# Test clone with different table types with debug sync --source include/have_debug_sync.inc --source include/count_sessions.inc --source include/not_windows.inc ## Install plugin --let $CLONE_DATADIR = $MYSQL_TMP_DIR/data_new --replace_result $CLONE_PLUGIN CLONE_PLUGIN --eval INSTALL PLUGIN clone SONAME '$CLONE_PLUGIN' ## Create test schema --source ../include/create_schema.inc # Insert 150 rows call execute_dml(0, 0, 150, 150, 10, 0); # Check base rows SHOW CREATE TABLE t1; SELECT count(*) from t1; SELECT col1, col2, col3, SUBSTRING(col4, 1000, 32) FROM t1 ORDER BY col1 LIMIT 10; SELECT col1, col2, col3, SUBSTRING(col4, 1000, 32) FROM t1 ORDER BY col1 DESC LIMIT 10; SHOW CREATE TABLE t2; SELECT count(*) from t2; SELECT col1, col2, col3, SUBSTRING(col4, 1000, 32) FROM t2 ORDER BY col1 LIMIT 10; SELECT col1, col2, col3, SUBSTRING(col4, 1000, 32) FROM t2 ORDER BY col1 DESC LIMIT 10; ## Test-1: Clone with dirty pages and redo log [No zero copy/sendfile] --echo # In connection default - Cloning database SET global debug="+d,clone_no_zero_copy"; SET DEBUG_SYNC = 'RESET'; SET DEBUG_SYNC = 'clone_file_copy SIGNAL start_dml1 WAIT_FOR resume_clone1'; SET DEBUG_SYNC = 'clone_page_copy SIGNAL start_dml2 WAIT_FOR resume_clone2'; --source ../include/clone_command_send.inc --echo # In connection con1 - Running Update Random [0 - 150 Key Range] connect (con1,localhost,root,,); SET DEBUG_SYNC = 'now WAIT_FOR start_dml1'; START TRANSACTION; CALL execute_dml(1, 0, 150, 200, 100, 1); COMMIT; --echo # Flush all dirty buffers SET GLOBAL innodb_buf_flush_list_now = 1; SET DEBUG_SYNC = 'now SIGNAL resume_clone1'; SET DEBUG_SYNC = 'now WAIT_FOR start_dml2'; START TRANSACTION; CALL execute_dml(1, 0, 150, 200, 100, 1); COMMIT; SET DEBUG_SYNC = 'now SIGNAL resume_clone2'; connection default; --echo # In connection default - Cloning database --reap SET global debug="-d,clone_no_zero_copy"; disconnect con1; --echo # Restart cloned database --replace_result $CLONE_DATADIR CLONE_DATADIR --let restart_parameters="restart: --datadir=$CLONE_DATADIR" --source include/restart_mysqld.inc # Check table in cloned database SHOW CREATE TABLE t1; SELECT count(*) from t1; SELECT col1, col3, SUBSTRING(col4, 1000, 32) FROM t1 ORDER BY col1 LIMIT 10; SELECT col1, col3, SUBSTRING(col4, 1000, 32) FROM t1 ORDER BY col1 DESC LIMIT 10; SHOW CREATE TABLE t2; SELECT count(*) from t2; SELECT col1, col3, SUBSTRING(col4, 1000, 32) FROM t2 ORDER BY col1 LIMIT 10; SELECT col1, col3, SUBSTRING(col4, 1000, 32) FROM t2 ORDER BY col1 DESC LIMIT 10; # Execute procedure to delete all rows and insert call execute_dml(3, 0, 1, 1, 1, 0); call execute_dml(0, 0, 150, 150, 100, 0); SELECT col1, col2, col3, SUBSTRING(col4, 1000, 32) FROM t1 ORDER BY col1 LIMIT 10; SELECT col1, col2, col3, SUBSTRING(col4, 1000, 32) FROM t1 ORDER BY col1 DESC LIMIT 10; SELECT col1, col2, col3, SUBSTRING(col4, 1000, 32) FROM t2 ORDER BY col1 LIMIT 10; SELECT col1, col2, col3, SUBSTRING(col4, 1000, 32) FROM t2 ORDER BY col1 DESC LIMIT 10; # Restart and Remove cloned directory --let restart_parameters="restart:" --source include/restart_mysqld.inc --force-rmdir $CLONE_DATADIR ## Test-2A: Clone with redo log ending at file boundary SET DEBUG_SYNC = 'RESET'; SET DEBUG_SYNC = 'clone_file_copy SIGNAL start_dml1 WAIT_FOR resume_clone1'; SET DEBUG_SYNC = 'clone_page_copy SIGNAL start_dml2 WAIT_FOR resume_clone2'; --source ../include/clone_command_send.inc --echo # In connection con1 - Running Update Random [0 - 10 Key Range] connect (con1,localhost,root,,); SET DEBUG_SYNC = 'now WAIT_FOR start_dml1'; START TRANSACTION; CALL execute_dml(1, 0, 10, 10, 10, 1); COMMIT; --echo # Flush all dirty buffers SET GLOBAL innodb_buf_flush_list_now = 1; SET DEBUG_SYNC = 'now SIGNAL resume_clone1'; SET DEBUG_SYNC = 'now WAIT_FOR start_dml2'; SET global debug="+d,clone_arch_log_stop_file_end"; START TRANSACTION; # Execute procedure to delete all rows and insert 150 rows call execute_dml(3, 0, 1, 1, 1, 0); call execute_dml(0, 0, 150, 150, 10, 0); COMMIT; SET DEBUG_SYNC = 'now SIGNAL resume_clone2'; connection default; --echo # In connection default - Cloning database --reap SET global debug="-d,clone_arch_log_stop_file_end"; # Removed cloned data --force-rmdir $CLONE_DATADIR ## Test-2B: Clone with redo log ending at file boundary + some bytes SET DEBUG_SYNC = 'RESET'; SET DEBUG_SYNC = 'clone_file_copy SIGNAL start_dml1 WAIT_FOR resume_clone1'; SET DEBUG_SYNC = 'clone_page_copy SIGNAL start_dml2 WAIT_FOR resume_clone2'; --source ../include/clone_command_send.inc --echo # In connection con1 - Running Update Random [0 - 10 Key Range] connection con1; SET DEBUG_SYNC = 'now WAIT_FOR start_dml1'; START TRANSACTION; CALL execute_dml(1, 0, 10, 10, 10, 1); COMMIT; --echo # Flush all dirty buffers SET GLOBAL innodb_buf_flush_list_now = 1; SET DEBUG_SYNC = 'now SIGNAL resume_clone1'; SET DEBUG_SYNC = 'now WAIT_FOR start_dml2'; SET global debug="+d,clone_arch_log_stop_file_end"; SET global debug="+d,clone_arch_log_extra_bytes"; START TRANSACTION; # Execute procedure to delete all rows and insert 150 rows call execute_dml(3, 0, 1, 1, 1, 0); call execute_dml(0, 0, 150, 150, 10, 0); COMMIT; SET DEBUG_SYNC = 'now SIGNAL resume_clone2'; connection default; --echo # In connection default - Cloning database --reap SET global debug="-d,clone_arch_log_stop_file_end"; SET global debug="-d,clone_arch_log_extra_bytes"; # Removed cloned data --force-rmdir $CLONE_DATADIR ## Test-3A: Shutdown while Clone in progress [FILE_COPY] SET DEBUG_SYNC = 'RESET'; SET DEBUG_SYNC = 'clone_file_copy SIGNAL start_dml1 WAIT_FOR resume_clone1'; --source ../include/clone_command_send.inc --echo # In connection con1 - Running Update Random [0 - 10 Key Range] connection con1; SET DEBUG_SYNC = 'now WAIT_FOR start_dml1'; START TRANSACTION; CALL execute_dml(1, 0, 10, 10, 10, 1); COMMIT; --source include/shutdown_mysqld.inc connection default; # During shutdown it is possible to get "2013" - Lost connection to server --echo # In connection default - Cloning database --error ER_QUERY_INTERRUPTED,2013,ER_CLONE_DONOR --reap disconnect con1; # Removed cloned data --force-rmdir $CLONE_DATADIR --source include/start_mysqld.inc ## Test-3B: Shutdown while Clone in progress [PAGE_COPY] SET DEBUG_SYNC = 'RESET'; SET DEBUG_SYNC = 'clone_file_copy SIGNAL start_dml1 WAIT_FOR resume_clone1'; SET DEBUG_SYNC = 'clone_page_copy SIGNAL start_dml2 WAIT_FOR resume_clone2'; --source ../include/clone_command_send.inc --echo # In connection con1 - Running Update Random [0 - 10 Key Range] connect (con1,localhost,root,,); SET DEBUG_SYNC = 'now WAIT_FOR start_dml1'; START TRANSACTION; CALL execute_dml(1, 0, 10, 10, 10, 1); COMMIT; --echo # Flush all dirty buffers SET GLOBAL innodb_buf_flush_list_now = 1; SET DEBUG_SYNC = 'now SIGNAL resume_clone1'; SET DEBUG_SYNC = 'now WAIT_FOR start_dml2'; START TRANSACTION; # Execute procedure to delete all rows and insert 50 rows call execute_dml(3, 0, 1, 1, 1, 0); call execute_dml(0, 0, 50, 50, 10, 0); COMMIT; --source include/shutdown_mysqld.inc connection default; --echo # In connection default - Cloning database --error ER_QUERY_INTERRUPTED,2013,ER_CLONE_DONOR --reap disconnect con1; # Removed cloned data --force-rmdir $CLONE_DATADIR --source include/start_mysqld.inc ## Test-3C: Shutdown while Clone in progress [REDO_COPY] SET DEBUG_SYNC = 'RESET'; SET DEBUG_SYNC = 'clone_file_copy SIGNAL start_dml1 WAIT_FOR resume_clone1'; SET DEBUG_SYNC = 'clone_page_copy SIGNAL start_dml2 WAIT_FOR resume_clone2'; SET DEBUG_SYNC = 'clone_redo_copy SIGNAL start_dml3 WAIT_FOR resume_clone3'; --source ../include/clone_command_send.inc --echo # In connection con1 - Running Update Random [0 - 10 Key Range] connect (con1,localhost,root,,); SET DEBUG_SYNC = 'now WAIT_FOR start_dml1'; START TRANSACTION; CALL execute_dml(1, 0, 10, 10, 10, 1); COMMIT; --echo # Flush all dirty buffers SET GLOBAL innodb_buf_flush_list_now = 1; SET DEBUG_SYNC = 'now SIGNAL resume_clone1'; SET DEBUG_SYNC = 'now WAIT_FOR start_dml2'; START TRANSACTION; # Execute procedure to delete all rows and insert 50 rows call execute_dml(3, 0, 1, 1, 1, 0); call execute_dml(0, 0, 50, 50, 10, 0); COMMIT; --echo # Flush all dirty buffers SET GLOBAL innodb_buf_flush_list_now = 1; SET DEBUG_SYNC = 'now SIGNAL resume_clone2'; SET DEBUG_SYNC = 'now WAIT_FOR start_dml3'; START TRANSACTION; # Execute procedure to delete all rows and insert 50 rows call execute_dml(3, 0, 1, 1, 1, 0); call execute_dml(0, 0, 50, 50, 10, 0); COMMIT; --source include/shutdown_mysqld.inc connection default; --echo # In connection default - Cloning database --error ER_QUERY_INTERRUPTED,2013,ER_CLONE_DONOR --reap disconnect con1; # Removed cloned data --force-rmdir $CLONE_DATADIR --source include/start_mysqld.inc #Cleanup --source ../include/drop_schema.inc UNINSTALL PLUGIN clone; SET DEBUG_SYNC = 'RESET'; --source include/wait_until_count_sessions.inc