############################### # Test Setup ############################### RESET MASTER; ###################################### # Test Group 1 # Run test cases on local log file ###################################### set @a=UNIX_TIMESTAMP("1970-01-21 15:32:22"); SET timestamp=@a; RESET MASTER; SET @@session.gtid_domain_id= 0; SET @@session.server_id= 1; CREATE TABLE t1 (a int); SET timestamp=@a+1; INSERT INTO t1 values (1), (2); SET @@session.gtid_domain_id= 1; SET @@session.server_id= 2; SET timestamp=@a+2; CREATE TABLE t2 (a int); SET timestamp=@a+3; INSERT INTO t2 values (1); SET @@session.gtid_domain_id= 0; SET @@session.server_id= 1; SET timestamp=@a+4; INSERT INTO t1 values (3), (4); SET @@session.gtid_domain_id= 1; SET @@session.server_id= 2; INSERT INTO t2 values (2); SET @@session.server_id= 3; INSERT INTO t2 values (3); SET @@session.server_id= 2; INSERT INTO t2 values (4); FLUSH LOGS; SET @@session.gtid_domain_id= 0; SET @@session.server_id= 1; CREATE TABLE t3 (a int); INSERT INTO t3 VALUES (1); FLUSH LOGS; # Gtid list event of the 2nd binlog file whose content is # matched against --start-position in the following tests: show binlog events in 'master-bin.000002' limit 1,1; Log_name Pos Event_type Server_id End_log_pos Info master-bin.000002 # Gtid_list 1 # [0-1-3,1-3-4,1-2-5] DROP TABLE t1; DROP TABLE t2; DROP TABLE t3; # # Test Case 1: # The end of the binlog file resets the server and domain id of the # session SET @@session.gtid_domain_id= 10; SET @@session.server_id= 20; # MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-0 --stop-position=0-1-2 | MYSQL include/assert.inc [session gtid_domain_id should not change when reading binlog in GTID mode] include/assert.inc [session server_id should not change when reading binlog in GTID mode] SET @@session.gtid_domain_id= 0; SET @@session.server_id= 1; DROP TABLE t1; # # Test Case 2: # Single GTID range specified # MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-0 --stop-position=0-1-2 | MYSQL DROP TABLE t1; # # Test Case 3: # Single GTID range with different server_ids # MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=1-2-0 --stop-position=1-3-4 | MYSQL DROP TABLE t2; # # Test Case 4: # Multiple GTID ranges specified # MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-0,1-2-0 --stop-position=0-1-3,1-2-3 | MYSQL DROP TABLE t1; DROP TABLE t2; # # Test Case 5: # Multiple GTID ranges specified where the domain ids are listed in # different orders between start/stop position # MYSQL_BINLOG BINLOG_FILE_PARAM --stop-position=0-1-3,1-2-3 --start-position=1-2-0,0-1-0 | MYSQL DROP TABLE t1; DROP TABLE t2; # # Test Case 6: # Only start position specified CREATE TABLE t1 (a int); INSERT INTO t1 values (3), (4); DROP TABLE t1; CREATE TABLE t1 (a int); # MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-2 | MYSQL DROP TABLE t1; DROP TABLE t2; # # Test Case 7: # Only stop position specified # MYSQL_BINLOG BINLOG_FILE_PARAM --stop-position=0-1-2 | MYSQL DROP TABLE t1; # # Test Case 8: # Seq_no=0 in --start-position includes all events for a domain # MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-0,1-2-0 | MYSQL DROP TABLE t1; DROP TABLE t2; # # Test Case 9: # Seq_no=0 in --stop-position excludes all events for a domain # MYSQL_BINLOG BINLOG_FILE_PARAM --stop-position=0-1-0,1-2-0 | MYSQL # # Test Case 10: # Output stops for all domain ids when all --stop-position GTID values # have been hit. # MYSQL_BINLOG BINLOG_FILE_PARAM --stop-position=0-1-2 | MYSQL DROP TABLE t1; # # Test Case 11: # All GTID events from other domains are printed until the # --stop-position values are hit # MYSQL_BINLOG BINLOG_FILE_PARAM --stop-position=1-3-4 | MYSQL DROP TABLE t2; # # Test Case 12: # Scalar and GTID values can be used together for stop or start # position # MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=empty_binlog_pos --stop-position=0-1-2 | MYSQL DROP TABLE t1; # MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-0 --stop-position=t1_final_checksum_pos | MYSQL DROP TABLE t1; DROP TABLE t2; # # Test Case 13: # If the start position is delayed within the binlog, events occurring # before that position are ignored CREATE TABLE t1 (a int); # MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-1 --stop-position=0-1-2 | MYSQL DROP TABLE t1; # # Test Case 14: # If start position is repeated, the last specification overrides all # previous ones CREATE TABLE t1 (a int); # MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-0 --start-position=0-1-1 --stop-position=0-1-2 | MYSQL DROP TABLE t1; # # Test Case 15: # If stop position is repeated, the last specification overrides all # previous ones # MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-0 --stop-position=0-1-1 --stop-position=0-1-2 | MYSQL DROP TABLE t1; # # Test Case 16: # Start position with --offset= skips n events after the first # GTID is found CREATE TABLE t1 (a int); # MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-0 --stop-position=0-1-2 --offset=5 | MYSQL DROP TABLE t1; # # Test Case 17: # Start position with --start-datetime= where T occurs after the # specified GTID results in no events before T # MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-0 --stop-position=1-2-2 --start-datetime="1970-01-21 15:32:24" | MYSQL DROP TABLE t2; # # Test Case 18: # If --stop-position is specified, domains which are not present # in its list should be excluded from output # MYSQL_BINLOG BINLOG_FILE_PARAM --stop-position=1-3-4 | MYSQL DROP TABLE t2; # # Test Case 19: # If the start and stop GTIDs in any domain are equal, the domain # should not have any output # MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-2 --stop-position=0-1-2 | MYSQL # # Test Case 20: # If --start-position and --stop-position have different domain ids, # only events from GTIDs in the --stop-position list are output # MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=1-2-2 --stop-position=0-1-3 | MYSQL DROP TABLE t1; # # Test Case 21: # Successive binary logs (e.g. logs with previous logs that have been # purged) will write events when the --start-position matches their # Gtid_list_log_event state # MYSQL_BINLOG BINLOG_FILE_PARAM2 --start-position=0-1-3,1-2-5 | MYSQL DROP TABLE t3; # # Test Case 22: # Successive binary logs can be called with --stop-position and # without --start-position # MYSQL_BINLOG BINLOG_FILE_PARAM2 --stop-position=0-1-4 | MYSQL DROP TABLE t3; # At the following error cases analysis # note incompatible --start-position with the value of # Gtid list event of the 2nd binlog file printed above. # # Error Case 1: # A GTID --start-position that does not mention all domains that make # up the binary log state should error # MYSQL_BINLOG BINLOG_FILE_PARAM2 --start-position=0-1-3 > tmp_out_ 2> err_out_ FOUND 2 /ERROR: Starting GTID position list does not specify an initial value/ in err.out # # Error Case 2: # A GTID --start-position with any sequence numbers which occur before # the binary log state should result in error # MYSQL_BINLOG BINLOG_FILE_PARAM2 --start-position=0-1-2,1-2-5 > tmp_out_ 2> err_out_ FOUND 1 /ERROR: Binary logs are missing data for domain 0/ in err.out # # Error Case 3: # A GTID --start-position with any sequence numbers that are not # eventually processed results in error # MYSQL_BINLOG BINLOG_FILE_PARAM2 --start-position=0-1-8,1-2-6 > tmp_out_ 2> err_out_ FOUND 2 /ERROR: Binary logs never reached expected GTID state/ in err.out ###################################### # Test Group 2 # Run test cases on remote host ###################################### set @a=UNIX_TIMESTAMP("1970-01-21 15:32:22"); SET timestamp=@a; RESET MASTER; SET @@session.gtid_domain_id= 0; SET @@session.server_id= 1; CREATE TABLE t1 (a int); SET timestamp=@a+1; INSERT INTO t1 values (1), (2); SET @@session.gtid_domain_id= 1; SET @@session.server_id= 2; SET timestamp=@a+2; CREATE TABLE t2 (a int); SET timestamp=@a+3; INSERT INTO t2 values (1); SET @@session.gtid_domain_id= 0; SET @@session.server_id= 1; SET timestamp=@a+4; INSERT INTO t1 values (3), (4); SET @@session.gtid_domain_id= 1; SET @@session.server_id= 2; INSERT INTO t2 values (2); SET @@session.server_id= 3; INSERT INTO t2 values (3); SET @@session.server_id= 2; INSERT INTO t2 values (4); FLUSH LOGS; SET @@session.gtid_domain_id= 0; SET @@session.server_id= 1; CREATE TABLE t3 (a int); INSERT INTO t3 VALUES (1); FLUSH LOGS; # Gtid list event of the 2nd binlog file whose content is # matched against --start-position in the following tests: show binlog events in 'master-bin.000002' limit 1,1; Log_name Pos Event_type Server_id End_log_pos Info master-bin.000002 # Gtid_list 1 # [0-1-3,1-3-4,1-2-5] DROP TABLE t1; DROP TABLE t2; DROP TABLE t3; # # Test Case 1: # The end of the binlog file resets the server and domain id of the # session SET @@session.gtid_domain_id= 10; SET @@session.server_id= 20; # MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-0 --stop-position=0-1-2 | MYSQL include/assert.inc [session gtid_domain_id should not change when reading binlog in GTID mode] include/assert.inc [session server_id should not change when reading binlog in GTID mode] SET @@session.gtid_domain_id= 0; SET @@session.server_id= 1; DROP TABLE t1; # # Test Case 2: # Single GTID range specified # MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-0 --stop-position=0-1-2 | MYSQL DROP TABLE t1; # # Test Case 3: # Single GTID range with different server_ids # MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=1-2-0 --stop-position=1-3-4 | MYSQL DROP TABLE t2; # # Test Case 4: # Multiple GTID ranges specified # MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-0,1-2-0 --stop-position=0-1-3,1-2-3 | MYSQL DROP TABLE t1; DROP TABLE t2; # # Test Case 5: # Multiple GTID ranges specified where the domain ids are listed in # different orders between start/stop position # MYSQL_BINLOG BINLOG_FILE_PARAM --stop-position=0-1-3,1-2-3 --start-position=1-2-0,0-1-0 | MYSQL DROP TABLE t1; DROP TABLE t2; # # Test Case 6: # Only start position specified CREATE TABLE t1 (a int); INSERT INTO t1 values (3), (4); DROP TABLE t1; CREATE TABLE t1 (a int); # MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-2 | MYSQL DROP TABLE t1; DROP TABLE t2; # # Test Case 7: # Only stop position specified # MYSQL_BINLOG BINLOG_FILE_PARAM --stop-position=0-1-2 | MYSQL DROP TABLE t1; # # Test Case 8: # Seq_no=0 in --start-position includes all events for a domain # MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-0,1-2-0 | MYSQL DROP TABLE t1; DROP TABLE t2; # # Test Case 9: # Seq_no=0 in --stop-position excludes all events for a domain # MYSQL_BINLOG BINLOG_FILE_PARAM --stop-position=0-1-0,1-2-0 | MYSQL # # Test Case 10: # Output stops for all domain ids when all --stop-position GTID values # have been hit. # MYSQL_BINLOG BINLOG_FILE_PARAM --stop-position=0-1-2 | MYSQL DROP TABLE t1; # # Test Case 11: # All GTID events from other domains are printed until the # --stop-position values are hit # MYSQL_BINLOG BINLOG_FILE_PARAM --stop-position=1-3-4 | MYSQL DROP TABLE t2; # # Test Case 12: # Scalar and GTID values can be used together for stop or start # position # MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=empty_binlog_pos --stop-position=0-1-2 | MYSQL DROP TABLE t1; # MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-0 --stop-position=t1_final_checksum_pos | MYSQL DROP TABLE t1; DROP TABLE t2; # # Test Case 13: # If the start position is delayed within the binlog, events occurring # before that position are ignored CREATE TABLE t1 (a int); # MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-1 --stop-position=0-1-2 | MYSQL DROP TABLE t1; # # Test Case 14: # If start position is repeated, the last specification overrides all # previous ones CREATE TABLE t1 (a int); # MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-0 --start-position=0-1-1 --stop-position=0-1-2 | MYSQL DROP TABLE t1; # # Test Case 15: # If stop position is repeated, the last specification overrides all # previous ones # MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-0 --stop-position=0-1-1 --stop-position=0-1-2 | MYSQL DROP TABLE t1; # # Test Case 16: # Start position with --offset= skips n events after the first # GTID is found CREATE TABLE t1 (a int); # MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-0 --stop-position=0-1-2 --offset=5 | MYSQL DROP TABLE t1; # # Test Case 17: # Start position with --start-datetime= where T occurs after the # specified GTID results in no events before T # MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-0 --stop-position=1-2-2 --start-datetime="1970-01-21 15:32:24" | MYSQL DROP TABLE t2; # # Test Case 18: # If --stop-position is specified, domains which are not present # in its list should be excluded from output # MYSQL_BINLOG BINLOG_FILE_PARAM --stop-position=1-3-4 | MYSQL DROP TABLE t2; # # Test Case 19: # If the start and stop GTIDs in any domain are equal, the domain # should not have any output # MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-2 --stop-position=0-1-2 | MYSQL # # Test Case 20: # If --start-position and --stop-position have different domain ids, # only events from GTIDs in the --stop-position list are output # MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=1-2-2 --stop-position=0-1-3 | MYSQL DROP TABLE t1; # # Test Case 21: # Successive binary logs (e.g. logs with previous logs that have been # purged) will write events when the --start-position matches their # Gtid_list_log_event state # # Reset server state RESET MASTER; FLUSH LOGS; FLUSH LOGS; PURGE BINARY LOGS TO "master-bin.000002"; DROP TABLE t1; DROP TABLE t2; DROP TABLE t3; # MYSQL_BINLOG BINLOG_FILE_PARAM2 --start-position=0-1-3,1-2-5 | MYSQL DROP TABLE t3; # # Test Case 22: # Successive binary logs can be called with --stop-position and # without --start-position # # Reset server state RESET MASTER; FLUSH LOGS; FLUSH LOGS; PURGE BINARY LOGS TO "master-bin.000002"; DROP TABLE t1; DROP TABLE t2; DROP TABLE t3; # MYSQL_BINLOG BINLOG_FILE_PARAM2 --stop-position=0-1-4 | MYSQL DROP TABLE t3; # # Remote-only setup for error cases RESET MASTER; FLUSH LOGS; FLUSH LOGS; PURGE BINARY LOGS TO "master-bin.000002"; # At the following error cases analysis # note incompatible --start-position with the value of # Gtid list event of the 2nd binlog file printed above. # # Error Case 1: # A GTID --start-position that does not mention all domains that make # up the binary log state should error # MYSQL_BINLOG BINLOG_FILE_PARAM2 --start-position=0-1-3 > tmp_out_ 2> err_out_ FOUND 1 /ERROR: Got error reading packet from server/ in err.out # # Error Case 2: # A GTID --start-position with any sequence numbers which occur before # the binary log state should result in error # MYSQL_BINLOG BINLOG_FILE_PARAM2 --start-position=0-1-2,1-2-5 > tmp_out_ 2> err_out_ FOUND 1 /ERROR: Got error reading packet from server/ in err.out # # Error Case 3: # A GTID --start-position with any sequence numbers that are not # eventually processed results in error # MYSQL_BINLOG BINLOG_FILE_PARAM2 --start-position=0-1-8,1-2-6 > tmp_out_ 2> err_out_ FOUND 1 /ERROR: Got error reading packet from server/ in err.out # # Remote-only cleanup from error cases DROP TABLE t1; DROP TABLE t2; DROP TABLE t3; RESET MASTER; # # Error Case 4: # User provides invalid positions # MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --start-position=z # MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --start-position=1- # MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --start-position=1-2 # MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --start-position=1-2- # MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --start-position=-1 # # Error Case 5: # User provides GTID ranges with repeated domain ids # MYSQL_BINLOG MYSQLD_DATADIR/master-bin.000001 --start-position=0-1-1,0-1-8 --stop-position=0-1-4,0-1-12 ############################## # Cleanup ############################## SET @@global.gtid_domain_id= 0; SET @@global.server_id= 1; # End of the tests