Description:
GRANT PROXY command for non existent user breaks replication.
Cannot reproduce with earlier major versions.
master [localhost] {root} ((none)) > select @@version;
+------------+
| @@version |
+------------+
| 5.7.17-log |
+------------+
1 row in set (0.00 sec)
How to repeat:
master [localhost] {root} ((none)) > flush logs;
Query OK, 0 rows affected (0.03 sec)
master [localhost] {root} ((none)) > CREATE USER 'testuser'@'%';
Query OK, 0 rows affected (0.01 sec)
master [localhost] {root} ((none)) > grant proxy on test2 to testuser;
Query OK, 0 rows affected (0.01 sec)
master [localhost] {root} ((none)) > show binlog events in 'mysql-bin.000002'\G
*************************** 1. row ***************************
Log_name: mysql-bin.000002
Pos: 4
Event_type: Format_desc
Server_id: 1
End_log_pos: 123
Info: Server ver: 5.7.17-log, Binlog ver: 4
*************************** 2. row ***************************
Log_name: mysql-bin.000002
Pos: 123
Event_type: Previous_gtids
Server_id: 1
End_log_pos: 154
Info:
*************************** 3. row ***************************
Log_name: mysql-bin.000002
Pos: 154
Event_type: Anonymous_Gtid
Server_id: 1
End_log_pos: 219
Info: SET @@SESSION.GTID_NEXT= 'ANONYMOUS'
*************************** 4. row ***************************
Log_name: mysql-bin.000002
Pos: 219
Event_type: Query
Server_id: 1
End_log_pos: 356
Info: CREATE USER 'testuser'@'%' IDENTIFIED WITH 'mysql_native_password'
*************************** 5. row ***************************
Log_name: mysql-bin.000002
Pos: 356
Event_type: Anonymous_Gtid
Server_id: 1
End_log_pos: 421
Info: SET @@SESSION.GTID_NEXT= 'ANONYMOUS'
*************************** 6. row ***************************
Log_name: mysql-bin.000002
Pos: 421
Event_type: Query
Server_id: 1
End_log_pos: 556
Info: GRANT USAGE ON *.* TO 'test2'@'%','testuser'@'%'
6 rows in set (0.00 sec)
master [localhost] {root} ((none)) > select user,host from mysql.user where user like 'test%';
+----------+------+
| user | host |
+----------+------+
| testuser | % |
+----------+------+
1 row in set (0.00 sec)
master [localhost] {root} ((none)) > show grants for 'testuser'@'%';
+----------------------------------------------+
| Grants for testuser@% |
+----------------------------------------------+
| GRANT USAGE ON *.* TO 'testuser'@'%' |
| GRANT PROXY ON 'test2'@'%' TO 'testuser'@'%' |
+----------------------------------------------+
2 rows in set (0.00 sec)
-- SLAVE
slave1 [localhost] {msandbox} ((none)) > show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 127.0.0.1
Master_User: rsandbox
Master_Port: 20192
Connect_Retry: 60
Master_Log_File: mysql-bin.000002
Read_Master_Log_Pos: 556
Relay_Log_File: mysql-relay.000005
Relay_Log_Pos: 569
Relay_Master_Log_File: mysql-bin.000002
Slave_IO_Running: Yes
Slave_SQL_Running: No
...
Last_Errno: 1133
Last_Error: Error 'Can't find any matching row in the user table' on query. Default database: ''. Query: 'GRANT USAGE ON *.* TO 'test2'@'%','testuser'@'%''
slave1 [localhost] {msandbox} ((none)) > show grants for 'testuser'@'%';
+--------------------------------------+
| Grants for testuser@% |
+--------------------------------------+
| GRANT USAGE ON *.* TO 'testuser'@'%' |
+--------------------------------------+
1 row in set (0.00 sec)
-- workaround for broken replication:
slave1 [localhost] {msandbox} ((none)) > CREATE USER 'test2'@'%';
Query OK, 0 rows affected (0.01 sec)
slave1 [localhost] {msandbox} ((none)) > start slave;
Query OK, 0 rows affected (0.01 sec)
Suggested fix:
Query results should be consistent on master and slave.
Description: GRANT PROXY command for non existent user breaks replication. Cannot reproduce with earlier major versions. master [localhost] {root} ((none)) > select @@version; +------------+ | @@version | +------------+ | 5.7.17-log | +------------+ 1 row in set (0.00 sec) How to repeat: master [localhost] {root} ((none)) > flush logs; Query OK, 0 rows affected (0.03 sec) master [localhost] {root} ((none)) > CREATE USER 'testuser'@'%'; Query OK, 0 rows affected (0.01 sec) master [localhost] {root} ((none)) > grant proxy on test2 to testuser; Query OK, 0 rows affected (0.01 sec) master [localhost] {root} ((none)) > show binlog events in 'mysql-bin.000002'\G *************************** 1. row *************************** Log_name: mysql-bin.000002 Pos: 4 Event_type: Format_desc Server_id: 1 End_log_pos: 123 Info: Server ver: 5.7.17-log, Binlog ver: 4 *************************** 2. row *************************** Log_name: mysql-bin.000002 Pos: 123 Event_type: Previous_gtids Server_id: 1 End_log_pos: 154 Info: *************************** 3. row *************************** Log_name: mysql-bin.000002 Pos: 154 Event_type: Anonymous_Gtid Server_id: 1 End_log_pos: 219 Info: SET @@SESSION.GTID_NEXT= 'ANONYMOUS' *************************** 4. row *************************** Log_name: mysql-bin.000002 Pos: 219 Event_type: Query Server_id: 1 End_log_pos: 356 Info: CREATE USER 'testuser'@'%' IDENTIFIED WITH 'mysql_native_password' *************************** 5. row *************************** Log_name: mysql-bin.000002 Pos: 356 Event_type: Anonymous_Gtid Server_id: 1 End_log_pos: 421 Info: SET @@SESSION.GTID_NEXT= 'ANONYMOUS' *************************** 6. row *************************** Log_name: mysql-bin.000002 Pos: 421 Event_type: Query Server_id: 1 End_log_pos: 556 Info: GRANT USAGE ON *.* TO 'test2'@'%','testuser'@'%' 6 rows in set (0.00 sec) master [localhost] {root} ((none)) > select user,host from mysql.user where user like 'test%'; +----------+------+ | user | host | +----------+------+ | testuser | % | +----------+------+ 1 row in set (0.00 sec) master [localhost] {root} ((none)) > show grants for 'testuser'@'%'; +----------------------------------------------+ | Grants for testuser@% | +----------------------------------------------+ | GRANT USAGE ON *.* TO 'testuser'@'%' | | GRANT PROXY ON 'test2'@'%' TO 'testuser'@'%' | +----------------------------------------------+ 2 rows in set (0.00 sec) -- SLAVE slave1 [localhost] {msandbox} ((none)) > show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 127.0.0.1 Master_User: rsandbox Master_Port: 20192 Connect_Retry: 60 Master_Log_File: mysql-bin.000002 Read_Master_Log_Pos: 556 Relay_Log_File: mysql-relay.000005 Relay_Log_Pos: 569 Relay_Master_Log_File: mysql-bin.000002 Slave_IO_Running: Yes Slave_SQL_Running: No ... Last_Errno: 1133 Last_Error: Error 'Can't find any matching row in the user table' on query. Default database: ''. Query: 'GRANT USAGE ON *.* TO 'test2'@'%','testuser'@'%'' slave1 [localhost] {msandbox} ((none)) > show grants for 'testuser'@'%'; +--------------------------------------+ | Grants for testuser@% | +--------------------------------------+ | GRANT USAGE ON *.* TO 'testuser'@'%' | +--------------------------------------+ 1 row in set (0.00 sec) -- workaround for broken replication: slave1 [localhost] {msandbox} ((none)) > CREATE USER 'test2'@'%'; Query OK, 0 rows affected (0.01 sec) slave1 [localhost] {msandbox} ((none)) > start slave; Query OK, 0 rows affected (0.01 sec) Suggested fix: Query results should be consistent on master and slave.