mariadb/storage/rocksdb/mysql-test/rocksdb_rpl/r/mdev12179.result
Kristian Nielsen 34f11b06e6 Move deletion of old GTID rows to slave background thread
This patch changes how old rows in mysql.gtid_slave_pos* tables are deleted.
Instead of doing it as part of every replicated transaction in
record_gtid(), it is done periodically (every @@gtid_cleanup_batch_size
transaction) in the slave background thread.

This removes the deletion step from the replication process in SQL or worker
threads, which could speed up replication with many small transactions. It
also decreases contention on the global mutex LOCK_slave_state. And it
simplifies the logic, eg. when a replicated transaction fails after having
deleted old rows.

With this patch, the deletion of old GTID rows happens asynchroneously and
slightly non-deterministic. Thus the number of old rows in
mysql.gtid_slave_pos can temporarily exceed @@gtid_cleanup_batch_size. But
all old rows will be deleted eventually after sufficiently many new GTIDs
have been replicated.
2018-12-07 07:10:40 +01:00

283 lines
7.8 KiB
Text

include/master-slave.inc
[connection master]
connection server_2;
include/stop_slave.inc
SET GLOBAL gtid_cleanup_batch_size = 999999999;
CHANGE MASTER TO master_use_gtid=slave_pos;
SET sql_log_bin=0;
CREATE TABLE mysql.gtid_slave_pos_innodb LIKE mysql.gtid_slave_pos;
ALTER TABLE mysql.gtid_slave_pos_innodb ENGINE=InnoDB;
CREATE TABLE mysql.gtid_slave_pos_rocksdb LIKE mysql.gtid_slave_pos;
ALTER TABLE mysql.gtid_slave_pos_rocksdb ENGINE=rocksdb;
CREATE TABLE mysql.gtid_slave_pos_myisam_redundant LIKE mysql.gtid_slave_pos;
CREATE TABLE mysql.gtid_slave_pos_innodb_redundant LIKE mysql.gtid_slave_pos;
ALTER TABLE mysql.gtid_slave_pos_innodb_redundant ENGINE=InnoDB;
call mtr.add_suppression("Ignoring redundant table.*since.*has the same storage engine");
include/start_slave.inc
connection server_1;
CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=MyISAM;
CREATE TABLE t2 (a INT PRIMARY KEY) ENGINE=InnoDB;
CREATE TABLE t3 (a INT PRIMARY KEY) ENGINE=rocksdb;
INSERT INTO t1 VALUES (1);
INSERT INTO t2 VALUES (1);
INSERT INTO t3 VALUES (1);
SELECT * FROM t1 ORDER BY a;
a
1
SELECT * FROM t2 ORDER BY a;
a
1
SELECT * FROM t3 ORDER BY a;
a
1
connection server_2;
SELECT * FROM t1 ORDER BY a;
a
1
SELECT * FROM t2 ORDER BY a;
a
1
SELECT * FROM t3 ORDER BY a;
a
1
SELECT * FROM mysql.gtid_slave_pos ORDER BY sub_id;
domain_id sub_id server_id seq_no
0 1 1 1
0 2 1 2
0 3 1 3
0 4 1 4
SELECT * FROM ( SELECT * FROM mysql.gtid_slave_pos_innodb
UNION ALL SELECT * FROM mysql.gtid_slave_pos_innodb_redundant) inner_select
ORDER BY sub_id;
domain_id sub_id server_id seq_no
0 5 1 5
SELECT * FROM mysql.gtid_slave_pos_rocksdb ORDER BY sub_id;
domain_id sub_id server_id seq_no
0 6 1 6
connection server_2;
FLUSH NO_WRITE_TO_BINLOG STATUS;
SET sql_log_bin=0;
SHOW STATUS LIKE "Transactions_multi_engine";
Variable_name Value
Transactions_multi_engine 0
INSERT INTO t1 VALUES (100);
SHOW STATUS LIKE "Transactions_multi_engine";
Variable_name Value
Transactions_multi_engine 0
INSERT INTO t2 VALUES (101);
SHOW STATUS LIKE "Transactions_multi_engine";
Variable_name Value
Transactions_multi_engine 0
INSERT INTO t3 VALUES (101);
SHOW STATUS LIKE "Transactions_multi_engine";
Variable_name Value
Transactions_multi_engine 0
BEGIN;
INSERT INTO t3 VALUES (102);
INSERT INTO t2 VALUES (103);
COMMIT;
SHOW STATUS LIKE "Transactions_multi_engine";
Variable_name Value
Transactions_multi_engine 1
BEGIN;
INSERT INTO t2 VALUES (104);
INSERT INTO t3 VALUES (105);
COMMIT;
SHOW STATUS LIKE "Transactions_multi_engine";
Variable_name Value
Transactions_multi_engine 2
UPDATE t2, t3 SET t2.a=106, t3.a=107 WHERE t2.a=104 AND t3.a=105;
SHOW STATUS LIKE "Transactions_multi_engine";
Variable_name Value
Transactions_multi_engine 3
SET sql_log_bin=1;
INSERT INTO t1 VALUES (200);
SHOW STATUS LIKE "Transactions_multi_engine";
Variable_name Value
Transactions_multi_engine 3
INSERT INTO t2 VALUES (201);
SHOW STATUS LIKE "Transactions_multi_engine";
Variable_name Value
Transactions_multi_engine 3
INSERT INTO t3 VALUES (201);
SHOW STATUS LIKE "Transactions_multi_engine";
Variable_name Value
Transactions_multi_engine 3
BEGIN;
INSERT INTO t3 VALUES (202);
INSERT INTO t2 VALUES (203);
COMMIT;
SHOW STATUS LIKE "Transactions_multi_engine";
Variable_name Value
Transactions_multi_engine 4
BEGIN;
INSERT INTO t2 VALUES (204);
INSERT INTO t3 VALUES (205);
COMMIT;
SHOW STATUS LIKE "Transactions_multi_engine";
Variable_name Value
Transactions_multi_engine 5
UPDATE t2, t3 SET t2.a=206, t3.a=207 WHERE t2.a=204 AND t3.a=205;
SHOW STATUS LIKE "Transactions_multi_engine";
Variable_name Value
Transactions_multi_engine 6
DELETE FROM t1 WHERE a >= 100;
DELETE FROM t2 WHERE a >= 100;
DELETE FROM t3 WHERE a >= 100;
connection server_1;
include/save_master_gtid.inc
connection server_2;
include/sync_with_master_gtid.inc
SELECT COUNT(*)>=10 FROM mysql.gtid_slave_pos;
COUNT(*)>=10
1
SELECT COUNT(*)>=10 FROM ( SELECT * FROM mysql.gtid_slave_pos_innodb
UNION ALL SELECT * FROM mysql.gtid_slave_pos_innodb_redundant) inner_select;
COUNT(*)>=10
1
SELECT COUNT(*)>=10 FROM mysql.gtid_slave_pos_rocksdb;
COUNT(*)>=10
1
SET GLOBAL gtid_cleanup_batch_size = 3;
connection server_2;
include/stop_slave.inc
SET sql_log_bin=0;
DROP TABLE mysql.gtid_slave_pos_rocksdb;
DROP TABLE mysql.gtid_slave_pos_myisam_redundant;
DROP TABLE mysql.gtid_slave_pos_innodb_redundant;
SET sql_log_bin=1;
FLUSH NO_WRITE_TO_BINLOG STATUS;
include/start_slave.inc
SHOW STATUS LIKE "%transactions%engine";
Variable_name Value
Rpl_transactions_multi_engine 0
Transactions_gtid_foreign_engine 0
Transactions_multi_engine 0
connection server_1;
INSERT INTO t1 VALUES (100);
connection server_2;
SHOW STATUS LIKE "%transactions%engine";
Variable_name Value
Rpl_transactions_multi_engine 0
Transactions_gtid_foreign_engine 0
Transactions_multi_engine 0
connection server_1;
INSERT INTO t2 VALUES (101);
connection server_2;
SHOW STATUS LIKE "%transactions%engine";
Variable_name Value
Rpl_transactions_multi_engine 0
Transactions_gtid_foreign_engine 0
Transactions_multi_engine 0
connection server_1;
INSERT INTO t3 VALUES (101);
connection server_2;
SHOW STATUS LIKE "%transactions%engine";
Variable_name Value
Rpl_transactions_multi_engine 0
Transactions_gtid_foreign_engine 1
Transactions_multi_engine 0
connection server_1;
BEGIN;
INSERT INTO t3 VALUES (102);
INSERT INTO t2 VALUES (103);
COMMIT;
connection server_2;
SHOW STATUS LIKE "%transactions%engine";
Variable_name Value
Rpl_transactions_multi_engine 1
Transactions_gtid_foreign_engine 1
Transactions_multi_engine 1
connection server_1;
BEGIN;
INSERT INTO t2 VALUES (104);
INSERT INTO t3 VALUES (105);
COMMIT;
connection server_2;
SHOW STATUS LIKE "%transactions%engine";
Variable_name Value
Rpl_transactions_multi_engine 2
Transactions_gtid_foreign_engine 1
Transactions_multi_engine 2
connection server_1;
UPDATE t2, t3 SET t2.a=106, t3.a=107 WHERE t2.a=104 AND t3.a=105;
connection server_2;
SHOW STATUS LIKE "%transactions%engine";
Variable_name Value
Rpl_transactions_multi_engine 3
Transactions_gtid_foreign_engine 1
Transactions_multi_engine 3
connection server_2;
connection server_2;
SHOW VARIABLES LIKE 'log_bin';
Variable_name Value
log_bin OFF
include/start_slave.inc
SHOW STATUS LIKE "%transactions%engine";
Variable_name Value
Rpl_transactions_multi_engine 0
Transactions_gtid_foreign_engine 0
Transactions_multi_engine 0
connection server_1;
INSERT INTO t1 VALUES (200);
connection server_2;
SHOW STATUS LIKE "%transactions%engine";
Variable_name Value
Rpl_transactions_multi_engine 0
Transactions_gtid_foreign_engine 0
Transactions_multi_engine 0
connection server_1;
INSERT INTO t2 VALUES (201);
connection server_2;
SHOW STATUS LIKE "%transactions%engine";
Variable_name Value
Rpl_transactions_multi_engine 0
Transactions_gtid_foreign_engine 0
Transactions_multi_engine 0
connection server_1;
INSERT INTO t3 VALUES (201);
connection server_2;
SHOW STATUS LIKE "%transactions%engine";
Variable_name Value
Rpl_transactions_multi_engine 0
Transactions_gtid_foreign_engine 1
Transactions_multi_engine 0
connection server_1;
BEGIN;
INSERT INTO t3 VALUES (202);
INSERT INTO t2 VALUES (203);
COMMIT;
connection server_2;
SHOW STATUS LIKE "%transactions%engine";
Variable_name Value
Rpl_transactions_multi_engine 1
Transactions_gtid_foreign_engine 1
Transactions_multi_engine 1
connection server_1;
BEGIN;
INSERT INTO t2 VALUES (204);
INSERT INTO t3 VALUES (205);
COMMIT;
connection server_2;
SHOW STATUS LIKE "%transactions%engine";
Variable_name Value
Rpl_transactions_multi_engine 2
Transactions_gtid_foreign_engine 1
Transactions_multi_engine 2
connection server_1;
UPDATE t2, t3 SET t2.a=206, t3.a=207 WHERE t2.a=204 AND t3.a=205;
connection server_2;
SHOW STATUS LIKE "%transactions%engine";
Variable_name Value
Rpl_transactions_multi_engine 3
Transactions_gtid_foreign_engine 1
Transactions_multi_engine 3
connection server_2;
SET sql_log_bin=0;
DROP TABLE mysql.gtid_slave_pos_innodb;
SET sql_log_bin=1;
connection server_1;
DROP TABLE t1;
DROP TABLE t2;
DROP TABLE t3;
include/rpl_end.inc