2015年7月16日木曜日

MySQL 5.7でshow_compatibility_56= 0だとレプリケーションスレーブがつながらないかも知れない(修正されました)

【2015/12/15 22:20】


昨日の 日々の覚書: MySQL 5.7では迂闊にperformance_schemaをOFFするとSHOW STATUSが使えない の派生バージョン。

MySQL 5.7.8以降、show_compatibility_56= 0が暗黙のデフォルトになり、SHOW VARIABLESとかはinformation_schemaではなくperformance_schemaを見に行くようになる。performance_schema.*_variablesテーブルにSELECT権限がないとSHOW VARIABLESは転ける。

さて…レプリケーションスレーブを作ろうと思った時、どんな権限を持ったユーザーを作るか。
俺ならこうだ。


mysql> CREATE USER replicator;
Query OK, 0 rows affected (0.07 sec)

mysql> GRANT replication slave ON *.* TO replicator;
Query OK, 0 rows affected (0.01 sec)

ホストの指定がないのとパスワードがからっぽなのはおいておいて、replication slave権限だけ渡す。これで必要十分だ。必要十分 *だった*

レプリケーションスレーブは接続時にいくつかのクエリーを叩いてマスターのステータスを確認する。こんな感じに。


2015-07-16T10:02:03.540261Z   17 Connect        replicator@172.17.0.13 on  using TCP/IP
2015-07-16T10:02:03.541390Z   17 Query  SELECT UNIX_TIMESTAMP()
2015-07-16T10:02:03.543327Z   17 Query  SHOW GLOBAL VARIABLES LIKE 'SERVER_ID'
2015-07-16T10:02:03.553855Z   17 Query  SET @master_heartbeat_period= 30000001024
2015-07-16T10:02:03.555791Z   17 Query  SET @master_binlog_checksum= @@global.binlog_checksum
2015-07-16T10:02:03.563154Z   17 Query  SELECT @master_binlog_checksum
2015-07-16T10:02:03.563764Z   17 Query  SELECT @@GLOBAL.GTID_MODE
2015-07-16T10:02:03.563909Z   17 Query  SHOW GLOBAL VARIABLES LIKE 'SERVER_UUID'
2015-07-16T10:02:03.564396Z   17 Query  SET @slave_uuid= 'b0a21916-2b9f-11e5-b413-0242ac11000d'
2015-07-16T10:02:03.564717Z   17 Binlog Dump GTID       Log: '' Pos: 4 GTIDs: 'b0a21916-2b9f-11e5-b413-0242ac11000d:1-133'

そう、SHOW GLOBAL VARIABLESだ。SELECT @@GLOBAL.GTID_MODEも同じことだ。
つまり、show_compatibility_56= OFFな状態でperformance_schema.global_variablesにSELECT権限のないユーザーでレプリケーションをさせようとすると


mysql> show slave status\G
*************************** 1. row ***************************
..
                Last_IO_Errno: 1142
                Last_IO_Error: The slave I/O thread stops because a fatal error is encountered when it try to get the value of SERVER_ID variable from master. Error: SELECT command denied to user 'replicator'@'172.17.0.13' for table 'global_variables'
..
1 row in set (0.00 sec)

こうなる。罠い。

既にバグレポートされてた。
MySQL Bugs: #77732: REGRESSION: replication fails for insufficient privileges

0 件のコメント :

コメントを投稿