Details
-
Bug
-
Status: Closed (View Workflow)
-
Major
-
Resolution: Not a Bug
-
10.1.18
Description
If a MariaDB server has replication filters configured for a multi-source replication connection and then if mysqld restarts, the slave thread will start to filter all data for that slave connection.
This problem was seen with the following replication topology:
MariaDB 10.1.18 master ===> MaxScale 1.4.3 binlog router ===> MariaDB 10.1.18 slave
However, I am not sure if the intermediate MaxScale master is required for this bug to occur.
The MariaDB master has the following configuration file:
[mariadb-10.1]
|
server_id=1
|
log_bin=mariadb-bin
|
The MariaDB slave has the following configuration file:
[mariadb-10.1]
|
server_id=3
|
maxscale_master.replicate_do_db="db1,db2"
|
And MaxScale has the following configuration file:
[maxscale]
|
threads=4
|
|
[Replication]
|
type=service
|
router=binlogrouter
|
version_string=10.0.27-log
|
user=repl
|
passwd=password
|
router_options=server_id=2,binlogdir=/var/log/binlogs,mariadb10-compatibility=1
|
|
[Replication Listener]
|
type=listener
|
service=Replication
|
protocol=MySQLClient
|
port=3306
|
I executed the following to set up replication on the MaxScale instance:
$ mysql -u repl -ppassword -h 127.0.0.1
|
Welcome to the MariaDB monitor. Commands end with ; or \g.
|
Your MySQL connection id is 9422
|
Server version: 10.0.27-log
|
|
Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.
|
|
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
|
|
MySQL [(none)]> CHANGE MASTER TO Master_host='172.30.0.32', Master_log_file='mariadb-bin.000001', Master_user='repl', Master_password='password';
|
Query OK, 0 rows affected (0.00 sec)
|
|
MySQL [(none)]> START SLAVE;
|
Query OK, 0 rows affected (0.01 sec)
|
|
MySQL [(none)]> SHOW SLAVE STATUS\G
|
*************************** 1. row ***************************
|
Slave_IO_State: Binlog Dump
|
Master_Host: 172.30.0.32
|
Master_User: repl
|
Master_Port: 3306
|
Connect_Retry: 60
|
Master_Log_File: mariadb-bin.000001
|
Read_Master_Log_Pos: 494
|
Relay_Log_File: mariadb-bin.000001
|
Relay_Log_Pos: 494
|
Relay_Master_Log_File: mariadb-bin.000001
|
Slave_IO_Running: Yes
|
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: 494
|
Relay_Log_Space: 494
|
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: 0
|
Master_SSL_Verify_Server_Cert: No
|
Last_IO_Errno: 0
|
Last_IO_Error:
|
Last_SQL_Errno: 0
|
Last_SQL_Error:
|
Replicate_Ignore_Server_Ids:
|
Master_Server_Id: 1
|
Master_UUID: 924649fb-9c77-11e6-8949-022c8e9e146b
|
Master_Info_File:
|
SQL_Delay: 0
|
SQL_Remaining_Delay: NULL
|
Slave_SQL_Running_State: Slave running
|
Master_Retry_Count: 1000
|
Master_Bind:
|
Last_IO_Error_TimeStamp:
|
Last_SQL_Error_Timestamp:
|
Master_SSL_Crl:
|
Master_SSL_Crlpath:
|
Retrieved_Gtid_Set:
|
Executed_Gtid_Set:
|
Auto_Position:
|
1 row in set (0.00 sec)
|
And I executed the following commands separately on the MariaDB master and slave:
MariaDB [(none)]> CREATE DATABASE db1;
|
Query OK, 1 row affected (0.00 sec)
|
|
MariaDB [(none)]> CREATE DATABASE db2;
|
Query OK, 1 row affected (0.00 sec)
|
|
MariaDB [(none)]> USE db1;
|
Database changed
|
MariaDB [db1]> CREATE TABLE tab (id int primary key, str varchar(50));
|
Query OK, 0 rows affected (0.01 sec)
|
Then I told the slave to start replicating from MaxScale in the following way:
MariaDB [db1]> CHANGE MASTER 'maxscale_master' TO Master_host='172.30.0.106', Master_log_file='mariadb-bin.000001', Master_log_pos=1165, Master_user='repl', Master_password='password';
|
Query OK, 0 rows affected (0.01 sec)
|
|
MariaDB [db1]> SET GLOBAL maxscale_master.replicate_do_db="db1,db2";
|
Query OK, 0 rows affected (0.00 sec)
|
|
MariaDB [db1]> START SLAVE 'maxscale_master';
|
Query OK, 0 rows affected (0.01 sec)
|
|
MariaDB [db1]> SHOW SLAVE 'maxscale_master' STATUS\G
|
*************************** 1. row ***************************
|
Slave_IO_State: Waiting for master to send event
|
Master_Host: 172.30.0.106
|
Master_User: repl
|
Master_Port: 3306
|
Connect_Retry: 60
|
Master_Log_File: mariadb-bin.000001
|
Read_Master_Log_Pos: 1165
|
Relay_Log_File: ip-172-30-0-46-relay-bin-maxscale_master.000002
|
Relay_Log_Pos: 539
|
Relay_Master_Log_File: mariadb-bin.000001
|
Slave_IO_Running: Yes
|
Slave_SQL_Running: Yes
|
Replicate_Do_DB: db1,db2
|
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: 1165
|
Relay_Log_Space: 862
|
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: 0
|
Master_SSL_Verify_Server_Cert: No
|
Last_IO_Errno: 0
|
Last_IO_Error:
|
Last_SQL_Errno: 0
|
Last_SQL_Error:
|
Replicate_Ignore_Server_Ids:
|
Master_Server_Id: 1
|
Master_SSL_Crl:
|
Master_SSL_Crlpath:
|
Using_Gtid: No
|
Gtid_IO_Pos:
|
Replicate_Do_Domain_Ids:
|
Replicate_Ignore_Domain_Ids:
|
Parallel_Mode: conservative
|
1 row in set (0.00 sec)
|
To test it, I inserted some data on the master:
MariaDB [(none)]> USE db1;
|
Reading table information for completion of table and column names
|
You can turn off this feature to get a quicker startup with -A
|
|
Database changed
|
MariaDB [db1]> INSERT INTO tab VALUES (1, 'str1');
|
Query OK, 1 row affected (0.00 sec)
|
And I confirmed that the new data exists on the slave:
MariaDB [db1]> SELECT * FROM tab;
|
+----+------+
|
| id | str |
|
+----+------+
|
| 1 | str1 |
|
+----+------+
|
1 row in set (0.00 sec)
|
|
MariaDB [db1]> SHOW SLAVE 'maxscale_master' STATUS\G
|
*************************** 1. row ***************************
|
Slave_IO_State: Waiting for master to send event
|
Master_Host: 172.30.0.106
|
Master_User: repl
|
Master_Port: 3306
|
Connect_Retry: 60
|
Master_Log_File: mariadb-bin.000001
|
Read_Master_Log_Pos: 1326
|
Relay_Log_File: ip-172-30-0-46-relay-bin-maxscale_master.000002
|
Relay_Log_Pos: 700
|
Relay_Master_Log_File: mariadb-bin.000001
|
Slave_IO_Running: Yes
|
Slave_SQL_Running: Yes
|
Replicate_Do_DB: db1,db2
|
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: 1326
|
Relay_Log_Space: 1023
|
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: 0
|
Master_SSL_Verify_Server_Cert: No
|
Last_IO_Errno: 0
|
Last_IO_Error:
|
Last_SQL_Errno: 0
|
Last_SQL_Error:
|
Replicate_Ignore_Server_Ids:
|
Master_Server_Id: 1
|
Master_SSL_Crl:
|
Master_SSL_Crlpath:
|
Using_Gtid: No
|
Gtid_IO_Pos:
|
Replicate_Do_Domain_Ids:
|
Replicate_Ignore_Domain_Ids:
|
Parallel_Mode: conservative
|
1 row in set (0.00 sec)
|
Now let's try restarting mysqld on the slave:
sudo systemctl restart mariadb
|
When the slave is back up, replication appears to be working:
MariaDB [(none)]> SHOW SLAVE 'maxscale_master' STATUS\G
|
*************************** 1. row ***************************
|
Slave_IO_State: Waiting for master to send event
|
Master_Host: 172.30.0.106
|
Master_User: repl
|
Master_Port: 3306
|
Connect_Retry: 60
|
Master_Log_File: mariadb-bin.000001
|
Read_Master_Log_Pos: 1326
|
Relay_Log_File: ip-172-30-0-46-relay-bin-maxscale_master.000004
|
Relay_Log_Pos: 539
|
Relay_Master_Log_File: mariadb-bin.000001
|
Slave_IO_Running: Yes
|
Slave_SQL_Running: Yes
|
Replicate_Do_DB: db1,db2
|
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: 1326
|
Relay_Log_Space: 862
|
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: 0
|
Master_SSL_Verify_Server_Cert: No
|
Last_IO_Errno: 0
|
Last_IO_Error:
|
Last_SQL_Errno: 0
|
Last_SQL_Error:
|
Replicate_Ignore_Server_Ids:
|
Master_Server_Id: 1
|
Master_SSL_Crl:
|
Master_SSL_Crlpath:
|
Using_Gtid: No
|
Gtid_IO_Pos:
|
Replicate_Do_Domain_Ids:
|
Replicate_Ignore_Domain_Ids:
|
Parallel_Mode: conservative
|
1 row in set (0.00 sec)
|
But let's try inserting more data into the master to test:
MariaDB [db1]> INSERT INTO tab VALUES (2, 'str2');
|
Query OK, 1 row affected (0.00 sec)
|
Does this new row exist on the slave?
MariaDB [db1]> SELECT * FROM tab;
|
+----+------+
|
| id | str |
|
+----+------+
|
| 1 | str1 |
|
+----+------+
|
1 row in set (0.00 sec)
|
It does not! But supposedly, replication is still working fine on the slave. We can even see that (Relay_Master_Log_File, Exec_Master_Log_Pos) have changed:
MariaDB [db1]> SHOW SLAVE 'maxscale_master' STATUS\G
|
*************************** 1. row ***************************
|
Slave_IO_State: Waiting for master to send event
|
Master_Host: 172.30.0.106
|
Master_User: repl
|
Master_Port: 3306
|
Connect_Retry: 60
|
Master_Log_File: mariadb-bin.000001
|
Read_Master_Log_Pos: 1487
|
Relay_Log_File: ip-172-30-0-46-relay-bin-maxscale_master.000004
|
Relay_Log_Pos: 700
|
Relay_Master_Log_File: mariadb-bin.000001
|
Slave_IO_Running: Yes
|
Slave_SQL_Running: Yes
|
Replicate_Do_DB: db1,db2
|
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: 1487
|
Relay_Log_Space: 1023
|
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: 0
|
Master_SSL_Verify_Server_Cert: No
|
Last_IO_Errno: 0
|
Last_IO_Error:
|
Last_SQL_Errno: 0
|
Last_SQL_Error:
|
Replicate_Ignore_Server_Ids:
|
Master_Server_Id: 1
|
Master_SSL_Crl:
|
Master_SSL_Crlpath:
|
Using_Gtid: No
|
Gtid_IO_Pos:
|
Replicate_Do_Domain_Ids:
|
Replicate_Ignore_Domain_Ids:
|
Parallel_Mode: conservative
|
1 row in set (0.00 sec)
|
And we can see that the new transaction is present in the slave's relay log:
$ sudo mysqlbinlog --verbose /var/lib/mysql/ip-172-30-0-46-relay-bin-maxscale_master.000004 --start-position=539
|
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
|
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
|
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
|
DELIMITER /*!*/;
|
# at 4
|
#161027 15:42:20 server id 3 end_log_pos 249 Start: binlog v 4, server v 10.1.18-MariaDB created 161027 15:42:20
|
BINLOG '
|
nFgSWA8DAAAA9QAAAPkAAAAAAAQAMTAuMS4xOC1NYXJpYURCAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAA3QAEGggAAAAICAgCAAAACgoKAAAAAAAA
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
AAAAAAAAAAAEEwQAAPeDzIg=
|
'/*!*/;
|
# at 294
|
#161027 15:42:20 server id 1 end_log_pos 0 Start: binlog v 4, server v 10.1.18-MariaDB created 161027 15:42:20 at startup
|
ROLLBACK/*!*/;
|
BINLOG '
|
nFgSWA8BAAAA9QAAAAAAAAAAAAQAMTAuMS4xOC1NYXJpYURCAGxvZwAAAAAAAAAAAAAAAAAAAAAA
|
AAAAAAAAAAAAAAAAAABKThJYEzgNAAgAEgAEBAQEEgAA3QAEGggAAAAICAgCAAAACgoKAAAAAAAA
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
AAAAAAAAAAAEEwQAAEEOVFU=
|
'/*!*/;
|
# at 539
|
#161027 15:43:10 server id 1 end_log_pos 1364 GTID 0-1-8 trans
|
/*!100101 SET @@session.skip_parallel_replication=0*//*!*/;
|
/*!100001 SET @@session.gtid_domain_id=0*//*!*/;
|
/*!100001 SET @@session.server_id=1*//*!*/;
|
/*!100001 SET @@session.gtid_seq_no=8*//*!*/;
|
BEGIN
|
/*!*/;
|
# at 577
|
#161027 15:43:10 server id 1 end_log_pos 1460 Query thread_id=9 exec_time=0 error_code=0
|
use `db1`/*!*/;
|
SET TIMESTAMP=1477597390/*!*/;
|
SET @@session.pseudo_thread_id=9/*!*/;
|
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
|
SET @@session.sql_mode=1342177280/*!*/;
|
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
|
/*!\C utf8 *//*!*/;
|
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=8/*!*/;
|
SET @@session.lc_time_names=0/*!*/;
|
SET @@session.collation_database=DEFAULT/*!*/;
|
INSERT INTO tab VALUES (2, 'str2')
|
/*!*/;
|
# at 673
|
#161027 15:43:10 server id 1 end_log_pos 1487 Xid = 51
|
COMMIT/*!*/;
|
DELIMITER ;
|
# End of log file
|
ROLLBACK /* added by mysqlbinlog */;
|
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
|
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
|
To get replication working again, we have to do the following process on the slave:
MariaDB [(none)]> STOP SLAVE 'maxscale_master';
|
Query OK, 0 rows affected (0.00 sec)
|
|
MariaDB [(none)]> RESET SLAVE 'maxscale_master';
|
Query OK, 0 rows affected (0.00 sec)
|
|
MariaDB [(none)]> CHANGE MASTER 'maxscale_master' TO Master_host='172.30.0.106', Master_log_file='mariadb-bin.000001', Master_log_pos=1326, Master_user='repl', Master_password='password';
|
Query OK, 0 rows affected (0.01 sec)
|
|
MariaDB [(none)]> SET GLOBAL maxscale_master.replicate_do_db="db1,db2";
|
Query OK, 0 rows affected (0.00 sec)
|
|
MariaDB [(none)]> START SLAVE 'maxscale_master';
|
Query OK, 0 rows affected (0.00 sec)
|
|
MariaDB [(none)]> SHOW SLAVE 'maxscale_master' STATUS\G
|
*************************** 1. row ***************************
|
Slave_IO_State: Waiting for master to send event
|
Master_Host: 172.30.0.106
|
Master_User: repl
|
Master_Port: 3306
|
Connect_Retry: 60
|
Master_Log_File: mariadb-bin.000001
|
Read_Master_Log_Pos: 1487
|
Relay_Log_File: ip-172-30-0-46-relay-bin-maxscale_master.000002
|
Relay_Log_Pos: 700
|
Relay_Master_Log_File: mariadb-bin.000001
|
Slave_IO_Running: Yes
|
Slave_SQL_Running: Yes
|
Replicate_Do_DB: db1,db2
|
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: 1487
|
Relay_Log_Space: 1023
|
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: 0
|
Master_SSL_Verify_Server_Cert: No
|
Last_IO_Errno: 0
|
Last_IO_Error:
|
Last_SQL_Errno: 0
|
Last_SQL_Error:
|
Replicate_Ignore_Server_Ids:
|
Master_Server_Id: 1
|
Master_SSL_Crl:
|
Master_SSL_Crlpath:
|
Using_Gtid: No
|
Gtid_IO_Pos:
|
Replicate_Do_Domain_Ids:
|
Replicate_Ignore_Domain_Ids:
|
Parallel_Mode: conservative
|
1 row in set (0.00 sec)
|
Does the missing row exist on the slave now?:
MariaDB [(none)]> USE db1;
|
Reading table information for completion of table and column names
|
You can turn off this feature to get a quicker startup with -A
|
|
Database changed
|
MariaDB [db1]> SELECT * FROM tab;
|
+----+------+
|
| id | str |
|
+----+------+
|
| 1 | str1 |
|
| 2 | str2 |
|
+----+------+
|
2 rows in set (0.00 sec)
|
Yes, it does.