mirror of
				https://github.com/MariaDB/server.git
				synced 2025-10-31 10:56:12 +01:00 
			
		
		
		
	 f8cf493290
			
		
	
	
	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;
 |