xtrabackupが実行中かどうかをSQLだけで確認する思考実験

はじまりは
畜生ペンギン@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);
}


*** 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);
}
view raw

gistfile1.txt

hosted with ❤ by GitHub

というわけで接続時に 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

– PR –