Quantcast
Channel: rana_kualuの記事 - Qiita
Viewing all articles
Browse latest Browse all 331

【MySQL】`nohup mysqldump`したらリストアに失敗した

$
0
0
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のデータを自分のところに取り込むだけみたいな機能はないんかね。 そういうのがなかったので、物理でどうにかしようとしたらコケたという話でした。

Viewing all articles
Browse latest Browse all 331

Trending Articles