たまには失敗談でも。
何をしたの?
そんなに失敗というわけではないんですが…
先日、クラウドの移行作業を行いました。A社のクラウドサービスに構築していたデータベースをB社のクラウドサービスに移行する作業です。
その際にデータ移行を担当したのですが、非常に残念な対応をしてしまったのです。
自分は組み込み開発からスタートして、スマートフォンのアプリ開発をメインに行ってきました。
DBに関するざっくりとした知識はありますがSQLを書く経験が無く、バックエンドチームが用意してくれたAPIを実行する日々を過ごしてきました。
技術的な背景
- DBMSはPostgreSQLを使用しています。
- データの移行は移行元のデータエクスポート機能を使ってCSV形式で取得してきます。
- データのインポートはクラウド上に踏み台サーバーを作り、ローカルPCからSSHでアクセスしてそこからインポートします。
エクスポートしたデータはというと…
総レコード数は1億6千5百万!
ファイルサイズにして60GB超!
はたしてDB素人は如何にしてデータを移行しようとしたのでしょうか。
何を考えたのか
わい:今回は空のテーブルにデータを入れるから、INSERTしたらええんやな!
わい:CSVファイルをINSERT文に変換したろ。置換ツールで一発や!
わい:\i で .sqlファイルで流せるんやな
わい:ふむ、5分で1万件か…すると1時間で12万件やし、ええんちゃう?
投入開始
わい:計算すると…165,000,000 / 120,000 = 1375時間、つまり…
わい:ご…57…日……だと…?とりあえず報告せな…
上司:PostgreSQLならCOPYコマンドを使ってみたら?
わい:そんなものが…
COPYコマンドを使った結果
30分ほどで全件投入出来ましたとさ♪
データにはJSON形式のデータも含まれていたのでCOPYコマンドで投入可能にするように変換する手間と時間はある程度はかかりましたが、データ投入の時間は圧倒的な速さでした。
結論
早めの報連相は大切だぞ!