mirror of
https://github.com/MariaDB/server.git
synced 2025-01-30 02:30:06 +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.
43 lines
1.7 KiB
Text
43 lines
1.7 KiB
Text
-- source include/have_innodb.inc
|
|
-- source include/have_debug.inc
|
|
-- 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'`)
|
|
{
|
|
--skip Needs debug_key_management
|
|
}
|
|
|
|
create table t1(a serial) engine=innoDB;
|
|
|
|
set global innodb_encrypt_tables=ON;
|
|
show variables like 'innodb_encrypt%';
|
|
|
|
--let $tables_count= `select count(*) + 1 + @@global.innodb_undo_tablespaces from information_schema.tables where engine = 'InnoDB'`
|
|
let $wait_condition= select count(*) = $tables_count from information_schema.innodb_tablespaces_encryption where current_key_version=1;
|
|
--source include/wait_condition.inc
|
|
|
|
select count(*) from information_schema.innodb_tablespaces_encryption where current_key_version <> 1;
|
|
set global debug_key_management_version=10;
|
|
|
|
let $wait_condition= select count(*) = $tables_count from information_schema.innodb_tablespaces_encryption where current_key_version=10;
|
|
--source include/wait_condition.inc
|
|
select count(*) from information_schema.innodb_tablespaces_encryption where current_key_version <> 10;
|
|
|
|
# Test redo log key rotation and crash recovery.
|
|
SET GLOBAL innodb_log_checkpoint_now = 1;
|
|
SET GLOBAL innodb_flush_log_at_trx_commit = 1;
|
|
INSERT INTO t1 VALUES(NULL);
|
|
let $shutdown_timeout = 0;
|
|
-- source include/restart_mysqld.inc
|
|
|
|
# Note that we expect that key_version is increasing so disable encryption before reset
|
|
|
|
set global innodb_encrypt_tables=OFF;
|
|
set global debug_key_management_version=1;
|
|
|
|
select * from t1;
|
|
|
|
drop table t1;
|