箱のプログラミング日記。

渋谷の自社開発企業でRails書いてます。

本番とローカルのDBを同期したい(ダンプとリストア)

f:id:y_hakoiri:20191102121842j:plain

MySQLでDBのダンプファイルを作成&リストアする方法についてまとめていきます。

ダンプって何

コンピュータの記憶装置(メモリやストレージなど)に記録された内容をまとめて表示、印刷、記録などすること

引用:ダンプとは - IT用語辞典 e-Words

簡単にいうと、DBの中身をファイルデータとして書き出しておくことで、簡単に複製や再現ができるようにしておくこと。

シーンとしては以下のような状況が考えられる

  • 本番DBのバックアップを定期的に取っておきたい
  • あるDBの中身のレコードをそっくりそのまま別のDBに格納したい

今回は2つめのシーンとして、本番DBの内容をdumpデータとして書き出した後にローカルのDBにリストアする手順についてまとめていく。

ダンプする

$ mysqldump -uユーザー名 -pパスワード -hホスト名 DB名 > ~/書き出したいファイル名.sql

オプションについて

  • -u...ユーザー名
  • -p...パスワード
  • -h...ホスト名(エンドポイント)

ログイン時にパスワード入力を設定していない場合は-pオプションは不要。パスワードやホスト名がわからなくなった場合はdatabase.ymlを参照する(Railsの場合)。

あとはDB名を指定した上で書き出し後のファイル名を指定する。

実際のコマンドは以下のようになる

$ mysqldump -uroot -ppassword -hhost_name db_name > ~/dump_20200727.sql

~/dump_20200727.sqlとすることでホームディレクトリ直下にdumpファイルを作成している。

ファイル名はなんでも良いけど後から見てパッとわかりやすいように日付を入れておくと分かりやすい&被らなくて良き。

~ $ ls
dump_20200727.sql

データ量が多い場合は少し時間がかかるけどちゃんと出来上がりました。

リストアとは

ハードディスクなどの記憶装置が破損するなどしてデータが失われた際に、以前に取っておいたデータの複製を書き戻すなどして復元することをリストアという。

引用:リストア(復元)とは - IT用語辞典 e-Words

今回で言うとdumpがDBデータの書き出し、restoreが書き出されたデータを元に複製を行うことに当たる。

リストアする

$ mysql -uユーザー名 -pパスワード -hホスト名 DB名 < ~/書き出したいファイル名.sql

さっきのdumpと比べると

$ mysqldump -uroot -ppassword -hhost_name db_name > ~/dump_20200727.sql
$ mysql -uroot -ppassword -hhost_name db_name < ~/dump_20200727.sql

dumpがあるかないかと、<>の向き先が逆になっているだけなので割と分かりやすい。

本番DBのダンプ作成&ローカルDBにリストア

ここまでの基本を押さえた上で、実際に本番DBからローカルDBへ、ダンプの作成とリストアまでの一連の流れをまとめる。

やることは以下

  • 本番DBサーバーに入りdumpファイルを作成
  • 作成したdumpファイルをローカルにコピー
  • ローカルにコピーされたdumpファイルからローカルDBにリストア

実際に手順を見ていく。

本番DBサーバーに入りdumpファイルを作成

特に難しいことはなくて、EC2インスタンスにDBを作成しているのでssh接続でサーバーに入り、先ほどのdumpコマンドを打つだけ。

$ mysqldump -uroot -ppassword -hhost_name db_name > ~/dump_20200727.sql

作成したdumpファイルをローカルにコピー

サーバー内で作成したdumpファイルをローカルにコピーする。

$ scp hogehoge@54.65.121.164:/home/hoge/dump_20200727.sql ~/

分割してみていくと

  • scp...ssh接続しつつコピー
  • hogehoge@**.**.***.**...EC2インスタンスにssh接続するためIPアドレスを指定
  • :/home/hoge/dump_20200727.sql...サーバー内のdumpファイルが置いてあるディレクトリを参照
  • ~/...ローカルのホームディレクトリ直下にコピー(コピー先を指定)

少し待ってローカルの指定したディレクトリ直下にdump_20200727.sqlが出来上がっていれば成功。

ローカルにコピーされたdumpファイルからローカルDBにリストア

最後に、先ほどローカルにコピーしたdumpからDBへリストアするだけ。

$ mysql -uroot -ppassword -hhost_name db_name < ~/dump_20200727.sql

無事に本番と同じDBをローカルでも再現できました。

参考

mysqldumpでバックアップ・リストアする - とほほのWWW入門

scpコマンド - Qiita