Bug #77732 | REGRESSION: replication fails for insufficient privileges | ||
---|---|---|---|
Submitted: | 15 Jul 2015 13:40 | Modified: | 25 Sep 2015 18:26 |
Reporter: | Giuseppe Maxia (OCA) | Email Updates: | |
Status: | Closed | Impact on me: | |
Category: | MySQL Server: Replication | Severity: | S1 (Critical) |
Version: | 5.7.8, 5.7.9, 8.0.0 | OS: | MacOS |
Assigned to: | CPU Architecture: | Any | |
Tags: | privileges, replication |
[15 Jul 2015 13:40]
Giuseppe Maxia
[15 Jul 2015 14:04]
Giuseppe Maxia
There is a workaround for this issue. Adding show_compatibility_56=on to the master configuration will resume the previous behavior.
[16 Jul 2015 7:18]
MySQL Verification Team
Hello Giuseppe, Thank you for the report. Observed this with 5.7.9 builds. Thanks, Umesh
[16 Jul 2015 8:32]
MySQL Verification Team
test results
Attachment: 77732.results (application/octet-stream, text), 12.69 KiB.
[16 Jul 2015 9:45]
MySQL Verification Team
// 5.8.0 is also affected [umshastr@hod03]/export/umesh/server/binaries/mysql-advanced-5.8.0: bin/mysql -uroot -S run/slave.sock Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.8.0-m17-enterprise-commercial-advanced-log MySQL Enterprise Server - Advanced Edition (Commercial) Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show variables like 'port'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | port | 15001 | +---------------+-------+ 1 row in set (0.00 sec) mysql> CHANGE MASTER TO -> MASTER_HOST='localhost', -> MASTER_PORT=15000, -> MASTER_USER='repl', -> MASTER_PASSWORD='slavepass', -> MASTER_LOG_FILE='master-bin.000001', -> MASTER_LOG_POS=650; Query OK, 0 rows affected, 2 warnings (0.00 sec) mysql> start slave; Query OK, 0 rows affected (0.01 sec) mysql> show slave status\G *************************** 1. row *************************** Slave_IO_State: Master_Host: localhost Master_User: repl Master_Port: 15000 Connect_Retry: 60 Master_Log_File: master-bin.000001 Read_Master_Log_Pos: 650 Relay_Log_File: slave-relay-bin.000001 Relay_Log_Pos: 4 Relay_Master_Log_File: master-bin.000001 Slave_IO_Running: No Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 650 Relay_Log_Space: 154 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: NULL Master_SSL_Verify_Server_Cert: No 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 'repl'@'localhost' for table 'global_variables' Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 0 Master_UUID: Master_Info_File: /export/umesh/server/binaries/mysql-advanced-5.8.0/slave/master.info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: 150716 11:43:13 Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0 Replicate_Rewrite_DB: Channel_Name: 1 row in set (0.00 sec) // 2015-07-16T09:43:13.733012Z 3 Connect repl@localhost on using TCP/IP 2015-07-16T09:43:13.733200Z 3 Query SELECT UNIX_TIMESTAMP() 2015-07-16T09:43:13.733313Z 3 Query SHOW GLOBAL VARIABLES LIKE 'SERVER_ID' 2015-07-16T09:43:13.733406Z 3 Quit 2015-07-16T09:43:52.203148Z 2 Quit
[20 Jul 2015 3:45]
Jesper wisborg Krogh
Posted by developer: This will also happen in 5.7.6 with show_compatibility_56 = OFF (but is not the default in 5.7.6). Instead of setting show_compatibility_56 = ON it's also possible to grant the replication user SELECT on performance_schema.global_variables: GRANT SELECT ON `performance_schema`.`global_variables` TO ...
[20 Jul 2015 4:36]
Giuseppe Maxia
If we need to add a privilege to the replication user, we contradict the manual, which states that the only privilege needed is REPLICATION SLAVE. https://dev.mysql.com/doc/refman/5.7/en/replication-howto-repuser.html The best fix would be changing the behavior of the replication user. Instead of "show variables like 'server_id'", it should run "SELECT @@server_id"
[27 Jul 2015 18:10]
Giuseppe Maxia
This issue causes also replication to fail when we enable the semi-synch replication plugin. In this scenario, the replication user issues the following commands: Time Id Command Argument 2015-07-27T18:04:03.442994Z 6 Quit 2015-07-27T18:04:14.960834Z 7 Connect rsandbox@localhost on using TCP/IP 2015-07-27T18:04:14.961001Z 7 Query SELECT UNIX_TIMESTAMP() 2015-07-27T18:04:14.961157Z 7 Query SHOW GLOBAL VARIABLES LIKE 'SERVER_ID' 2015-07-27T18:04:14.961838Z 7 Query SET @master_heartbeat_period= 30000001024 2015-07-27T18:04:14.961988Z 7 Query SET @master_binlog_checksum= @@global.binlog_checksum 2015-07-27T18:04:14.962086Z 7 Query SELECT @master_binlog_checksum 2015-07-27T18:04:14.962189Z 7 Query SELECT @@GLOBAL.GTID_MODE 2015-07-27T18:04:14.962312Z 7 Query SHOW GLOBAL VARIABLES LIKE 'SERVER_UUID' 2015-07-27T18:04:14.962846Z 7 Query SET @slave_uuid= 'c1243e74-3488-11e5-b17d-b0a321bc4c49' 2015-07-27T18:04:14.963053Z 7 Query SHOW VARIABLES LIKE 'rpl_semi_sync_master_enabled' 2015-07-27T18:04:14.963735Z 7 Query SET @rpl_semi_sync_slave= 1 2015-07-27T18:04:14.963929Z 7 Binlog Dump Log: 'mysql-bin.000002' Pos: 399 The command "SHOW VARIABLES LIKE 'rpl_semi_sync_master_enabled'" fails because the user does not have permission to access performance_schema.session_variables. This scenario happens when I gave the replication user SELECT privilege to performance_schema.global_variables. However, that privilege was not sufficient for semi-sync operations. Here, in addition to the general issue of requiring a table access privilege for the replication user where none was required before, we also have 'SHOW VARIABLES' instead of 'SHOW GLOBAL VARIABLES'.
[17 Aug 2015 14:41]
Simon Mudd
See also: bug#78107
[7 Sep 2015 14:53]
Jon Stephens
Documented fix in the MySQL 5.7.9 changelog as follows: Replication slaves could fail for having insufficient privileges when they had been granted only the REPLICATION SLAVE privilege. Closed.
[25 Sep 2015 18:23]
Chris Fidao
To be clear, it seems that the bug is "fixed" by saying that we must ALSO grant the SELECT privilege to the replication user, correct? Will this be documented in more places than the changelog?
[25 Sep 2015 18:26]
Giuseppe Maxia
I have tested a preview build of MySQL 5.7.9. The bug is fixed properly, meaning that the slave user will not need additional grants to run as expected.
[18 Jun 2016 21:26]
Omer Barnir
Posted by developer: Reported version value updated to reflect release name change from 5.8 to 8.0