diff --git a/mysql-test/include/innodb_encrypt_log.combinations b/mysql-test/include/innodb_encrypt_log.combinations new file mode 100644 index 0000000000000..fd21a57c3c256 --- /dev/null +++ b/mysql-test/include/innodb_encrypt_log.combinations @@ -0,0 +1,7 @@ +[crypt] +innodb_encrypt_log=ON +innodb_encryption_rotate_key_age=1 +plugin_load_add=$DEBUG_KEY_MANAGEMENT_SO + +[clear] +skip_innodb_encrypt_log diff --git a/mysql-test/include/innodb_encrypt_log.inc b/mysql-test/include/innodb_encrypt_log.inc new file mode 100644 index 0000000000000..5beebeae81f07 --- /dev/null +++ b/mysql-test/include/innodb_encrypt_log.inc @@ -0,0 +1,4 @@ +# The goal of including this file is to enable innodb_encrypt_log combinations +# (see include/innodb_encrypt_log.combinations) + +--source include/have_innodb.inc diff --git a/mysql-test/suite/encryption/r/innodb-rowlog.result b/mysql-test/suite/encryption/r/innodb-rowlog.result deleted file mode 100644 index 873041ab421c9..0000000000000 --- a/mysql-test/suite/encryption/r/innodb-rowlog.result +++ /dev/null @@ -1,30 +0,0 @@ -SET GLOBAL innodb_file_format = `Barracuda`; -create table t1(id int not null primary key auto_increment, credit_card varchar(200), private varchar(50)) engine=innodb; -SET SESSION debug_dbug="+d,ib_merge_wait_after_read"; -alter table t1 add index secret (credit_card), ALGORITHM=INPLACE, LOCK=NONE; -SET GLOBAL innodb_encryption_rotate_key_age = 1; -create table t2(id int) engine=innodb; -SET SESSION debug_dbug="+d,ib_merge_wait_after_read"; -alter table t1 add index secret2 (private), ALGORITHM=INPLACE, LOCK=NONE; -insert into t1(credit_card) select credit_card from t1; -insert into t1(credit_card) select credit_card from t1; -insert into t1(credit_card) select credit_card from t1; -drop table t2; -SELECT variable_value > 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_encrypted'; -variable_value > 0 -1 -SELECT variable_value > 0 FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_merge_blocks_encrypted'; -variable_value > 0 -1 -SELECT variable_value > 0 FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_merge_blocks_decrypted'; -variable_value > 0 -1 -SELECT variable_value > 0 FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_encrypted'; -variable_value > 0 -1 -SELECT variable_value > 0 FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_decrypted'; -variable_value > 0 -1 -drop table t1; -SET GLOBAL innodb_file_format=Antelope; -SET GLOBAL innodb_encryption_rotate_key_age=15; diff --git a/mysql-test/suite/encryption/t/innodb-rowlog.opt b/mysql-test/suite/encryption/t/innodb-rowlog.opt deleted file mode 100644 index 6338ddbde352b..0000000000000 --- a/mysql-test/suite/encryption/t/innodb-rowlog.opt +++ /dev/null @@ -1,7 +0,0 @@ ---aria-encrypt-tables ---encrypt-tmp-disk-tables ---innodb-encrypt-tables ---innodb-encrypt-log ---innodb-encryption-rotate-key-age=15 ---innodb-encryption-threads=4 ---innodb-tablespaces-encryption diff --git a/mysql-test/suite/encryption/t/innodb-rowlog.test b/mysql-test/suite/encryption/t/innodb-rowlog.test deleted file mode 100644 index 135293ef4b949..0000000000000 --- a/mysql-test/suite/encryption/t/innodb-rowlog.test +++ /dev/null @@ -1,90 +0,0 @@ --- source include/have_innodb.inc --- source include/have_example_key_management_plugin.inc -# needs dbug_dbug --- source include/have_debug.inc - ---disable_warnings ---disable_query_log -let $innodb_file_format_orig = `SELECT @@innodb_file_format`; -let $key_age = `SELECT @@innodb_encryption_rotate_key_age`; ---enable_query_log - -SET GLOBAL innodb_file_format = `Barracuda`; ---enable_warnings - -let $MYSQLD_DATADIR = `SELECT @@datadir`; -let $MYSQLD_TMPDIR = `SELECT @@tmpdir`; - -# -# Create a table that will be encrypted and put some sensitive data to it (credit card numbers) -# - -create table t1(id int not null primary key auto_increment, credit_card varchar(200), private varchar(50)) engine=innodb; - -let $rows = 15000; ---disable_query_log -begin; -while ($rows) -{ - eval insert into t1 values(NULL, '0000-0000-0000-0000','private_data'); - dec $rows; -} -commit; ---enable_query_log - ---let $wait_timeout= 600 ---let $wait_condition=SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 ---source include/wait_condition.inc - -# -# Now we create secondary index for credit_card column in parallel we create new rows -# forcing alter table to wait so that row log is used. -# -SET SESSION debug_dbug="+d,ib_merge_wait_after_read"; -send alter table t1 add index secret (credit_card), ALGORITHM=INPLACE, LOCK=NONE; -# -# Force key rotation and create second index for same table -# -connect (con2,localhost,root,,); -SET GLOBAL innodb_encryption_rotate_key_age = 1; -create table t2(id int) engine=innodb; -SET SESSION debug_dbug="+d,ib_merge_wait_after_read"; -send alter table t1 add index secret2 (private), ALGORITHM=INPLACE, LOCK=NONE; -# -# Create new rows to row log -# -connect (con1,localhost,root,,); -insert into t1(credit_card) select credit_card from t1; -insert into t1(credit_card) select credit_card from t1; -insert into t1(credit_card) select credit_card from t1; - -connection default; -reap; -disconnect con1; - -connection con2; -reap; -drop table t2; - -connection default; -disconnect con2; - -let $wait_condition= select variable_value > 0 from information_schema.global_status where variable_name = 'INNODB_NUM_PAGES_ENCRYPTED'; ---source include/wait_condition.inc - -# -# Verify that both merge blocks and row log blocks are encryted and decrypted -# - -SELECT variable_value > 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_encrypted'; -SELECT variable_value > 0 FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_merge_blocks_encrypted'; -SELECT variable_value > 0 FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_merge_blocks_decrypted'; -SELECT variable_value > 0 FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_encrypted'; -SELECT variable_value > 0 FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_decrypted'; - -drop table t1; - ---disable_warnings -eval SET GLOBAL innodb_file_format=$innodb_file_format_orig; -eval SET GLOBAL innodb_encryption_rotate_key_age=$key_age; ---enable_warnings diff --git a/mysql-test/suite/innodb/r/innodb-index-online,crypt.rdiff b/mysql-test/suite/innodb/r/innodb-index-online,crypt.rdiff new file mode 100644 index 0000000000000..767e36f3bfb46 --- /dev/null +++ b/mysql-test/suite/innodb/r/innodb-index-online,crypt.rdiff @@ -0,0 +1,20 @@ +--- innodb-index-online.result ++++ innodb-index-online,crypt.reject +@@ -260,7 +260,7 @@ + @merge_encrypt_1>@merge_encrypt_0, @merge_decrypt_1>@merge_decrypt_0, + @rowlog_encrypt_1>@rowlog_encrypt_0; + sort_balance @merge_encrypt_1>@merge_encrypt_0 @merge_decrypt_1>@merge_decrypt_0 @rowlog_encrypt_1>@rowlog_encrypt_0 +-0 0 0 0 ++0 1 1 1 + SET DEBUG_SYNC = 'now SIGNAL dml2_done'; + ERROR HY000: Creating index 'c2e' required more than 'innodb_online_alter_log_max_size' bytes of modification log. Please try again. + SELECT name, count FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE subsystem = 'ddl'; +@@ -364,7 +364,7 @@ + @rowlog_encrypt_2-@rowlog_encrypt_1>0 as log_encrypted, + @rowlog_decrypt_2-@rowlog_decrypt_1>0 as log_decrypted; + sort_encrypted sort_decrypted log_encrypted log_decrypted +-0 0 0 0 ++1 1 1 1 + SELECT COUNT(c22f) FROM t1; + COUNT(c22f) + 320 diff --git a/mysql-test/suite/innodb/r/innodb-index-online.result b/mysql-test/suite/innodb/r/innodb-index-online.result index 77b7bc365aad4..d6941770cd3fb 100644 --- a/mysql-test/suite/innodb/r/innodb-index-online.result +++ b/mysql-test/suite/innodb/r/innodb-index-online.result @@ -180,6 +180,15 @@ t1 CREATE TABLE `t1` ( PRIMARY KEY (`c1`), KEY `c2d` (`c2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 STATS_PERSISTENT=1 +SET @merge_encrypt_0= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_encrypted'); +SET @merge_decrypt_0= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_decrypted'); +SET @rowlog_encrypt_0= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_encrypted'); SET DEBUG_SYNC = 'row_log_apply_before SIGNAL c2e_created WAIT_FOR dml2_done'; SET lock_wait_timeout = 10; ALTER TABLE t1 DROP INDEX c2d, ADD INDEX c2e(c2), @@ -209,6 +218,22 @@ BEGIN; UPDATE t1 SET c2 = c2 + 1; DELETE FROM t1; ROLLBACK; +BEGIN; +DELETE FROM t1; +ROLLBACK; +UPDATE t1 SET c2 = c2 + 1; +BEGIN; +UPDATE t1 SET c2 = c2 + 1; +DELETE FROM t1; +ROLLBACK; +BEGIN; +DELETE FROM t1; +ROLLBACK; +UPDATE t1 SET c2 = c2 + 1; +BEGIN; +UPDATE t1 SET c2 = c2 + 1; +DELETE FROM t1; +ROLLBACK; SELECT name, count FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE subsystem = 'ddl'; name count ddl_background_drop_indexes 0 @@ -220,6 +245,22 @@ INNER JOIN INFORMATION_SCHEMA.INNODB_SYS_FIELDS sf ON si.index_id = sf.index_id WHERE si.name = '?c2e'; name pos c2 0 +SET @merge_encrypt_1= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_encrypted'); +SET @merge_decrypt_1= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_decrypted'); +SET @rowlog_encrypt_1= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_encrypted'); +SELECT +(@merge_encrypt_1-@merge_encrypt_0)- +(@merge_decrypt_1-@merge_decrypt_0) as sort_balance, +@merge_encrypt_1>@merge_encrypt_0, @merge_decrypt_1>@merge_decrypt_0, +@rowlog_encrypt_1>@rowlog_encrypt_0; +sort_balance @merge_encrypt_1>@merge_encrypt_0 @merge_decrypt_1>@merge_decrypt_0 @rowlog_encrypt_1>@rowlog_encrypt_0 +0 0 0 0 SET DEBUG_SYNC = 'now SIGNAL dml2_done'; ERROR HY000: Creating index 'c2e' required more than 'innodb_online_alter_log_max_size' bytes of modification log. Please try again. SELECT name, count FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE subsystem = 'ddl'; @@ -245,6 +286,18 @@ ddl_background_drop_indexes 0 ddl_background_drop_tables 0 ddl_online_create_index 0 ddl_pending_alter_table 0 +SET @merge_encrypt_1= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_encrypted'); +SET @merge_decrypt_1= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_decrypted'); +SET @rowlog_encrypt_1= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_encrypted'); +SET @rowlog_decrypt_1= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_decrypted'); SET DEBUG_SYNC = 'row_log_apply_before SIGNAL c2f_created WAIT_FOR dml3_done'; ALTER TABLE t1 ADD INDEX c2f(c2); SET DEBUG_SYNC = 'now WAIT_FOR c2f_created'; @@ -262,6 +315,14 @@ BEGIN; UPDATE t1 SET c2 = c2 + 1; DELETE FROM t1; ROLLBACK; +BEGIN; +INSERT INTO t1 SELECT 320 + c1, c2, c3 FROM t1 WHERE c1 > 160; +DELETE FROM t1 WHERE c1 > 320; +ROLLBACK; +BEGIN; +UPDATE t1 SET c2 = c2 + 1; +DELETE FROM t1; +ROLLBACK; SELECT name, count FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE subsystem = 'ddl'; name count ddl_background_drop_indexes 0 @@ -278,6 +339,32 @@ ddl_background_drop_indexes 0 ddl_background_drop_tables 0 ddl_online_create_index 0 ddl_pending_alter_table 0 +SET @merge_encrypt_2= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_encrypted'); +SET @merge_decrypt_2= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_decrypted'); +SET @rowlog_encrypt_2= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_encrypted'); +SET @rowlog_decrypt_2= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_decrypted'); +SELECT +(@merge_encrypt_2-@merge_encrypt_1)- +(@merge_decrypt_2-@merge_decrypt_1) as sort_balance, +(@rowlog_encrypt_2-@rowlog_encrypt_1)- +(@rowlog_decrypt_2-@rowlog_decrypt_1) as log_balance; +sort_balance log_balance +0 0 +SELECT +@merge_encrypt_2-@merge_encrypt_1>0 as sort_encrypted, +@merge_decrypt_2-@merge_decrypt_1>0 as sort_decrypted, +@rowlog_encrypt_2-@rowlog_encrypt_1>0 as log_encrypted, +@rowlog_decrypt_2-@rowlog_decrypt_1>0 as log_decrypted; +sort_encrypted sort_decrypted log_encrypted log_decrypted +0 0 0 0 SELECT COUNT(c22f) FROM t1; COUNT(c22f) 320 diff --git a/mysql-test/suite/innodb/r/innodb-table-online,crypt.rdiff b/mysql-test/suite/innodb/r/innodb-table-online,crypt.rdiff new file mode 100644 index 0000000000000..fa36666ba488e --- /dev/null +++ b/mysql-test/suite/innodb/r/innodb-table-online,crypt.rdiff @@ -0,0 +1,20 @@ +--- innodb-table-online.result ++++ innodb-table-online,crypt.reject +@@ -254,7 +254,7 @@ + @merge_encrypt_1>@merge_encrypt_0, @merge_decrypt_1>@merge_decrypt_0, + @rowlog_encrypt_1>@rowlog_encrypt_0; + sort_balance @merge_encrypt_1>@merge_encrypt_0 @merge_decrypt_1>@merge_decrypt_0 @rowlog_encrypt_1>@rowlog_encrypt_0 +-0 0 0 0 ++0 1 1 1 + SET DEBUG_SYNC = 'now SIGNAL dml2_done'; + # session con1 + ERROR HY000: Creating index 'PRIMARY' required more than 'innodb_online_alter_log_max_size' bytes of modification log. Please try again. +@@ -345,7 +345,7 @@ + @rowlog_encrypt_2-@rowlog_encrypt_1>0 as log_encrypted, + @rowlog_decrypt_2-@rowlog_decrypt_1>0 as log_decrypted; + sort_encrypted sort_decrypted log_encrypted log_decrypted +-0 0 0 0 ++1 1 1 1 + ALTER TABLE t1 DROP PRIMARY KEY, ADD PRIMARY KEY c3p5(c3(5)); + ERROR 23000: Duplicate entry '' for key 'PRIMARY' + UPDATE t1 SET c3 = NULL WHERE c3 = ''; diff --git a/mysql-test/suite/innodb/r/innodb-table-online.result b/mysql-test/suite/innodb/r/innodb-table-online.result index a352f0c2a909e..b8cd99659facf 100644 --- a/mysql-test/suite/innodb/r/innodb-table-online.result +++ b/mysql-test/suite/innodb/r/innodb-table-online.result @@ -3,7 +3,7 @@ call mtr.add_suppression("InnoDB: Error: table 'test/t1'"); call mtr.add_suppression("MySQL is trying to open a table handle but the .ibd file for"); SET @global_innodb_file_per_table_orig = @@global.innodb_file_per_table; SET GLOBAL innodb_file_per_table = on; -CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 INT NOT NULL, c3 TEXT NOT NULL) +CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 INT NOT NULL, c3 CHAR(255) NOT NULL) ENGINE = InnoDB; INSERT INTO t1 VALUES (1,1,''), (2,2,''), (3,3,''), (4,4,''), (5,5,''); SET GLOBAL innodb_monitor_enable = module_ddl; @@ -53,7 +53,7 @@ Table Create Table t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` int(11) NOT NULL, - `c3` text NOT NULL, + `c3` char(255) NOT NULL, PRIMARY KEY (`c1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=REDUNDANT BEGIN; @@ -81,7 +81,7 @@ Table Create Table t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` int(11) NOT NULL, - `c3` text NOT NULL, + `c3` char(255) NOT NULL, UNIQUE KEY `c2` (`c2`), UNIQUE KEY `c2_2` (`c2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT @@ -92,7 +92,7 @@ Table Create Table t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` int(11) NOT NULL, - `c3` text NOT NULL, + `c3` char(255) NOT NULL, UNIQUE KEY `c2` (`c2`), UNIQUE KEY `c2_2` (`c2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT @@ -118,7 +118,7 @@ Table Create Table t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` int(11) NOT NULL, - `c3` text NOT NULL, + `c3` char(255) NOT NULL, UNIQUE KEY `c2` (`c2`), UNIQUE KEY `c2_2` (`c2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT @@ -173,17 +173,26 @@ INSERT INTO t1 SELECT 20 + c1, c2, c3 FROM t1; INSERT INTO t1 SELECT 40 + c1, c2, c3 FROM t1; EXPLAIN SELECT COUNT(*) FROM t1 WHERE c2 > 3; id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 ALL NULL NULL NULL NULL 80 Using where +1 SIMPLE t1 ALL NULL NULL NULL NULL ROWS Using where ANALYZE TABLE t1; Table Op Msg_type Msg_text test.t1 analyze status OK +SET @merge_encrypt_0= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_encrypted'); +SET @merge_decrypt_0= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_decrypted'); +SET @rowlog_encrypt_0= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_encrypted'); # session con1 SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` int(11) NOT NULL, - `c3` text NOT NULL, + `c3` char(255) NOT NULL, PRIMARY KEY (`c1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT SET DEBUG_SYNC = 'row_log_table_apply1_before SIGNAL rebuilt2 WAIT_FOR dml2_done'; @@ -230,6 +239,22 @@ ddl_background_drop_indexes 0 ddl_background_drop_tables 0 ddl_online_create_index 1 ddl_pending_alter_table 1 +SET @merge_encrypt_1= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_encrypted'); +SET @merge_decrypt_1= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_decrypted'); +SET @rowlog_encrypt_1= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_encrypted'); +SELECT +(@merge_encrypt_1-@merge_encrypt_0)- +(@merge_decrypt_1-@merge_decrypt_0) as sort_balance, +@merge_encrypt_1>@merge_encrypt_0, @merge_decrypt_1>@merge_decrypt_0, +@rowlog_encrypt_1>@rowlog_encrypt_0; +sort_balance @merge_encrypt_1>@merge_encrypt_0 @merge_decrypt_1>@merge_decrypt_0 @rowlog_encrypt_1>@rowlog_encrypt_0 +0 0 0 0 SET DEBUG_SYNC = 'now SIGNAL dml2_done'; # session con1 ERROR HY000: Creating index 'PRIMARY' required more than 'innodb_online_alter_log_max_size' bytes of modification log. Please try again. @@ -239,14 +264,26 @@ ddl_background_drop_indexes 0 ddl_background_drop_tables 0 ddl_online_create_index 0 ddl_pending_alter_table 0 +SET @merge_encrypt_1= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_encrypted'); +SET @merge_decrypt_1= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_decrypted'); +SET @rowlog_encrypt_1= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_encrypted'); +SET @rowlog_decrypt_1= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_decrypted'); SET DEBUG_SYNC = 'row_log_table_apply1_before SIGNAL rebuilt3 WAIT_FOR dml3_done'; ALTER TABLE t1 ADD PRIMARY KEY(c22f), CHANGE c2 c22f INT; ERROR 42000: Multiple primary key defined ALTER TABLE t1 DROP PRIMARY KEY, ADD PRIMARY KEY(c22f), CHANGE c2 c22f INT; ERROR 23000: Duplicate entry '5' for key 'PRIMARY' ALTER TABLE t1 DROP PRIMARY KEY, ADD PRIMARY KEY(c1,c22f,c4(5)), -CHANGE c2 c22f INT, CHANGE c3 c3 TEXT NULL, CHANGE c1 c1 INT AFTER c22f, -ADD COLUMN c4 VARCHAR(6) DEFAULT 'Online'; +CHANGE c2 c22f INT, CHANGE c3 c3 CHAR(255) NULL, CHANGE c1 c1 INT AFTER c22f, +ADD COLUMN c4 VARCHAR(6) DEFAULT 'Online', LOCK=NONE; # session default SET DEBUG_SYNC = 'now WAIT_FOR rebuilt3'; SELECT name, count FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE subsystem = 'ddl'; @@ -283,6 +320,32 @@ COUNT(c22f) CHECK TABLE t1; Table Op Msg_type Msg_text test.t1 check status OK +SET @merge_encrypt_2= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_encrypted'); +SET @merge_decrypt_2= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_decrypted'); +SET @rowlog_encrypt_2= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_encrypted'); +SET @rowlog_decrypt_2= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_decrypted'); +SELECT +(@merge_encrypt_2-@merge_encrypt_1)- +(@merge_decrypt_2-@merge_decrypt_1) as sort_balance, +(@rowlog_encrypt_2-@rowlog_encrypt_1)- +(@rowlog_decrypt_2-@rowlog_decrypt_1) as log_balance; +sort_balance log_balance +0 0 +SELECT +@merge_encrypt_2-@merge_encrypt_1>0 as sort_encrypted, +@merge_decrypt_2-@merge_decrypt_1>0 as sort_decrypted, +@rowlog_encrypt_2-@rowlog_encrypt_1>0 as log_encrypted, +@rowlog_decrypt_2-@rowlog_decrypt_1>0 as log_decrypted; +sort_encrypted sort_decrypted log_encrypted log_decrypted +0 0 0 0 ALTER TABLE t1 DROP PRIMARY KEY, ADD PRIMARY KEY c3p5(c3(5)); ERROR 23000: Duplicate entry '' for key 'PRIMARY' UPDATE t1 SET c3 = NULL WHERE c3 = ''; @@ -294,13 +357,13 @@ SET @@sql_mode = 'STRICT_TRANS_TABLES'; ALTER TABLE t1 DROP COLUMN c22f, DROP PRIMARY KEY, ADD PRIMARY KEY c3p5(c3(5)), ALGORITHM = INPLACE; ERROR 22004: Invalid use of NULL value -ALTER TABLE t1 MODIFY c3 TEXT NOT NULL; +ALTER TABLE t1 MODIFY c3 CHAR(255) NOT NULL; ERROR 22004: Invalid use of NULL value SET @@sql_mode = @old_sql_mode; -UPDATE t1 SET c3=CONCAT(c1,REPEAT('foo',c1)) WHERE c3 IS NULL; +UPDATE t1 SET c3=LEFT(CONCAT(c1,REPEAT('foo',c1)),255) WHERE c3 IS NULL; SET DEBUG_SYNC = 'row_log_table_apply1_before SIGNAL c3p5_created0 WAIT_FOR ins_done0'; SET @@sql_mode = 'STRICT_TRANS_TABLES'; -ALTER TABLE t1 MODIFY c3 TEXT NOT NULL, DROP COLUMN c22f, +ALTER TABLE t1 MODIFY c3 CHAR(255) NOT NULL, DROP COLUMN c22f, ADD COLUMN c5 CHAR(5) DEFAULT 'tired' FIRST; # session default SET DEBUG_SYNC = 'now WAIT_FOR c3p5_created0'; @@ -314,7 +377,7 @@ SET @@sql_mode = @old_sql_mode; # session default ROLLBACK; # session con1 -ALTER TABLE t1 MODIFY c3 TEXT NOT NULL; +ALTER TABLE t1 MODIFY c3 CHAR(255) NOT NULL; SET DEBUG_SYNC = 'row_log_table_apply1_before SIGNAL c3p5_created WAIT_FOR ins_done'; ALTER TABLE t1 DROP PRIMARY KEY, DROP COLUMN c22f, ADD COLUMN c6 VARCHAR(1000) DEFAULT @@ -361,7 +424,7 @@ Table Create Table t1 CREATE TABLE `t1` ( `c22f` int(11) NOT NULL, `c1` int(11) NOT NULL, - `c3` text NOT NULL, + `c3` char(255) NOT NULL, `c4` varchar(6) NOT NULL DEFAULT 'Online', PRIMARY KEY (`c1`,`c22f`,`c4`(5)) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=REDUNDANT diff --git a/mysql-test/suite/innodb/t/innodb-index-online.opt b/mysql-test/suite/innodb/t/innodb-index-online.opt index 3f3c063b38fe3..820778b0004ac 100644 --- a/mysql-test/suite/innodb/t/innodb-index-online.opt +++ b/mysql-test/suite/innodb/t/innodb-index-online.opt @@ -1,5 +1,5 @@ --innodb-sort-buffer-size=64k ---innodb-online-alter-log-max-size=64k +--innodb-online-alter-log-max-size=128k --innodb-buffer-pool-size=5M --innodb-log-buffer-size=256k --innodb-sys-indexes diff --git a/mysql-test/suite/innodb/t/innodb-index-online.test b/mysql-test/suite/innodb/t/innodb-index-online.test index 24e3cd1ba2295..efd700498c6bb 100644 --- a/mysql-test/suite/innodb/t/innodb-index-online.test +++ b/mysql-test/suite/innodb/t/innodb-index-online.test @@ -1,4 +1,5 @@ --source include/innodb_page_size_small.inc +--source include/innodb_encrypt_log.inc --source include/have_debug_sync.inc let $innodb_metrics_select= @@ -200,6 +201,18 @@ EXPLAIN SELECT COUNT(*) FROM t1 WHERE c2 > 3; SHOW CREATE TABLE t1; +connection default; +SET @merge_encrypt_0= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_encrypted'); +SET @merge_decrypt_0= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_decrypted'); +SET @rowlog_encrypt_0= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_encrypted'); +connection con1; + # Exceed the configured innodb_online_alter_log_max_size. # The actual limit is a multiple of innodb_sort_buf_size, # because that is the size of the in-memory log buffers. @@ -223,7 +236,7 @@ SET DEBUG_SYNC = 'now WAIT_FOR c2e_created'; # At this point, the clustered index scan must have completed, # but the modification log keeps accumulating due to the DEBUG_SYNC. eval $innodb_metrics_select; -let $c= 2; +let $c= 4; while ($c) { BEGIN; @@ -243,6 +256,22 @@ SELECT sf.name, sf.pos FROM INFORMATION_SCHEMA.INNODB_SYS_INDEXES si INNER JOIN INFORMATION_SCHEMA.INNODB_SYS_FIELDS sf ON si.index_id = sf.index_id WHERE si.name = '?c2e'; +SET @merge_encrypt_1= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_encrypted'); +SET @merge_decrypt_1= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_decrypted'); +SET @rowlog_encrypt_1= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_encrypted'); + +SELECT +(@merge_encrypt_1-@merge_encrypt_0)- +(@merge_decrypt_1-@merge_decrypt_0) as sort_balance, +@merge_encrypt_1>@merge_encrypt_0, @merge_decrypt_1>@merge_decrypt_0, +@rowlog_encrypt_1>@rowlog_encrypt_0; + # Release con1. SET DEBUG_SYNC = 'now SIGNAL dml2_done'; @@ -270,6 +299,19 @@ ALTER TABLE t1 COMMENT 'testing if c2e will be dropped'; # Check that the 'zombie' index c2e was dropped. eval $innodb_metrics_select; +SET @merge_encrypt_1= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_encrypted'); +SET @merge_decrypt_1= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_decrypted'); +SET @rowlog_encrypt_1= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_encrypted'); +SET @rowlog_decrypt_1= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_decrypted'); + connection con1; # Accumulate and apply some modification log. SET DEBUG_SYNC = 'row_log_apply_before SIGNAL c2f_created WAIT_FOR dml3_done'; @@ -282,6 +324,9 @@ connection default; SET DEBUG_SYNC = 'now WAIT_FOR c2f_created'; # Generate some log (delete-mark, delete-unmark, insert etc.) eval $innodb_metrics_select; +let $c= 2; +while ($c) +{ BEGIN; INSERT INTO t1 SELECT 320 + c1, c2, c3 FROM t1 WHERE c1 > 160; DELETE FROM t1 WHERE c1 > 320; @@ -290,6 +335,8 @@ BEGIN; UPDATE t1 SET c2 = c2 + 1; DELETE FROM t1; ROLLBACK; +dec $c; +} eval $innodb_metrics_select; # Release con1. SET DEBUG_SYNC = 'now SIGNAL dml3_done'; @@ -300,6 +347,34 @@ reap; ALTER TABLE t1 CHANGE c2 c22f INT; eval $innodb_metrics_select; + +connection default; + +SET @merge_encrypt_2= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_encrypted'); +SET @merge_decrypt_2= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_decrypted'); +SET @rowlog_encrypt_2= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_encrypted'); +SET @rowlog_decrypt_2= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_decrypted'); + +SELECT +(@merge_encrypt_2-@merge_encrypt_1)- +(@merge_decrypt_2-@merge_decrypt_1) as sort_balance, +(@rowlog_encrypt_2-@rowlog_encrypt_1)- +(@rowlog_decrypt_2-@rowlog_decrypt_1) as log_balance; +SELECT +@merge_encrypt_2-@merge_encrypt_1>0 as sort_encrypted, +@merge_decrypt_2-@merge_decrypt_1>0 as sort_decrypted, +@rowlog_encrypt_2-@rowlog_encrypt_1>0 as log_encrypted, +@rowlog_decrypt_2-@rowlog_decrypt_1>0 as log_decrypted; + +connection con1; SELECT COUNT(c22f) FROM t1; CHECK TABLE t1; diff --git a/mysql-test/suite/innodb/t/innodb-table-online-master.opt b/mysql-test/suite/innodb/t/innodb-table-online-master.opt index 9ac01ffb5adce..92eea2b0d2ebe 100644 --- a/mysql-test/suite/innodb/t/innodb-table-online-master.opt +++ b/mysql-test/suite/innodb/t/innodb-table-online-master.opt @@ -1 +1 @@ ---innodb-sort-buffer-size=64k --innodb-online-alter-log-max-size=64k --innodb-buffer-pool-size=5M --innodb-log-buffer-size=256k +--innodb-sort-buffer-size=64k --innodb-online-alter-log-max-size=512k --innodb-buffer-pool-size=5M --innodb-log-buffer-size=256k diff --git a/mysql-test/suite/innodb/t/innodb-table-online.test b/mysql-test/suite/innodb/t/innodb-table-online.test index ff5c55d9cd906..938fd176b1e00 100644 --- a/mysql-test/suite/innodb/t/innodb-table-online.test +++ b/mysql-test/suite/innodb/t/innodb-table-online.test @@ -1,4 +1,5 @@ --source include/innodb_page_size_small.inc +--source include/innodb_encrypt_log.inc --source include/have_debug.inc --source include/have_debug_sync.inc @@ -17,7 +18,7 @@ SET GLOBAL innodb_file_per_table = on; # Save the initial number of concurrent sessions. --source include/count_sessions.inc -CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 INT NOT NULL, c3 TEXT NOT NULL) +CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 INT NOT NULL, c3 CHAR(255) NOT NULL) ENGINE = InnoDB; INSERT INTO t1 VALUES (1,1,''), (2,2,''), (3,3,''), (4,4,''), (5,5,''); @@ -183,10 +184,20 @@ INSERT INTO t1 SELECT 10 + c1, c2, c3 FROM t1; INSERT INTO t1 SELECT 20 + c1, c2, c3 FROM t1; INSERT INTO t1 SELECT 40 + c1, c2, c3 FROM t1; # Purge may or may not have cleaned up the DELETE FROM t1 WHERE c1 = 7; ---replace_result 81 80 +--replace_column 9 ROWS EXPLAIN SELECT COUNT(*) FROM t1 WHERE c2 > 3; ANALYZE TABLE t1; +SET @merge_encrypt_0= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_encrypted'); +SET @merge_decrypt_0= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_decrypted'); +SET @rowlog_encrypt_0= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_encrypted'); + --echo # session con1 connection con1; SHOW CREATE TABLE t1; @@ -228,6 +239,22 @@ while ($c) # Temporary table should exist until the DDL thread notices the overflow. eval $innodb_metrics_select; +SET @merge_encrypt_1= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_encrypted'); +SET @merge_decrypt_1= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_decrypted'); +SET @rowlog_encrypt_1= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_encrypted'); + +SELECT +(@merge_encrypt_1-@merge_encrypt_0)- +(@merge_decrypt_1-@merge_decrypt_0) as sort_balance, +@merge_encrypt_1>@merge_encrypt_0, @merge_decrypt_1>@merge_decrypt_0, +@rowlog_encrypt_1>@rowlog_encrypt_0; + # Release con1. SET DEBUG_SYNC = 'now SIGNAL dml2_done'; @@ -241,6 +268,19 @@ reap; # when the above error was noticed. eval $innodb_metrics_select; +SET @merge_encrypt_1= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_encrypted'); +SET @merge_decrypt_1= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_decrypted'); +SET @rowlog_encrypt_1= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_encrypted'); +SET @rowlog_decrypt_1= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_decrypted'); + # Accumulate and apply some modification log. SET DEBUG_SYNC = 'row_log_table_apply1_before SIGNAL rebuilt3 WAIT_FOR dml3_done'; --error ER_MULTIPLE_PRI_KEY @@ -249,8 +289,8 @@ ALTER TABLE t1 ADD PRIMARY KEY(c22f), CHANGE c2 c22f INT; ALTER TABLE t1 DROP PRIMARY KEY, ADD PRIMARY KEY(c22f), CHANGE c2 c22f INT; --send ALTER TABLE t1 DROP PRIMARY KEY, ADD PRIMARY KEY(c1,c22f,c4(5)), -CHANGE c2 c22f INT, CHANGE c3 c3 TEXT NULL, CHANGE c1 c1 INT AFTER c22f, -ADD COLUMN c4 VARCHAR(6) DEFAULT 'Online'; +CHANGE c2 c22f INT, CHANGE c3 c3 CHAR(255) NULL, CHANGE c1 c1 INT AFTER c22f, +ADD COLUMN c4 VARCHAR(6) DEFAULT 'Online', LOCK=NONE; --echo # session default connection default; @@ -276,6 +316,30 @@ eval $innodb_metrics_select; SELECT COUNT(c22f) FROM t1; CHECK TABLE t1; +SET @merge_encrypt_2= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_encrypted'); +SET @merge_decrypt_2= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_merge_blocks_decrypted'); +SET @rowlog_encrypt_2= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_encrypted'); +SET @rowlog_decrypt_2= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_decrypted'); + +SELECT +(@merge_encrypt_2-@merge_encrypt_1)- +(@merge_decrypt_2-@merge_decrypt_1) as sort_balance, +(@rowlog_encrypt_2-@rowlog_encrypt_1)- +(@rowlog_decrypt_2-@rowlog_decrypt_1) as log_balance; +SELECT +@merge_encrypt_2-@merge_encrypt_1>0 as sort_encrypted, +@merge_decrypt_2-@merge_decrypt_1>0 as sort_decrypted, +@rowlog_encrypt_2-@rowlog_encrypt_1>0 as log_encrypted, +@rowlog_decrypt_2-@rowlog_decrypt_1>0 as log_decrypted; + # Create a column prefix index. --error ER_DUP_ENTRY ALTER TABLE t1 DROP PRIMARY KEY, ADD PRIMARY KEY c3p5(c3(5)); @@ -292,15 +356,15 @@ ALTER TABLE t1 DROP COLUMN c22f, DROP PRIMARY KEY, ADD PRIMARY KEY c3p5(c3(5)), ALGORITHM = INPLACE; --error ER_INVALID_USE_OF_NULL -ALTER TABLE t1 MODIFY c3 TEXT NOT NULL; +ALTER TABLE t1 MODIFY c3 CHAR(255) NOT NULL; SET @@sql_mode = @old_sql_mode; -UPDATE t1 SET c3=CONCAT(c1,REPEAT('foo',c1)) WHERE c3 IS NULL; +UPDATE t1 SET c3=LEFT(CONCAT(c1,REPEAT('foo',c1)),255) WHERE c3 IS NULL; SET DEBUG_SYNC = 'row_log_table_apply1_before SIGNAL c3p5_created0 WAIT_FOR ins_done0'; # NULL -> NOT NULL only allowed INPLACE if strict sql_mode is on. SET @@sql_mode = 'STRICT_TRANS_TABLES'; --send -ALTER TABLE t1 MODIFY c3 TEXT NOT NULL, DROP COLUMN c22f, +ALTER TABLE t1 MODIFY c3 CHAR(255) NOT NULL, DROP COLUMN c22f, ADD COLUMN c5 CHAR(5) DEFAULT 'tired' FIRST; --echo # session default @@ -324,7 +388,7 @@ ROLLBACK; --echo # session con1 connection con1; -ALTER TABLE t1 MODIFY c3 TEXT NOT NULL; +ALTER TABLE t1 MODIFY c3 CHAR(255) NOT NULL; SET DEBUG_SYNC = 'row_log_table_apply1_before SIGNAL c3p5_created WAIT_FOR ins_done'; --send ALTER TABLE t1 DROP PRIMARY KEY, DROP COLUMN c22f, diff --git a/storage/innobase/row/row0merge.cc b/storage/innobase/row/row0merge.cc index a91c0f6721828..62dc98a3e3046 100644 --- a/storage/innobase/row/row0merge.cc +++ b/storage/innobase/row/row0merge.cc @@ -4037,10 +4037,6 @@ row_merge_build_indexes( /* Now we have files containing index entries ready for sorting and inserting. */ - DBUG_EXECUTE_IF( - "ib_merge_wait_after_read", - os_thread_sleep(20000000);); /* 20 sec */ - for (i = 0; i < n_indexes; i++) { dict_index_t* sort_idx = indexes[i]; diff --git a/storage/xtradb/row/row0merge.cc b/storage/xtradb/row/row0merge.cc index 28b43d6abeffc..1b0566dd2d35b 100644 --- a/storage/xtradb/row/row0merge.cc +++ b/storage/xtradb/row/row0merge.cc @@ -4040,10 +4040,6 @@ row_merge_build_indexes( /* Now we have files containing index entries ready for sorting and inserting. */ - DBUG_EXECUTE_IF( - "ib_merge_wait_after_read", - os_thread_sleep(20000000);); /* 20 sec */ - for (i = 0; i < n_indexes; i++) { dict_index_t* sort_idx = indexes[i];