コマンドラインからのsql復元(リストア)方法
cd
コマンドでバックアップファイルが保存されている場所に移動して
docker exec -i コンテナ名 mysql -uデータベースユーザー名 -データベースパスワード データベース名 < バックアップファイル.sql
で可能。
詳しい方法を書いていく。
ジャンプできる目次
コンテナ名確認方法
docker ps
でNAMES欄を確認する。
% docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dd67e96ed4fd phpmyadmin/phpmyadmin "/docker-entrypoint.…" About an hour ago Up About an hour 0.0.0.0:8081->80/tcp crm-phpmyadmin-1
dbe421d05ae7 nginx:latest "/docker-entrypoint.…" About an hour ago Up About an hour 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp crm-web-1
fa1c22287cf9 crm_private-app "docker-php-entrypoi…" About an hour ago Up About an hour 9000/tcp crm-app-1
b9070cf5df2f crm_private-db "/entrypoint.sh mysq…" About an hour ago Up About an hour (healthy) 3306/tcp, 33060-33061/tcp **crm-db-1**
この例は、crm-db-1
っぽいね。
厳密にいうとdocker-compose.ymlに
db:
build: ./infra/mysql
volumes:
- db-store:/var/lib/mysql
って書いてたから「db」が名前に含まれると判断できた。
あくまで自分の環境の例なので、勘で選んでくれていいと思う。
データベース情報確認方法
mysqlのDockerfileで指定している情報か、phpMyAdminにログインするときに叩いている情報に当たる。
自分の環境だと
infra/mysql/Dockerfile
FROM mysql/mysql-server:8.0
ENV MYSQL_DATABASE=laravel_local \
MYSQL_USER=yaju \
MYSQL_PASSWORD=ikisugi \
MYSQL_ROOT_PASSWORD=ikisugi \
TZ=Asia/Tokyo
COPY ./my.cnf /etc/my.cnf
RUN chmod 644 /etc/my.cnf
データベース名:laravel_local
データベースユーザー名:yaju
データベースパスワード:ikisugi
ってことになる。
ユーザー名とパスワードに関してだが、環境変数を使っている場合などは.env
の内容を書くにする必要があるのかも。
phpMyAdminからデータベース名を確認するにはサイドバーを確認する。
いざ復元
リストア作業に入る。
冒頭で述べたよういcd
コマンドでバックアップがあるディレクトリまで移動する。
docker exec -i コンテナ名 mysql -uデータベースユーザー名 -データベースパスワード データベース名 < バックアップファイル.sql
というルールに基づくと、今回の例では下記のようなコマンドになる。
docker exec -i crm-db-1 mysql -uyaju -psikisugi laravel_local < 実際のバックアップファイル名.sql
サイズによっては時間かかるけどこれで復元できる。
15万レコードぐらいのデータを復元したときで、1、2分だった記憶がある。