mirror of
https://github.com/MariaDB/server.git
synced 2026-01-06 05:22:24 +03:00
When @@GLOBAL.gtid_strict_mode=1, then certain operations result in error that would otherwise result in out-of-order binlog files between servers. GTID sequence numbers are now allocated independently per domain; this results in less/no holes in GTID sequences, increasing the likelyhood that diverging binlogs will be caught by the slave when GTID strict mode is enabled.
368 lines
5.6 KiB
Plaintext
368 lines
5.6 KiB
Plaintext
include/rpl_init.inc [topology=1->2, 1->3, 1->4, 1->5]
|
|
ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB;
|
|
CREATE TABLE t4 (a INT, b INT, PRIMARY KEY (a,b)) Engine=InnoDB;
|
|
CREATE FUNCTION extract_gtid(d VARCHAR(100), s VARCHAR(100))
|
|
RETURNS VARCHAR(100) DETERMINISTIC
|
|
BEGIN
|
|
SET s= CONCAT(",", s, ",");
|
|
SET s= SUBSTR(s FROM LOCATE(CONCAT(",", d, "-"), s) + 1);
|
|
SET s= SUBSTR(s FROM 1 FOR LOCATE(",", s) - 1);
|
|
RETURN s;
|
|
END|
|
|
include/stop_slave.inc
|
|
CHANGE MASTER TO master_use_gtid=current_pos;
|
|
include/stop_slave.inc
|
|
CHANGE MASTER TO master_use_gtid=current_pos;
|
|
include/stop_slave.inc
|
|
CHANGE MASTER TO master_use_gtid=current_pos;
|
|
include/stop_slave.inc
|
|
CHANGE MASTER TO master_use_gtid=current_pos;
|
|
SET gtid_domain_id= 1;
|
|
CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=InnoDB;
|
|
INSERT INTO t1 VALUES (1);
|
|
INSERT INTO t1 VALUES (2);
|
|
INSERT INTO t4 VALUES (1, 1);
|
|
INSERT INTO t1 VALUES (3);
|
|
INSERT INTO t1 VALUES (4);
|
|
INSERT INTO t4 VALUES (1, 3);
|
|
SET gtid_domain_id= 2;
|
|
CREATE TABLE t2 (a INT PRIMARY KEY) ENGINE=InnoDB;
|
|
INSERT INTO t2 VALUES (1);
|
|
INSERT INTO t2 VALUES (2);
|
|
INSERT INTO t4 VALUES (2, 1);
|
|
INSERT INTO t2 VALUES (3);
|
|
INSERT INTO t2 VALUES (4);
|
|
INSERT INTO t4 VALUES (2, 3);
|
|
SET gtid_domain_id= 3;
|
|
CREATE TABLE t3 (a INT PRIMARY KEY) ENGINE=InnoDB;
|
|
INSERT INTO t3 VALUES (1);
|
|
INSERT INTO t3 VALUES (2);
|
|
INSERT INTO t4 VALUES (3, 1);
|
|
INSERT INTO t3 VALUES (3);
|
|
INSERT INTO t3 VALUES (4);
|
|
INSERT INTO t4 VALUES (3, 3);
|
|
START SLAVE UNTIL master_gtid_pos= "1-1-4,2-1-4,3-1-4";
|
|
START SLAVE UNTIL master_gtid_pos= "1-1-1,2-1-4,3-1-7";
|
|
START SLAVE UNTIL master_gtid_pos= "2-1-1,3-1-4,1-1-7";
|
|
START SLAVE UNTIL master_gtid_pos= "3-1-1,1-1-4,2-1-7";
|
|
include/wait_for_slave_to_stop.inc
|
|
SELECT * FROM t1 ORDER BY a;
|
|
a
|
|
1
|
|
2
|
|
SELECT * FROM t2 ORDER BY a;
|
|
a
|
|
1
|
|
2
|
|
SELECT * FROM t3 ORDER BY a;
|
|
a
|
|
1
|
|
2
|
|
SELECT * FROM t4 ORDER BY a,b;
|
|
a b
|
|
1 1
|
|
2 1
|
|
3 1
|
|
include/wait_for_slave_to_stop.inc
|
|
SELECT * FROM t1 ORDER BY a;
|
|
a
|
|
SELECT * FROM t2 ORDER BY a;
|
|
a
|
|
1
|
|
2
|
|
SELECT * FROM t3 ORDER BY a;
|
|
a
|
|
1
|
|
2
|
|
3
|
|
4
|
|
SELECT * FROM t4 ORDER BY a,b;
|
|
a b
|
|
2 1
|
|
3 1
|
|
3 3
|
|
include/wait_for_slave_to_stop.inc
|
|
SELECT * FROM t1 ORDER BY a;
|
|
a
|
|
1
|
|
2
|
|
3
|
|
4
|
|
SELECT * FROM t2 ORDER BY a;
|
|
a
|
|
SELECT * FROM t3 ORDER BY a;
|
|
a
|
|
1
|
|
2
|
|
SELECT * FROM t4 ORDER BY a,b;
|
|
a b
|
|
1 1
|
|
1 3
|
|
3 1
|
|
include/wait_for_slave_to_stop.inc
|
|
SELECT * FROM t1 ORDER BY a;
|
|
a
|
|
1
|
|
2
|
|
SELECT * FROM t2 ORDER BY a;
|
|
a
|
|
1
|
|
2
|
|
3
|
|
4
|
|
SELECT * FROM t3 ORDER BY a;
|
|
a
|
|
SELECT * FROM t4 ORDER BY a,b;
|
|
a b
|
|
1 1
|
|
2 1
|
|
2 3
|
|
*** Now replicate all extra changes from 3,4,5 to 2, in preparation for making 2 the new master. ***
|
|
CHANGE MASTER TO master_host = '127.0.0.1', master_port = SERVER_MYPORT_3;
|
|
START SLAVE UNTIL master_gtid_pos = "1-1-1,0-1-3,3-1-7,2-1-4";
|
|
include/wait_for_slave_to_stop.inc
|
|
SELECT * FROM t1 ORDER BY a;
|
|
a
|
|
1
|
|
2
|
|
SELECT * FROM t2 ORDER BY a;
|
|
a
|
|
1
|
|
2
|
|
SELECT * FROM t3 ORDER BY a;
|
|
a
|
|
1
|
|
2
|
|
3
|
|
4
|
|
SELECT * FROM t4 ORDER BY a,b;
|
|
a b
|
|
1 1
|
|
2 1
|
|
3 1
|
|
3 3
|
|
CHANGE MASTER TO master_host = '127.0.0.1', master_port = SERVER_MYPORT_4;
|
|
START SLAVE UNTIL master_gtid_pos = "1-1-7,0-1-3,3-1-4,2-1-1";
|
|
include/wait_for_slave_to_stop.inc
|
|
SELECT * FROM t1 ORDER BY a;
|
|
a
|
|
1
|
|
2
|
|
3
|
|
4
|
|
SELECT * FROM t2 ORDER BY a;
|
|
a
|
|
1
|
|
2
|
|
SELECT * FROM t3 ORDER BY a;
|
|
a
|
|
1
|
|
2
|
|
3
|
|
4
|
|
SELECT * FROM t4 ORDER BY a,b;
|
|
a b
|
|
1 1
|
|
1 3
|
|
2 1
|
|
3 1
|
|
3 3
|
|
CHANGE MASTER TO master_host = '127.0.0.1', master_port = SERVER_MYPORT_5;
|
|
START SLAVE UNTIL master_gtid_pos = "1-1-4,0-1-3,3-1-1,2-1-7";
|
|
include/wait_for_slave_to_stop.inc
|
|
SELECT * FROM t1 ORDER BY a;
|
|
a
|
|
1
|
|
2
|
|
3
|
|
4
|
|
SELECT * FROM t2 ORDER BY a;
|
|
a
|
|
1
|
|
2
|
|
3
|
|
4
|
|
SELECT * FROM t3 ORDER BY a;
|
|
a
|
|
1
|
|
2
|
|
3
|
|
4
|
|
SELECT * FROM t4 ORDER BY a,b;
|
|
a b
|
|
1 1
|
|
1 3
|
|
2 1
|
|
2 3
|
|
3 1
|
|
3 3
|
|
*** Now make 2 master and point 3,4,5 to the new master 2
|
|
SET gtid_domain_id= 1;
|
|
INSERT INTO t1 values (5);
|
|
INSERT INTO t4 values (1,5);
|
|
SET gtid_domain_id= 2;
|
|
INSERT INTO t2 values (5);
|
|
INSERT INTO t4 values (2,5);
|
|
SET gtid_domain_id= 3;
|
|
INSERT INTO t3 values (5);
|
|
INSERT INTO t4 values (3,5);
|
|
CHANGE MASTER TO master_host = '127.0.0.1', master_port = SERVER_MYPORT_2;
|
|
include/start_slave.inc
|
|
CHANGE MASTER TO master_host = '127.0.0.1', master_port = SERVER_MYPORT_2;
|
|
include/start_slave.inc
|
|
CHANGE MASTER TO master_host = '127.0.0.1', master_port = SERVER_MYPORT_2;
|
|
include/start_slave.inc
|
|
SELECT * FROM t1 ORDER BY a;
|
|
a
|
|
1
|
|
2
|
|
3
|
|
4
|
|
5
|
|
SELECT * FROM t2 ORDER BY a;
|
|
a
|
|
1
|
|
2
|
|
3
|
|
4
|
|
5
|
|
SELECT * FROM t3 ORDER BY a;
|
|
a
|
|
1
|
|
2
|
|
3
|
|
4
|
|
5
|
|
SELECT * FROM t4 ORDER BY a,b;
|
|
a b
|
|
1 1
|
|
1 3
|
|
1 5
|
|
2 1
|
|
2 3
|
|
2 5
|
|
3 1
|
|
3 3
|
|
3 5
|
|
SELECT * FROM t1 ORDER BY a;
|
|
a
|
|
1
|
|
2
|
|
3
|
|
4
|
|
5
|
|
SELECT * FROM t2 ORDER BY a;
|
|
a
|
|
1
|
|
2
|
|
3
|
|
4
|
|
5
|
|
SELECT * FROM t3 ORDER BY a;
|
|
a
|
|
1
|
|
2
|
|
3
|
|
4
|
|
5
|
|
SELECT * FROM t4 ORDER BY a,b;
|
|
a b
|
|
1 1
|
|
1 3
|
|
1 5
|
|
2 1
|
|
2 3
|
|
2 5
|
|
3 1
|
|
3 3
|
|
3 5
|
|
SELECT * FROM t1 ORDER BY a;
|
|
a
|
|
1
|
|
2
|
|
3
|
|
4
|
|
5
|
|
SELECT * FROM t2 ORDER BY a;
|
|
a
|
|
1
|
|
2
|
|
3
|
|
4
|
|
5
|
|
SELECT * FROM t3 ORDER BY a;
|
|
a
|
|
1
|
|
2
|
|
3
|
|
4
|
|
5
|
|
SELECT * FROM t4 ORDER BY a,b;
|
|
a b
|
|
1 1
|
|
1 3
|
|
1 5
|
|
2 1
|
|
2 3
|
|
2 5
|
|
3 1
|
|
3 3
|
|
3 5
|
|
*** Now let the old master join up as slave. ***
|
|
CHANGE MASTER TO master_host = '127.0.0.1', master_port = SERVER_MYPORT_2,
|
|
master_user = "root", master_use_gtid = current_pos;
|
|
include/start_slave.inc
|
|
SELECT * FROM t1 ORDER BY a;
|
|
a
|
|
1
|
|
2
|
|
3
|
|
4
|
|
5
|
|
SELECT * FROM t2 ORDER BY a;
|
|
a
|
|
1
|
|
2
|
|
3
|
|
4
|
|
5
|
|
SELECT * FROM t3 ORDER BY a;
|
|
a
|
|
1
|
|
2
|
|
3
|
|
4
|
|
5
|
|
SELECT * FROM t4 ORDER BY a,b;
|
|
a b
|
|
1 1
|
|
1 3
|
|
1 5
|
|
2 1
|
|
2 3
|
|
2 5
|
|
3 1
|
|
3 3
|
|
3 5
|
|
*** Finally move things back and clean up. ***
|
|
include/stop_slave.inc
|
|
RESET SLAVE ALL;
|
|
CHANGE MASTER TO master_host = '127.0.0.1', master_port = SERVER_MYPORT_1;
|
|
include/start_slave.inc
|
|
include/stop_slave.inc
|
|
CHANGE MASTER TO master_host = '127.0.0.1', master_port = SERVER_MYPORT_1;
|
|
include/start_slave.inc
|
|
include/stop_slave.inc
|
|
CHANGE MASTER TO master_host = '127.0.0.1', master_port = SERVER_MYPORT_1;
|
|
include/start_slave.inc
|
|
include/stop_slave.inc
|
|
CHANGE MASTER TO master_host = '127.0.0.1', master_port = SERVER_MYPORT_1;
|
|
include/start_slave.inc
|
|
SET gtid_domain_id = 0;
|
|
DROP TABLE t1;
|
|
DROP TABLE t2;
|
|
DROP TABLE t3;
|
|
DROP TABLE t4;
|
|
DROP FUNCTION extract_gtid;
|
|
include/rpl_end.inc
|