mirror of
https://github.com/MariaDB/server.git
synced 2025-01-30 10:31:54 +01:00
eb1f8b2919
dict_find_max_space_id(): Return SELECT MAX(SPACE) FROM SYS_TABLES. dict_check_tablespaces_and_store_max_id(): In the normal case (no encryption plugin has been loaded and the change buffer is empty), invoke dict_find_max_space_id() and do not open any .ibd files. If a std::set<uint32_t> has been specified, open the files whose tablespace ID is mentioned. Else, open all data files that are identified by SYS_TABLES records. fil_ibd_open(): Remove a call to os_file_get_last_error() that can report a misleading error, such as EINVAL inside my_realpath() that is not an actual error. This could be invoked when a data file is found but the FSP_SPACE_FLAGS are incorrect, such as is the case for table test.td in ./mtr --mysqld=--innodb-buffer-pool-dump-at-shutdown=0 innodb.table_flags buf_load(): If any tablespaces could not be found, invoke dict_check_tablespaces_and_store_max_id() on the missing tablespaces. dict_load_tablespace(): Try to load the tablespace unless it was found to be futile. This fixes failures related to FTS_*.ibd files for FULLTEXT INDEX. btr_cur_t::search_leaf(): Prevent a crash when the tablespace does not exist. This was caught by the test innodb_fts.fts_concurrent_insert when the change to dict_load_tablespaces() was not present. We modify a few tests to ensure that tables will not be loaded at startup. For some fault injection tests this means that the corrupted tables will not be loaded, because dict_load_tablespace() would perform stricter checks than dict_check_tablespaces_and_store_max_id(). Tested by: Matthias Leich Reviewed by: Thirunarayanan Balathandayuthapani
188 lines
5.7 KiB
Text
188 lines
5.7 KiB
Text
# restart: with restart_parameters
|
|
SET GLOBAL innodb_file_per_table=1;
|
|
CREATE TABLE tr(a INT PRIMARY KEY)ENGINE=InnoDB ROW_FORMAT=REDUNDANT;
|
|
CREATE TABLE tc(a INT PRIMARY KEY)ENGINE=InnoDB ROW_FORMAT=COMPACT;
|
|
CREATE TABLE td(a INT PRIMARY KEY)ENGINE=InnoDB ROW_FORMAT=DYNAMIC;
|
|
SET innodb_strict_mode=OFF;
|
|
CREATE TABLE tz(a INT PRIMARY KEY)ENGINE=InnoDB ROW_FORMAT=COMPRESSED
|
|
KEY_BLOCK_SIZE=1;
|
|
SET innodb_strict_mode=ON;
|
|
CREATE TABLE tp(a INT PRIMARY KEY)ENGINE=InnoDB ROW_FORMAT=DYNAMIC
|
|
PAGE_COMPRESSED=1 PAGE_COMPRESSION_LEVEL=9;
|
|
SYS_TABLES clustered index root page (8):
|
|
N_RECS=8; LEVEL=0; INDEX_ID=0x0000000000000001
|
|
header=0x01000003008d (NAME=0x696e66696d756d00)
|
|
header=0x0000101500d5 (NAME='SYS_FOREIGN',
|
|
DB_TRX_ID=0x000000000000,
|
|
DB_ROLL_PTR=0x80000000000000,
|
|
ID=0x000000000000000b,
|
|
N_COLS=0x00000004,
|
|
TYPE=0x00000001,
|
|
MIX_ID=0x0000000000000000,
|
|
MIX_LEN=0x00000040,
|
|
CLUSTER_NAME=NULL(0 bytes),
|
|
SPACE=0x00000000)
|
|
header=0x000018150122 (NAME='SYS_FOREIGN_COLS',
|
|
DB_TRX_ID=0x000000000000,
|
|
DB_ROLL_PTR=0x80000000000000,
|
|
ID=0x000000000000000c,
|
|
N_COLS=0x00000004,
|
|
TYPE=0x00000001,
|
|
MIX_ID=0x0000000000000000,
|
|
MIX_LEN=0x00000040,
|
|
CLUSTER_NAME=NULL(0 bytes),
|
|
SPACE=0x00000000)
|
|
header=0x0000201501ae (NAME='SYS_VIRTUAL',
|
|
DB_TRX_ID=0x000000000000,
|
|
DB_ROLL_PTR=0x80000000000000,
|
|
ID=0x000000000000000d,
|
|
N_COLS=0x00000003,
|
|
TYPE=0x00000001,
|
|
MIX_ID=0x0000000000000000,
|
|
MIX_LEN=0x00000040,
|
|
CLUSTER_NAME=NULL(0 bytes),
|
|
SPACE=0x00000000)
|
|
header=0x0400301501f2 (NAME='test/tc',
|
|
DB_TRX_ID=0x000000000000,
|
|
DB_ROLL_PTR=0x80000000000000,
|
|
ID=0x000000000000000f,
|
|
N_COLS=0x80000001,
|
|
TYPE=0x00000001,
|
|
MIX_ID=0x0000000000000000,
|
|
MIX_LEN=0x00000050,
|
|
CLUSTER_NAME=NULL(0 bytes),
|
|
SPACE=0x00000002)
|
|
header=0x00003815027a (NAME='test/td',
|
|
DB_TRX_ID=0x000000000000,
|
|
DB_ROLL_PTR=0x80000000000000,
|
|
ID=0x0000000000000010,
|
|
N_COLS=0x80000001,
|
|
TYPE=0x00000021,
|
|
MIX_ID=0x0000000000000000,
|
|
MIX_LEN=0x00000050,
|
|
CLUSTER_NAME=NULL(0 bytes),
|
|
SPACE=0x00000003)
|
|
header=0x00004815016a (NAME='test/tp',
|
|
DB_TRX_ID=0x000000000000,
|
|
DB_ROLL_PTR=0x80000000000000,
|
|
ID=0x0000000000000012,
|
|
N_COLS=0x80000001,
|
|
TYPE=0x000009a1,
|
|
MIX_ID=0x0000000000000000,
|
|
MIX_LEN=0x00000050,
|
|
CLUSTER_NAME=NULL(0 bytes),
|
|
SPACE=0x00000005)
|
|
header=0x000028150236 (NAME='test/tr',
|
|
DB_TRX_ID=0x000000000000,
|
|
DB_ROLL_PTR=0x80000000000000,
|
|
ID=0x000000000000000e,
|
|
N_COLS=0x00000001,
|
|
TYPE=0x00000001,
|
|
MIX_ID=0x0000000000000000,
|
|
MIX_LEN=0x00000050,
|
|
CLUSTER_NAME=NULL(0 bytes),
|
|
SPACE=0x00000001)
|
|
header=0x000040150074 (NAME='test/tz',
|
|
DB_TRX_ID=0x000000000000,
|
|
DB_ROLL_PTR=0x80000000000000,
|
|
ID=0x0000000000000011,
|
|
N_COLS=0x80000001,
|
|
TYPE=0x00000023,
|
|
MIX_ID=0x0000000000000000,
|
|
MIX_LEN=0x00000050,
|
|
CLUSTER_NAME=NULL(0 bytes),
|
|
SPACE=0x00000004)
|
|
header=0x050008030000 (NAME=0x73757072656d756d00)
|
|
# restart: with restart_parameters
|
|
SHOW CREATE TABLE tr;
|
|
ERROR 42S02: Table 'test.tr' doesn't exist in engine
|
|
SHOW CREATE TABLE tc;
|
|
ERROR 42S02: Table 'test.tc' doesn't exist in engine
|
|
SELECT * FROM tc;
|
|
ERROR 42S02: Table 'test.tc' doesn't exist in engine
|
|
SHOW CREATE TABLE td;
|
|
ERROR HY000: Got error 194 "Tablespace is missing for a table" from storage engine InnoDB
|
|
SELECT * FROM td;
|
|
ERROR HY000: Got error 194 "Tablespace is missing for a table" from storage engine InnoDB
|
|
SHOW CREATE TABLE tz;
|
|
Table Create Table
|
|
tz CREATE TABLE `tz` (
|
|
`a` int(11) NOT NULL,
|
|
PRIMARY KEY (`a`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=1
|
|
BEGIN;
|
|
INSERT INTO tz VALUES(42);
|
|
ROLLBACK;
|
|
SELECT * FROM tz;
|
|
a
|
|
42
|
|
SHOW CREATE TABLE tp;
|
|
ERROR 42S02: Table 'test.tp' doesn't exist in engine
|
|
FOUND 3 /InnoDB: Table test/t[cp] in InnoDB data dictionary contains invalid flags\. SYS_TABLES\.TYPE=(129|289|3873|1232[13]) SYS_TABLES\.N_COLS=2147483649/ in mysqld.1.err
|
|
FOUND 1 /InnoDB: Table test/tr in InnoDB data dictionary contains invalid flags\. SYS_TABLES\.TYPE=65 SYS_TABLES\.MIX_LEN=4294967295\b/ in mysqld.1.err
|
|
Restoring SYS_TABLES clustered index root page (8)
|
|
# restart: with restart_parameters
|
|
SHOW CREATE TABLE tr;
|
|
Table Create Table
|
|
tr CREATE TABLE `tr` (
|
|
`a` int(11) NOT NULL,
|
|
PRIMARY KEY (`a`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci ROW_FORMAT=REDUNDANT
|
|
SHOW CREATE TABLE tc;
|
|
Table Create Table
|
|
tc CREATE TABLE `tc` (
|
|
`a` int(11) NOT NULL,
|
|
PRIMARY KEY (`a`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci ROW_FORMAT=COMPACT
|
|
SHOW CREATE TABLE td;
|
|
Table Create Table
|
|
td CREATE TABLE `td` (
|
|
`a` int(11) NOT NULL,
|
|
PRIMARY KEY (`a`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci ROW_FORMAT=DYNAMIC
|
|
SHOW CREATE TABLE tz;
|
|
Table Create Table
|
|
tz CREATE TABLE `tz` (
|
|
`a` int(11) NOT NULL,
|
|
PRIMARY KEY (`a`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=1
|
|
SHOW CREATE TABLE tp;
|
|
Table Create Table
|
|
tp CREATE TABLE `tp` (
|
|
`a` int(11) NOT NULL,
|
|
PRIMARY KEY (`a`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci ROW_FORMAT=DYNAMIC `PAGE_COMPRESSED`=1 `PAGE_COMPRESSION_LEVEL`=9
|
|
BEGIN;
|
|
INSERT INTO tr VALUES(1);
|
|
INSERT INTO tc VALUES(1);
|
|
INSERT INTO td VALUES(1);
|
|
INSERT INTO tp VALUES(1);
|
|
ROLLBACK;
|
|
SELECT * FROM tr;
|
|
a
|
|
SELECT * FROM tc;
|
|
a
|
|
SELECT * FROM td;
|
|
a
|
|
SELECT * FROM tp;
|
|
a
|
|
DROP TABLE tr,tc,td,tz,tp;
|
|
# restart
|
|
ib_logfile0
|
|
ibdata1
|
|
sys_tables.bin
|
|
call mtr.add_suppression("ERROR HY000: Can't create table `test`.`t1`");
|
|
CREATE TABLE t1(f1 INT, f2 VARCHAR(1), KEY k1(f2),
|
|
FULLTEXT KEY(f2),
|
|
FOREIGN KEY (f2) REFERENCES t1(f3))ENGINE=InnoDB;
|
|
ERROR HY000: Can't create table `test`.`t1` (errno: 150 "Foreign key constraint is incorrectly formed")
|
|
#
|
|
# MDEV-23199 page_compression flag is missing
|
|
# for full_crc32 tablespace
|
|
#
|
|
CREATE TABLE t1(f1 BIGINT PRIMARY KEY)ENGINE=InnoDB;
|
|
INSERT INTO t1 VALUES(1);
|
|
ALTER TABLE t1 PAGE_COMPRESSED = 1;
|
|
INSERT INTO t1 VALUES(2);
|
|
# restart
|
|
DROP TABLE t1;
|