mirror of
				https://github.com/MariaDB/server.git
				synced 2025-10-31 19:06:14 +01:00 
			
		
		
		
	 5ab5ff08b0
			
		
	
	
	5ab5ff08b0
	
	
	
		
			
			This commit makes replicas crash-safe by default by changing the Using_Gtid value to be Slave_Pos on a fresh slave start and after RESET SLAVE is issued. If the primary server does not support GTIDs (i.e., version < 10), the replica will fall back to Using_Gtid=No on slave start and after RESET SLAVE. The following additional informational messages/warnings are added: 1. When Using_Gtid is automatically changed. That is, if RESET SLAVE reverts Using_Gtid back to Slave_Pos, or Using_Gtid is inferred to No from a CHANGE MASTER TO given with log coordinates without MASTER_USE_GTID. 2. If options are ignored in CHANGE MASTER TO. If CHANGE MASTER TO is given with log coordinates, yet also specifies MASTER_USE_GTID=Slave_Pos, a warning message is given that the log coordinate options are ignored. Additionally, an MTR macro has been added for RESET SLAVE, reset_slave.inc, which provides modes/options for resetting a slave in log coordinate or gtid modes. When in log coordinates mode, the macro will execute CHANGE MASTER TO MASTER_USE_GTID=No after the RESET SLAVE command. When in GTID mode, an extra parameter, reset_slave_keep_gtid_state, can be set to reset or preserve the value of gtid_slave_pos. Reviewed By: =========== Andrei Elkin <andrei.elkin@mariadb.com>
		
			
				
	
	
		
			247 lines
		
	
	
	
		
			7.9 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			247 lines
		
	
	
	
		
			7.9 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| # See if replication of a "LOAD DATA in an autoincrement column"
 | |
| # Honours autoincrement values
 | |
| # i.e. if the master and slave have the same sequence
 | |
| #
 | |
| # check replication of load data for temporary tables with additional
 | |
| # parameters
 | |
| #
 | |
| # check if duplicate entries trigger an error (they should unless IGNORE or
 | |
| # REPLACE was used on the master) (bug 571).
 | |
| #
 | |
| # check if START SLAVE, RESET SLAVE, CHANGE MASTER reset Last_slave_error and
 | |
| # Last_slave_errno in SHOW SLAVE STATUS (1st and 3rd commands did not: bug 986)
 | |
| 
 | |
| source include/have_innodb.inc;
 | |
| source include/master-slave.inc;
 | |
| 
 | |
| --disable_query_log
 | |
| CALL mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT");
 | |
| --enable_query_log
 | |
| 
 | |
| select last_insert_id();
 | |
| create table t1(a int not null auto_increment, b int, primary key(a) );
 | |
| eval load data $lock_option infile '../../std_data/rpl_loaddata.dat' into table t1;
 | |
| # verify that LAST_INSERT_ID() is set by LOAD DATA INFILE
 | |
| select last_insert_id();
 | |
| 
 | |
| create temporary table t2 (day date,id int(9),category enum('a','b','c'),name varchar(60));
 | |
| eval load data $lock_option infile '../../std_data/rpl_loaddata2.dat' into table t2 fields terminated by ',' optionally enclosed by '%' escaped by '@' lines terminated by '\n##\n' starting by '>' ignore 1 lines;
 | |
| 
 | |
| create table t3 (day date,id int(9),category enum('a','b','c'),name varchar(60));
 | |
| --disable_warnings
 | |
| insert into t3 select * from t2;
 | |
| --enable_warnings
 | |
| 
 | |
| sync_slave_with_master;
 | |
| 
 | |
| select * from t1;
 | |
| select * from t3;
 | |
| 
 | |
| connection master;
 | |
| 
 | |
| drop table t1;
 | |
| drop table t2;
 | |
| drop table t3;
 | |
| create table t1(a int, b int, unique(b));
 | |
| 
 | |
| sync_slave_with_master;
 | |
| 
 | |
| # See if slave stops when there's a duplicate entry for key error in LOAD DATA
 | |
| 
 | |
| insert into t1 values(1,10);
 | |
| 
 | |
| connection master;
 | |
| eval load data $lock_option infile '../../std_data/rpl_loaddata.dat' into table t1;
 | |
| 
 | |
| save_master_pos;
 | |
| connection slave;
 | |
| # 1062 = ER_DUP_ENTRY
 | |
| call mtr.add_suppression("Slave SQL.*Error .Duplicate entry .10. for key .b.. on query.* error.* 1062");
 | |
