summaryrefslogtreecommitdiff
path: root/mysql-test/suite/encryption/t/innodb-redo-badkey.test
blob: 09ad7a7d5a3ecda06164668e00ae0ebebd1f7a4f (plain)
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
-- source include/have_innodb.inc
-- source include/have_file_key_management_plugin.inc
# embedded does not support restart
-- source include/not_embedded.inc
# MDEV-20839 innodb-redo-badkey sporadically fails on buildbot with page dump
# We only require a debug build to avoid getting page dumps, making use of
# MDEV-19766: Disable page dump output in debug builds
-- source include/have_debug.inc

call mtr.add_suppression("Plugin 'file_key_management'");
call mtr.add_suppression("Plugin 'InnoDB' init function returned error.");
call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[1-9][0-9]*\\] in file '.*test.t[1-4]\\.ibd' cannot be decrypted");
call mtr.add_suppression("failed to read or decrypt \\[page id: space=[1-9][0-9]*, page number=[1-9][0-9]*\\]");
call mtr.add_suppression("InnoDB: Unable to decompress .*.test.t[12]\\.ibd\\[page id: space=[1-9][0-9]*, page number=[0-9]+\\]");
call mtr.add_suppression("InnoDB: Database page corruption on disk or a failed read of file '.*test.t[12]\\.ibd'");
call mtr.add_suppression("InnoDB: Failed to read page .* from file '.*'");
call mtr.add_suppression("InnoDB: Plugin initialization aborted");
call mtr.add_suppression("Plugin 'InnoDB' registration as a STORAGE ENGINE failed");
# for innodb_checksum_algorithm=full_crc32 only
call mtr.add_suppression("\\[ERROR\\] InnoDB: Cannot decrypt \\[page id: space=");

-- let $restart_parameters=--file-key-management-filename=$MYSQL_TEST_DIR/std_data/keys2.txt
-- source include/restart_mysqld.inc

--echo # Wait max 10 min for key encryption threads to encrypt all spaces
--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

SET GLOBAL innodb_file_per_table = ON;

create table t1(a int not null primary key auto_increment, c char(250), b blob, index(b(10))) engine=innodb row_format=compressed encrypted=yes encryption_key_id=4;
create table t2(a int not null primary key auto_increment, c char(250), b blob, index(b(10))) engine=innodb row_format=compressed;
create table t3(a int not null primary key auto_increment, c char(250), b blob, index(b(10))) engine=innodb encrypted=yes encryption_key_id=4;
create table t4(a int not null primary key auto_increment, c char(250), b blob, index(b(10))) engine=innodb;

begin;
--disable_query_log
--let $i = 20
begin;
while ($i)
{
  insert into t1(c,b) values (repeat('secret1',20), repeat('secret2',6000));
  dec $i;
}
--enable_query_log

insert into t2 select * from t1;
insert into t3 select * from t1;
insert into t4 select * from t1;
commit;

--source ../../suite/innodb/include/no_checkpoint_start.inc

#
# We test redo log page read at recv_read_page using
# incorrect keys from std_data/keys.txt. If checkpoint
# happens we will skip this test. If no checkpoint
# happens, InnoDB refuses to start as used
# encryption key is incorrect.
#
SET GLOBAL innodb_flush_log_at_trx_commit=1;
begin;
update t1 set c = repeat('secret3', 20);
update t2 set c = repeat('secret4', 20);
update t3 set c = repeat('secret4', 20);
update t4 set c = repeat('secret4', 20);
insert into t1 (c,b) values (repeat('secret5',20), repeat('secret6',6000));
insert into t2 (c,b) values (repeat('secret7',20), repeat('secret8',6000));
insert into t3 (c,b) values (repeat('secret9',20), repeat('secre10',6000));
insert into t4 (c,b) values (repeat('secre11',20), repeat('secre12',6000));
COMMIT;
let $cleanup= drop table t1,t2,t3,t4;
--let CLEANUP_IF_CHECKPOINT= $cleanup;
--source ../../suite/innodb/include/no_checkpoint_end.inc

--error 1
-- source include/start_mysqld.inc
--source include/kill_mysqld.inc

#
# Now test with innodb-force-recovery=1 i.e. ignore corrupt pages
#

-- let $restart_parameters=--innodb-force-recovery=1
--error 1
-- source include/start_mysqld.inc

--source include/kill_mysqld.inc

-- let $restart_parameters=--file-key-management-filename=$MYSQL_TEST_DIR/std_data/keys2.txt
-- source include/start_mysqld.inc

drop table t1, t2,t3,t4;