1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-08 11:22:35 +03:00

MDEV-8588: Assertion failure in file ha_innodb.cc line 21140 if at least one encrypted table exists and encryption service is not available

Analysis: Problem was that in fil_read_first_page we do find that
    table has encryption information and that encryption service
    or used key_id is not available. But, then we just printed
    fatal error message that causes above assertion.

    Fix: When we open single table tablespace if it has encryption
    information (crypt_data) store this crypt data to the table
    structure. When we open a table and we find out that tablespace
    is not available, check has table a encryption information
    and from there is encryption service or used key_id is not available.
    If it is, add additional warning for SQL-layer.
This commit is contained in:
Jan Lindström
2015-08-31 19:47:14 +03:00
parent e1978234eb
commit 7e916bb86f
44 changed files with 1546 additions and 408 deletions

View File

@@ -1,6 +1,11 @@
call mtr.add_suppression("Plugin 'file_key_management' init function returned error");
call mtr.add_suppression("InnoDB: Database page corruption on disk or a failed.*");
call mtr.add_suppression("Plugin 'file_key_management' registration.*failed");
call mtr.add_suppression("InnoDB: Block in space_id .* in file test/.* encrypted");
call mtr.add_suppression("InnoDB: However key management plugin or used key_id 1 is not found or used encryption algorithm or method does not match.");
call mtr.add_suppression("InnoDB: Marking tablespace as missing. You may drop this table or install correct key management plugin and key file.");
call mtr.add_suppression(".*InnoDB: Cannot open table test/.* from the internal data dictionary of InnoDB though the .frm file for the table exists. See .* for how you can resolve the problem.");
call mtr.add_suppression("InnoDB: .ibd file is missing for table test/.*");
# Start server with keys2.txt
SET GLOBAL innodb_file_format = `Barracuda`;
@@ -33,3 +38,98 @@ Warning 1812 Tablespace is missing for table 'test/t1'
Warning 155 Table test/t1 is encrypted but encryption service or used key_id 2 is not available. Can't continue reading table.
Error 1932 Table 'test.t1' doesn't exist in engine
DROP TABLE t1;
# Start server with keys.txt
CREATE TABLE t2 (c VARCHAR(8), id int not null primary key, b int, key(b)) ENGINE=InnoDB ENCRYPTED=YES;
INSERT INTO t2 VALUES ('foobar',1,2);
# Restart server with keys2.txt
SELECT * FROM t2;
Got one of the listed errors
SHOW WARNINGS;
Level Code Message
Warning 155 Table test/t2 in tablespace 7 is encrypted but encryption service or used key_id is not available. Can't continue reading table.
Warning 155 Table test/t2 in tablespace 7 is encrypted but encryption service or used key_id is not available. Can't continue reading table.
Warning 155 Table test/t2 is encrypted but encryption service or used key_id is not available. Can't continue reading table.
Error 1932 Table 'test.t2' doesn't exist in engine
SELECT * FROM t2 where id = 1;
Got one of the listed errors
SHOW WARNINGS;
Level Code Message
Warning 1812 Tablespace is missing for table 'test/t2'
Warning 155 Table test/t2 is encrypted but encryption service or used key_id is not available. Can't continue reading table.
Error 1932 Table 'test.t2' doesn't exist in engine
SELECT * FROM t2 where b = 1;
Got one of the listed errors
SHOW WARNINGS;
Level Code Message
Warning 1812 Tablespace is missing for table 'test/t2'
Warning 155 Table test/t2 is encrypted but encryption service or used key_id is not available. Can't continue reading table.
Error 1932 Table 'test.t2' doesn't exist in engine
INSERT INTO t2 VALUES ('tmp',3,3);
ERROR 42S02: Table 'test.t2' doesn't exist in engine
SHOW WARNINGS;
Level Code Message
Warning 1812 Tablespace is missing for table 'test/t2'
Warning 155 Table test/t2 is encrypted but encryption service or used key_id is not available. Can't continue reading table.
Error 1932 Table 'test.t2' doesn't exist in engine
DELETE FROM t2 where b = 3;
Got one of the listed errors
SHOW WARNINGS;
Level Code Message
Warning 1812 Tablespace is missing for table 'test/t2'
Warning 155 Table test/t2 is encrypted but encryption service or used key_id is not available. Can't continue reading table.
Error 1932 Table 'test.t2' doesn't exist in engine
DELETE FROM t2 where id = 3;
Got one of the listed errors
SHOW WARNINGS;
Level Code Message
Warning 1812 Tablespace is missing for table 'test/t2'
Warning 155 Table test/t2 is encrypted but encryption service or used key_id is not available. Can't continue reading table.
Error 1932 Table 'test.t2' doesn't exist in engine
UPDATE t2 set b = b +1;
Got one of the listed errors
SHOW WARNINGS;
Level Code Message
Warning 1812 Tablespace is missing for table 'test/t2'
Warning 155 Table test/t2 is encrypted but encryption service or used key_id is not available. Can't continue reading table.
Error 1932 Table 'test.t2' doesn't exist in engine
OPTIMIZE TABLE t2;
Table Op Msg_type Msg_text
test.t2 optimize Warning Tablespace is missing for table 'test/t2'
test.t2 optimize Warning Table test/t2 is encrypted but encryption service or used key_id is not available. Can't continue reading table.
test.t2 optimize Error Table 'test.t2' doesn't exist in engine
test.t2 optimize status Operation failed
SHOW WARNINGS;
Level Code Message
ALTER TABLE t2 ADD COLUMN c INT;
ERROR 42S02: Table 'test.t2' doesn't exist in engine
SHOW WARNINGS;
Level Code Message
Warning 1812 Tablespace is missing for table 'test/t2'
Warning 155 Table test/t2 is encrypted but encryption service or used key_id is not available. Can't continue reading table.
Error 1932 Table 'test.t2' doesn't exist in engine
ANALYZE TABLE t2;
Table Op Msg_type Msg_text
test.t2 analyze Warning Tablespace is missing for table 'test/t2'
test.t2 analyze Warning Table test/t2 is encrypted but encryption service or used key_id is not available. Can't continue reading table.
test.t2 analyze Error Table 'test.t2' doesn't exist in engine
test.t2 analyze status Operation failed
SHOW WARNINGS;
Level Code Message
TRUNCATE TABLE t2;
ERROR 42S02: Table 'test.t2' doesn't exist in engine
SHOW WARNINGS;
Level Code Message
Warning 1812 Tablespace is missing for table 'test/t2'
Warning 155 Table test/t2 is encrypted but encryption service or used key_id is not available. Can't continue reading table.
Error 1932 Table 'test.t2' doesn't exist in engine
DROP TABLE t2;
ERROR HY000: Table 't2' is read only
SHOW WARNINGS;
Level Code Message
Error 1036 Table 't2' is read only
# Restart server with keys.txt
DROP TABLE t2;
SHOW WARNINGS;
Level Code Message