| call mtr.add_suppression("Slave SQL.*Query caused different errors on master and slave.*Error on master:.*error code=1062.*Error on slave:.*error.* 0");
 | |
| --let $slave_sql_errno= 1062
 | |
| --source include/wait_for_slave_sql_error_and_skip.inc
 | |
| 
 | |
| # Skip the bad event and see if error is cleared in SHOW SLAVE STATUS by START
 | |
| # SLAVE, even though we are not executing any event (as sql_slave_skip_counter
 | |
| # takes us directly to the end of the relay log).
 | |
| 
 | |
| sync_with_master;
 | |
| --source include/check_slave_no_error.inc
 | |
| 
 | |
| # Trigger error again to test CHANGE MASTER
 | |
| 
 | |
| connection master;
 | |
| set sql_log_bin=0;
 | |
| delete from t1;
 | |
| set sql_log_bin=1;
 | |
| eval load data $lock_option infile '../../std_data/rpl_loaddata.dat' into table t1;
 | |
| save_master_pos;
 | |
| connection slave;
 | |
| # The SQL slave thread should be stopped now. 
 | |
| # Exec_Master_Log_Pos should point to the start of Execute event
 | |
| # for last load data.
 | |
| # 1062 = ER_DUP_ENTRY
 | |
| --let $slave_sql_errno= 1062
 | |
| --source include/wait_for_slave_sql_error.inc
 | |
| 
 | |
| # CHANGE MASTER and see if error is cleared in SHOW SLAVE STATUS.
 | |
| --source include/stop_slave_io.inc
 | |
| change master to master_user='test';
 | |
| change master to master_user='root';
 | |
| --source include/check_slave_no_error.inc
 | |
| 
 | |
| # Trigger error again to test RESET SLAVE
 | |
| 
 | |
| set global sql_slave_skip_counter=1;
 | |
| start slave;
 | |
| sync_with_master;
 | |
| connection master;
 | |
| set sql_log_bin=0;
 | |
| delete from t1;
 | |
| set sql_log_bin=1;
 | |
| eval load data $lock_option infile '../../std_data/rpl_loaddata.dat' into table t1;
 | |
| save_master_pos;
 | |
| connection slave;
 | |
| # The SQL slave thread should be stopped now.
 | |
| # 1062 = ER_DUP_ENTRY
 | |
| --let $slave_sql_errno= 1062
 | |
| --source include/wait_for_slave_sql_error.inc
 | |
| 
 | |
| # RESET SLAVE and see if error is cleared in SHOW SLAVE STATUS.
 | |
| stop slave;
 | |
| --source include/reset_slave.inc
 | |
| --source include/check_slave_no_error.inc
 | |
| 
 | |
| # Finally, see if logging is done ok on master for a failing LOAD DATA INFILE
 | |
| 
 | |
| connection master;
 | |
| reset master;
 | |
| eval create table t2 (day date,id int(9),category enum('a','b','c'),name varchar(60),
 | |
| unique(day)) engine=$engine_type; # no transactions
 | |
| --error ER_DUP_ENTRY
 | |
| eval load data $lock_option infile '../../std_data/rpl_loaddata2.dat' into table t2 fields
 | |
| terminated by ',' optionally enclosed by '%' escaped by '@' lines terminated by
 | |
| '\n##\n' starting by '>' ignore 1 lines;
 | |
| select * from t2;
 | |
| save_master_pos;
 | |
| connection slave;
 | |
| start slave;
 | |
| sync_with_master;
 | |
| select * from t2;
 | |
| 
 | |
| # verify that if no error on slave, this is an error
 | |
| 
 | |
| alter table t2 drop key day;
 | |
| connection master;
 | |
| delete from t2;
 | |
| --error ER_DUP_ENTRY
 | |
| eval load data $lock_option infile '../../std_data/rpl_loaddata2.dat' into table t2 fields
 | |
| terminated by ',' optionally enclosed by '%' escaped by '@' lines terminated by
 | |
| '\n##\n' starting by '>' ignore 1 lines;
 | |
| connection slave;
 | |
| 
 | |
| if (`SELECT @@global.binlog_format != 'ROW'`)
 | |
| {
 | |
|   # Query causes error on master but not on slave. This causes the slave to
 | |
|   # stop with error code 0 (which is wrong: see BUG#57287)
 | |
|   --let $slave_sql_errno= 0
 | |
|   --source include/wait_for_slave_sql_error.inc
 | |
|   drop table t1, t2;
 | |
| }
 | |
| connection master;
 | |
| drop table t1, t2;
 | |
| 
 | |
| # BUG#17233 LOAD DATA INFILE: failure causes mysqld dbug_assert, binlog not flushed
 | |
