polardbxengine/mysql-test/suite/rpl/t/rpl_migration_crash_safe.test

205 lines
7.7 KiB
Plaintext

########################################################################################
# This test verifies if the server migrates correctly from a file repository to a
# table repository and vice-versa. In particular, it checks if the information in the
# relay log info is correctly migrated between the different types (i.e. FILE or TABLE)
# of repositories. The algorithm and the function used to migrate the master info is
# the same and for that reason, we do not test its migration.
#
# If a FILE repository is used, the following assertions are valid:
# AF1. SELECT COUNT(*) FROM mysql.slave_relay_log_info == 0
# AF2. file_exists $MYSQLD_DATADIR/relay-log.info == 1
#
# If a TABLE repository is used, the following assertions are valid:
# AT1. SELECT COUNT(*) FROM mysql.slave_relay_log_info == 1
# AT2. file_exists $MYSQLD_DATADIR/relay-log.info == 0
#
# The test case is organized as follows:
#
# 1. Preparation:
# 1.1. The slave is started with a FILE repository enabled and the replication
# stopped.
# 1.2. A table is created and populated in order to check at the end of the test
# if data is replicated correctly.
# 1.3. Assertions AF1 and AF2 are verified.
#
# 2. Migration from FILE to TABLE by restarting the SERVER
# 2.1. The slave is stopped and restarted with --relay-log-info-repository=TABLE
# 2.2. Assertions AT1 and AT2 are verified.
#
# 3. Migration from TABLE to FILE by restarting the SERVER
# 4.1. The slave is stopped and restarted with --relay-log-info-repository=FILE
# 4.2. Assertions AF1 and AF2 are verified.
#
# 4. Migration from FILE to TALBE by using SET
# 4.1. SET @GLOBAL.relay_log_info_repository=TABLE is exectued.
# 4.2. Assertions AT1 and AT2 are verified.
#
# 5. Migration from TABLE to FILE by using SET
# 5.1. SET @GLOBAL.relay_log_info_repository=FILE is executed.
# 5.2. Assertions AF1 and AF2 are verified.
#
# 6. Migration from FILE to FILE by using SET
# 6.1. SET @GLOBAL.relay_log_info_repository=FILE is executed.
# 6.2. Assertions AF1 and AF2 are verified.
#
# 7. Migration while slave is running by using SET
# 7.1 Slave is started.
# 7.2. SET @GLOBAL.relay_log_info_repository=FILE is executed and fails.
# 7.3. Assertions AF1 and AF2 are verified.
#
# 8. Check consistency
# 8.1. The replication is started and the master is compared to the slave.
########################################################################################
########################################################################################
# 1. Preparation
########################################################################################
--source include/not_group_replication_plugin.inc
--source include/not_valgrind.inc
--source include/not_mts_slave_parallel_workers.inc
--source include/master-slave.inc
--connection slave
let $MYSQLD_DATADIR= `SELECT @@datadir`;
let $exp_slave= 0;
let $got_slave= `SELECT COUNT(*) FROM mysql.slave_relay_log_info`;
if ($got_slave != $exp_slave)
{
--echo "The mysql.slave_relay_log_info has information and this is not expected."
--die
}
file_exists $MYSQLD_DATADIR/relay-log.info;
--source include/stop_slave.inc
--connection master
CREATE TABLE test(id INTEGER NOT NULL PRIMARY KEY);
INSERT INTO test VALUES (1), (2), (3);
########################################################################################
# 2. Migration from FILE to TABLE by restarting the SERVER
########################################################################################
--connection slave
--let $rpl_server_number= 2
--let $rpl_server_parameters= --relay-log-info-repository=TABLE --skip-slave-start
--source include/rpl_restart_server.inc
let $exp_slave= 1;
let $got_slave= `SELECT COUNT(*) FROM mysql.slave_relay_log_info`;
if ($got_slave != $exp_slave)
{
--echo "The mysql.slave_relay_log_info has no information and this is not expected."
--die
}
--error 1
file_exists $MYSQLD_DATADIR/relay-log.info;
########################################################################################
# 3. Migration from TABLE to FILE by restarting the SERVER
########################################################################################
--connection slave
--let $rpl_server_number= 2
--let $rpl_server_parameters= --relay-log-info-repository=FILE --skip-slave-start
--source include/rpl_restart_server.inc
let $exp_slave= 0;
let $got_slave= `SELECT COUNT(*) FROM mysql.slave_relay_log_info`;
if ($got_slave != $exp_slave)
{
--echo "The mysql.slave_relay_log_info has information and this is not expected."
--die
}
file_exists $MYSQLD_DATADIR/relay-log.info;
########################################################################################
# 4. Migration FROM FILE TO TABLE by using SET
########################################################################################
--connection slave
SET @@GLOBAL.relay_log_info_repository= "TABLE";
let $exp_slave= 1;
let $got_slave= `SELECT COUNT(*) FROM mysql.slave_relay_log_info`;
if ($got_slave != $exp_slave)
{
--echo "The mysql.slave_relay_log_info has no information and this is not expected."
--die
}
--error 1
file_exists $MYSQLD_DATADIR/relay-log.info;
########################################################################################
# 5. Migration FROM TABLE TO FILE by using SET
########################################################################################
--connection slave
SET @@GLOBAL.relay_log_info_repository= "FILE";
let $exp_slave= 0;
let $got_slave= `SELECT COUNT(*) FROM mysql.slave_relay_log_info`;
if ($got_slave != $exp_slave)
{
--echo "The mysql.slave_relay_log_info has information and this is not expected."
--die
}
file_exists $MYSQLD_DATADIR/relay-log.info;
########################################################################################
# 6. Migration FROM FILE TO FILE by using SET
########################################################################################
--connection slave
SET @@GLOBAL.relay_log_info_repository= "FILE";
let $exp_slave= 0;
let $got_slave= `SELECT COUNT(*) FROM mysql.slave_relay_log_info`;
if ($got_slave != $exp_slave)
{
--echo "The mysql.slave_relay_log_info has information and this is not expected."
--die
}
file_exists $MYSQLD_DATADIR/relay-log.info;
########################################################################################
# 7. Migration while slave is running by using SET
########################################################################################
--connection slave
#
# If the slave info repository is X, and the user sets the same repository
# again there is no need to stop the slave threads and the control return
# to client thread without doing anything. To make the test case pass in
# crash-safe-master i.e when --master-info-repository=TABLE, we convert
# the repo to FILE.
SET @@GLOBAL.master_info_repository= "FILE";
--source include/start_slave.inc
--error ER_SLAVE_CHANNEL_MUST_STOP
SET @@GLOBAL.relay_log_info_repository= "TABLE";
--error ER_SLAVE_CHANNEL_MUST_STOP
SET @@GLOBAL.master_info_repository= "TABLE";
########################################################################################
# 8. Check consistency
########################################################################################
--connection master
--source include/sync_slave_sql_with_master.inc
--exec $MYSQL_DUMP --compact --order-by-primary --skip-extended-insert --no-create-info test > $MYSQLD_DATADIR/test-migration-master.sql
--exec $MYSQL_DUMP_SLAVE --compact --order-by-primary --skip-extended-insert --no-create-info test > $MYSQLD_DATADIR/test-migration-slave.sql
--diff_files $MYSQLD_DATADIR/test-migration-master.sql $MYSQLD_DATADIR/test-migration-slave.sql
--connection master
DROP TABLE test;
--source include/sync_slave_sql_with_master.inc
#Cleanup
--source include/rpl_end.inc