経緯
Docker-composeで作成したMySQLのデータをAmazonRDSに移行する必要があった。
結論
Dockerコンテナで作成したMySQLデータをRDSなどの外部サーバーに移行する
エクスポート時
$ docker exec コンテナ名 mysqldump --default-character-set=文字コード(utfmb4など) -u ユーザ名 -p パスワード データベース名 > backup.sql
インポート時
mysql --default-character-set=文字コード -h エンドポイント(AmazonRDSの場合) -P 3306 -u admin -p データベース名 < backup.sql
Sequelize(Node.jsのORM)を使ってスキーマを作成していた場合
エクスポート時
$ docker exec コンテナ名 mysqldump --skip-lock-tables --default-character-set=文字コード(utfmb4など) --ignore-table=データベース名.SequelizeMeta -u ユーザ名 -p パスワード データベース名 > backup.sql
インポート時
mysql --default-character-set=文字コード -h エンドポイント(AmazonRDSの場合) -P 3306 -u admin -p データベース名 < backup.sql
Sequelizeを使ってスキーマを作成していた場合は SequelizeMeta
というテーブルが作成されているので、dumpを作成しようとすると、以下のようなエラーになります。(アッパーキャメルだから?)
doesn't exist when using LOCK TABLES
Couldn't read status information for table SequelizeMeta
なので、dump作成時に --skip-lock-tables
と --ignore-table
オプションを使います。
Sequelizeを用いたアプリケーションにおける、dump作成からRDSなどの外部サーバーで同じ環境を構築する流れは以下のようになります。
コンテナ内でdump作成
↓
RDSなどの移行先サーバーでマイグレーションを実行する
(ここでSequelizeMetaテーブルは正常に作成される)
↓
dumpをインポートする
インポートしたデータが文字化けする場合
dumpしたデータを読み込んだ際に日本語のデータが文字化けする場合があります。
原因は
--default-character-setオプション
の設定が間違っている
DBサーバの文字コード設定
が間違っている
といったものが予想されます。
RDSの場合は以下の記事が参考になりました。
[AWS][RDS][MySQL] 文字コードをutf8mb4にする