mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
MDEV-7850: Extend GTID Binlog Events with Thread Id
This patch augments Gtid_log_event with the user thread-id. In particular that compensates for the loss of this info in Rows_log_events. Gtid_log_event::thread_id gets visible in mysqlbinlog output like #231025 16:21:45 server id 1 end_log_pos 537 CRC32 0x1cf1d963 GTID 0-1-2 ddl thread_id=10 as 64 bit unsigned integer. While the size of Gtid event has grown by 8-9 bytes replication from OLD <-> NEW is not affected by it. This work was started by the late Sujatha Sivakumar. Brandon Nesterenko took it over, reviewed initial patches and extended the work. Reviewed-by: <andrei.elkin@mariadb.com>
This commit is contained in:
@@ -190,7 +190,7 @@ ROLLBACK/*!*/;
|
||||
# at #
|
||||
#010909 4:46:40 server id # end_log_pos # CRC32 XXX Binlog checkpoint slave-bin.000001
|
||||
# at #
|
||||
#010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-1 ddl
|
||||
#010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-1 ddl thread_id=#
|
||||
/*!100101 SET @@session.skip_parallel_replication=0*//*!*/;
|
||||
/*!100001 SET @@session.gtid_domain_id=0*//*!*/;
|
||||
/*!100001 SET @@session.server_id=1*//*!*/;
|
||||
@@ -210,7 +210,7 @@ SET @@session.collation_database=DEFAULT/*!*/;
|
||||
CREATE TABLE t1 (a INT, b INT, c INT)
|
||||
/*!*/;
|
||||
# at #
|
||||
#010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-2 ddl
|
||||
#010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-2 ddl thread_id=#
|
||||
/*!100001 SET @@session.gtid_seq_no=2*//*!*/;
|
||||
# at #
|
||||
#010909 4:46:40 server id # end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid=<xid>
|
||||
@@ -218,7 +218,7 @@ SET TIMESTAMP=1000000000/*!*/;
|
||||
CREATE TABLE t2 (a INT, b INT, c INT)
|
||||
/*!*/;
|
||||
# at #
|
||||
#010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-2-3 ddl
|
||||
#010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-2-3 ddl thread_id=#
|
||||
/*!100001 SET @@session.server_id=2*//*!*/;
|
||||
/*!100001 SET @@session.gtid_seq_no=3*//*!*/;
|
||||
# at #
|
||||
@@ -227,7 +227,7 @@ SET TIMESTAMP=1000000000/*!*/;
|
||||
ALTER TABLE t1 ENGINE=BLACKHOLE
|
||||
/*!*/;
|
||||
# at #
|
||||
#010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-3 trans
|
||||
#010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-3 trans thread_id=#
|
||||
/*!100001 SET @@session.server_id=1*//*!*/;
|
||||
/*!100001 SET @@session.gtid_seq_no=3*//*!*/;
|
||||
START TRANSACTION
|
||||
@@ -246,7 +246,7 @@ SET TIMESTAMP=1000000000/*!*/;
|
||||
COMMIT
|
||||
/*!*/;
|
||||
# at #
|
||||
#010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-4 trans
|
||||
#010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-4 trans thread_id=#
|
||||
/*!100001 SET @@session.gtid_seq_no=4*//*!*/;
|
||||
START TRANSACTION
|
||||
/*!*/;
|
||||
@@ -264,7 +264,7 @@ SET TIMESTAMP=1000000000/*!*/;
|
||||
COMMIT
|
||||
/*!*/;
|
||||
# at #
|
||||
#010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-5 trans
|
||||
#010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-5 trans thread_id=#
|
||||
/*!100001 SET @@session.gtid_seq_no=5*//*!*/;
|
||||
START TRANSACTION
|
||||
/*!*/;
|
||||
@@ -282,7 +282,7 @@ SET TIMESTAMP=1000000000/*!*/;
|
||||
COMMIT
|
||||
/*!*/;
|
||||
# at #
|
||||
#010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-6 trans
|
||||
#010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-6 trans thread_id=#
|
||||
/*!100001 SET @@session.gtid_seq_no=6*//*!*/;
|
||||
START TRANSACTION
|
||||
/*!*/;
|
||||
@@ -300,7 +300,7 @@ SET TIMESTAMP=1000000000/*!*/;
|
||||
COMMIT
|
||||
/*!*/;
|
||||
# at #
|
||||
#010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-7 trans
|
||||
#010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-7 trans thread_id=#
|
||||
/*!100001 SET @@session.gtid_seq_no=7*//*!*/;
|
||||
START TRANSACTION
|
||||
/*!*/;
|
||||
@@ -318,7 +318,7 @@ SET TIMESTAMP=1000000000/*!*/;
|
||||
COMMIT
|
||||
/*!*/;
|
||||
# at #
|
||||
#010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-8 ddl
|
||||
#010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-8 ddl thread_id=#
|
||||
/*!100001 SET @@session.gtid_seq_no=8*//*!*/;
|
||||
# at #
|
||||
#010909 4:46:40 server id # end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid=<xid>
|
||||
@@ -326,7 +326,7 @@ SET TIMESTAMP=1000000000/*!*/;
|
||||
ALTER TABLE t1 ADD PRIMARY KEY pk_t1 (a,b)
|
||||
/*!*/;
|
||||
# at #
|
||||
#010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-9 trans
|
||||
#010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-9 trans thread_id=#
|
||||
/*!100001 SET @@session.gtid_seq_no=9*//*!*/;
|
||||
START TRANSACTION
|
||||
/*!*/;
|
||||
@@ -344,7 +344,7 @@ SET TIMESTAMP=1000000000/*!*/;
|
||||
COMMIT
|
||||
/*!*/;
|
||||
# at #
|
||||
#010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-10 trans
|
||||
#010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-10 trans thread_id=#
|
||||
/*!100001 SET @@session.gtid_seq_no=10*//*!*/;
|
||||
START TRANSACTION
|
||||
/*!*/;
|
||||
@@ -362,7 +362,7 @@ SET TIMESTAMP=1000000000/*!*/;
|
||||
COMMIT
|
||||
/*!*/;
|
||||
# at #
|
||||
#010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-11 trans
|
||||
#010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-11 trans thread_id=#
|
||||
/*!100001 SET @@session.gtid_seq_no=11*//*!*/;
|
||||
START TRANSACTION
|
||||
/*!*/;
|
||||
@@ -380,7 +380,7 @@ SET TIMESTAMP=1000000000/*!*/;
|
||||
COMMIT
|
||||
/*!*/;
|
||||
# at #
|
||||
#010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-12 ddl
|
||||
#010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-12 ddl thread_id=#
|
||||
/*!100001 SET @@session.gtid_seq_no=12*//*!*/;
|
||||
# at #
|
||||
#010909 4:46:40 server id # end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid=<xid>
|
||||
@@ -388,7 +388,7 @@ SET TIMESTAMP=1000000000/*!*/;
|
||||
ALTER TABLE t1 DROP PRIMARY KEY, ADD KEY key_t1 (a)
|
||||
/*!*/;
|
||||
# at #
|
||||
#010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-13 trans
|
||||
#010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-13 trans thread_id=#
|
||||
/*!100001 SET @@session.gtid_seq_no=13*//*!*/;
|
||||
START TRANSACTION
|
||||
/*!*/;
|
||||
@@ -406,7 +406,7 @@ SET TIMESTAMP=1000000000/*!*/;
|
||||
COMMIT
|
||||
/*!*/;
|
||||
# at #
|
||||
#010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-14 trans
|
||||
#010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-14 trans thread_id=#
|
||||
/*!100001 SET @@session.gtid_seq_no=14*//*!*/;
|
||||
START TRANSACTION
|
||||
/*!*/;
|
||||
@@ -424,7 +424,7 @@ SET TIMESTAMP=1000000000/*!*/;
|
||||
COMMIT
|
||||
/*!*/;
|
||||
# at #
|
||||
#010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-15 trans
|
||||
#010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-15 trans thread_id=#
|
||||
/*!100001 SET @@session.gtid_seq_no=15*//*!*/;
|
||||
START TRANSACTION
|
||||
/*!*/;
|
||||
@@ -442,7 +442,7 @@ SET TIMESTAMP=1000000000/*!*/;
|
||||
COMMIT
|
||||
/*!*/;
|
||||
# at #
|
||||
#010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-16 ddl
|
||||
#010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-16 ddl thread_id=#
|
||||
/*!100001 SET @@session.gtid_seq_no=16*//*!*/;
|
||||
# at #
|
||||
#010909 4:46:40 server id # end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid=<xid>
|
||||
|
48
mysql-test/suite/rpl/r/rpl_gtid_thread_id.result
Normal file
48
mysql-test/suite/rpl/r/rpl_gtid_thread_id.result
Normal file
@@ -0,0 +1,48 @@
|
||||
include/master-slave.inc
|
||||
[connection master]
|
||||
connection master;
|
||||
create table t1(a int);
|
||||
insert into t1 values(1);
|
||||
optimize table t1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 optimize status OK
|
||||
connection slave;
|
||||
connection master;
|
||||
# MYSQL_BINLOG local > primary_outfile
|
||||
include/assert_grep.inc [Ensure only 3 GTID events exist (Primary)]
|
||||
include/assert_grep.inc [Ensure each GTID event has the thread id (Primary)]
|
||||
#
|
||||
# GTID event's thread_id should not use psuedo_thread_id
|
||||
connection master;
|
||||
set @@pseudo_thread_id=99999;
|
||||
insert into t1 values(2);
|
||||
# MYSQL_BINLOG local > primary_outfile
|
||||
include/assert_grep.inc [GTID event's thread_id does not use pseudo_thread_id]
|
||||
#
|
||||
# Test the serial replica
|
||||
connection slave;
|
||||
# MYSQL_BINLOG local > replica_outfile
|
||||
include/assert_grep.inc [Ensure the same number of GTID events on the replica as the primary]
|
||||
include/assert_grep.inc [Ensure each GTID event has the thread id of the SQL Thread]
|
||||
#
|
||||
# Test the parallel replica
|
||||
connection slave;
|
||||
include/stop_slave.inc
|
||||
SET @@GLOBAL.slave_parallel_threads=1;
|
||||
include/start_slave.inc
|
||||
connection master;
|
||||
insert into t1 values(3);
|
||||
insert into t1 values(4);
|
||||
connection slave;
|
||||
connection slave;
|
||||
# MYSQL_BINLOG local > replica_outfile
|
||||
include/assert_grep.inc [Ensure the same number of GTID events on the replica as the primary]
|
||||
include/assert_grep.inc [Ensure only the new GTID events have the thread id of the worker thread]
|
||||
include/stop_slave.inc
|
||||
SET @@GLOBAL.slave_parallel_threads=0;
|
||||
include/start_slave.inc
|
||||
#
|
||||
# Cleanup
|
||||
connection master;
|
||||
drop table t1;
|
||||
include/rpl_end.inc
|
125
mysql-test/suite/rpl/t/rpl_gtid_thread_id.test
Normal file
125
mysql-test/suite/rpl/t/rpl_gtid_thread_id.test
Normal file
@@ -0,0 +1,125 @@
|
||||
#
|
||||
# Verify that GTID log events are written into the binary log along with the
|
||||
# id of the thread which executed the transaction. On the primary, this is the
|
||||
# id of the user connection. On a replica, this is either the id of the SQL
|
||||
# Thread id, if serial, or the id of the corresponding worker thread, if
|
||||
# parallel. Psuedo_thread_id is disregarded and only used for Query log events.
|
||||
#
|
||||
# References:
|
||||
# MDEV-7850: MariaDB doesn't show thread_id for ROW-based events in binlog
|
||||
#
|
||||
--source include/have_binlog_format_row.inc
|
||||
--source include/master-slave.inc
|
||||
|
||||
--connection master
|
||||
--let primary_thread_id=`select connection_id()`
|
||||
create table t1(a int);
|
||||
insert into t1 values(1);
|
||||
optimize table t1;
|
||||
|
||||
--sync_slave_with_master
|
||||
|
||||
--connection master
|
||||
--let datadir= `select @@datadir`
|
||||
--let filename= query_get_value(SHOW MASTER STATUS, File, 1)
|
||||
--let local=$datadir/$filename
|
||||
--let primary_outfile=$MYSQLTEST_VARDIR/tmp/primary_binlog.sql
|
||||
--echo # MYSQL_BINLOG local > primary_outfile
|
||||
--exec $MYSQL_BINLOG $local > $primary_outfile
|
||||
|
||||
--let $assert_count= 3
|
||||
--let $assert_text= Ensure only $assert_count GTID events exist (Primary)
|
||||
--let $assert_select=GTID [0-9]-[0-9]-[0-9]
|
||||
--let $assert_file= $primary_outfile
|
||||
--source include/assert_grep.inc
|
||||
|
||||
--let $assert_text= Ensure each GTID event has the thread id (Primary)
|
||||
--let $assert_select=GTID [0-9]-[0-9]-[0-9].*thread_id=$primary_thread_id\$
|
||||
--source include/assert_grep.inc
|
||||
|
||||
--echo #
|
||||
--echo # GTID event's thread_id should not use psuedo_thread_id
|
||||
--connection master
|
||||
--let $old_pseudo_id= `SELECT @@SESSION.pseudo_thread_id`
|
||||
set @@pseudo_thread_id=99999;
|
||||
insert into t1 values(2);
|
||||
--echo # MYSQL_BINLOG local > primary_outfile
|
||||
--exec $MYSQL_BINLOG $local > $primary_outfile
|
||||
|
||||
--let $assert_count= 0
|
||||
--let $assert_text= GTID event's thread_id does not use pseudo_thread_id
|
||||
--let $assert_select=GTID [0-9]-[0-9]-[0-9].*thread_id=99999\$
|
||||
--source include/assert_grep.inc
|
||||
|
||||
--disable_query_log
|
||||
--eval set @@pseudo_thread_id=$old_pseudo_id
|
||||
--enable_query_log
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # Test the serial replica
|
||||
--connection slave
|
||||
--let $sql_thread_id= `SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND LIKE 'Slave_SQL'`
|
||||
|
||||
--let replica_thread_id=`select connection_id()`
|
||||
--let datadir= `select @@datadir`
|
||||
--let filename= query_get_value(SHOW MASTER STATUS, File, 1)
|
||||
--let local=$datadir/$filename
|
||||
--let replica_outfile=$MYSQLTEST_VARDIR/tmp/serial_replica_binlog.sql
|
||||
--echo # MYSQL_BINLOG local > replica_outfile
|
||||
--exec $MYSQL_BINLOG $local > $replica_outfile
|
||||
|
||||
--let $assert_count= 4
|
||||
--let $assert_text= Ensure the same number of GTID events on the replica as the primary
|
||||
--let $assert_select=GTID [0-9]-[0-9]-[0-9]
|
||||
--let $assert_file= $replica_outfile
|
||||
--source include/assert_grep.inc
|
||||
|
||||
--let $assert_text= Ensure each GTID event has the thread id of the SQL Thread
|
||||
--let $assert_select=GTID [0-9]-[0-9]-[0-9].*thread_id=$sql_thread_id\$
|
||||
--source include/assert_grep.inc
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # Test the parallel replica
|
||||
--connection slave
|
||||
--source include/stop_slave.inc
|
||||
--let $old_parallel_threads= `SELECT @@GLOBAL.slave_parallel_threads`
|
||||
SET @@GLOBAL.slave_parallel_threads=1;
|
||||
--source include/start_slave.inc
|
||||
|
||||
--connection master
|
||||
insert into t1 values(3);
|
||||
insert into t1 values(4);
|
||||
--sync_slave_with_master
|
||||
|
||||
--connection slave
|
||||
--let $worker_thread_id= `SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND LIKE 'Slave_worker'`
|
||||
--echo # MYSQL_BINLOG local > replica_outfile
|
||||
--exec $MYSQL_BINLOG $local > $replica_outfile
|
||||
|
||||
--let $assert_count= 6
|
||||
--let $assert_text= Ensure the same number of GTID events on the replica as the primary
|
||||
--let $assert_select=GTID [0-9]-[0-9]-[0-9]
|
||||
#--let $assert_file= $replica_outfile
|
||||
--source include/assert_grep.inc
|
||||
|
||||
--let $assert_count= 2
|
||||
--let $assert_text= Ensure only the new GTID events have the thread id of the worker thread
|
||||
--let $assert_select=GTID [0-9]-[0-9]-[0-9].*thread_id=$worker_thread_id\$
|
||||
--source include/assert_grep.inc
|
||||
|
||||
--source include/stop_slave.inc
|
||||
--eval SET @@GLOBAL.slave_parallel_threads=$old_parallel_threads
|
||||
--source include/start_slave.inc
|
||||
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # Cleanup
|
||||
--connection master
|
||||
drop table t1;
|
||||
remove_file $primary_outfile;
|
||||
remove_file $replica_outfile;
|
||||
|
||||
--source include/rpl_end.inc
|
@@ -430,7 +430,9 @@ START SLAVE IO_THREAD;
|
||||
--let $pos_until= 3130
|
||||
--let $file_rl= slave-relay-bin.000018
|
||||
|
||||
--let $pos_gtid = 2987
|
||||
# Todo: change to compute the explicit postion as it may may further change
|
||||
# with events evolution.
|
||||
--let $pos_gtid = 2993
|
||||
--let $info= query_get_value(SHOW RELAYLOG EVENTS IN '$file_rl' FROM $pos_gtid LIMIT 1, Info, 1)
|
||||
|
||||
if (`SELECT "$info" != "BEGIN GTID 0-1-23"`)
|
||||
@@ -438,7 +440,8 @@ if (`SELECT "$info" != "BEGIN GTID 0-1-23"`)
|
||||
--echo *** Unexpected offset. Refine it to point to the correct GTID!
|
||||
--die
|
||||
}
|
||||
--let $pos_event = 3120
|
||||
# Todo: ditto
|
||||
--let $pos_event = 3129
|
||||
--let $type= query_get_value(SHOW RELAYLOG EVENTS IN '$file_rl' FROM $pos_event LIMIT 1, Event_type, 1)
|
||||
if (`SELECT "$type" != "Delete_rows_v1"`)
|
||||
{
|
||||
|
Reference in New Issue
Block a user