mirror of
https://github.com/MariaDB/server.git
synced 2025-02-05 13:22:17 +01:00
f8cf493290
- InnoDB fails to recover the full crc32 encrypted page from doublewrite buffer. The reason is that buf_dblwr_t::recover() fails to identify the space id from the page because the page has been encrypted from FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION bytes. Fix: === buf_dblwr_t::recover(): preserve any pages whose space_id does not match a known tablespace. These could be encrypted pages of tablespaces that had been created with innodb_checksum_algorithm=full_crc32. buf_page_t::read_complete(): If the page looks corrupted and the tablespace is encrypted and in full_crc32 format, try to restore the page from doublewrite buffer. recv_dblwr_t::recover_encrypted_page(): Find the page which has the same page number and try to decrypt the page using space->crypt_data. After decryption, compare the space id. Write the recovered page back to the file.
81 lines
3 KiB
Text
81 lines
3 KiB
Text
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;
|