ローカルDBでデータを作成し、AWSのDBにインポートする
やりたいこと
最近仕事でLaravelを使った開発をやっています。
AWSサーバーにあるDevelop環境にテストデータを追加したかったのですが、諸事情でいきなりAWSサーバーでSeederを実行するのはリスクがありローカルで作成したレコードをdumpしてAWSサーバーDBにインポートするという作業をしました。
おおまかな流れ
- ローカルDBのレコードをdumpする
- AWS側のテーブルのidの連番になるようにdumpファイルを修正
- AWSサーバーにdumpしたsqlファイルを移動する
- AWSサーバーにdumpファイル をAWSサーバーのDBにインポートする
mysqldumpコマンドでレコードをdumpする
レコードをdumpするためにmysqldumpコマンドを使います。 説明は省きますがデータベース単位やテーブル単位など様々な用法があるようなので、それは下記参照ください。 qiita.com
今回はレコード単位でさらにテーブルの中のid=XXX以上のレコードをdumpしたかったためmysqldumpにWHEREオプションを合わせて実行します。
最終的なコマンド
$ mysqldump -u USERNAME --no-create-info DB_NAME TABLE_NAME --where="id >= 100" > dump.sql
--no-create-info
今回の場合AWS側のDBは既にあるテーブルにレコードを追加したかったため、このオプションをつけました。これをつけなければCREATE TABLEクエリが発行されるため既に登録されているレコードも全て初期化されてしまいます。
--where
『--where(-w)』オプションを指定することでいつものSQL文と同じように条件を絞ることができます
これでレコードのdumpファイルの完了です。
AWS側のidに連番となるようにdumpファイルを修正する
AWS側のテーブルには既にレコードが登録されており、それの最終idから連番となるように追加をしたいです。そのためにdumpファイルをちょっとだけ修正します。 登録済みのレコードそのままに追加するのではなく、テーブルごと置き換える場合は不要です。
修正前
INSERT INTO `TABLE_NAME` * VALUES (100,AAA,SATO,sato@test.com),(101,AAB,SUZUKI,suzuki@test.com),(102,AAC,YAMADA,yamada@test.com).........
修正後
INSERT INTO `TABLE_NAME` (user_id, name, email) VALUES (AAA,SATO,sato@test.com),(AAB,SUZUKI,suzuki@test.com),(AAC,YAMADA,yamada@test.com).........
ポイント
- *の部分にauto incrementのid以外の全カラムを書く
- 正規表現を使ってVALUESのid部分の値を削除する
こうすることで空となったid部分は、挿入先のテーブルの連番となるように追加されます。
ローカルサーバーのファイルをAWSサーバーに移動する
dumpファイル ができたら、もうあとは余裕だ!と思っていいたら思わぬところで躓きました。
dumpファイル をどうやってAWSサーバーに持っていくのか
最初はコピペしてみたもののサイズが大きすぎてvimが途中で止まってしまいました。そのためちゃんと調べたところscpコマンドというSSH先のサーバーにファイル転送するコマンドがありました。
scp コマンド
scpコマンドとはローカルサーバーからリモートサーバーにファイルを転送したり、その逆でリモートサーバーからローカルサーバーにファイルを転送したりできます。
今回は鍵認証を使ってローカルからリモートにコピーします。
鍵は既に~/.ssh/key.pem
というファイルがあったのでこれを -i オプションを使って転送します。
# フォーマット $ scp -i 秘密鍵ファイル ファイル名 送信先のアドレス:ファイルを保存するディレクトリ # 例 $ scp -i ~/.ssh/key.pem /{ローカルファイルのパス}/dump.sql ec2-user@XXX.amazonaws.com:/{保存するディレクトリパス}
参考 qiita.com docs.aws.amazon.com
dumpファイル をAWSサーバーのDBにインポートする
最後にAWS側のDBにmysqlコマンドを使用してdumpしたファイルをインポートさせます。
$ mysql -h XXX.amazonaws.com -u username -p DB_NAME < dump.sql
以上でローカルでテストデータを作成し、AWSのDBにインポートする方法でした。正直たかがテストデータを作成するだけでかなり時間がかかってしまいました。
おまけ
- mysqlテーブルのauto incrementの値を確認する
mysql> show table status like 'TABLE_NAME';
- mysqlテーブルのauto incrementの値を更新する
mysql> ALTER TABLE TABLE_NAME AUTO_INCREMENT = 1000;
- 組み込みエンジニアから念願のWebエンジニアに転職しました