160 lines
5.9 KiB
Plaintext
160 lines
5.9 KiB
Plaintext
################################################################################
|
|
# InnoDB transparent tablespace data encryption for general shared tablespace.
|
|
# This test case will test
|
|
# - Crash during altering an encrypted tablespace
|
|
# - encryption='y' to encryption='n'
|
|
# - encryption='n' to encryption='y'
|
|
# This test checks physical ibd file to see if unencrypted string is present
|
|
# in any of the pages in tablespace file.
|
|
################################################################################
|
|
--source include/have_debug.inc
|
|
--source include/big_test.inc
|
|
# --source include/no_valgrind_without_big.inc
|
|
# Disable in valgrind because of timeout, cf. Bug#22760145
|
|
--source include/not_valgrind.inc
|
|
# Waiting time when (re)starting the server
|
|
--let $explicit_default_wait_counter=10000;
|
|
|
|
--echo #########
|
|
--echo # SETUP #
|
|
--echo #########
|
|
--echo
|
|
let datadir=`SELECT @@datadir`;
|
|
let search_pattern=samplerecord;
|
|
let ts_name=encrypt_ts.ibd;
|
|
|
|
--echo #########################################################################
|
|
--echo # RESTART 1 : WITH KEYRING PLUGIN
|
|
--echo #########################################################################
|
|
let $restart_parameters = restart: --early-plugin-load=keyring_file=$KEYRING_PLUGIN --loose-keyring_file_data=$MYSQL_TMP_DIR/mysecret_keyring $KEYRING_PLUGIN_OPT;
|
|
--source include/restart_mysqld_no_echo.inc
|
|
|
|
--echo # Create a new 'unencrypted' tablespace 'encrypt_ts'
|
|
SELECT NAME, FLAG, SPACE_TYPE FROM information_schema.INNODB_TABLESPACES
|
|
where NAME="encrypt_ts";
|
|
create tablespace encrypt_ts add datafile 'encrypt_ts.ibd'
|
|
engine=INNODB encryption='N';
|
|
SELECT NAME, FLAG, SPACE_TYPE FROM information_schema.INNODB_TABLESPACES
|
|
where NAME="encrypt_ts";
|
|
|
|
--echo # Create a table test.t1 in 'encrypt_ts' tablespace and insert some records.
|
|
create table test.t1 (c char(20)) tablespace encrypt_ts;
|
|
insert into test.t1 values ("samplerecord");
|
|
|
|
# Make sure ts file is updated
|
|
set global innodb_buf_flush_list_now = 1;
|
|
|
|
--echo #############################################################
|
|
--echo # INITIAL SETUP : Tablespace is created as unencrypted #
|
|
--echo # A table is created and rows are inserted #
|
|
--echo #############################################################
|
|
|
|
--echo # Check that tablespace file is not encrypted yet
|
|
--source include/if_encrypted.inc
|
|
|
|
--echo ############################################################
|
|
--echo # ALTER TABLESPACE 1 : Unencrypted => Encrypted #
|
|
--echo ############################################################
|
|
ALTER TABLESPACE encrypt_ts ENCRYPTION='Y';
|
|
|
|
# Make sure all pages are flushed
|
|
set global innodb_buf_flush_list_now = 1;
|
|
|
|
--echo # Check that tablespace file is encrypted now
|
|
--source include/if_encrypted.inc
|
|
|
|
--echo ############################################################
|
|
--echo # ALTER TABLESPACE 2 : Encrypted => Unencrypted #
|
|
--echo ############################################################
|
|
ALTER TABLESPACE encrypt_ts ENCRYPTION='N';
|
|
|
|
# Make sure all pages are flushed
|
|
set global innodb_buf_flush_list_now = 1;
|
|
|
|
--echo # Check that tablespace file is not encrypted now
|
|
--source include/if_encrypted.inc
|
|
|
|
--echo
|
|
--echo ################# CRASH/RECOVERY TESTING ###################
|
|
--echo
|
|
|
|
--echo ############################################################
|
|
--echo # ALTER TABLESPACE 3 : Unencrypted => Encrypted #
|
|
--echo # (crash at page 10) #
|
|
--echo ############################################################
|
|
# Insert few records in table
|
|
--disable_query_log
|
|
let $counter=12;
|
|
while ($counter>0)
|
|
{
|
|
INSERT INTO test.t1 SELECT * FROM test.t1;
|
|
dec $counter;
|
|
}
|
|
--enable_query_log
|
|
|
|
SELECT COUNT(*) FROM test.t1;
|
|
|
|
# Make sure ts file is updated with new records in table
|
|
set global innodb_buf_flush_list_now = 1;
|
|
|
|
--echo # Check that tablespace file is still unencrypted
|
|
--source include/if_encrypted.inc
|
|
|
|
--echo # Set Encryption process to crash at page 10
|
|
SET SESSION debug= '+d,alter_encrypt_tablespace_page_10';
|
|
|
|
--source include/expect_crash.inc
|
|
--error 0,CR_SERVER_LOST,ER_INTERNAL_ERROR
|
|
ALTER TABLESPACE encrypt_ts ENCRYPTION='Y';
|
|
--source include/start_mysqld_no_echo.inc
|
|
|
|
--echo # Wait for Encryption processing to finish in background thread
|
|
let $wait_condition = select count(*) = 0
|
|
from performance_schema.events_stages_current
|
|
where EVENT_NAME='stage/innodb/alter tablespace (encryption)';
|
|
--source include/wait_condition.inc
|
|
|
|
--echo # After restart/recovery, check that Encryption was roll-forward and
|
|
--echo # tablespace file is encrypted now
|
|
--source include/if_encrypted.inc
|
|
|
|
--echo ############################################################
|
|
--echo # ALTER TABLESPACE 4 : Encrypted => Unencrypted #
|
|
--echo # (crash at page 10) #
|
|
--echo ############################################################
|
|
|
|
SELECT COUNT(*) FROM test.t1;
|
|
|
|
--echo # Check that tablespace file is Encrypted
|
|
--source include/if_encrypted.inc
|
|
|
|
--echo # Set Encryption process to crash after page 10
|
|
SET SESSION debug= '+d,alter_encrypt_tablespace_page_10';
|
|
|
|
--source include/expect_crash.inc
|
|
--error 0,CR_SERVER_LOST,ER_INTERNAL_ERROR
|
|
ALTER TABLESPACE encrypt_ts ENCRYPTION='N';
|
|
--source include/start_mysqld_no_echo.inc
|
|
|
|
--echo # Wait for Unencryption processing to finish in background thread
|
|
let $wait_condition = select count(*) = 0
|
|
from performance_schema.events_stages_current
|
|
where EVENT_NAME='stage/innodb/alter tablespace (encryption)';
|
|
--source include/wait_condition.inc
|
|
|
|
--echo # After restart/recovery, check that Unencryption was roll-forward and
|
|
--echo # tablespace file is Unencrypted now
|
|
--source include/if_encrypted.inc
|
|
|
|
--echo ###########
|
|
--echo # CLEANUP #
|
|
--echo ###########
|
|
DROP TABLE test.t1;
|
|
DROP TABLESPACE encrypt_ts;
|
|
remove_file $MYSQLTEST_VARDIR/tmpfile.txt;
|
|
remove_file $MYSQL_TMP_DIR/mysecret_keyring;
|
|
|
|
--echo # Restarting server without keyring to restore server state
|
|
let $restart_parameters = restart: ;
|
|
--source include/restart_mysqld.inc
|