メンチカツ

ロースカツが好きです

時間がかかるsqlスクリプトの進捗を確認する

mysqlスクリプトやmysqldumpで大量データをあれこれしたいとき、 なかなか終わらないと進捗が見えなくてわなわなしますよね。

# でかいテーブルを空にする
truncate table hoge_db.dekai_table;
# すごいテーブルを空にする
truncate table hoge_db.sugoi_table;

BEGIN;

# でかいテーブルに、別DBのでかいテーブルのデータを突っ込む
insert into hoge_db.dekai_table select * from fuga_db.dekai_table;
# すごいテーブルに、別DBのすごいテーブルのデータを突っ込む
insert into hoge_db.sugoi_table select * from fuga_db.sugoi_table;

COMMIT ;

トランザクションにした日には完了するまで待ち続けるしかなくて 一層わなわなします。

プロセスリスト(show full processlist)で確認することもできますが、 もうちょっと気軽にシェルスクリプトみたいに途中経過をechoとかで 挟めないのかな、と思ったらありました。

qiita.com

コマンド書いたらいいんですね。

\! echo "でかいテーブルを空にする"
truncate table hoge_db.dekai_table;
\! echo "すごいテーブルを空にする"
truncate table hoge_db.sugoi_table;

BEGIN;

\! echo "でかいテーブルに、別DBのでかいテーブルのデータを突っ込む"
insert into hoge_db.dekai_table select * from fuga_db.dekai_table;
\! echo "すごいテーブルに、別DBのすごいテーブルのデータを突っ込む"
insert into hoge_db.sugoi_table select * from fuga_db.sugoi_table;

COMMIT ;

これをnohupで実行します。nohupすることで、サーバーからログアウトした あとでも処理を続けてくれます。

$ nohup mysql -h hoge_host -u username -ppassword hoge_db -e "source sync.sql" &
#=> nohup: ignoring input and appending output to `nohup.out'

仕込んだechoは「$HOME/nohup.out」で見ることができます。

$ tail -f ~/nohup.out
#=> でかいテーブルを空にする
#=> すごいテーブルを空にする
#=> でかいテーブルに、別DBのでかいテーブルのデータを突っ込む