######################################################################### # START : WITHOUT KEYRING PLUGIN ######################################################################### ######### # SETUP # ######### CREATE TABLESPACE encrypt_ts ADD DATAFILE 'encrypt_ts.ibd' ENGINE=InnoDB ENCRYPTION="N"; CREATE TABLE t1(c1 char(100)) ENGINE=InnoDB TABLESPACE encrypt_ts; set global innodb_buf_flush_list_now = 1; SELECT NAME, ENCRYPTION FROM INFORMATION_SCHEMA.INNODB_TABLESPACES WHERE NAME='encrypt_ts'; NAME ENCRYPTION encrypt_ts N SELECT * FROM t1 LIMIT 10; c1 SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES ALTER TABLESPACE encrypt_ts ENCRYPTION='Y'; ERROR HY000: Can't find master key from keyring, please check in the server log if a keyring plugin is loaded and initialized successfully. #-------------------------- TEST 1 -------------------------------------# ######################################################################### # RESTART 1 : WITH KEYRING PLUGIN ######################################################################### ######################################################################## # ALTER TABLESPACE 1 : Unencrypted => Encrypted # # crash just before flushing page 0 at the end # ######################################################################## # Set process to crash just before flushing page 0 at the end SET SESSION debug= '+d,alter_encrypt_tablespace_crash_before_flushing_page_0'; # Encrypt the tablespace. It will cause crash. ALTER TABLESPACE encrypt_ts ENCRYPTION='Y'; ######################################################################### # RESTART 2 : WITH KEYRING PLUGIN after crash # and INJECT error TOO_MANY_CONCURRENT_TXNS in startup location #1 ######################################################################### # Wait for Encryption processing to finish in background thread set global innodb_buf_flush_list_now = 1; # After restart/recovery, check that Encryption was roll-forward SELECT NAME, ENCRYPTION FROM INFORMATION_SCHEMA.INNODB_TABLESPACES WHERE NAME='encrypt_ts'; NAME ENCRYPTION encrypt_ts Y SELECT * FROM t1 LIMIT 10; c1 SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES ######################################################################### # RESTART 3 : WITHOUT KEYRING PLUGIN ######################################################################### SELECT * FROM t1 LIMIT 10; ERROR HY000: Can't find master key from keyring, please check in the server log if a keyring plugin is loaded and initialized successfully. ######################################################################### # RESTART 4 : WITH KEYRING PLUGIN ######################################################################### SELECT NAME, ENCRYPTION FROM INFORMATION_SCHEMA.INNODB_TABLESPACES WHERE NAME='encrypt_ts'; NAME ENCRYPTION encrypt_ts Y SELECT * FROM t1 LIMIT 10; c1 SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES ######################################################################## # ALTER TABLESPACE 2 : Encrypted => Unencrypted # # crash just before flushing page 0 at the end # ######################################################################## # Set process to crash just before flushing page 0 at the end SET SESSION debug= '+d,alter_encrypt_tablespace_crash_before_flushing_page_0'; # Unencrypt the tablespace. It will cause crash. ALTER TABLESPACE encrypt_ts ENCRYPTION='N'; ######################################################################### # RESTART 5 : WITH KEYRING PLUGIN after crash # and INJECT error TOO_MANY_CONCURRENT_TXNS in startup location #2 ######################################################################### # Wait for Unencryption processing to finish in background thread set global innodb_buf_flush_list_now = 1; # After restart/recovery, check that Unencryption was roll-forward SELECT NAME, ENCRYPTION FROM INFORMATION_SCHEMA.INNODB_TABLESPACES WHERE NAME='encrypt_ts'; NAME ENCRYPTION encrypt_ts N SELECT * FROM t1 LIMIT 10; c1 SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES ######################################################################### # RESTART 6 : WITHOUT KEYRING PLUGIN ######################################################################### SELECT NAME, ENCRYPTION FROM INFORMATION_SCHEMA.INNODB_TABLESPACES WHERE NAME='encrypt_ts'; NAME ENCRYPTION encrypt_ts N SELECT * FROM t1 LIMIT 10; c1 SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES ######################################################################### # RESTART 7 : WITH KEYRING PLUGIN ######################################################################### ######################################################################## # ALTER TABLESPACE 3 : Unencrypted => Encrypted # # crash just after flushing page 0 at the end # ######################################################################## # Set process to crash just after flushing page 0 at the end SET SESSION debug= '+d,alter_encrypt_tablespace_crash_after_flushing_page_0'; # Encrypt the tablespace. It will cause crash. ALTER TABLESPACE encrypt_ts ENCRYPTION='Y'; ######################################################################### # RESTART 8 : WITH KEYRING PLUGIN after crash ######################################################################### # Wait for Encryption processing to finish in background thread set global innodb_buf_flush_list_now = 1; # After restart/recovery, check that Encryption was roll-forward SELECT NAME, ENCRYPTION FROM INFORMATION_SCHEMA.INNODB_TABLESPACES WHERE NAME='encrypt_ts'; NAME ENCRYPTION encrypt_ts Y SELECT * FROM t1 LIMIT 10; c1 SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES ######################################################################### # RESTART 9 : WITHOUT KEYRING PLUGIN ######################################################################### SELECT * FROM t1 LIMIT 10; ERROR HY000: Can't find master key from keyring, please check in the server log if a keyring plugin is loaded and initialized successfully. ######################################################################### # RESTART 10 : WITH KEYRING PLUGIN ######################################################################### SELECT NAME, ENCRYPTION FROM INFORMATION_SCHEMA.INNODB_TABLESPACES WHERE NAME='encrypt_ts'; NAME ENCRYPTION encrypt_ts Y SELECT * FROM t1 LIMIT 10; c1 SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES ######################################################################## # ALTER TABLESPACE 4 : Encrypted => Unencrypted # # crash just after flushing page 0 at the end # ######################################################################## # Set process to crash just after flushing page 0 at the end SET SESSION debug= '+d,alter_encrypt_tablespace_crash_after_flushing_page_0'; # Unencrypt the tablespace. It will cause crash. ALTER TABLESPACE encrypt_ts ENCRYPTION='N'; ######################################################################### # RESTART 11 : WITH KEYRING PLUGIN after crash ######################################################################### # Wait for Unencryption processing to finish in background thread set global innodb_buf_flush_list_now = 1; # After restart/recovery, check that Unencryption was roll-forward SELECT NAME, ENCRYPTION FROM INFORMATION_SCHEMA.INNODB_TABLESPACES WHERE NAME='encrypt_ts'; NAME ENCRYPTION encrypt_ts N SELECT * FROM t1 LIMIT 10; c1 SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES ######################################################################### # RESTART 12 : WITHOUT KEYRING PLUGIN ######################################################################### SELECT NAME, ENCRYPTION FROM INFORMATION_SCHEMA.INNODB_TABLESPACES WHERE NAME='encrypt_ts'; NAME ENCRYPTION encrypt_ts N SELECT * FROM t1 LIMIT 10; c1 SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES #-------------------------- TEST 2 -------------------------------------# ######################################################################### # RESTART 13 : WITH KEYRING PLUGIN # and INJECT error TOO_MANY_CONCURRENT_TXNS in startup location #3 ######################################################################### SELECT NAME, ENCRYPTION FROM INFORMATION_SCHEMA.INNODB_TABLESPACES WHERE NAME='encrypt_ts'; NAME ENCRYPTION encrypt_ts N SELECT * FROM t1 LIMIT 10; c1 SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES ######################################################################## # ALTER TABLESPACE 5 : Encrypted => unencrypted # # crash just before updating ts flags on page0 # ######################################################################## ALTER TABLESPACE encrypt_ts ENCRYPTION='Y'; # Set process to crash just after flushing page 0 at the end SET SESSION debug= '+d,alter_encrypt_tablespace_crash_before_updating_flags'; # Unencrypt the tablespace. It will cause crash. ALTER TABLESPACE encrypt_ts ENCRYPTION='N'; ######################################################################### # RESTART 14 : WITH KEYRING PLUGIN after crash ######################################################################### # Wait for Unencryption processing to finish in background thread set global innodb_buf_flush_list_now = 1; # After restart/recovery, check that Unencryption was roll-forward SELECT NAME, ENCRYPTION FROM INFORMATION_SCHEMA.INNODB_TABLESPACES WHERE NAME='encrypt_ts'; NAME ENCRYPTION encrypt_ts N SELECT * FROM t1 LIMIT 10; c1 SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES ######################################################################### # RESTART 15 : WITHOUT KEYRING PLUGIN ######################################################################### SELECT NAME, ENCRYPTION FROM INFORMATION_SCHEMA.INNODB_TABLESPACES WHERE NAME='encrypt_ts'; NAME ENCRYPTION encrypt_ts N SELECT * FROM t1 LIMIT 10; c1 SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES ######################################################################### # RESTART 16 : WITH KEYRING PLUGIN ######################################################################### SELECT NAME, ENCRYPTION FROM INFORMATION_SCHEMA.INNODB_TABLESPACES WHERE NAME='encrypt_ts'; NAME ENCRYPTION encrypt_ts N SELECT * FROM t1 LIMIT 10; c1 SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES ######################################################################## # ALTER TABLESPACE 6 : Encrypted => unencrypted # # crash just before resetting progress onpage 0 # ######################################################################## ALTER TABLESPACE encrypt_ts ENCRYPTION='Y'; # Set process to crash just after flushing page 0 at the end SET SESSION debug= '+d,alter_encrypt_tablespace_crash_before_resetting_progress'; # Unencrypt the tablespace. It will cause crash. ALTER TABLESPACE encrypt_ts ENCRYPTION='N'; ######################################################################### # RESTART 17 : WITH KEYRING PLUGIN after crash ######################################################################### # Wait for Unencryption processing to finish in background thread set global innodb_buf_flush_list_now = 1; # After restart/recovery, check that Unencryption was roll-forward SELECT NAME, ENCRYPTION FROM INFORMATION_SCHEMA.INNODB_TABLESPACES WHERE NAME='encrypt_ts'; NAME ENCRYPTION encrypt_ts N SELECT * FROM t1 LIMIT 10; c1 SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES ######################################################################### # RESTART 18: WITHOUT KEYRING PLUGIN ######################################################################### SELECT NAME, ENCRYPTION FROM INFORMATION_SCHEMA.INNODB_TABLESPACES WHERE NAME='encrypt_ts'; NAME ENCRYPTION encrypt_ts N SELECT * FROM t1 LIMIT 10; c1 SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES SOME VALUES #-------------------------- TEST 3 -------------------------------------# ######################################################################### # RESTART 19 : WITH KEYRING PLUGIN ######################################################################### DROP TABLE t1; DROP TABLESPACE encrypt_ts; CREATE TABLESPACE encrypt_ts ADD DATAFILE 'encrypt_ts.ibd'; CREATE TABLE t1 (C CHAR(10)) TABLESPACE=encrypt_ts; SET GLOBAL innodb_limit_optimistic_insert_debug=2; INSERT INTO t1 VALUES("SOMEVALUE"); INSERT INTO t1 VALUES("SOMEVALUE"); INSERT INTO t1 VALUES("SOMEVALUE"); INSERT INTO t1 VALUES("SOMEVALUE"); INSERT INTO t1 VALUES("SOMEVALUE"); INSERT INTO t1 VALUES("SOMEVALUE"); INSERT INTO t1 VALUES("SOMEVALUE"); # Make sure checkpoint is not moved SET GLOBAL innodb_log_checkpoint_now = ON; SET GLOBAL innodb_page_cleaner_disabled_debug = 1; SET GLOBAL innodb_dict_stats_disabled_debug = 1; SET GLOBAL innodb_master_thread_disabled_debug = 1; # Following encryption will create a new tablespace key (KEY1) # KEY1 will be written on REDO log ALTER TABLESPACE encrypt_ts encryption='Y'; # Following unencryption will remove tablespace key ALTER TABLESPACE encrypt_ts encryption='N'; SET SESSION debug= '+d,alter_encrypt_tablespace_page_6'; SET SESSION debug= '+d,flush_each_dirtied_page'; # Following encryption will create a new tablespace key (KEY2) # KEY2 will be written on REDO log # Flush dirtied pages encrypted with KEY2 before crash ALTER TABLESPACE encrypt_ts encryption='Y'; ######################################################################### # RESTART 20: WITH KEYRING PLUGIN after crash ######################################################################### ########### # Cleanup # ########### DROP TABLE t1; DROP TABLESPACE encrypt_ts; ######################################################################### # RESTART 21 : final #########################################################################