MySQLのデータをmysqldumpコマンドでバックアップ&リストアしようとしました。
なにがおきた?
テーブルのバックアップを取るとき、何も考えずに
nohup mysqldump -u 'hoge' -p'fuga' 'database' table > table.backup &
ってやったら、バックアップは成功したのにリストアに失敗した。
原因
バックアップファイルの頭に
Warning: Using a password on the command line interface can be insecure.
ってエラーメッセージが入ってたのでリストアコマンドがエラーになった。
どうすればいい?
バッチファイルにする
参考: https://www.suzu6.net/posts/212-nohup-dump-background/
mysqldump
コマンドはバッチファイルに書いておいて、そのファイルをnohup dump.sh &
のように実行します。
これならエラーメッセージはdump.sh
のほうに出力され、mysqldump
コマンドには出ないので成功します。
繰り返し実行する必要があるのならば、これが最適だと思います。
エラーメッセージは別ファイルに出す
参考: https://yakst.com/ja/posts/1355
nohup mysqldump -u 'hoge' -p'fuga' 'database' table > table.backup 2>table.error &
こんなかんじでいけます。
エラーメッセージも捨てられず別ファイルに残るので、何かあったときに後から見直すこともできます。
むしろエラーメッセージを標準出力と同じところに出す奴が悪いので、本来はこちらが正しいコマンドと言えるでしょう。
--result-file
を使う
mysqldumpには、出力するファイルを指定するオプションがあります。
nohup mysqldump -u 'hoge' -p'fuga' 'database' table --result-file=table.backup &
これで出力はファイルに、エラーメッセージはコンソールに出力されます。
ということでこちらのオプションを使っていけばいいのではと思うのですが、何故か使用例が全然見当たらず、それどころか公式リファレンスですらリダイレクトを使っているので、本当にこれを使っていいのかよくわかりません。
フロントで開始してからバックグラウンドに持っていく
参考:https://qiita.com/strsk/items/1c971c1b7b3e9b08a445
mysqldump -u 'hoge' -p'fuga' 'database' table > table.backup
# Ctrl + Z を押す
bg 1
disown %1
こんなかんじでバックグラウンドに持っていけます。
Ctrl + Z
で一時中断し、bg
でバックグラウンド実行になります。
この時点ではmysqldumpはまだ自分の配下にあって、jobs
でジョブを確認可能ですし接続を閉じたら実行も終了してしまいます。
そこからさらにdisown
コマンドを打つことで自分と切り離すことができ、接続を閉じてもバックグラウンド実行を続けてくれるようになります。
エラーメッセージはコンソールに出るので、バックアップファイルに変なものが入ることもありません。
めんどくさいですね。
というか、エラーメッセージを回避するだけのためにこんなことをする意味がわかりません。
リストアする前にファイルからエラー行を削除する
はい。
そもそも-pxxxxx
するな
はい。
まとめ
バージョンの異なるMySQLサーバにデータを移行したいっていう場合の適切なソリューションが全然ないんですよ。
双方向レプリケーションとか高度な機能はいらないので、単に対象DBのデータを自分のところに取り込むだけみたいな機能はないんかね。
そういうのがなかったので、物理でどうにかしようとしたらコケたという話でした。