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.