MySQLのデータベースお引っ越し

よく訓練されたアップル信者、都元です。

MySQLのデータベースのコピーとか、お引っ越しをしたい時、ありますよね。今AWS上で新規にMySQLを使いたいのであれば迷い無くRDSを選ぶと思いますが、まだRDSのmicroインスタンスが無かった頃に、microのEC2上に生でMySQLを建てた…とか、まぁ歴史上の理由は様々でしょう。

まぁ「無停止で」とか言い出すと色々大変ですが、そうでなければ(計画停止をすれば)MySQLの引っ越しって実はかなり簡単です。

まずは事前に出力先のMySQLの方はCREATE DATABASEを済ませておきます。CREATE DATABASE済みの場合は不要です。

$ mysqladmin \
  -u'cmsampleuser' \
  -p'cmsamplepass' \
  -h'dest.hostname.example.com' \
  --default-character-set=utf8
  create dest_database

あとは、アプリを止めて、mysqldumpmysqlをパイプで繋いでドーンと一発です。

$ mysqldump \
  --single-transaction \
  --no-autocommit \
  -u'cmsampleuser' \
  -p'cmsamplepass' \
  -h'source.hostname.example.com' \
  source_database \
  | mysql \
    -u'cmsampleuser' \
    -p'cmsamplepass' \
    -h'dest.hostname.example.com' \
    dest_database

場合によっては、パイプで直結ではなく、ファイルを経由させれば、バックアップにもなりますね。

$ mysqldump \
  --single-transaction \
  --no-autocommit \
  -u'cmsampleuser' \
  -p'cmsamplepass' \
  -h'source.hostname.example.com' \
  source_database \
  | gzip >cmsampledb-dump.sql.gz
$ gunzip -c cmsampledb-dump.sql.gz | mysql \
  -u'cmsampleuser' \
  -p'cmsamplepass' \
  -h'dest.hostname.example.com' \
  dest_database

終わったら、アプリの接続先を新DBに切り替えて起動するだけですね。

その他、お引っ越し用途だけでなく、ローカルの開発用DBのコピーを作る場合など、かなり応用は効くと思います。