🥟
Dockerで"mysqldump"を走らせる
はじめに
インターン初日に、まずデータベースの情報を受け渡してくれるAPIのローカル環境構築をしました。Dockerにapiを載せるまでは良かったのですが、その後のデータベースのコピーに苦労しました。その時に一番良く分からなかったのがmysqldump
のコマンド。これをパパッと理解できるようスッキリまとめます。
mysqldump
とは
mysqldump
はデータベースのバックアップを取る時に使えるコマンドです。オリジナルデータを再現するためのSQL文を生成してくれます。ちなみにmysqldump
は"mysql"をインストールするだけでターミナルで使用できるようになります。
ターミナルで検証
〜 % mysqldump
Usage: mysqldump [OPTIONS] database [tables]
OR mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
OR mysqldump [OPTIONS] --all-databases [OPTIONS]
For more options, use mysqldump --help
_________________________________
_________________________________
____helpオプションでさらに詳しく_____
_________________________________
_________________________________
〜 % mysqldump --help
mysqldump Ver 10.13 Distrib 5.6.51, for osx10.16 (x86_64)
Copyright (c) 2000, 2021, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf
The following groups are read: mysqldump client
The following options may be given as the first argument:
--print-defaults Print the program argument list and exit.
--no-defaults Don't read default options from any option file,
except for login file.
--defaults-file=# Only read default options from the given file #.
--defaults-extra-file=# Read this file after the global files are read.
--defaults-group-suffix=#
Also read groups with concat(group, suffix)
--login-path=# Read this path from the login file.
-A, --all-databases Dump all the databases. This will be same as --databases
with all databases selected.
-Y, --all-tablespaces
Dump all the tablespaces.
_________________________________
_________________________________
______以降もオプションがズラリ_______
_________________________________
_________________________________
便利なオプション
オプション名 | 役割 |
---|---|
--single-transaction | サーバーからデータをダンプする前に BEGIN SQL ステートメントを発行する |
--quick | テーブルの全レコードをメモリにバッファリングする代わりに、1行ずつダンプを行う |
mysqldump
本題の Docker + Dockerの中でどうにかmysqldump実行しようと以下のコマンドを使用。
docker exec -it 〜.mysql mysql -u -p 〜〜
この時にどうしてもユーザーへのmysql編集の権限を譲渡することができませんでした。
そこで作戦変更。Dockerの中に直接入ってコマンドラインを入力することで、頭のdocker exec -it 〜.mysql
を無くしました。
つまり
Before: Dockerの外から
docker exec -it 〜.mysql mysqldump -u -p 〜〜
After: Dockerの中で
mysqldump -u -p 〜〜
mysqldump
を通らせる事ができました。
これによってmysqlのユーザー権限を複雑化することなくSummary Of The Day(SOTD)
この後でmysqldump
以外のmysqlコマンドを実行しましたがどれも問題なく通ってくれました。
mysqlのユーザー切り替えや権限の切り替えがDockerなどのコンテナ内外でうまくいかないときは内からと外から、両方からのアプローチを試してみるのがいいと分かりました。今日の学びです。
References
Discussion