0
0

More than 3 years have passed since last update.

【Node.js】Dockerで作成したMySQLをDUMPする

Posted at

経緯

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にする

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0