概要
ローカルから直接Docker内にあるデータベース(MySQL)をダンプ/リストアなどの操作をする方法です。
Dcokerのコマンド + MySQLのコマンドを組み合わせるだけです。
本文
以下の定数はコマンド等で確認してください。
CONTAINER_NAME
: Dockerのコンテナ名。$ docker ps
で確認する。
USER_NAME
: Docker内のデータベースのユーザ名
PASSWORD
: Docker内のデータベースのパスワード
DATABASE_NAME
: Docker内のデータベース名
ローカルから直接Dockerのデータベースに接続
$ docker exec -it CONTAINER_NAME mysql -u USER_NAME -p
ローカルから直接Dockerのデータベースを操作
データベース作成の例。
-eのオプションでは自由にSQLコマンドを実行できます。
$ docker exec -it CONTAINER_NAME mysql -u USER_NAME -p -e'CREATE DATABASE IF NOT EXISTS DATABASE_NAME;'
ローカルから直接Dockerのデータベースをダンプ
ダンプとは、テーブルなどのデータベースの情報をSQL文の形で出力することです。
バックアップのようなものです。
$ docker exec -it CONTAINER_NAME mysqldump -u USER_NAME -pPASSWORD DATABASE_NAME > dump.sql
ローカルから直接Dockerにあるダンプファイルをリストア
リストアとは、ダンプされたファイルからデータベースを復元することです。
$ docker exec -it CONTAINER_NAME mysql -u USER_NAME -p DATABASE_NAME -e"$(cat dump.sql)"
本題は以上です。
補足
個人的によく使うDockerとMySQLのコマンドも記載しておきます。
Dockerコマンド
コンテナに接続
$ docker exec -it CONTAINER_NAME bash
オプションの意味は以下です。
-i
: アタッチしていなくても STDIN をオープンにし続ける
-t
: 疑似ターミナル (pseudo-TTY) の割り当て
exec — Docker-docs-ja 17.06.Beta ドキュメント
ローカルへファイルをコピー
$ docker cp <コンテナID>:path/to/container/dump.sql path/to/local/dump.sql
cp — Docker-docs-ja 17.06.Beta ドキュメント
MySQLコマンド
MySQLに接続
$ mysql -u USER_NAME -p
ダンプ
$ mysqldump -u USER_NAME -p DATABASE_NAME > dump.sql
特定のテーブルを指定することもできます。
$ mysqldump -u USER_NAME -p DATABASE_NAME TABLE_NAME > dump.sql
バックアップとしてダンプするときは、--single-transaction
オプションをつけます。
このオプションをつけるとトランザクションを利用してくれるので、バックアップを開始〜終了まで整合性のとれたデータであることを保証してくれます。
$ mysqldump --single-transaction -u USER_NAME -p DATABASE_NAME > dump.sql
MySQL :: MySQL 5.6 リファレンスマニュアル :: 4.5.4 mysqldump — データベースバックアッププログラム
リストア
$ mysql -u USER_NAME DATABASE_NAME < dump.sql
最後に
記事に間違いや不明な点があれば遠慮なくご指摘ください。