mirror of
https://github.com/MariaDB/server.git
synced 2025-08-07 00:04:31 +03:00
MDEV-35689 InnoDB system tables cannot be optimized or defragmented
- With the help of MDEV-14795, InnoDB implemented a way to shrink the InnoDB system tablespace after undo tablespaces have been moved to separate files (MDEV-29986). There is no way to defragment any pages of InnoDB system tables. By doing that, shrinking of system tablespace can be more effective. This patch deals with defragment of system tables inside ibdata1. Following steps are done to do the defragmentation of system tablespace: 1) Make sure that there is no user tables exist in ibdata1 2) Iterate through all extent descriptor pages in system tablespace and note their states. 3) Find the free earlier extent to replace the lastly used extents in the system tablespace. 4) Iterate through all indexes of system tablespace and defragment the tree level by level. 5) Iterate the level from left page to right page and find out the page comes under the extent to be replaced. If it is then do step (6) else step(4) 6) Prepare the allocation of new extent by latching necessary pages. If any error happens then there is no modification of page happened till step (5). 7) Allocate the new page from the new extent 8) Prepare the associated pages for the block to be modified 9) Prepare the step of freeing of page 10) If any error happens during preparing of associated pages, freeing of page then restore the page which was modified during new page allocation 11) Copy the old page content to new page 12) Change the associative pages like left, right and parent page 13) Complete the freeing of old page Allocation of page from new extent, changing of relative pages, freeing of page are done by 2 steps. one is prepare which latches the to be modified pages and checks their validation. Other is complete(), Do the operation fseg_validate(): Validate the list exist in inode segment Defragmentation is enabled only when :autoextend exist in innodb_data_file_path variable.
This commit is contained in:
25
mysql-test/suite/innodb/r/sys_defragment.result
Normal file
25
mysql-test/suite/innodb/r/sys_defragment.result
Normal file
@@ -0,0 +1,25 @@
|
||||
# restart
|
||||
SET GLOBAL innodb_file_per_table= 0;
|
||||
Warnings:
|
||||
Warning 1287 '@@innodb_file_per_table' is deprecated and will be removed in a future release
|
||||
SET GLOBAL innodb_limit_optimistic_insert_debug = 2;
|
||||
CREATE TABLE t1(f1 INT NOT NULL, f2 INT NOT NULL, f3 INT NOT NULL)ENGINE=InnoDB;
|
||||
INSERT INTO t1 SELECT seq, seq, seq FROM seq_1_to_16384;
|
||||
SET GLOBAL innodb_file_per_table= default;
|
||||
Warnings:
|
||||
Warning 1287 '@@innodb_file_per_table' is deprecated and will be removed in a future release
|
||||
CREATE TABLE t2(f1 INT NOT NULL PRIMARY KEY,f2 VARCHAR(40))ENGINE=InnoDB PARTITION BY KEY() PARTITIONS 256;
|
||||
INSERT INTO t1 SELECT seq, seq, seq FROM seq_1_to_16384;
|
||||
DROP TABLE t2, t1;
|
||||
InnoDB 0 transactions not purged
|
||||
select name, file_size from information_schema.innodb_sys_tablespaces where space = 0;
|
||||
name file_size
|
||||
innodb_system 205520896
|
||||
set GLOBAL innodb_fast_shutdown= 0;
|
||||
# restart
|
||||
FOUND 1 /InnoDB: Moving the data from extents 4096 through 22016/ in mysqld.1.err
|
||||
FOUND 1 /InnoDB: Defragmentation of system tablespace is successful/ in mysqld.1.err
|
||||
select name, file_size from information_schema.innodb_sys_tablespaces where space = 0;
|
||||
name file_size
|
||||
innodb_system 14680064
|
||||
# restart
|
52
mysql-test/suite/innodb/r/sys_defragment_fail.result
Normal file
52
mysql-test/suite/innodb/r/sys_defragment_fail.result
Normal file
@@ -0,0 +1,52 @@
|
||||
call mtr.add_suppression("InnoDB: Defragmentation of CLUST_IND in SYS_INDEXES failed: Data structure corruption");
|
||||
call mtr.add_suppression("InnoDB: Defragmentation of CLUST_IND in SYS_COLUMNS failed: Data structure corruption");
|
||||
call mtr.add_suppression("InnoDB: Cannot free the unused segments in system tablespace");
|
||||
# restart
|
||||
set GLOBAL innodb_file_per_table = 0;
|
||||
Warnings:
|
||||
Warning 1287 '@@innodb_file_per_table' is deprecated and will be removed in a future release
|
||||
set GLOBAL innodb_limit_optimistic_insert_debug = 2;
|
||||
CREATE TABLE t1(f1 INT NOT NULL, f2 INT NOT NULL)ENGINE=InnoDB;
|
||||
INSERT INTO t1 SELECT seq, seq FROM seq_1_to_4096;
|
||||
SET GLOBAL innodb_file_per_table= 1;
|
||||
Warnings:
|
||||
Warning 1287 '@@innodb_file_per_table' is deprecated and will be removed in a future release
|
||||
CREATE TABLE t2(f1 INT NOT NULL PRIMARY KEY,
|
||||
f2 VARCHAR(40))ENGINE=InnoDB PARTITION BY KEY() PARTITIONS 256;
|
||||
INSERT INTO t1 SELECT seq, seq FROM seq_1_to_4096;
|
||||
DROP TABLE t2;
|
||||
InnoDB 0 transactions not purged
|
||||
# restart
|
||||
FOUND 1 /InnoDB: User table exists in the system tablespace/ in mysqld.1.err
|
||||
DROP TABLE t1;
|
||||
InnoDB 0 transactions not purged
|
||||
select name, file_size from information_schema.innodb_sys_tablespaces where space = 0;
|
||||
name file_size
|
||||
innodb_system 58720256
|
||||
# restart: --debug_dbug=+d,fail_after_level_defragment
|
||||
FOUND 1 /InnoDB: Defragmentation of CLUST_IND in SYS_COLUMNS failed./ in mysqld.1.err
|
||||
select name, file_size from information_schema.innodb_sys_tablespaces where space = 0;
|
||||
name file_size
|
||||
innodb_system 58720256
|
||||
# restart: --debug_dbug=d,allocation_prepare_fail
|
||||
FOUND 1 /InnoDB: Defragmentation of CLUST_IND in SYS_INDEXES failed./ in mysqld.1.err
|
||||
select name, file_size from information_schema.innodb_sys_tablespaces where space = 0;
|
||||
name file_size
|
||||
innodb_system 58720256
|
||||
# restart: --debug_dbug=d,relation_page_prepare_fail
|
||||
FOUND 2 /InnoDB: Defragmentation of CLUST_IND in SYS_INDEXES failed./ in mysqld.1.err
|
||||
select name, file_size from information_schema.innodb_sys_tablespaces where space = 0;
|
||||
name file_size
|
||||
innodb_system 58720256
|
||||
# restart: --debug_dbug=d,remover_prepare_fail
|
||||
FOUND 3 /InnoDB: Defragmentation of CLUST_IND in SYS_INDEXES failed./ in mysqld.1.err
|
||||
select name, file_size from information_schema.innodb_sys_tablespaces where space = 0;
|
||||
name file_size
|
||||
innodb_system 58720256
|
||||
# restart
|
||||
FOUND 5 /InnoDB: Moving the data from extents 4096 through 8960/ in mysqld.1.err
|
||||
FOUND 1 /InnoDB: Defragmentation of system tablespace is successful/ in mysqld.1.err
|
||||
select name, file_size from information_schema.innodb_sys_tablespaces where space = 0;
|
||||
name file_size
|
||||
innodb_system 15728640
|
||||
# restart
|
@@ -4,7 +4,7 @@ Warning 1287 '@@innodb_file_per_table' is deprecated and will be removed in a fu
|
||||
SET UNIQUE_CHECKS=0, FOREIGN_KEY_CHECKS=0;
|
||||
CREATE TABLE t1(f1 INT NOT NULL, f2 INT NOT NULL,
|
||||
f3 INT NOT NULL, INDEX(f1),
|
||||
INDEX(f2), INDEX(f3))ENGINE=InnoDB;
|
||||
INDEX(f2), INDEX(f3))STATS_PERSISTENT=0 ENGINE=InnoDB;
|
||||
BEGIN;
|
||||
INSERT INTO t1 SELECT seq, seq, seq FROM seq_1_to_16384;
|
||||
INSERT INTO t1 SELECT seq, seq, seq FROM seq_1_to_16384;
|
||||
|
@@ -9,7 +9,7 @@ Warning 1287 '@@innodb_file_per_table' is deprecated and will be removed in a fu
|
||||
SET UNIQUE_CHECKS=0, FOREIGN_KEY_CHECKS=0;
|
||||
CREATE TABLE t1(f1 INT NOT NULL, f2 INT NOT NULL,
|
||||
f3 INT NOT NULL, INDEX(f1),
|
||||
INDEX(f2), INDEX(f3))ENGINE=InnoDB;
|
||||
INDEX(f2), INDEX(f3))STATS_PERSISTENT=0 ENGINE=InnoDB;
|
||||
BEGIN;
|
||||
INSERT INTO t1 SELECT seq, seq, seq FROM seq_1_to_16384;
|
||||
INSERT INTO t1 SELECT seq, seq, seq FROM seq_1_to_16384;
|
||||
|
6
mysql-test/suite/innodb/t/sys_defragment.opt
Normal file
6
mysql-test/suite/innodb/t/sys_defragment.opt
Normal file
@@ -0,0 +1,6 @@
|
||||
--innodb_page_size=4k
|
||||
--innodb_data_file_path=ibdata1:1M:autoextend:autoshrink
|
||||
--innodb_undo_tablespaces=0
|
||||
--innodb_stats_persistent=0
|
||||
--skip_partition=0
|
||||
--innodb_sys_tablespaces
|
40
mysql-test/suite/innodb/t/sys_defragment.test
Normal file
40
mysql-test/suite/innodb/t/sys_defragment.test
Normal file
@@ -0,0 +1,40 @@
|
||||
--source include/have_innodb.inc
|
||||
--source include/have_sequence.inc
|
||||
--source include/have_debug.inc
|
||||
|
||||
--let MYSQLD_DATADIR= `SELECT @@datadir`
|
||||
--source include/shutdown_mysqld.inc
|
||||
--copy_file $MYSQLD_DATADIR/ibdata1 $MYSQLD_DATADIR/ibdata1_copy
|
||||
--copy_file $MYSQLD_DATADIR/ib_logfile0 $MYSQLD_DATADIR/ib_logfile0_copy
|
||||
--source include/start_mysqld.inc
|
||||
|
||||
SET GLOBAL innodb_file_per_table= 0;
|
||||
SET GLOBAL innodb_limit_optimistic_insert_debug = 2;
|
||||
CREATE TABLE t1(f1 INT NOT NULL, f2 INT NOT NULL, f3 INT NOT NULL)ENGINE=InnoDB;
|
||||
INSERT INTO t1 SELECT seq, seq, seq FROM seq_1_to_16384;
|
||||
SET GLOBAL innodb_file_per_table= default;
|
||||
CREATE TABLE t2(f1 INT NOT NULL PRIMARY KEY,f2 VARCHAR(40))ENGINE=InnoDB PARTITION BY KEY() PARTITIONS 256;
|
||||
INSERT INTO t1 SELECT seq, seq, seq FROM seq_1_to_16384;
|
||||
DROP TABLE t2, t1;
|
||||
--source include/wait_all_purged.inc
|
||||
|
||||
select name, file_size from information_schema.innodb_sys_tablespaces where space = 0;
|
||||
|
||||
set GLOBAL innodb_fast_shutdown= 0;
|
||||
--source include/restart_mysqld.inc
|
||||
|
||||
let SEARCH_FILE= $MYSQLTEST_VARDIR/log/mysqld.1.err;
|
||||
let SEARCH_PATTERN=InnoDB: Moving the data from extents 4096 through 22016;
|
||||
--source include/search_pattern_in_file.inc
|
||||
|
||||
let SEARCH_PATTERN=InnoDB: Defragmentation of system tablespace is successful;
|
||||
--source include/search_pattern_in_file.inc
|
||||
|
||||
select name, file_size from information_schema.innodb_sys_tablespaces where space = 0;
|
||||
|
||||
--source include/shutdown_mysqld.inc
|
||||
|
||||
--move_file $MYSQLD_DATADIR/ibdata1_copy $MYSQLD_DATADIR/ibdata1
|
||||
--move_file $MYSQLD_DATADIR/ib_logfile0_copy $MYSQLD_DATADIR/ib_logfile0
|
||||
|
||||
--source include/start_mysqld.inc
|
6
mysql-test/suite/innodb/t/sys_defragment_fail.opt
Normal file
6
mysql-test/suite/innodb/t/sys_defragment_fail.opt
Normal file
@@ -0,0 +1,6 @@
|
||||
--innodb_page_size=4k
|
||||
--innodb_data_file_path=ibdata1:15M:autoextend:autoshrink
|
||||
--innodb_undo_tablespaces=0
|
||||
--innodb_stats_persistent=0
|
||||
--skip_partition=0
|
||||
--innodb_sys_tablespaces
|
90
mysql-test/suite/innodb/t/sys_defragment_fail.test
Normal file
90
mysql-test/suite/innodb/t/sys_defragment_fail.test
Normal file
@@ -0,0 +1,90 @@
|
||||
--source include/have_innodb.inc
|
||||
--source include/have_debug.inc
|
||||
--source include/have_sequence.inc
|
||||
|
||||
call mtr.add_suppression("InnoDB: Defragmentation of CLUST_IND in SYS_INDEXES failed: Data structure corruption");
|
||||
call mtr.add_suppression("InnoDB: Defragmentation of CLUST_IND in SYS_COLUMNS failed: Data structure corruption");
|
||||
call mtr.add_suppression("InnoDB: Cannot free the unused segments in system tablespace");
|
||||
|
||||
--let MYSQLD_DATADIR= `SELECT @@datadir`
|
||||
--source include/shutdown_mysqld.inc
|
||||
--copy_file $MYSQLD_DATADIR/ibdata1 $MYSQLD_DATADIR/ibdata1_copy
|
||||
--copy_file $MYSQLD_DATADIR/ib_logfile0 $MYSQLD_DATADIR/ib_logfile0_copy
|
||||
--source include/start_mysqld.inc
|
||||
|
||||
set GLOBAL innodb_file_per_table = 0;
|
||||
set GLOBAL innodb_limit_optimistic_insert_debug = 2;
|
||||
CREATE TABLE t1(f1 INT NOT NULL, f2 INT NOT NULL)ENGINE=InnoDB;
|
||||
INSERT INTO t1 SELECT seq, seq FROM seq_1_to_4096;
|
||||
|
||||
SET GLOBAL innodb_file_per_table= 1;
|
||||
CREATE TABLE t2(f1 INT NOT NULL PRIMARY KEY,
|
||||
f2 VARCHAR(40))ENGINE=InnoDB PARTITION BY KEY() PARTITIONS 256;
|
||||
|
||||
INSERT INTO t1 SELECT seq, seq FROM seq_1_to_4096;
|
||||
DROP TABLE t2;
|
||||
|
||||
--source include/wait_all_purged.inc
|
||||
let $restart_parameters=;
|
||||
--source include/restart_mysqld.inc
|
||||
|
||||
let SEARCH_FILE= $MYSQLTEST_VARDIR/log/mysqld.1.err;
|
||||
let SEARCH_PATTERN=InnoDB: User table exists in the system tablespace;
|
||||
--source include/search_pattern_in_file.inc
|
||||
DROP TABLE t1;
|
||||
|
||||
--source include/wait_all_purged.inc
|
||||
select name, file_size from information_schema.innodb_sys_tablespaces where space = 0;
|
||||
|
||||
let $restart_parameters=--debug_dbug=+d,fail_after_level_defragment;
|
||||
--source include/restart_mysqld.inc
|
||||
|
||||
let SEARCH_FILE= $MYSQLTEST_VARDIR/log/mysqld.1.err;
|
||||
let SEARCH_PATTERN=InnoDB: Defragmentation of CLUST_IND in SYS_COLUMNS failed.;
|
||||
--source include/search_pattern_in_file.inc
|
||||
|
||||
select name, file_size from information_schema.innodb_sys_tablespaces where space = 0;
|
||||
|
||||
let $restart_parameters=--debug_dbug=d,allocation_prepare_fail;
|
||||
--source include/restart_mysqld.inc
|
||||
|
||||
let SEARCH_FILE= $MYSQLTEST_VARDIR/log/mysqld.1.err;
|
||||
let SEARCH_PATTERN=InnoDB: Defragmentation of CLUST_IND in SYS_INDEXES failed.;
|
||||
--source include/search_pattern_in_file.inc
|
||||
|
||||
select name, file_size from information_schema.innodb_sys_tablespaces where space = 0;
|
||||
|
||||
let $restart_parameters=--debug_dbug=d,relation_page_prepare_fail;
|
||||
--source include/restart_mysqld.inc
|
||||
|
||||
let SEARCH_FILE= $MYSQLTEST_VARDIR/log/mysqld.1.err;
|
||||
let SEARCH_PATTERN=InnoDB: Defragmentation of CLUST_IND in SYS_INDEXES failed.;
|
||||
--source include/search_pattern_in_file.inc
|
||||
|
||||
select name, file_size from information_schema.innodb_sys_tablespaces where space = 0;
|
||||
|
||||
let $restart_parameters=--debug_dbug=d,remover_prepare_fail;
|
||||
--source include/restart_mysqld.inc
|
||||
|
||||
let SEARCH_FILE= $MYSQLTEST_VARDIR/log/mysqld.1.err;
|
||||
let SEARCH_PATTERN=InnoDB: Defragmentation of CLUST_IND in SYS_INDEXES failed.;
|
||||
--source include/search_pattern_in_file.inc
|
||||
|
||||
select name, file_size from information_schema.innodb_sys_tablespaces where space = 0;
|
||||
|
||||
let $restart_parameters=;
|
||||
--source include/restart_mysqld.inc
|
||||
|
||||
let SEARCH_FILE= $MYSQLTEST_VARDIR/log/mysqld.1.err;
|
||||
let SEARCH_PATTERN= InnoDB: Moving the data from extents 4096 through 8960;
|
||||
--source include/search_pattern_in_file.inc
|
||||
|
||||
let SEARCH_PATTERN=InnoDB: Defragmentation of system tablespace is successful;
|
||||
--source include/search_pattern_in_file.inc
|
||||
|
||||
select name, file_size from information_schema.innodb_sys_tablespaces where space = 0;
|
||||
|
||||
--source include/shutdown_mysqld.inc
|
||||
--move_file $MYSQLD_DATADIR/ibdata1_copy $MYSQLD_DATADIR/ibdata1
|
||||
--move_file $MYSQLD_DATADIR/ib_logfile0_copy $MYSQLD_DATADIR/ib_logfile0
|
||||
--source include/start_mysqld.inc
|
@@ -1,2 +1,3 @@
|
||||
--innodb_data_file_path=ibdata1:10M:autoextend:autoshrink
|
||||
--innodb_sys_tablespaces
|
||||
--innodb_buffer_pool_size=75M
|
||||
|
@@ -1,10 +1,11 @@
|
||||
--source include/have_innodb.inc
|
||||
--source include/have_sequence.inc
|
||||
|
||||
SET GLOBAL INNODB_FILE_PER_TABLE= 0;
|
||||
SET UNIQUE_CHECKS=0, FOREIGN_KEY_CHECKS=0;
|
||||
CREATE TABLE t1(f1 INT NOT NULL, f2 INT NOT NULL,
|
||||
f3 INT NOT NULL, INDEX(f1),
|
||||
INDEX(f2), INDEX(f3))ENGINE=InnoDB;
|
||||
INDEX(f2), INDEX(f3))STATS_PERSISTENT=0 ENGINE=InnoDB;
|
||||
BEGIN;
|
||||
INSERT INTO t1 SELECT seq, seq, seq FROM seq_1_to_16384;
|
||||
INSERT INTO t1 SELECT seq, seq, seq FROM seq_1_to_16384;
|
||||
|
@@ -1,3 +1,4 @@
|
||||
--innodb_data_file_path=ibdata1:1M:autoextend:autoshrink
|
||||
--innodb_sys_tablespaces
|
||||
--innodb_page_size=4k
|
||||
--innodb_buffer_pool_size=100M
|
||||
|
@@ -16,7 +16,7 @@ SET GLOBAL INNODB_FILE_PER_TABLE= 0;
|
||||
SET UNIQUE_CHECKS=0, FOREIGN_KEY_CHECKS=0;
|
||||
CREATE TABLE t1(f1 INT NOT NULL, f2 INT NOT NULL,
|
||||
f3 INT NOT NULL, INDEX(f1),
|
||||
INDEX(f2), INDEX(f3))ENGINE=InnoDB;
|
||||
INDEX(f2), INDEX(f3))STATS_PERSISTENT=0 ENGINE=InnoDB;
|
||||
BEGIN;
|
||||
INSERT INTO t1 SELECT seq, seq, seq FROM seq_1_to_16384;
|
||||
INSERT INTO t1 SELECT seq, seq, seq FROM seq_1_to_16384;
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -409,45 +409,56 @@ dberr_t flst_remove(buf_block_t *base, uint16_t boffset,
|
||||
return err;
|
||||
}
|
||||
|
||||
#ifdef UNIV_DEBUG
|
||||
/** Validate a file-based list. */
|
||||
void flst_validate(const buf_block_t *base, uint16_t boffset, mtr_t *mtr)
|
||||
dberr_t flst_validate(const buf_block_t *base, uint16_t boffset,
|
||||
mtr_t *mtr) noexcept
|
||||
{
|
||||
ut_ad(boffset < base->physical_size());
|
||||
if (boffset >= base->physical_size())
|
||||
return DB_CORRUPTION;
|
||||
|
||||
ut_ad(mtr->memo_contains_flagged(base, MTR_MEMO_PAGE_X_FIX |
|
||||
MTR_MEMO_PAGE_SX_FIX));
|
||||
|
||||
const uint32_t len= flst_get_len(base->page.frame + boffset);
|
||||
fil_addr_t addr= flst_get_first(base->page.frame + boffset);
|
||||
dberr_t err= DB_SUCCESS;
|
||||
|
||||
for (uint32_t i= len; i--; )
|
||||
{
|
||||
ut_ad(addr.boffset >= FIL_PAGE_DATA);
|
||||
ut_ad(addr.boffset < base->physical_size() - FIL_PAGE_DATA_END);
|
||||
if (addr.boffset < FIL_PAGE_DATA ||
|
||||
addr.boffset >= base->physical_size() - FIL_PAGE_DATA_END)
|
||||
return DB_CORRUPTION;
|
||||
const buf_block_t *b=
|
||||
buf_page_get_gen(page_id_t(base->page.id().space(), addr.page),
|
||||
base->zip_size(), RW_SX_LATCH, nullptr, BUF_GET, mtr);
|
||||
ut_ad(b);
|
||||
base->zip_size(), RW_SX_LATCH, nullptr, BUF_GET, mtr,
|
||||
&err);
|
||||
if (!b)
|
||||
return err;
|
||||
addr= flst_get_next_addr(b->page.frame + addr.boffset);
|
||||
mtr->release_last_page();
|
||||
}
|
||||
|
||||
ut_ad(addr.page == FIL_NULL);
|
||||
if (addr.page != FIL_NULL)
|
||||
return DB_CORRUPTION;
|
||||
|
||||
addr= flst_get_last(base->page.frame + boffset);
|
||||
|
||||
for (uint32_t i= len; i--; )
|
||||
{
|
||||
ut_ad(addr.boffset >= FIL_PAGE_DATA);
|
||||
ut_ad(addr.boffset < base->physical_size() - FIL_PAGE_DATA_END);
|
||||
if (addr.boffset < FIL_PAGE_DATA ||
|
||||
addr.boffset >= base->physical_size() - FIL_PAGE_DATA_END)
|
||||
return DB_CORRUPTION;
|
||||
const buf_block_t *b=
|
||||
buf_page_get_gen(page_id_t(base->page.id().space(), addr.page),
|
||||
base->zip_size(), RW_SX_LATCH, nullptr, BUF_GET, mtr);
|
||||
ut_ad(b);
|
||||
base->zip_size(), RW_SX_LATCH, nullptr, BUF_GET, mtr,
|
||||
&err);
|
||||
if (!b)
|
||||
return err;
|
||||
addr= flst_get_prev_addr(b->page.frame + addr.boffset);
|
||||
mtr->release_last_page();
|
||||
}
|
||||
|
||||
ut_ad(addr.page == FIL_NULL);
|
||||
if (addr.page != FIL_NULL)
|
||||
return DB_CORRUPTION;
|
||||
return err;
|
||||
}
|
||||
#endif
|
||||
|
@@ -1504,6 +1504,14 @@ public:
|
||||
bool load_sys_tables() noexcept;
|
||||
/** Create or check system tables on startup */
|
||||
dberr_t create_or_check_sys_tables() noexcept;
|
||||
|
||||
bool is_sys_table(table_id_t table_id) const noexcept
|
||||
{
|
||||
return (table_id > 0 && table_id <= 4) ||
|
||||
table_id == sys_foreign->id ||
|
||||
table_id == sys_foreign_cols->id ||
|
||||
table_id == sys_virtual->id;
|
||||
}
|
||||
};
|
||||
|
||||
/** the data dictionary cache */
|
||||
|
@@ -1021,6 +1021,12 @@ public:
|
||||
@param shutdown called during slow shutdown
|
||||
@return error code */
|
||||
dberr_t garbage_collect(bool shutdown);
|
||||
|
||||
/** Move InnoDB system tables closer to the start of
|
||||
the tablespace.
|
||||
@return error code
|
||||
@retval DB_SUCCESS on successful operation */
|
||||
dberr_t defragment() noexcept;
|
||||
private:
|
||||
/** @return whether the file is usable for io() */
|
||||
ATTRIBUTE_COLD bool prepare_acquired() noexcept;
|
||||
|
@@ -161,9 +161,8 @@ inline fil_addr_t flst_get_prev_addr(const flst_node_t *node)
|
||||
void flst_write_addr(const buf_block_t &block, byte *faddr,
|
||||
uint32_t page, uint16_t boffset, mtr_t *mtr);
|
||||
|
||||
# ifdef UNIV_DEBUG
|
||||
/** Validate a file-based list. */
|
||||
void flst_validate(const buf_block_t *base, uint16_t boffset, mtr_t *mtr);
|
||||
# endif
|
||||
dberr_t flst_validate(const buf_block_t *base, uint16_t boffset,
|
||||
mtr_t *mtr) noexcept;
|
||||
|
||||
#endif /* !UNIV_INNOCHECKSUM */
|
||||
|
Reference in New Issue
Block a user