Dockerで"mysqldump"を走らせる

3 min read読了の目安(約3100字

はじめに

インターン初日に、まずデータベースの情報を受け渡してくれる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行ずつダンプを行う

大きなテーブルをダンプするときは"--single-transaction"と"--quick"の併用が有効。らしい

本題の Docker + mysqldump

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 〜〜

これによってmysqlのユーザー権限を複雑化することなくmysqldumpを通らせる事ができました。

Summary Of The Day(SOTD)

この後でmysqldump以外のmysqlコマンドを実行しましたがどれも問題なく通ってくれました。
mysqlのユーザー切り替えや権限の切り替えがDockerなどのコンテナ内外でうまくいかないときは内からと外から、両方からのアプローチを試してみるのがいいと分かりました。今日の学びです。

References

https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html#option_mysqldump_single-transaction
https://style.potepan.com/articles/18092.html