2017年4月13日木曜日

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

はじまりは
畜生ペンギン@keny_lala のひとこと。






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でハードコードしてあるんだろう。 ともあれ、これならフツーのアプリが使うこともなさそうなのでこれで検出できそう。





:(;゙゚’ω゚’): あ、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);
  }
というわけで接続時に 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出しに行くか?

0 件のコメント :

コメントを投稿