mirror of
https://github.com/MariaDB/server.git
synced 2025-09-06 19:08:06 +03:00
InnoDB always keeps all tablespaces in the fil_system cache. The fil_system.LRU is only for closing file handles; the fil_space_t and fil_node_t for all data files will remain in main memory. Between startup to shutdown, they can only be created and removed by DDL statements. Therefore, we can let dict_table_t::space point directly to the fil_space_t. dict_table_t::space_id: A numeric tablespace ID for the corner cases where we do not have a tablespace. The most prominent examples are ALTER TABLE...DISCARD TABLESPACE or a missing or corrupted file. There are a few functional differences; most notably: (1) DROP TABLE will delete matching .ibd and .cfg files, even if they were not attached to the data dictionary. (2) Some error messages will report file names instead of numeric IDs. There still are many functions that use numeric tablespace IDs instead of fil_space_t*, and many functions could be converted to fil_space_t member functions. Also, Tablespace and Datafile should be merged with fil_space_t and fil_node_t. page_id_t and buf_page_get_gen() could use fil_space_t& instead of a numeric ID, and after moving to a single buffer pool (MDEV-15058), buf_pool_t::page_hash could be moved to fil_space_t::page_hash. FilSpace: Remove. Only few calls to fil_space_acquire() will remain, and gradually they should be removed. mtr_t::set_named_space_id(ulint): Renamed from set_named_space(), to prevent accidental calls to this slower function. Very few callers remain. fseg_create(), fsp_reserve_free_extents(): Take fil_space_t* as a parameter instead of a space_id. fil_space_t::rename(): Wrapper for fil_rename_tablespace_check(), fil_name_write_rename(), fil_rename_tablespace(). Mariabackup passes the parameter log=false; InnoDB passes log=true. dict_mem_table_create(): Take fil_space_t* instead of space_id as parameter. dict_process_sys_tables_rec_and_mtr_commit(): Replace the parameter 'status' with 'bool cached'. dict_get_and_save_data_dir_path(): Avoid copying the fil_node_t::name. fil_ibd_open(): Return the tablespace. fil_space_t::set_imported(): Replaces fil_space_set_imported(). truncate_t: Change many member function parameters to fil_space_t*, and remove page_size parameters. row_truncate_prepare(): Merge to its only caller. row_drop_table_from_cache(): Assert that the table is persistent. dict_create_sys_indexes_tuple(): Write SYS_INDEXES.SPACE=FIL_NULL if the tablespace has been discarded. row_import_update_discarded_flag(): Remove a constant parameter.
109 lines
3.4 KiB
Plaintext
109 lines
3.4 KiB
Plaintext
-- source include/have_innodb.inc
|
|
-- source include/have_file_key_management_plugin.inc
|
|
# embedded does not support restart
|
|
-- source include/not_embedded.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("Plugin 'file_key_management' registration.*failed");
|
|
call mtr.add_suppression("InnoDB: Table `test`\\.`t[12]` (has an unreadable root page|is corrupted)");
|
|
call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[1-9][0-9]*\\] in file '.*test.t[12]\\.ibd' cannot be decrypted\\.");
|
|
call mtr.add_suppression("failed to read or decrypt \\[page id: space=[1-9][0-9]*, page number=[1-9][0-9]*\\]");
|
|
call mtr.add_suppression("File '.*mysql-test.std_data.keysbad3\\.txt' not found");
|
|
|
|
--echo # Start server with keys2.txt
|
|
-- let $restart_parameters=--file-key-management-filename=$MYSQL_TEST_DIR/std_data/keys2.txt
|
|
-- source include/restart_mysqld.inc
|
|
|
|
SET GLOBAL innodb_file_per_table = ON;
|
|
|
|
CREATE TABLE t1 (c VARCHAR(8)) ENGINE=InnoDB ENCRYPTED=YES ENCRYPTION_KEY_ID=2;
|
|
INSERT INTO t1 VALUES ('foobar');
|
|
ALTER TABLE t1 ADD COLUMN c2 INT;
|
|
INSERT INTO t1 VALUES ('foobar',2);
|
|
SELECT * FROM t1;
|
|
TRUNCATE TABLE t1;
|
|
SELECT * FROM t1;
|
|
INSERT INTO t1 VALUES ('foobar',1);
|
|
INSERT INTO t1 VALUES ('foobar',2);
|
|
FLUSH TABLE WITH READ LOCK;
|
|
SELECT * FROM t1;
|
|
|
|
--echo
|
|
--echo # Restart server with keysbad3.txt
|
|
-- let $restart_parameters=--file-key-management-filename=$MYSQL_TEST_DIR/std_data/keysbad3.txt
|
|
-- source include/restart_mysqld.inc
|
|
|
|
--disable_warnings
|
|
--error ER_NO_SUCH_TABLE_IN_ENGINE
|
|
SELECT * FROM t1;
|
|
--enable_warnings
|
|
|
|
-- let $restart_parameters=--file-key-management-filename=$MYSQL_TEST_DIR/std_data/keysbad3.txt
|
|
-- source include/restart_mysqld.inc
|
|
|
|
--replace_regex /key_id [1-9][0-9]*/\1 /
|
|
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 keys3.txt
|
|
-- let $restart_parameters=--file-key-management-filename=$MYSQL_TEST_DIR/std_data/keys3.txt
|
|
-- source include/restart_mysqld.inc
|
|
|
|
SET GLOBAL innodb_default_encryption_key_id=5;
|
|
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
|
|
|
|
--disable_warnings
|
|
--error ER_NO_SUCH_TABLE_IN_ENGINE
|
|
SELECT * FROM t2;
|
|
|
|
--error ER_NO_SUCH_TABLE_IN_ENGINE
|
|
SELECT * FROM t2 where id = 1;
|
|
|
|
--error ER_NO_SUCH_TABLE_IN_ENGINE
|
|
SELECT * FROM t2 where b = 1;
|
|
|
|
--error ER_NO_SUCH_TABLE_IN_ENGINE
|
|
INSERT INTO t2 VALUES ('tmp',3,3);
|
|
|
|
--error ER_NO_SUCH_TABLE_IN_ENGINE
|
|
DELETE FROM t2 where b = 3;
|
|
|
|
--error ER_NO_SUCH_TABLE_IN_ENGINE
|
|
DELETE FROM t2 where id = 3;
|
|
|
|
--error ER_NO_SUCH_TABLE_IN_ENGINE
|
|
UPDATE t2 set b = b +1;
|
|
|
|
OPTIMIZE TABLE t2;
|
|
|
|
--error ER_NO_SUCH_TABLE_IN_ENGINE
|
|
ALTER TABLE t2 ADD COLUMN d INT;
|
|
|
|
ANALYZE TABLE t2;
|
|
|
|
--error ER_NO_SUCH_TABLE_IN_ENGINE
|
|
TRUNCATE TABLE t2;
|
|
|
|
DROP TABLE t2;
|
|
--enable_warnings
|
|
|
|
--echo
|
|
--echo # Start server with keys2.txt
|
|
-- let $restart_parameters=--file-key-management-filename=$MYSQL_TEST_DIR/std_data/keys2.txt
|
|
-- source include/restart_mysqld.inc
|