GIF89a; Mini Shell

Mini Shell

Direktori : /usr/share/mysql-test/suite/binlog/t/
Upload File :
Current File : //usr/share/mysql-test/suite/binlog/t/binlog_mysqlbinlog_concat.test

#################################################################
# Bug#18258933 CONCATENATION OF MYSQLBINLOG OUTPUT DOES NOT
# WORK WITH GTID

# Problem:  When mysqlbinlog processes and concatenates
# multiple binary log files into one output file, this
# output file is not in useful state. When it is later
# used for point-in-time recovery, it is producing
# ER_GTID_NEXT_TYPE_UNDEFINED_GROUP "ERROR 1837: When
# @@SESSION.GTID_NEXT is set to a GTID, you must explicitly
# set it to a different value after a COMMIT or ROLLBACK.
# Please check GTID_NEXT variable manual page for detailed
# explanation. Current @@SESSION.GTID_NEXT is 'xyz'"

# Solution: When mysqlbinlog processes second binary log's
#            start_log_event, it can output
#            "SET GTID_NEXT=AUTOMATIC" if required i.e., if
#            previous binary log is leaving the GTID_NEXT state
#            in 'undefined' state.

# Steps to verify the case:
# 1) On a Gtid enabled server, generate some dummy statements
#    in binary log ( to generate GTID_NEXT events in binary log 1)
# 2) Restart server with gtid-mode OFF
# 3) On a Gtid disabled sever, generate some dummy statements
#     in binary log ( to generate anonymous events in binary log 2)
# 4) Restart server again with gtid-mode ON.
# 5) On a Gtid enabled server, generate some dummy statements
#    in binary log ( to generate GTID_NEXT events in binary log 3)
# 6) Concat all three binary logs 1,2 and 3 and apply the generated
#    sql against mysql command line tool and it should not cause
#    any error (i.e., no ER_GTID_NEXT_TYPE_UNDEFINED_GROUP error)
#################################################################
--source include/have_binlog_format_statement.inc
--source include/have_gtid.inc

# Use this so that we can use rpl_restart_server.inc later.
--let $rpl_server_count= 1
--let $rpl_topology= none
--source include/rpl_init.inc
--source include/rpl_default_connections.inc


#Initial setup
--let $datadir= `SELECT @@datadir`
--let $binlog_file1= query_get_value(SHOW MASTER STATUS, File, 1)

# Step 1 : Dummy statements to generate gtid transactions (gtid-mode is ON)
# in binlog_file1
CREATE TABLE t1(i INT);
INSERT INTO t1 values (1);

# Step 2: Restart server with gtid-mode off (binlog will be rotated)
--let $rpl_server_number= 1
--let $rpl_server_parameters= --gtid-mode=off
--source include/rpl_restart_server.inc
--let $binlog_file2= query_get_value(SHOW MASTER STATUS, File, 1)

# Step 3: Dummy statements to generate anonymous transactions
# (gtid-mode is OFF)
CREATE TABLE t2(i INT);
INSERT INTO t2 values (2);

# Step 4: Restart server with gtid-mode ON (binlog will be rotated)
--let $rpl_server_number= 1
--let $rpl_server_parameters= --gtid-mode=on
--source include/rpl_restart_server.inc
--let $binlog_file3= query_get_value(SHOW MASTER STATUS, File, 1)

# Step 5 : Dummy statements to generate gtid transactions (gtid-mode is ON)
# in binlog_file3
CREATE TABLE t3(i INT);
INSERT INTO t3 values (3);

# Clean up command (let DROP TABLE be in binary log 4, when we apply
# all three binary logs, we can select the data and verify that the
# data is there.
FLUSH LOGS;
DROP TABLE t1,t2,t3;

# Step 6: Combine binlog_file1, binlog_file2, binlog_file3 and generate
# a .sql file.
--exec $MYSQL_BINLOG --force-if-open $datadir/$binlog_file1 $datadir/$binlog_file2  $datadir/$binlog_file3 > $MYSQLTEST_VARDIR/tmp/concat_three_files.sql

# Execute reset master, so that when we are applying gtid transactions,
# they should not skipped.
RESET MASTER;

# Step 7: Apply the generated .sql through mysql command line tool
# and it should not cause any issues
--exec $MYSQL --user=root --host=127.0.0.1 --port=$MASTER_MYPORT < $MYSQLTEST_VARDIR/tmp/concat_three_files.sql

# Step 8: Verify the data in t1 and t2
# [NOTE] there will not be table t3 created because CREATE TABLE t2, INSERT INTO t2
# (originally anonymous transactions) now occupies gtid numbers 3 and 4,
# hence CREATE TABLE t3, INSERT INTO t3(which has originally gtid numbers 3
# and 4) will be skipped when we are reapplying them.
SELECT * FROM t1;
SELECT * FROM t2;

# Clean up
DROP TABLE t1,t2;
--remove_file $MYSQLTEST_VARDIR/tmp/concat_three_files.sql

./BlackJoker Mini Shell 1.0