# Test clone with different table types with debug sync --source include/have_innodb_max_16k.inc --source include/have_debug_sync.inc --source include/count_sessions.inc --echo # Prepare for creating Encrypted Table --let $CLONE_DATADIR = $MYSQL_TMP_DIR/data_new --let $MYSQLD_DATADIR= `select @@datadir;` --let $ENCRYPT_DATADIR = $MYSQL_TMP_DIR/data_encrypt --let $ENCRYPT_ERROR_FILE = $MYSQL_TMP_DIR/boot_encrypt_log --let BOOTSTRAP_SQL=$MYSQL_TMP_DIR/boot.sql --let $START_PAGE_SIZE= `select @@innodb_page_size` --echo # create bootstrap file write_file $BOOTSTRAP_SQL; CREATE DATABASE test DEFAULT CHARACTER SET latin1; EOF --mkdir $ENCRYPT_DATADIR --echo # Create and start mysqld with keyring plugin. --source include/shutdown_mysqld.inc --replace_result $MYSQLD MYSQLD $BOOTSTRAP_SQL BOOTSTRAP_SQL $ENCRYPT_DATADIR ENCRYPT_DATADIR $START_PAGE_SIZE PAGE_SIZE $ENCRYPT_ERROR_FILE ENCRYPT_ERROR_FILE --let NEW_CMD = $MYSQLD --no-defaults --innodb_dedicated_server=OFF --initialize-insecure --init-file=$BOOTSTRAP_SQL --innodb_log_file_size=5M --innodb_log_files_in_group=2 --innodb_page_size=$START_PAGE_SIZE --datadir=$ENCRYPT_DATADIR > $ENCRYPT_ERROR_FILE 2>&1 --exec $NEW_CMD --replace_result $KEYRING_PLUGIN KEYRING_PLUGIN $MYSQL_TMP_DIR MYSQL_TMP_DIR $ENCRYPT_DATADIR ENCRYPT_DATADIR --let $restart_parameters=restart: --datadir=$ENCRYPT_DATADIR --early-plugin-load="keyring_file=$KEYRING_PLUGIN" --keyring_file_data=$MYSQL_TMP_DIR/mysecret_keyring --source include/start_mysqld.inc --echo ## Install plugin --replace_result $CLONE_PLUGIN CLONE_PLUGIN --eval INSTALL PLUGIN clone SONAME '$CLONE_PLUGIN' ## Create test schema --source ../include/create_schema.inc if(!$page_compression) { --echo # In connection default - starting clone # Validate that redo and undo encryption cannot be set when clone in progress. */ SET DEBUG_SYNC = 'clone_file_copy SIGNAL set_encryption WAIT_FOR resume_clone'; --source ../include/clone_command_send.inc connect (con1,localhost,root,,); --echo # In connection con1 - Trying to set redo and undo encryption SET DEBUG_SYNC = 'now WAIT_FOR set_encryption'; SHOW VARIABLES LIKE 'innodb_redo_log_encrypt'; --error ER_CLONE_IN_PROGRESS SET GLOBAL innodb_redo_log_encrypt = ON; SHOW VARIABLES LIKE 'innodb_redo_log_encrypt'; SHOW VARIABLES LIKE 'innodb_undo_log_encrypt'; --error ER_CLONE_IN_PROGRESS SET GLOBAL innodb_undo_log_encrypt = ON; SHOW VARIABLES LIKE 'innodb_undo_log_encrypt'; SET DEBUG_SYNC = 'now SIGNAL resume_clone'; connection default; --echo # In connection default - finishing Clone --reap disconnect con1; --force-rmdir $CLONE_DATADIR } # Modify the schema and add compressed table DROP TABLE t1; DROP TABLE t2; if(!$page_compression) { # Create table with encryption enabled */ CREATE TABLE t1(col1 INT PRIMARY KEY, col2 int, col3 varchar(64), col4 BLOB) ROW_FORMAT = COMPRESSED ENCRYPTION = "Y"; # Create table in encrypted general tablespace CREATE TABLESPACE tbs1 ADD DATAFILE 'tbs1_data1.ibd' ENCRYPTION="Y"; CREATE TABLE t2(col1 INT PRIMARY KEY, col2 int, col3 varchar(64), col4 BLOB) ENCRYPTION="Y" TABLESPACE = tbs1; SET GLOBAL innodb_redo_log_encrypt = ON; SHOW VARIABLES LIKE 'innodb_redo_log_encrypt'; SET GLOBAL innodb_undo_log_encrypt = ON; SHOW VARIABLES LIKE 'innodb_undo_log_encrypt'; } if($page_compression) { # Create table with encryption and compression enabled. # Disable warning for platforms not supporting punch hole. --disable_warnings CREATE TABLE t1(col1 INT PRIMARY KEY, col2 int, col3 varchar(64), col4 BLOB) COMPRESSION = "LZ4" ENCRYPTION = "Y"; --enable_warnings # Create table in encrypted general tablespace CREATE TABLESPACE tbs1 ADD DATAFILE 'tbs1_data1.ibd' ENCRYPTION="Y"; # Create table with ZLIB compression. # Disable warning for platforms not supporting punch hole. --disable_warnings CREATE TABLE t2(col1 INT PRIMARY KEY, col2 int, col3 varchar(64), col4 BLOB) COMPRESSION = "ZLIB"; --enable_warnings } ## Execute Clone while concurrent DMLs are in progress # Insert 200 rows call execute_dml(0, 0, 200, 200, 100, 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 no redo log to copy. SET GLOBAL innodb_buf_flush_list_now = 1; --source ../include/clone_command.inc --echo # Restart cloned database --replace_result $KEYRING_PLUGIN KEYRING_PLUGIN $MYSQL_TMP_DIR MYSQL_TMP_DIR $CLONE_DATADIR CLONE_DATADIR --let $restart_parameters=restart: --datadir=$CLONE_DATADIR --early-plugin-load="keyring_file=$KEYRING_PLUGIN" --keyring_file_data=$MYSQL_TMP_DIR/mysecret_keyring --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, 200, 200, 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; --replace_result $KEYRING_PLUGIN KEYRING_PLUGIN $MYSQL_TMP_DIR MYSQL_TMP_DIR $ENCRYPT_DATADIR ENCRYPT_DATADIR --let $restart_parameters=restart: --datadir=$ENCRYPT_DATADIR --early-plugin-load="keyring_file=$KEYRING_PLUGIN" --keyring_file_data=$MYSQL_TMP_DIR/mysecret_keyring --source include/restart_mysqld.inc --force-rmdir $CLONE_DATADIR ## Test-2: Clone with dirty pages and redo log SET GLOBAL innodb_redo_log_encrypt = ON; SET GLOBAL innodb_undo_log_encrypt = ON; SHOW CREATE TABLE t1; SHOW CREATE TABLE t2; --echo # In connection default - Cloning database 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 - 200 Key Range] connect (con1,localhost,root,,); SET DEBUG_SYNC = 'now WAIT_FOR start_dml1'; START TRANSACTION; CALL execute_dml(1, 0, 200, 500, 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, 200, 500, 100, 1); COMMIT; SET DEBUG_SYNC = 'now SIGNAL resume_clone2'; connection default; --echo # In connection default - Cloning database --reap disconnect con1; --source include/wait_until_count_sessions.inc --echo # Restart cloned database --replace_result $KEYRING_PLUGIN KEYRING_PLUGIN $MYSQL_TMP_DIR MYSQL_TMP_DIR $CLONE_DATADIR CLONE_DATADIR --let $restart_parameters=restart: --datadir=$CLONE_DATADIR --early-plugin-load="keyring_file=$KEYRING_PLUGIN" --keyring_file_data=$MYSQL_TMP_DIR/mysecret_keyring --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, 200, 200, 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; --replace_result $KEYRING_PLUGIN KEYRING_PLUGIN $MYSQL_TMP_DIR MYSQL_TMP_DIR $ENCRYPT_DATADIR ENCRYPT_DATADIR --let $restart_parameters=restart: --datadir=$ENCRYPT_DATADIR --early-plugin-load="keyring_file=$KEYRING_PLUGIN" --keyring_file_data=$MYSQL_TMP_DIR/mysecret_keyring --source include/restart_mysqld.inc --force-rmdir $CLONE_DATADIR # Cleanup --source ../include/drop_schema.inc DROP TABLESPACE tbs1; UNINSTALL PLUGIN clone; UNINSTALL PLUGIN keyring_file; SET DEBUG_SYNC = 'RESET'; # Restart default database --let restart_parameters="restart:" --source include/restart_mysqld.inc --echo # Restart server and remove encrypted data directory let $restart_parameters = "restart:"; --source include/restart_mysqld.inc # Temporary file Cleanup --force-rmdir $ENCRYPT_DATADIR --remove_file $ENCRYPT_ERROR_FILE --remove_file $BOOTSTRAP_SQL --remove_file $MYSQL_TMP_DIR/mysecret_keyring