🙄

Mysqlコンテナにsqlをインポートしてみた記録

2022/03/12に公開

前提・環境

レンタルサーバーで運用中のデータベースをエクスポートして
ローカルのDockerで使用するという状況でした。
データベースのエクスポートはサーバの管理画面から済んでいるものとして書きます。

Docker構成

Docker composeにてプロキシ、アプリ、DBコンテナを制御して本番と同じドメインで使用できるように設定しております。またDBのデータを永続化するためにbusyboxを使用してデータの永続化をしています。
プロキシ → アプリ → DB → DB専用(永続化用)

このような構成にすることでDBのデータとアプリ側、またDBコンテナ自体も疎結合にできるので例えばバージョンアップしたrubyやsqlなどの言語でテストをしたい、といった場合にコンテナのイメージを変えることで簡単にバージョンを上げたり下げたりすることができます。
DB専用コンテナに関してはExited状態で存在していれば特に起動する必要もなくデータを保持してくれます。

前準備

自分の環境ではDB専用コンテナを先に作成しなければならないので以下のようにコマンドを打ちます。

$ docker run -i -t --name container-name --mount source=test-dbdatavolume,target=/var/lib/mysql busybox

そしてプロキシコンテナとアプリコンテナで以下のコマンドを打つと自分の環境では全てのコンテナが繋がるようになっています。

$ docker compose up -d

手順概要

  1. sqlエクスポートしローカルPCに保存。
  2. ローカルPCよりDockerコンテナ内にsqlをコピーする。
  3. mysqlコマンドでインポートする。

ローカルPCよりDockerコンテナ内にsqlをコピー

# docker cp ./ローカルのファイル コンテナID:/コンテナ内のパス
$ docker cp ./backup.sql xxxxxxxxx:/tmp/backup.sql

mysqlコマンドでインポート

まずはdockerコンテナ内に入ります。

$ docker exec -it container_name_mysql_1 /bin/bash

そしてmysqlコマンドを使って先ほどローカルPCからコピーしたsqlファイルを指定してインポートします。
mysql -u[ユーザー名] -p[パスワード] [インポートするデータベース名] < [インポートするファイル名]

# mysql -u root -p newdatabase < backup.sql

以下のようにデータがインポートされているか確認してみましょう。

# mysql -u root -p
# show databases;
# use newdatabase;
# show tables;

これでテーブルが表示されればインポートできていると思います。

DBが反映されない場合のチェックポイント

  • アプリ側で指定しているデータベース名
  • アプリ側でのデータベースのプレフィックスの指定とDB側のプレフィックスが合致しているかどうか
  • Dockerコンテナ自体がきちんとつながっているかどうか。アプリコンテナからmysqlが実行できるかどうかなどで疎通確認するとわかりやすいかもしれません。

Dockerコンテナからローカルにファイルをコピーする場合

ちなみにDockerコンテナのファイルをローカルにコピーすることもできます。

$ docker cp コンテナID:/コンテナ内のパス ./ローカルのファイル
$ docker cp containerid:/var/www/html/sample.html ./sample.html

Discussion