mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
Merge 10.11 into 11.4
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
call mtr.add_suppression("InnoDB: Encrypted page \\[page id: space=[1-9][0-9]*, page number=[0-9]*\\] in file");
|
||||
create table t1(a serial) engine=innoDB;
|
||||
set global innodb_encrypt_tables=ON;
|
||||
show variables like 'innodb_encrypt%';
|
||||
|
81
mysql-test/suite/encryption/r/doublewrite_debug.result
Normal file
81
mysql-test/suite/encryption/r/doublewrite_debug.result
Normal file
@@ -0,0 +1,81 @@
|
||||
call mtr.add_suppression("InnoDB: Encrypted page \\[page id: space=[1-9][0-9]*, page number=3\\] in file .*test.t[12]\\.ibd looks corrupted");
|
||||
call mtr.add_suppression("InnoDB: Unable to apply log to corrupted page ");
|
||||
call mtr.add_suppression("InnoDB: Plugin initialization aborted");
|
||||
call mtr.add_suppression("Plugin 'InnoDB' init function returned error");
|
||||
call mtr.add_suppression("Plugin 'InnoDB' registration as a STORAGE ENGINE failed");
|
||||
create table t1 (f1 int primary key, f2 blob)page_compressed = 1 engine=innodb stats_persistent=0;
|
||||
create table t2(f1 int primary key, f2 blob)engine=innodb stats_persistent=0;
|
||||
start transaction;
|
||||
insert into t1 values(1, repeat('#',12));
|
||||
insert into t1 values(2, repeat('+',12));
|
||||
insert into t1 values(3, repeat('/',12));
|
||||
insert into t1 values(4, repeat('-',12));
|
||||
insert into t1 values(5, repeat('.',12));
|
||||
insert into t2 select * from t1;
|
||||
commit work;
|
||||
SET GLOBAL innodb_fast_shutdown = 0;
|
||||
# restart: --debug_dbug=+d,ib_log_checkpoint_avoid_hard --innodb_flush_sync=0
|
||||
select space into @t1_space_id from information_schema.innodb_sys_tablespaces where name='test/t1';
|
||||
select space into @t2_space_id from information_schema.innodb_sys_tablespaces where name='test/t2';
|
||||
begin;
|
||||
insert into t1 values (6, repeat('%', 400));
|
||||
insert into t2 values (6, repeat('%', 400));
|
||||
# xtrabackup prepare
|
||||
set global innodb_saved_page_number_debug = 3;
|
||||
set global innodb_fil_make_page_dirty_debug = @t1_space_id;
|
||||
set global innodb_saved_page_number_debug = 3;
|
||||
set global innodb_fil_make_page_dirty_debug = @t2_space_id;
|
||||
set global innodb_buf_flush_list_now = 1;
|
||||
# Kill the server
|
||||
# restart
|
||||
FOUND 2 /InnoDB: Recovered page \[page id: space=[1-9]*, page number=3\]/ in mysqld.1.err
|
||||
check table t1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 check status OK
|
||||
check table t2;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t2 check status OK
|
||||
select f1, f2 from t1;
|
||||
f1 f2
|
||||
1 ############
|
||||
2 ++++++++++++
|
||||
3 ////////////
|
||||
4 ------------
|
||||
5 ............
|
||||
select f1, f2 from t2;
|
||||
f1 f2
|
||||
1 ############
|
||||
2 ++++++++++++
|
||||
3 ////////////
|
||||
4 ------------
|
||||
5 ............
|
||||
SET GLOBAL innodb_fast_shutdown = 0;
|
||||
# shutdown server
|
||||
# remove datadir
|
||||
# xtrabackup move back
|
||||
# restart: --debug_dbug=+d,ib_log_checkpoint_avoid_hard --innodb_flush_sync=0
|
||||
select space into @t1_space_id from information_schema.innodb_sys_tablespaces where name='test/t1';
|
||||
begin;
|
||||
insert into t1 values (6, repeat('%', 400));
|
||||
set global innodb_saved_page_number_debug = 3;
|
||||
set global innodb_fil_make_page_dirty_debug = @t1_space_id;
|
||||
set global innodb_buf_flush_list_now = 1;
|
||||
# Kill the server
|
||||
# Corrupt the page 3 in t1.ibd file
|
||||
# Assign the maximum value to lsn in doublewrite buffer page
|
||||
# restart
|
||||
FOUND 1 /InnoDB: Encrypted page \[page id: space=[1-9]*, page number=3\] in file .*test.t1.ibd looks corrupted/ in mysqld.1.err
|
||||
select * from t1;
|
||||
ERROR 42000: Unknown storage engine 'InnoDB'
|
||||
# shutdown server
|
||||
# remove datadir
|
||||
# xtrabackup move back
|
||||
# restart
|
||||
select * from t1;
|
||||
f1 f2
|
||||
1 ############
|
||||
2 ++++++++++++
|
||||
3 ////////////
|
||||
4 ------------
|
||||
5 ............
|
||||
drop table t2, t1;
|
@@ -1,5 +1,5 @@
|
||||
--- encrypt_and_grep.result 2022-09-02 22:36:21.669650278 +0530
|
||||
+++ encrypt_and_grep.reject 2022-11-29 19:01:22.080027528 +0530
|
||||
--- encrypt_and_grep.result
|
||||
+++ encrypt_and_grep.reject
|
||||
@@ -14,6 +14,9 @@
|
||||
SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0;
|
||||
NAME
|
||||
|
@@ -1,5 +1,5 @@
|
||||
--- innodb-remove-encryption.result 2022-09-02 20:44:59.960430396 +0530
|
||||
+++ innodb-remove-encryption,undo3.reject 2022-11-29 19:02:24.813094277 +0530
|
||||
--- innodb-remove-encryption.result
|
||||
+++ innodb-remove-encryption,undo3.reject
|
||||
@@ -13,6 +13,9 @@
|
||||
SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0;
|
||||
NAME
|
||||
|
@@ -1,5 +1,5 @@
|
||||
--- innodb_encrypt_freed.result 2021-03-23 15:44:14.466377983 +0530
|
||||
+++ innodb_encrypt_freed,undo3.reject 2022-11-29 19:04:24.987010571 +0530
|
||||
--- innodb_encrypt_freed.result
|
||||
+++ innodb_encrypt_freed,undo3.reject
|
||||
@@ -14,6 +14,9 @@
|
||||
SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0;
|
||||
NAME
|
||||
|
@@ -1,5 +1,5 @@
|
||||
--- innodb_encrypt_key_rotation_age.result 2022-06-02 16:15:08.395122720 +0530
|
||||
+++ innodb_encrypt_key_rotation_age,undo3.reject 2022-11-29 19:06:07.964542115 +0530
|
||||
--- innodb_encrypt_key_rotation_age.result
|
||||
+++ innodb_encrypt_key_rotation_age,undo3.reject
|
||||
@@ -12,6 +12,9 @@
|
||||
SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0;
|
||||
NAME
|
||||
|
@@ -3,6 +3,7 @@
|
||||
-- source include/innodb_undo_tablespaces.inc
|
||||
-- source include/not_embedded.inc
|
||||
|
||||
call mtr.add_suppression("InnoDB: Encrypted page \\[page id: space=[1-9][0-9]*, page number=[0-9]*\\] in file");
|
||||
if (`select count(*) = 0 from information_schema.plugins
|
||||
where plugin_name = 'debug_key_management' and plugin_status='active'`)
|
||||
{
|
||||
|
3
mysql-test/suite/encryption/t/doublewrite_debug.opt
Normal file
3
mysql-test/suite/encryption/t/doublewrite_debug.opt
Normal file
@@ -0,0 +1,3 @@
|
||||
--innodb-use-atomic-writes=0
|
||||
--innodb-encrypt-tables=FORCE
|
||||
--innodb_sys_tablespaces
|
223
mysql-test/suite/encryption/t/doublewrite_debug.test
Normal file
223
mysql-test/suite/encryption/t/doublewrite_debug.test
Normal file
@@ -0,0 +1,223 @@
|
||||
--source include/have_innodb.inc
|
||||
--source include/have_debug.inc
|
||||
--source include/not_embedded.inc
|
||||
--source include/have_example_key_management_plugin.inc
|
||||
call mtr.add_suppression("InnoDB: Encrypted page \\[page id: space=[1-9][0-9]*, page number=3\\] in file .*test.t[12]\\.ibd looks corrupted");
|
||||
call mtr.add_suppression("InnoDB: Unable to apply log to corrupted page ");
|
||||
call mtr.add_suppression("InnoDB: Plugin initialization aborted");
|
||||
call mtr.add_suppression("Plugin 'InnoDB' init function returned error");
|
||||
call mtr.add_suppression("Plugin 'InnoDB' registration as a STORAGE ENGINE failed");
|
||||
|
||||
let INNODB_PAGE_SIZE=`select @@innodb_page_size`;
|
||||
let MYSQLD_DATADIR=`select @@datadir`;
|
||||
let ALGO=`select @@innodb_checksum_algorithm`;
|
||||
|
||||
create table t1 (f1 int primary key, f2 blob)page_compressed = 1 engine=innodb stats_persistent=0;
|
||||
create table t2(f1 int primary key, f2 blob)engine=innodb stats_persistent=0;
|
||||
|
||||
start transaction;
|
||||
insert into t1 values(1, repeat('#',12));
|
||||
insert into t1 values(2, repeat('+',12));
|
||||
insert into t1 values(3, repeat('/',12));
|
||||
insert into t1 values(4, repeat('-',12));
|
||||
insert into t1 values(5, repeat('.',12));
|
||||
insert into t2 select * from t1;
|
||||
commit work;
|
||||
|
||||
# Slow shutdown and restart to make sure ibuf merge is finished
|
||||
SET GLOBAL innodb_fast_shutdown = 0;
|
||||
let $shutdown_timeout=;
|
||||
let $restart_parameters=--debug_dbug=+d,ib_log_checkpoint_avoid_hard --innodb_flush_sync=0;
|
||||
--source include/restart_mysqld.inc
|
||||
--source ../../suite/innodb/include/no_checkpoint_start.inc
|
||||
|
||||
select space into @t1_space_id from information_schema.innodb_sys_tablespaces where name='test/t1';
|
||||
select space into @t2_space_id from information_schema.innodb_sys_tablespaces where name='test/t2';
|
||||
|
||||
begin;
|
||||
insert into t1 values (6, repeat('%', 400));
|
||||
insert into t2 values (6, repeat('%', 400));
|
||||
|
||||
# Copy the t1.ibd, t2.ibd file
|
||||
let $targetdir=$MYSQLTEST_VARDIR/tmp/backup_1;
|
||||
--disable_result_log
|
||||
exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir;
|
||||
--enable_result_log
|
||||
|
||||
echo # xtrabackup prepare;
|
||||
--disable_result_log
|
||||
exec $XTRABACKUP --prepare --target-dir=$targetdir;
|
||||
|
||||
set global innodb_saved_page_number_debug = 3;
|
||||
set global innodb_fil_make_page_dirty_debug = @t1_space_id;
|
||||
|
||||
set global innodb_saved_page_number_debug = 3;
|
||||
set global innodb_fil_make_page_dirty_debug = @t2_space_id;
|
||||
|
||||
set global innodb_buf_flush_list_now = 1;
|
||||
--let CLEANUP_IF_CHECKPOINT=drop table t1, t2, unexpected_checkpoint;
|
||||
--source ../../suite/innodb/include/no_checkpoint_end.inc
|
||||
# Corrupt the page 3 in t1.ibd, t2.ibd file
|
||||
perl;
|
||||
use IO::Handle;
|
||||
do "$ENV{MTR_SUITE_DIR}/include/crc32.pl";
|
||||
my $polynomial = 0x82f63b78; # CRC-32C
|
||||
my $algo = $ENV{ALGO};
|
||||
die "Unsupported innodb_checksum_algorithm=$algo\n" unless $algo =~ /crc32/;
|
||||
|
||||
my $fname= "$ENV{'MYSQLD_DATADIR'}test/t1.ibd";
|
||||
my $page_size = $ENV{INNODB_PAGE_SIZE};
|
||||
my $page;
|
||||
do "$ENV{MTR_SUITE_DIR}/../innodb/include/crc32.pl";
|
||||
open(FILE, "+<", $fname) or die;
|
||||
sysseek(FILE, 3*$page_size, 0);
|
||||
sysread(FILE, $page, $page_size)==$page_size||die "Unable to read $name\n";
|
||||
sysseek(FILE, 3*$page_size, 0)||die "Unable to seek $fname\n";
|
||||
my $corrupted = $page;
|
||||
# Set FIL_PAGE_LSN to the maximum
|
||||
substr($corrupted, 16, 8) = chr(255) x 8;
|
||||
substr($corrupted, $page_size - 8, 8) = chr(255) x 8;
|
||||
if ($algo =~ /full_crc32/)
|
||||
{
|
||||
my $ck = mycrc32(substr($corrupted, 0, $page_size - 4), 0, $polynomial);
|
||||
substr($corrupted, $page_size - 4, 4) = pack("N", $ck);
|
||||
}
|
||||
else
|
||||
{
|
||||
# Replace the innodb_checksum_algorithm=crc32 checksum
|
||||
my $ck= pack("N",
|
||||
mycrc32(substr($corrupted, 4, 22), 0, $polynomial) ^
|
||||
mycrc32(substr($corrupted_, 38, $page_size - 38 - 8), 0,
|
||||
$polynomial));
|
||||
substr ($corrupted, 0, 4) = $ck;
|
||||
substr ($corrupted, $page_size - 8, 4) = $ck;
|
||||
}
|
||||
syswrite(FILE, $corrupted);
|
||||
close FILE;
|
||||
|
||||
# Zero the complete page
|
||||
my $fname= "$ENV{'MYSQLD_DATADIR'}test/t2.ibd";
|
||||
open(FILE, "+<", $fname) or die;
|
||||
FILE->autoflush(1);
|
||||
binmode FILE;
|
||||
sysseek(FILE, 3*$page_size, 0);
|
||||
print FILE chr(0) x ($ENV{'INNODB_PAGE_SIZE'});
|
||||
close FILE;
|
||||
EOF
|
||||
|
||||
# Successful recover from doublewrite buffer
|
||||
let $restart_parameters=;
|
||||
--source include/start_mysqld.inc
|
||||
let SEARCH_FILE= $MYSQLTEST_VARDIR/log/mysqld.1.err;
|
||||
let SEARCH_PATTERN=InnoDB: Recovered page \\[page id: space=[1-9]*, page number=3\\];
|
||||
--source include/search_pattern_in_file.inc
|
||||
|
||||
check table t1;
|
||||
check table t2;
|
||||
select f1, f2 from t1;
|
||||
select f1, f2 from t2;
|
||||
|
||||
SET GLOBAL innodb_fast_shutdown = 0;
|
||||
let $shutdown_timeout=;
|
||||
let $restart_parameters=--debug_dbug=+d,ib_log_checkpoint_avoid_hard --innodb_flush_sync=0;
|
||||
--source ../../mariabackup/include/restart_and_restore.inc
|
||||
--source ../../suite/innodb/include/no_checkpoint_start.inc
|
||||
select space into @t1_space_id from information_schema.innodb_sys_tablespaces where name='test/t1';
|
||||
|
||||
begin;
|
||||
insert into t1 values (6, repeat('%', 400));
|
||||
|
||||
set global innodb_saved_page_number_debug = 3;
|
||||
set global innodb_fil_make_page_dirty_debug = @t1_space_id;
|
||||
|
||||
set global innodb_buf_flush_list_now = 1;
|
||||
--let CLEANUP_IF_CHECKPOINT=drop table t1, unexpected_checkpoint;
|
||||
--source ../../suite/innodb/include/no_checkpoint_end.inc
|
||||
|
||||
--echo # Corrupt the page 3 in t1.ibd file
|
||||
--echo # Assign the maximum value to lsn in doublewrite buffer page
|
||||
perl;
|
||||
use IO::Handle;
|
||||
do "$ENV{MTR_SUITE_DIR}/include/crc32.pl";
|
||||
my $polynomial = 0x82f63b78; # CRC-32C
|
||||
my $algo = $ENV{ALGO};
|
||||
die "Unsupported innodb_checksum_algorithm=$algo\n" unless $algo =~ /crc32/;
|
||||
|
||||
my $fname= "$ENV{'MYSQLD_DATADIR'}test/t1.ibd";
|
||||
my $page_size = $ENV{INNODB_PAGE_SIZE};
|
||||
my $page;
|
||||
do "$ENV{MTR_SUITE_DIR}/../innodb/include/crc32.pl";
|
||||
open(FILE, "+<", $fname) or die;
|
||||
sysseek(FILE, 3*$page_size, 0);
|
||||
sysread(FILE, $page, $page_size)==$page_size||die "Unable to read $name\n";
|
||||
sysseek(FILE, 3*$page_size, 0)||die "Unable to seek $fname\n";
|
||||
my $corrupted = $page;
|
||||
# Set FIL_PAGE_LSN to the maximum
|
||||
substr($corrupted, 16, 8) = chr(255) x 8;
|
||||
substr($corrupted, $page_size - 8, 8) = chr(255) x 8;
|
||||
if ($algo =~ /full_crc32/)
|
||||
{
|
||||
my $ck = mycrc32(substr($corrupted, 0, $page_size - 4), 0, $polynomial);
|
||||
substr($corrupted, $page_size - 4, 4) = pack("N", $ck);
|
||||
}
|
||||
else
|
||||
{
|
||||
# Replace the innodb_checksum_algorithm=crc32 checksum
|
||||
my $ck= pack("N",
|
||||
mycrc32(substr($corrupted, 4, 22), 0, $polynomial) ^
|
||||
mycrc32(substr($corrupted_, 38, $page_size - 38 - 8), 0,
|
||||
$polynomial));
|
||||
substr ($corrupted, 0, 4) = $ck;
|
||||
substr ($corrupted, $page_size - 8, 4) = $ck;
|
||||
}
|
||||
syswrite(FILE, $corrupted);
|
||||
close FILE;
|
||||
|
||||
# Change the page lsn to maximum value
|
||||
open(FILE, "+<", "$ENV{MYSQLD_DATADIR}ibdata1")||die "cannot open ibdata1\n";
|
||||
sysseek(FILE, 6 * $page_size - 190, 0)||die "Unable to seek ibdata1\n";
|
||||
sysread(FILE, $_, 12) == 12||die "Unable to read TRX_SYS\n";
|
||||
my($magic,$d1,$d2)=unpack "NNN", $_;
|
||||
die "magic=$magic, $d1, $d2\n" unless $magic == 536853855 && $d2 >= $d1 + 64;
|
||||
sysseek(FILE, $d1 * $page_size, 0)||die "Unable to seek ibdata1\n";
|
||||
# Find the page in the doublewrite buffer
|
||||
for (my $d = $d1; $d < $d2 + 64; $d++)
|
||||
{
|
||||
sysread(FILE, $_, $page_size)==$page_size||die "Cannot read doublewrite\n";
|
||||
next unless $_ eq $page;
|
||||
sysseek(FILE, $d * $page_size, 0)||die "Unable to seek ibdata1\n";
|
||||
substr($_, 16, 8) = chr(255) x 8;
|
||||
if ($algo =~ /full_crc32/)
|
||||
{
|
||||
my $ck = mycrc32(substr($_, 0, $page_size - 4), 0, $polynomial);
|
||||
substr($_, $page_size - 4, 4) = pack("N", $ck);
|
||||
}
|
||||
else
|
||||
{
|
||||
# Replace the innodb_checksum_algorithm=crc32 checksum
|
||||
my $ck= pack("N",
|
||||
mycrc32(substr($_, 4, 22), 0, $polynomial) ^
|
||||
mycrc32(substr($_, 38, $page_size - 38 - 8), 0,
|
||||
$polynomial));
|
||||
substr ($_, 0, 4) = $ck;
|
||||
substr ($_, $page_size - 8, 4) = $ck;
|
||||
}
|
||||
syswrite(FILE, $_, $page_size)==$page_size||die;
|
||||
close(FILE);
|
||||
exit 0;
|
||||
}
|
||||
die "Did not find the page in the doublewrite buffer ($d1,$d2)\n";
|
||||
EOF
|
||||
|
||||
let $restart_parameters=;
|
||||
--source include/start_mysqld.inc
|
||||
let SEARCH_FILE= $MYSQLTEST_VARDIR/log/mysqld.1.err;
|
||||
let SEARCH_PATTERN=InnoDB: Encrypted page \\[page id: space=[1-9]*, page number=3\\] in file .*test.t1.ibd looks corrupted;
|
||||
--source include/search_pattern_in_file.inc
|
||||
|
||||
--error ER_UNKNOWN_STORAGE_ENGINE
|
||||
select * from t1;
|
||||
|
||||
--source ../../mariabackup/include/restart_and_restore.inc
|
||||
select * from t1;
|
||||
drop table t2, t1;
|
Reference in New Issue
Block a user