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.
28 lines
949 B
Text
28 lines
949 B
Text
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%';
|
|
Variable_name Value
|
|
innodb_encrypt_log ON
|
|
innodb_encrypt_tables ON
|
|
innodb_encrypt_temporary_tables OFF
|
|
innodb_encryption_rotate_key_age 2
|
|
innodb_encryption_rotation_iops 100
|
|
innodb_encryption_threads 4
|
|
select count(*) from information_schema.innodb_tablespaces_encryption where current_key_version <> 1;
|
|
count(*)
|
|
0
|
|
set global debug_key_management_version=10;
|
|
select count(*) from information_schema.innodb_tablespaces_encryption where current_key_version <> 10;
|
|
count(*)
|
|
0
|
|
SET GLOBAL innodb_log_checkpoint_now = 1;
|
|
SET GLOBAL innodb_flush_log_at_trx_commit = 1;
|
|
INSERT INTO t1 VALUES(NULL);
|
|
# restart
|
|
set global innodb_encrypt_tables=OFF;
|
|
set global debug_key_management_version=1;
|
|
select * from t1;
|
|
a
|
|
1
|
|
drop table t1;
|