Docker内のMySQLにダンプ(dump)ファイルをインポートする方法を実例で解説|mysqldumpコマンド・バックアップのimport方法、docker execのiとcオプションとは何か?

docker-prograshi(プロぐらし)-kv Database
記事内に広告が含まれていることがあります。
[PR]

レンタルサーバーなど外部のサーバー上にある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_」がつくテーブルのみがダンプの対象となります。

合わせて読みたい

上記のパターンマッチングで対象となるテーブルのみのダンプファイルを生成するコマンドの詳細については下記をご参考ください。

MySQLで複数のテーブルをパターンマッチングでダンプ(dump)/バックアップする方法



ダンプファイルをインポートする

バックアップ用のダンプファイル(~.sql)が生成できたら、これをDocker内のMySQLコンテナ内のデータベースにインポートします。


事前準備

Docker内のMySQLコンテナ内のデータベースにインポートする前に以下の2つが前提となります。

  1. 「docker-compose up」コマンドなどで、MySQLのコンテナを起動しておく。
  2. ダンプファイル(~.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"であれば動作します。

(参考)docker公式 docker exec


mysql <データベース名> -u <ユーザー名> -p<パスワード>’ <ダンプファイル名>.sql

「-c」オプションの後ろに記述したコマンドが、mysqlの指定したデータベースに対象のダンプファイル(バックアップファイル)をインポートする処理です。

mysql -u <ユーザー名> -p<パスワード> <データベース名> < <インポートするファイル名>.sql
注意点
  1. インポートするファイル(.sql)の前に記述するのは「<」です。
  2. 「-p」オプションの後ろにパスワードを記述するときは半角スペースは不要です。


実例

ダンプファイルの生成

リモートサーバーにアクセスして「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

以上で完了です。


タイトルとURLをコピーしました