View File

@@ -2,10 +2,24 @@
-- source include/have_file_key_management_plugin.inc
# embedded does not support restart
-- source include/not_embedded.inc
-- source include/not_valgrind.inc
# Avoid CrashReporter popup on Mac
-- source include/not_crashrep.inc
-- source include/not_windows.inc
#
# MDEV-8588: Assertion failure in file ha_innodb.cc line 21140 if at least one encrypted
# table exists and encryption service is not available.
#
call mtr.add_suppression("Plugin 'file_key_management' init function returned error");
call mtr.add_suppression("InnoDB: Database page corruption on disk or a failed.*");
call mtr.add_suppression("Plugin 'file_key_management' registration.*failed");
call mtr.add_suppression("InnoDB: Block in space_id .* in file test/.* encrypted");
call mtr.add_suppression("InnoDB: However key management plugin or used key_id 1 is not found or used encryption algorithm or method does not match.");
call mtr.add_suppression("InnoDB: Marking tablespace as missing. You may drop this table or install correct key management plugin and key file.");
call mtr.add_suppression(".*InnoDB: Cannot open table test/.* from the internal data dictionary of InnoDB though the .frm file for the table exists. See .* for how you can resolve the problem.");
call mtr.add_suppression("InnoDB: .ibd file is missing for table test/.*");
--echo
--echo # Start server with keys2.txt
@@ -43,4 +57,64 @@ SHOW WARNINGS;
-- let $restart_parameters=--file-key-management-filename=$MYSQL_TEST_DIR/std_data/keysbad3.txt
-- source include/restart_mysqld.inc
DROP TABLE t1;
DROP TABLE t1;
#
# MDEV-8591: Database page corruption on disk or a failed space, Assertion failure in file buf0buf.cc
# line 2856 on querying a table using wrong default encryption key
#
--echo # Start server with keys.txt
-- let $restart_parameters=--file-key-management-filename=$MYSQL_TEST_DIR/std_data/keys.txt
-- source include/restart_mysqld.inc
CREATE TABLE t2 (c VARCHAR(8), id int not null primary key, b int, key(b)) ENGINE=InnoDB ENCRYPTED=YES;
INSERT INTO t2 VALUES ('foobar',1,2);
--echo
--echo # Restart server with keys2.txt
-- let $restart_parameters=--file-key-management-filename=$MYSQL_TEST_DIR/std_data/keys2.txt
-- source include/restart_mysqld.inc
--error 1932,1712
SELECT * FROM t2;
SHOW WARNINGS;
--error 1932,1712
SELECT * FROM t2 where id = 1;
SHOW WARNINGS;
--error 1932,1712
SELECT * FROM t2 where b = 1;
SHOW WARNINGS;
--error 1932
INSERT INTO t2 VALUES ('tmp',3,3);
SHOW WARNINGS;
--error 1932,1712
DELETE FROM t2 where b = 3;
SHOW WARNINGS;
--error 1932,1712
DELETE FROM t2 where id = 3;
SHOW WARNINGS;
--error 1932,1712
UPDATE t2 set b = b +1;
SHOW WARNINGS;
OPTIMIZE TABLE t2;
SHOW WARNINGS;
--error 1932
ALTER TABLE t2 ADD COLUMN c INT;
SHOW WARNINGS;
ANALYZE TABLE t2;
SHOW WARNINGS;
--error 1932
TRUNCATE TABLE t2;
SHOW WARNINGS;
--error 1036
DROP TABLE t2;
SHOW WARNINGS;
--echo
--echo # Restart server with keys.txt
-- let $restart_parameters=--file-key-management-filename=$MYSQL_TEST_DIR/std_data/keys.txt
-- source include/restart_mysqld.inc
DROP TABLE t2;
SHOW WARNINGS;