1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230
|
--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 $PLUGIN_DIR_OPT --innodb_dedicated_server=OFF --initialize-insecure --init-file=$BOOTSTRAP_SQL --innodb_redo_log_capacity=10M --innodb_page_size=$START_PAGE_SIZE --datadir=$ENCRYPT_DATADIR > $ENCRYPT_ERROR_FILE 2>&1
--exec $NEW_CMD
--let $restart_parameters=restart: $PLUGIN_DIR_OPT --datadir=$ENCRYPT_DATADIR
--source include/start_mysqld_no_echo.inc
--echo ## Install plugin
--replace_result $CLONE_PLUGIN CLONE_PLUGIN
--eval INSTALL PLUGIN clone SONAME '$CLONE_PLUGIN'
## Create test schema
--source create_schema.inc
if(!$page_compression) {
--echo # In connection default - starting clone
# Validate that redo and undo encryption can be set when clone in progress. */
SET DEBUG_SYNC = 'clone_file_copy SIGNAL set_encryption WAIT_FOR resume_clone';
--source clone_command_send.inc
connect (con1,localhost,root,,);
--echo # In connection con1 - Set redo and undo encryption
SET DEBUG_SYNC = 'now WAIT_FOR set_encryption';
SHOW VARIABLES LIKE 'innodb_redo_log_encrypt';
SET GLOBAL innodb_redo_log_encrypt = ON;
SHOW VARIABLES LIKE 'innodb_redo_log_encrypt';
SHOW VARIABLES LIKE 'innodb_undo_log_encrypt';
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
SET GLOBAL innodb_redo_log_encrypt = OFF;
SET GLOBAL innodb_undo_log_encrypt = OFF;
}
# 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 clone_command.inc
--echo # Restart cloned database
--let $restart_parameters=restart: $PLUGIN_DIR_OPT --datadir=$CLONE_DATADIR
--source include/restart_mysqld_no_echo.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;
--let $restart_parameters=restart: $PLUGIN_DIR_OPT --datadir=$ENCRYPT_DATADIR
--source include/restart_mysqld_no_echo.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 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
--let $restart_parameters=restart: $PLUGIN_DIR_OPT --datadir=$CLONE_DATADIR
--source include/restart_mysqld_no_echo.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;
--let $restart_parameters=restart: $PLUGIN_DIR_OPT --datadir=$ENCRYPT_DATADIR
--source include/restart_mysqld_no_echo.inc
--force-rmdir $CLONE_DATADIR
# Cleanup
--source drop_schema.inc
DROP TABLESPACE tbs1;
UNINSTALL PLUGIN clone;
SET DEBUG_SYNC = 'RESET';
# Restart default database
--let restart_parameters="restart: $PLUGIN_DIR_OPT"
--source include/restart_mysqld_no_echo.inc
# Temporary file Cleanup
--force-rmdir $ENCRYPT_DATADIR
--remove_file $ENCRYPT_ERROR_FILE
--remove_file $BOOTSTRAP_SQL
|