レンタルサーバーなど外部のサーバー上にあるMySQLの内容をDocker内のMySQLに移管したいことがあります。
そういったときは、mysqldumpコマンドを使ってダンプファイル(バックアップファイル)を作成し、それをコマンドラインでDocker内のMySQLのデータベースにインポートすることができます。
ここではその方法についてまとめています。
外部のMySQLの内容をダンプファイルに抜き出す方法
まずは、移管元となるMySQLの内容をダンプファイル(バックアップファイル)として出力する必要があります。
特定のデータベースの全てのテーブルを移管したい場合と、一部のテーブルのみを移管したい場合で実行するコマンドが変わってきます。
全てのテーブルを移管する場合
特定のデータベースの中身をごっそり抜き出したいときは以下のコマンドを実行します。
$ mysqldump -u <ユーザー名> -h <ホスト名> -p <データベース名> --skip-column-statistics > 出力ファイル名.sql
パスワードの入力を求められるので、MySQLのパスワードを入力します。
すると、指定したファイル名で「出力ファイル名.sql」が生成されます。
これがバックアップ用のファイル(ダンプファイル)になります。
指定したテーブルのみ移管する場合
特定のデータベースの中の指定したテーブルのみを抜き出したいときは、以下のコマンドを実行します。
mysqldump -u <ユーザー名> -h <ホスト名> -p <データベース名> <テーブル名1> <テーブル名2>,,,, > 出力ファイル名.sql
対象となるテーブルがたくさんある場合
対象となるテーブルが複数あるとき、個別にテーブル名を入力していくのは大変です。
そんなときは、パターンマッチングを使って対象となるテーブルをまとめて指定することもできます。
$ mysql -u <ユーザー名> -h <ホスト名> -p <データベース名> -N -e 'show tables like "パターンマッチング"' | xargs mysqldump -u <ユーザー名> -h <ホスト名> -p <データベース名> --skip-column-statistics > 出力ファイル名.sql
パスワード入力を2回求められるので、それぞれMySQLのパスワードを入力してください。
すると、指定したファイル名「出力ファイル名.sql」のファイルが生成され、指定したテーブルの内容のみが入ります。
なおパターンマッチングの部分は、SQLのLike句で指定します。
ワイルドカード | 内容 |
---|---|
% | 0文字以上の任意の文字列 |
_ | 任意の1文字 |
例えば、「show tables like “pre_%”」とすれば、テーブル名の冒頭に「pre_」がつくテーブルのみがダンプの対象となります。
ダンプファイルをインポートする
バックアップ用のダンプファイル(~.sql)が生成できたら、これをDocker内のMySQLコンテナ内のデータベースにインポートします。
事前準備
Docker内のMySQLコンテナ内のデータベースにインポートする前に以下の2つが前提となります。
- 「docker-compose up」コマンドなどで、MySQLのコンテナを起動しておく。
- ダンプファイル(~.sql)を、Dockerfileやdocker-compose.ymlファイルと同じ場所に移動しておく。
テーブルの内容をインポートする
MySQLのコンテナを指定して以下のコマンドを実行します。
$ docker exec -i <コンテナ名> sh -c 'mysql <データベース名> -u <ユーザー名> -p<パスワード>' <ダンプファイル名>.sql
このコマンドを実行することで、コンテナのbashを起動することなく、mysqlコマンドを実行できます。
-iオプションとは何か?
「-i」オプションは、標準入力(STDIN)をオープンにし続けるオプションです。これにより指定したコマンドを実行することが可能になります。
通常「-t」オプションと合わせて使用されることが一般的です。「-t」オプションは疑似ターミナル(tty)を割り当てるオプションで、コンテナの中に入ってターミナルでコマンド操作することが可能になります。
今回は、コマンドのオプションで実行するmysqlコマンドを指定するので、疑似ターミナルは不要なため、「-i」オプションのみとなります。
shとは何か?
shは「shell(シェル)」のことで、指定したコンテナのシェルを起動します。これでシェルのコマンドが渡せる状態になります。
-cオプションとは何か?
「-c」オプションはコンテナの中で実行したいスクリプト(コマンド)を指定します。
「-c」のあとに、シングル(ダブル)クオテーションで、コマンドを記述します。
なお、「-c」がないとコマンドとして認識されません。
コマンドは実行可能である必要があり、連結されていたりクォートで囲まれていたりすると動作しません。
例として
docker exec -ti my_container "echo a && echo b"
は動作しませんが、docker exec -ti my_container sh -c "echo a && echo b"
であれば動作します。
mysql <データベース名> -u <ユーザー名> -p<パスワード>’ <ダンプファイル名>.sql
「-c」オプションの後ろに記述したコマンドが、mysqlの指定したデータベースに対象のダンプファイル(バックアップファイル)をインポートする処理です。
mysql -u <ユーザー名> -p<パスワード> <データベース名> < <インポートするファイル名>.sql
実例
ダンプファイルの生成
リモートサーバーにアクセスして「prograshi_」という接頭語がつくテーブルのみを抽出する場合は以下のようになります。
$ mysql -u userName -h mysq.lolipop.lan -p database -N -e 'show tables like "prograshi_%"' | xargs mysqldump -u userName -h mysq.lolipop.lan -p database --skip-column-statistics > dump_prograshi.sql
Enter password:
Enter password:
コマンドを実行すると、パスワードの入力を2回求められるので、入力します。
lsコマンドで確認すると、指定したファイルが生成されていることがわかります。
$ ls
dump_prograshi.sql wp-admin wp-content wp-login.php xmlrpc.php
この「dump_prograshi.sql」ファイルを、移管したいDockerのルートディレクトリ直下に配置します。
ダンプファイルのインポート
まずは対象となるMySQLコンテナが起動していることを確かめます。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5ba4912ef774 wordpress:latest "docker-entrypoint.s…" 36 seconds ago Up 34 seconds 0.0.0.0:10090->80/tcp, :::10090->80/tcp wordpress
a08ad79e6342 phpmyadmin/phpmyadmin:latest "/docker-entrypoint.…" 37 seconds ago Up 34 seconds 0.0.0.0:10099->80/tcp, :::10099->80/tcp phpmyadmin
b399b142387b mysql:5.7 "docker-entrypoint.s…" 39 seconds ago Up 37 seconds 3306/tcp, 33060/tcp wp_mysql
上記の、コンテナ名「wp_mysql」が今回生成したsqlファイルをインポートするデータベースを持つMySQLになります。
コンテナ名「wp_mysql」、ユーザー名「wp_user」、パスワード「root」、データベース名「wp_db」に「dump_prograshi.sql」をインポートする場合は以下のようになります。
$ docker exec -i wp_mysql sh -c 'mysql -u wp_user -proot wp_db' < dump_prograshi.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
コマンドライン上にパスワードを入力すべきではないという警告がでますが無視して問題ありません。
以上でインポートは完了です。とても簡単です。
テーブルがインポートされたか確認する
念のためテーブルが正しくインポートされたか確認します。
MySQLコンテナの中に入ります。
$ docker exec -it wp_mysql bash
root@b399b142387b:/#
MySQLの対話モードを開き、データベースを選択してテーブル一覧を表示します。
root@b399b142387b:/# mysql -u wp_user -proot
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 5.7.37 MySQL Community Server (GPL)
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| wp_db |
+--------------------+
2 rows in set (0.00 sec)
mysql> use wp_db
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+-----------------------------------+
| Tables_in_wp_db |
+-----------------------------------+
| prograshi_actionscheduler_actions |
| prograshi_actionscheduler_claims |
| prograshi_actionscheduler_groups |
| prograshi_actionscheduler_logs |
| prograshi_aioseo_cache |
| prograshi_aioseo_notifications |
| prograshi_aioseo_posts |
| prograshi_bwt_failed_submissions |
| prograshi_bwt_passed_submissions |
| prograshi_commentmeta |
| prograshi_comments |
| prograshi_ewwwio_images |
| prograshi_ewwwio_queue |
| prograshi_links |
| prograshi_options |
| prograshi_postmeta |
| prograshi_posts |
| prograshi_siteguard_history |
| prograshi_siteguard_login |
| prograshi_term_relationships |
| prograshi_term_taxonomy |
| prograshi_termmeta |
| prograshi_terms |
| prograshi_usermeta |
| prograshi_users |
| prograshi_wpforms_tasks_meta |
| prograshi_wpmailsmtp_debug_events |
| prograshi_wpmailsmtp_tasks_meta |
+-----------------------------------+
28 rows in set (0.00 sec)
ダンプファイルの内容がインポートされていることがわかります。
MySQLの対話モードとMySQLのコンテナから抜けます。
mysql> exit
Bye
root@b399b142387b:/# exit
exit
以上で完了です。