| CREATE TABLE t1 (word CHAR(20) NOT NULL PRIMARY KEY) ENGINE=INNODB;
 | |
| 
 | |
| --error ER_DUP_ENTRY
 | |
| eval LOAD DATA $lock_option INFILE "../../std_data/words.dat" INTO TABLE t1;
 | |
| 
 | |
| DROP TABLE t1;
 | |
| 
 | |
| # BUG#48297: Schema name is ignored when LOAD DATA is written into binlog,
 | |
| # replication aborts
 | |
| -- let $rpl_only_running_threads= 1
 | |
| -- source include/rpl_reset.inc
 | |
| 
 | |
| -- let $db1= b48297_db1
 | |
| -- let $db2= b42897_db2
 | |
| 
 | |
| -- connection master
 | |
| 
 | |
| -- disable_warnings
 | |
| -- eval drop database if exists $db1
 | |
| -- eval drop database if exists $db2
 | |
| -- enable_warnings
 | |
| 
 | |
| -- eval create database $db1
 | |
| -- eval create database $db2
 | |
| 
 | |
| -- eval use $db1
 | |
| -- eval CREATE TABLE t1 (c1 VARCHAR(256)) engine=$engine_type;
 | |
| 
 | |
| -- eval use $db2
 | |
| 
 | |
| -- echo ### assertion: works with cross-referenced database
 | |
| -- replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
 | |
| -- eval LOAD DATA $lock_option LOCAL INFILE '$MYSQLTEST_VARDIR/std_data/loaddata5.dat' INTO TABLE $db1.t1
 | |
| 
 | |
| -- eval use $db1
 | |
| -- replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
 | |
| -- echo ### assertion: works with fully qualified name on current database
 | |
| -- replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
 | |
| -- eval LOAD DATA $lock_option LOCAL INFILE '$MYSQLTEST_VARDIR/std_data/loaddata5.dat' INTO TABLE $db1.t1
 | |
| 
 | |
| -- echo ### assertion: works without fully qualified name on current database
 | |
| -- replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
 | |
| -- eval LOAD DATA $lock_option LOCAL INFILE '$MYSQLTEST_VARDIR/std_data/loaddata5.dat' INTO TABLE t1
 | |
| 
 | |
| -- echo ### create connection without default database
 | |
| connect (conn2,localhost,root,,*NO-ONE*);
 | |
| -- connection conn2
 | |
| -- echo ### assertion: works without stating the default database
 | |
| -- replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
 | |
| -- eval LOAD DATA $lock_option LOCAL INFILE '$MYSQLTEST_VARDIR/std_data/loaddata5.dat' INTO TABLE $db1.t1
 | |
| 
 | |
| # We cannot disconnect right away because when inserting
 | |
| # concurrently in a MyISAM table, the server is sending an OK 
 | |
| # to the client before updating the table state (where the 
 | |
| # number of records is kept). See: BUG#37521 and BUG#29334.
 | |
| # So we need to wait, otherwise we would be having sporadic 
 | |
| # failures as reported here: BUG#50451.
 | |
| 
 | |
| # 12 = 3 rows per each LOAD DATA executed x 4
 | |
| -- let $count= 12
 | |
| -- let $table= $db1.t1
 | |
| --source include/wait_until_rows_count.inc
 | |
| 
 | |
| -- disconnect conn2
 | |
| -- connection master
 | |
| 
 | |
| -- sync_slave_with_master
 | |
| -- eval use $db1
 | |
| 
 | |
| let $diff_tables= master:$db1.t1, slave:$db1.t1;
 | |
| source include/diff_tables.inc;
 | |
| 
 | |
| -- connection master
 | |
| 
 | |
| -- eval DROP DATABASE $db1
 | |
| -- eval DROP DATABASE $db2
 | |
| 
 | |
| -- sync_slave_with_master
 | |
| 
 | |
| # BUG#49479: LOAD DATA INFILE is binlogged without escaping field names
 | |
| -- source include/rpl_reset.inc
 | |
| -- connection master
 | |
| use test;
 | |
| CREATE TABLE t1 (`key` TEXT, `text` TEXT);
 | |
| 
 | |
| LOAD DATA INFILE '../../std_data/loaddata2.dat' REPLACE INTO TABLE `t1` FIELDS TERMINATED BY ',';
 | |
| SELECT * FROM t1;
 | |
| 
 | |
| -- sync_slave_with_master
 | |
| -- connection master
 | |
| DROP TABLE t1;
 | |
| 
 | |
| --source include/rpl_end.inc
 |