はじまりは
畜生ペンギン@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 で引いてみた。
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が終わった後に通るのだそう(´・ω・`)
仕方ない、ユーザーロックするパッチ当てるか。。
*** 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);
}
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
*** 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インターフェイスから確認できるし
mysql57> SELECT is_used_lock('xtrabackup');
+----------------------------+
| is_used_lock('xtrabackup') |
+----------------------------+
| 25 |
+----------------------------+
1 row in set (0.00 sec)
ついでにxbの二重起動も防げる。
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