はじまりは
畜生ペンギン@keny_lala のひとこと。
xtrabackupが今稼働中だよーってことがOSコマンドじゃなくてMySQLから分かる方法ありませんか?
— kentarokitagawa (@keny_lala) 2017年4月13日
Percona Serverには LOCK TABLES FOR BACKUP とかあったよなと思いつつ、たぶんPercona Serverじゃないので置いておく。
xtrabackup-2.4.6のソースコードをナナメに読んでいくと、 SET SESSION wait_timeout = 2147483 を押し込んでいる箇所があったので、ここで検出できないかなと思い付く。
取り敢えず王道(?)として、 performance_schema.variables_by_thread で引いてみた。
1 2 3 4 5 6 7 | mysql57> SELECT * FROM performance_schema.variables_by_thread WHERE variable_name = 'wait_timeout' AND variable_value = 2147483; +-----------+---------------+----------------+ | THREAD_ID | VARIABLE_NAME | VARIABLE_VALUE | +-----------+---------------+----------------+ | 50 | wait_timeout | 2147483 | +-----------+---------------+----------------+ 1 row in set (0.02 sec) |
ビンゴ。 そんなにキリの良い数字じゃないと思うんだけど、なんで2147483でハードコードしてあるんだろう。 ともあれ、これならフツーのアプリが使うこともなさそうなのでこれで検出できそう。
@yoku0825 なるほど!しかし、57限定になってします。。あ、専用ユーザ作ってユーザ名で見ればなんとかなるか。。
— kentarokitagawa (@keny_lala) 2017年4月13日
:(;゙゚’ω゚’): あ、5.6もサポートしないとダメ? ってかこのテーブル5.7で追加されたんだっけか。。。
如何にも爪痕を残しそうな PERCONA_SCHEMA.xtrabackup_history なるものをCREATEしている箇所があったけど、これはxtrabackupが終わった後に通るのだそう(´・ω・`)
仕方ない、ユーザーロックするパッチ当てるか。。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | *** storage/innobase/xtrabackup/src/backup_mysql.cc.orig 2017-02-27 16:47:06.000000000 +0900 --- storage/innobase/xtrabackup/src/backup_mysql.cc 2017-04-13 14:44:07.149003517 +0900 *************** *** 162,167 **** --- 162,169 ---- xb_mysql_query(connection, "SET SESSION wait_timeout=2147483", false, true); + xb_mysql_query(connection, "SELECT get_lock('xtrabackup', @@wait_timeout)", + false, true); return(connection); } *************** *** 1697,1702 **** --- 1699,1706 ---- free(uuid); free(server_version); + xb_mysql_query(connection, "SELECT release_lock('xtrabackup')", + false, false); return(true); } |
というわけで接続時に get_lock して終了時に release_lock するクエリーを入れ込んだ。
これなら is_used_lock 関数だけでSQLインターフェイスから確認できるし
1 2 3 4 5 6 7 8 | mysql57> SELECT is_used_lock('xtrabackup'); +----------------------------+ | is_used_lock('xtrabackup') | +----------------------------+ | 25 | +----------------------------+ 1 row in set (0.00 sec) |
ついでにxbの二重起動も防げる。
1 2 3 4 5 6 7 8 9 10 | mysql57> SHOW PROCESSLIST; +----+------+-----------+------+---------+------+-----------+-----------------------------------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+------+-----------+------+---------+------+-----------+-----------------------------------------------+ | 25 | root | localhost | NULL | Sleep | 691 | | NULL | | 28 | root | localhost | NULL | Query | 7 | User lock | SELECT get_lock('xtrabackup', @@wait_timeout) | | 29 | root | localhost | NULL | Query | 0 | starting | SHOW PROCESSLIST | +----+------+-----------+------+---------+------+-----------+-----------------------------------------------+ 3 rows in set (0.00 sec) |
よし、Feature Request出しに行くか?
投稿日:April 13th 2017
元記事:http://yoku0825.blogspot.com/2017/04/xtrabackupsql.html