轉載、節選於 https://dev.mysql.com/doc/refman/8.0/en/innodb-tablespace.html This section covers topics related to InnoDB tablespaces. 1.The System Tablespac ...
轉載、節選於 https://dev.mysql.com/doc/refman/8.0/en/innodb-tablespace.html
This section covers topics related to InnoDB
tablespaces.
1.The System Tablespace
The InnoDB
system tablespace is the storage area for the doublewrite buffer and the change buffer. The system tablespace also contains table and index data for user-created tables created in the system tablespace. In previous releases, the system tablespace contained the InnoDB
data dictionary. In MySQL 8.0, InnoDB
stores metadata in the MySQL data dictionary.
The system tablespace can have one or more data files. By default, one system tablespace data file, named ibdata1
, is created in the data directory. The size and number of system tablespace data files is controlled by the innodb_data_file_path
startup option.
Resizing the System Tablespace
This section describes how to increase or decrease the size of the InnoDB
system tablespace.
Increasing the Size of the InnoDB System Tablespace
The easiest way to increase the size of the InnoDB
system tablespace is to configure it from the beginning to be auto-extending. Specify the autoextend
attribute for the last data file in the tablespace definition. Then InnoDB
increases the size of that file automatically in 64MB increments when it runs out of space. The increment size can be changed by setting the value of the innodb_autoextend_increment
system variable, which is measured in megabytes.
You can expand the system tablespace by a defined amount by adding another data file:
-
Shut down the MySQL server.
-
If the previous last data file is defined with the keyword
autoextend
, change its definition to use a fixed size, based on how large it has actually grown. Check the size of the data file, round it down to the closest multiple of 1024 × 1024 bytes (= 1MB), and specify this rounded size explicitly ininnodb_data_file_path
. -
Add a new data file to the end of
innodb_data_file_path
, optionally making that file auto-extending. Only the last data file in theinnodb_data_file_path
can be specified as auto-extending. -
Start the MySQL server again.
For example, this tablespace has just one auto-extending data file ibdata1
:
innodb_data_home_dir = innodb_data_file_path = /ibdata/ibdata1:10M:autoextend
Suppose that this data file, over time, has grown to 988MB. Here is the configuration line after modifying the original data file to use a fixed size and adding a new auto-extending data file:
innodb_data_home_dir = innodb_data_file_path = /ibdata/ibdata1:988M;/disk2/ibdata2:50M:autoextend
When you add a new data file to the system tablespace configuration, make sure that the filename does not refer to an existing file. InnoDB
creates and initializes the file when you restart the server.
Decreasing the Size of the InnoDB System Tablespace
You cannot remove a data file from the system tablespace. To decrease the system tablespace size, use this procedure:
1.Use mysqldump to dump all your InnoDB
tables, including InnoDB
tables located in the MySQL database.
mysql> SELECT TABLE_NAME from INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='mysql' and ENGINE='InnoDB'; +---------------------------+ | TABLE_NAME | +---------------------------+ | columns_priv | | component | | db | | default_roles | | engine_cost | | func | | global_grants | | gtid_executed | | help_category | | help_keyword | | help_relation | | help_topic | | innodb_dynamic_metadata | | innodb_index_stats | | innodb_table_stats | | plugin | | procs_priv | | proxies_priv | | role_edges | | server_cost | | servers | | slave_master_info | | slave_relay_log_info | | slave_worker_info | | tables_priv | | time_zone | | time_zone_leap_second | | time_zone_name | | time_zone_transition | | time_zone_transition_type | | user | +---------------------------+
2.Stop the server.
3.Remove all the existing tablespace files (*.ibd
), including the ibdata
and ib_log
files. Do not forget to remove *.ibd
files for tables located in the MySQL database.
4.Configure a new tablespace.
5.Restart the server.
6.Import the dump files.
註意:If your databases only use the InnoDB
engine, it may be simpler to dump all databases, stop the server, remove all databases and InnoDB
log files, restart the server, and import the dump files.
Using Raw Disk Partitions for the System Tablespace
You can use raw disk partitions as data files in the InnoDB
system tablespace. This technique enables nonbuffered I/O on Windows and on some Linux and Unix systems without file system overhead. Perform tests with and without raw partitions to verify whether this change actually improves performance on your system.
When you use a raw disk partition, ensure that the user ID that runs the MySQL server has read and write privileges for that partition. For example, if you run the server as the mysql
user, the partition must be readable and writeable by mysql
. If you run the server with the --memlock
option, the server must be run as root
, so the partition must be readable and writeable by root
.
The procedures described below involve option file modification.
Allocating a Raw Disk Partition on Linux and Unix Systems
-
When you create a new data file, specify the keyword
newraw
immediately after the data file size for theinnodb_data_file_path
option. The partition must be at least as large as the size that you specify. Note that 1MB inInnoDB
is 1024 × 1024 bytes, whereas 1MB in disk specifications usually means 1,000,000 bytes.[mysqld] innodb_data_home_dir= innodb_data_file_path=/dev/hdd1:3Gnewraw;/dev/hdd2:2Gnewraw
-
Restart the server.
InnoDB
notices thenewraw
keyword and initializes the new partition. However, do not create or change anyInnoDB
tables yet. Otherwise, when you next restart the server,InnoDB
reinitializes the partition and your changes are lost. (As a safety measureInnoDB
prevents users from modifying data when any partition withnewraw
is specified.) -
After
InnoDB
has initialized the new partition, stop the server, changenewraw
in the data file specification toraw
:[mysqld] innodb_data_home_dir= innodb_data_file_path=/dev/hdd1:3Graw;/dev/hdd2:2Graw
-
Restart the server.
InnoDB
now permits changes to be made.
Allocating a Raw Disk Partition on Windows
On Windows systems, the same steps and accompanying guidelines described for Linux and Unix systems apply except that the innodb_data_file_path
setting differs slightly on Windows.
-
When you create a new data file, specify the keyword
newraw
immediately after the data file size for theinnodb_data_file_path
option:[mysqld] innodb_data_home_dir= innodb_data_file_path=//./D::10Gnewraw
The
//./
corresponds to the Windows syntax of\\.\
for accessing physical drives. In the example above,D:
is the drive letter of the partition. -
Restart the server.
InnoDB
notices thenewraw
keyword and initializes the new partition. -
After
InnoDB
has initialized the new partition, stop the server, changenewraw
in the data file specification toraw
:[mysqld] innodb_data_home_dir= innodb_data_file_path=//./D::10Graw
-
Restart the server.
InnoDB
now permits changes to be made.
2.File-Per-Table Tablespaces
Historically, InnoDB
tables were stored in the system tablespace. This monolithic approach was targeted at machines dedicated to database processing, with carefully planned data growth, where any disk storage allocated to MySQL would never be needed for other purposes. The file-per-table tablespace feature provides a more flexible alternative, where each InnoDB
table is stored in its own tablespace data file (.ibd
file). This feature is controlled by the innodb_file_per_table
configuration option, which is enabled by default.
Advantages
-
You can reclaim disk space when truncating or dropping a table stored in a file-per-table tablespace. Truncating or dropping tables stored in the shared system tablespace creates free space internally in the system tablespace data files (ibdata files) which can only be used for new
InnoDB
data.Similarly, a table-copying
ALTER TABLE
operation on table that resides in a shared tablespace can increase the amount of space used by the tablespace. Such operations may require as much additional space as the data in the table plus indexes. The additional space required for the table-copyingALTER TABLE
operation is not released back to the operating system as it is for file-per-table tablespaces. -
The
TRUNCATE TABLE
operation is faster when run on tables stored in file-per-table tablespaces. -
You can store specific tables on separate storage devices, for I/O optimization, space management, or backup purposes by specifying the location of each table using the syntax
CREATE TABLE ... DATA DIRECTORY =
absolute_path_to_directory.
-
You can run
OPTIMIZE TABLE
to compact or recreate a file-per-table tablespace. When you run anOPTIMIZE TABLE
,InnoDB
creates a new.ibd
file with a temporary name, using only the space required to store actual data. When the optimization is complete,InnoDB
removes the old.ibd
file and replaces it with the new one. If the previous.ibd
file grew significantly but the actual data only accounted for a portion of its size, runningOPTIMIZE TABLE
can reclaim the unused space. -
You can move individual
InnoDB
tables rather than entire databases. -
You can copy individual
InnoDB
tables from one MySQL instance to another (known as the transportable tablespace feature). -
Tables created in file-per-table tablespaces support features associated with compressed and dynamic row formats.
-
You can enable more efficient storage for tables with large
BLOB
orTEXT
columns using the dynamic row format. -
File-per-table tablespaces may improve chances for a successful recovery and save time when a corruption occurs, when a server cannot be restarted, or when backup and binary logs are unavailable.
-
You can back up or restore individual tables quickly using the MySQL Enterprise Backup product, without interrupting the use of other
InnoDB
tables. This is beneficial if you have tables that require backup less frequently or on a different backup schedule. See Making a Partial Backup for details. -
File-per-table tablespaces are convenient for per-table status reporting when copying or backing up tables.
-
You can monitor table size at a file system level without accessing MySQL.
-
Common Linux file systems do not permit concurrent writes to a single file when
innodb_flush_method
is set toO_DIRECT
. As a result, there are possible performance improvements when using file-per-table tablespaces in conjunction withinnodb_flush_method
. -
The system tablespace stores the data dictionary and undo logs, and is limited in size by
InnoDB
tablespace size limits. With file-per-table tablespaces, each table has its own tablespace, which provides room for growth.
Potential Disadvantages
-
With file-per-table tablespaces, each table may have unused space, which can only be utilized by rows of the same table. This could lead to wasted space if not properly managed.
-
fsync
operations must run on each open table rather than on a single file. Because there is a separatefsync
operation for each file, write operations on multiple tables cannot be combined into a single I/O operation. This may requireInnoDB
to perform a higher total number offsync
operations. -
mysqld must keep one open file handle per table, which may impact performance if you have numerous tables in file-per-table tablespaces.
-
More file descriptors are used.
-
innodb_file_per_table
is enabled by default in MySQL 5.6 and higher. You may consider disabling it if backward compatibility with earlier versions of MySQL is a concern. -
If many tables are growing there is potential for more fragmentation which can impede
DROP TABLE
and table scan performance. However, when fragmentation is managed, having files in their own tablespace can improve performance. -
The buffer pool is scanned when dropping a file-per-table tablespace, which can take several seconds for buffer pools that are tens of gigabytes in size. The scan is performed with a broad internal lock, which may delay other operations. Tables in the system tablespace are not affected.
-
The
innodb_autoextend_increment
variable, which defines increment size (in MB) for extending the size of an auto-extending shared tablespace file when it becomes full, does not apply to file-per-table tablespace files, which are auto-extending regardless of theinnodb_autoextend_increment
setting. The initial extensions are by small amounts, after which extensions occur in increments of 4MB.
Enabling File-Per-Table Tablespaces
The innodb_file_per_table
option is enabled by default.
You can also set innodb_file_per_table
dynamically, while the server is running:
mysql> SET GLOBAL innodb_file_per_table=1;
With innodb_file_per_table
enabled, you can store InnoDB
tables in a
file. Unlike the tbl_name
.ibdMyISAM
storage engine, with its separate
andtbl_name
.MYD
files for indexes and data, tbl_name
.MYIInnoDB
stores the data and the indexes together in a single .ibd
file.
If you disable innodb_file_per_table
in your startup options and restart the server, or disable it with the SET GLOBAL
command, InnoDB
creates new tables inside the system tablespace unless you have explicitly placed the table in file-per-table tablespace or general tablespace using the CREATE TABLE ... TABLESPACE
option.
You can always read and write any InnoDB
tables, regardless of the file-per-table setting.
To move a table from the system tablespace to its own tablespace, change the innodb_file_per_table
setting and rebuild the table:
mysql> SET GLOBAL innodb_file_per_table=1; mysql> ALTER TABLE table_name ENGINE=InnoDB;
Tables added to the system tablespace using CREATE TABLE ... TABLESPACE
or ALTER TABLE ... TABLESPACE
syntax are not affected by the innodb_file_per_table
setting. To move these tables from the system tablespace to a file-per-table tablespace, they must be moved explicitly using ALTER TABLE ... TABLESPACE
syntax.
註意:
InnoDB
always needs the system tablespace because it puts its internal data dictionary and undo logs there. The .ibd
files are not sufficient forInnoDB
to operate.
When a table is moved out of the system tablespace into its own .ibd
file, the data files that make up the system tablespace remain the same size. The space formerly occupied by the table can be reused for new InnoDB
data, but is not reclaimed for use by the operating system. When moving largeInnoDB
tables out of the system tablespace, where disk space is limited, you may prefer to enable innodb_file_per_table
and recreate the entire instance using the mysqldump command. As mentioned above, tables added to the system tablespace using CREATE TABLE ... TABLESPACE
orALTER TABLE ... TABLESPACE
syntax are not affected by the innodb_file_per_table
setting. These tables must be moved individually.
3.General Tablespaces
A general tablespace is a shared InnoDB
tablespace that is created using CREATE TABLESPACE
syntax. General tablespace capabilities and features are described under the following topics in this section.
General Tablespace Capabilities
The general tablespace feature provides the following capabilities:
-
Similar to the system tablespace, general tablespaces are shared tablespaces that can store data for multiple tables.
-
General tablespaces have a potential memory advantage over file-per-table tablespaces. The server keeps tablespace metadata in memory for the lifetime of a tablespace. Multiple tables in fewer general tablespaces consume less memory for tablespace metadata than the same number of tables in separate file-per-table tablespaces.
-
General tablespace data files may be placed in a directory relative to or independent of the MySQL data directory, which provides you with many of the data file and storage management capabilities of file-per-table tablespaces. As with file-per-table tablespaces, the ability to place data files outside of the MySQL data directory allows you to manage performance of critical tables separately, setup RAID or DRBD for specific tables, or bind tables to particular disks, for example.
-
General tablespaces support both Antelope and Barracuda file formats, and therefore support all table row formats and associated features. With support for both file formats, general tablespaces have no dependence on
innodb_file_format
orinnodb_file_per_table
settings, nor do these variables have any effect on general tablespaces. -
The
TABLESPACE
option can be used withCREATE TABLE
to create tables in a general tablespaces, file-per-table tablespace, or in the system tablespace. -
The
TABLESPACE
option can be used withALTER TABLE
to move tables between general tablespaces, file-per-table tablespaces, and the system tablespace. Previously, it was not possible to move a table from a file-per-table tablespace to the system tablespace. With the general tablespace feature, you can now do so.
Creating a General Tablespace
General tablespaces are created using CREATE TABLESPACE
syntax.
CREATE TABLESPACE tablespace_name [ADD DATAFILE 'file_name'] [FILE_BLOCK_SIZE = value] [ENGINE [=] engine_name]
A general tablespace can be created in the data directory or outside of it. To avoid conflicts with implicitly created file-per-table tablespaces, creating a general tablespace in a subdirectory under the data directory is not supported. When creating a general tablespace outside of the data directory, the directory must exist and must be known toInnoDB
prior to creating the tablespace. To make an unknown directory known to InnoDB
, add the directory to the innodb_directories
argument value. innodb_directories
is a read-only startup option. Configuring it requires restarting the server.
Examples:
Creating a general tablespace in the data directory:
mysql> CREATE TABLESPACE `ts1` ADD DATAFILE 'ts1.ibd' Engine=InnoDB;
or
mysql> CREATE TABLESPACE `ts1` Engine=InnoDB;
The ADD DATAFILE
clause is optional as of MySQL 8.0.14 and required before that. If the ADD DATAFILE
clause is not specified when creating a tablespace, a tablespace data file with a unique file name is created implicitly. The unique file name is a 128 bit UUID formatted into five groups of hexadecimal numbers separated by dashes (aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee
). General tablespace data files include an .ibd
file extension. In a replication environment, the data file name created on the master is not the same as the data file name created on the slave.
Creating a general tablespace in a directory outside of the data directory:
mysql> CREATE TABLESPACE `ts1` ADD DATAFILE '/my/tablespace/directory/ts1.ibd' Engine=InnoDB;
You can specify a path that is relative to the data directory as long as the tablespace directory is not under the data directory. In this example, the my_tablespace
directory is at the same level as the data directory:
mysql> CREATE TABLESPACE `ts1` ADD DATAFILE '../my_tablespace/ts1.ibd' Engine=InnoDB;
註意:The ENGINE = InnoDB
clause must be defined as part of the CREATE TABLESPACE
statement, or InnoDB
must be defined as the default storage engine (default_storage_engine=InnoDB
).
Adding Tables to a General Tablespace
After creating an InnoDB
general tablespace, you can use CREATE TABLE
or tbl_name
... TABLESPACE [=] tablespace_name
ALTER TABLE
to add tables to the tablespace, as shown in the following examples:tbl_name
TABLESPACE [=]tablespace_name
CREATE TABLE
:
mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY) TABLESPACE ts1;
ALTER TABLE
:
mysql> ALTER TABLE t2 TABLESPACE ts1;
註意:Support for adding table partitions to shared tablespaces was deprecated in MySQL 5.7.24 and removed in MySQL 8.0.13. Shared tablespaces include the InnoDB
system tablespace and general tablespaces.
General Tablespace Row Format Support
General tablespaces support all table row formats (REDUNDANT
, COMPACT
, DYNAMIC
, COMPRESSED
) with the caveat that compressed and uncompressed tables cannot coexist in the same general tablespace due to different physical page sizes.
For a general tablespace to contain compressed tables (ROW_FORMAT=COMPRESSED
), FILE_BLOCK_SIZE
must be specified, and the FILE_BLOCK_SIZE
value must be a valid compressed page size in relation to the innodb_page_size
value. Also, the physical page size of the compressed table (KEY_BLOCK_SIZE
) must be equal toFILE_BLOCK_SIZE/1024
. For example, if innodb_page_size=16KB
and FILE_BLOCK_SIZE=8K
, the KEY_BLOCK_SIZE
of the table must be 8.
The following table shows permitted innodb_page_size
, FILE_BLOCK_SIZE
, and KEY_BLOCK_SIZE
combinations. FILE_BLOCK_SIZE
values may also be specified in bytes. To determine a valid KEY_BLOCK_SIZE
value for a given FILE_BLOCK_SIZE
, divide the FILE_BLOCK_SIZE
value by 1024. Table compression is not support for 32K and 64KInnoDB
page sizes.
Permitted Page Size, FILE_BLOCK_SIZE, and KEY_BLOCK_SIZE Combinations for Compressed Tables
InnoDB Page Size (innodb_page_size) | Permitted FILE_BLOCK_SIZE Value | Permitted KEY_BLOCK_SIZE Value |
---|---|---|
64KB | 64K (65536) | Compression is not supported |
32KB | 32K (32768) | Compression is not supported |
16KB | 16K (16384) | N/A: If innodb_page_size is equal to FILE_BLOCK_SIZE , the tablespace cannot contain a compressed table. |
16KB | 8K (8192) | 8 |
16KB | 4K (4096) | 4 |
16KB | 2K (2048) | 2 |
16KB | 1K (1024) | 1 |
8KB | 8K (8192) | N/A: If innodb_page_size is equal to FILE_BLOCK_SIZE , the tablespace cannot contain a compressed table. |
8KB | 4K (4096) | 4 |
8KB | 2K (2048) | 2 |
8KB | 1K (1024) | 1 |
4KB | 4K (4096) | N/A: If innodb_page_size is equal to FILE_BLOCK_SIZE , the tablespace cannot contain a compressed table. |
4KB | 2K (2048) | 2 |
4KB | 1K (1024) | 1 |
This example demonstrates creating a general tablespace and adding a compressed table. The example assumes a default innodb_page_size
of 16KB. TheFILE_BLOCK_SIZE
of 8192 requires that the compressed table have a KEY_BLOCK_SIZE
of 8.
mysql> CREATE TABLESPACE `ts2` ADD DATAFILE 'ts2.ibd' FILE_BLOCK_SIZE = 8192 Engine=InnoDB; mysql> CREATE TABLE t4 (c1 INT PRIMARY KEY) TABLESPACE ts2 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;
If you do not specify FILE_BLOCK_SIZE
when creating a general tablespace, FILE_BLOCK_SIZE
defaults to innodb_page_size
. When FILE_BLOCK_SIZE
is equal toinnodb_page_size
, the tablespace may only contain tables with an uncompressed row format (COMPACT
, REDUNDANT
, and DYNAMIC
row formats).
Moving Tables Between Tablespaces Using ALTER TABLE
You can use ALTER TABLE
with the TABLESPACE
option to move a table to an existing general tablespace, to a new file-per-table tablespace, or to the system tablespace.
註意:Support for placing table partitions in shared tablespaces was deprecated in MySQL 5.7.24 and removed MySQL 8.0.13. Shared tablespaces include the InnoDB
system tablespace and general tablespace.
To move a table from a file-per-table tablespace or from the system tablespace to a general tablespace, specify the name of the general tablespace. The general tablespace must exist.
ALTER TABLE tbl_name TABLESPACE [=] tablespace_name;
To move a table from a general tablespace or file-per-table tablespace to the system tablespace, specify innodb_system
as the tablespace name.
ALTER TABLE tbl_name TABLESPACE [=] innodb_system;
To move a table from the system tablespace or a general tablespace to a file-per-table tablespace, specify innodb_file_per_table
as the tablespace name.
ALTER TABLE tbl_name TABLESPACE [=] innodb_file_per_table;
ALTER TABLE ... TABLESPACE
operations always cause a full table rebuild, even if the TABLESPACE
attribute has not changed from its previous value.
ALTER TABLE ... TABLESPACE
syntax does not support moving a table from a temporary tablespace to a persistent tablespace.
The DATA DIRECTORY
clause is permitted with CREATE TABLE ... TABLESPACE=innodb_file_per_table
but is otherwise not supported for use in combination with theTABLESPACE
option.
Restrictions apply when moving tables from encrypted tablespaces.
Dropping a General Tablespace
The DROP TABLESPACE
statement is used to drop an InnoDB
general tablespace.
All tables must be dropped from the tablespace prior to a DROP TABLESPACE
operation. If the tablespace is not empty, DROP TABLESPACE
returns an error.
Use a query similar to the following to identify tables in a general tablespace.
mysql> SELECT a.NAME AS space_name, b.NAME AS table_name FROM INFORMATION_SCHEMA.INNODB_TABLESPACES a, INFORMATION_SCHEMA.INNODB_TABLES b WHERE a.SPACE=b.SPACE AND a.NAME LIKE 'ts1'; +------------+------------+ | space_name | table_name | +------------+------------+ | ts1 | test/t1 | | ts1 | test/t2 | | ts1 | test/t3 | +------------+------------+
A general InnoDB
tablespace is not deleted automatically when the last table in the tablespace is dropped. The tablespace must be dropped explicitly using DROP TABLESPACE
.tablespace_name
A general tablespace does not belong to any particular database. A DROP DATABASE
operation can drop tables that belong to a general tablespace but it cannot drop the tablespace, even if the DROP DATABASE
operation drops all tables that belong to the tablespace. A general tablespace must be dropped explicitly using DROP TABLESPACE
.tablespace_name
Similar to the system tablespace, truncating or dropping tables stored in a general tablespace creates free space internally in the general tablespace .ibd data file which can only be used for new InnoDB
data. Space is not released back to the operating system as it is when a file-per-table tablespace is deleted during a DROP TABLE
operation.
This example demonstrates how to drop an InnoDB
general tablespace. The general tablespace ts1
is created with a single table. The table must be dropped before dropping the tablespace.
mysql> CREATE TABLESPACE `ts1` ADD DATAFILE 'ts1.ibd' Engine=InnoDB; mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY) TABLESPACE ts10 Engine=InnoDB; mysql> DROP TABLE t1; mysql> DROP TABLESPACE ts1;
註意:
is a case-sensitive identifier in MySQL.tablespace_name
General Tablespace Limitations
-
A generated or existing tablespace cannot be changed to a general tablespace.
-
Creation of temporary general tablespaces is not supported.
-
General tablespaces do not support temporary tables.
-
Similar to the system tablespace, truncating or dropping tables stored in a general tablespace creates free space internally in the general tablespace .ibd data file which can only be used for new
InnoDB
data. Space is not released back to the operating system as it is for file-per-table tablespaces.Additionally, a table-copying
ALTER TABLE
operation on table that resides in a shared tablespace (a general tablespace or the system tablespace) can increase the amount of space used by the tablespace. Such operations require as much additional space as the data in the table plus indexes. The additional space required for the table-copyingALTER TABLE
operation is not released back to the operating system as it is for file-per-table tablespaces. -
ALTER TABLE ... DISCARD TABLESPACE
andALTER TABLE ...IMPORT TABLESPACE
are not supported for tables that belong to a general tablespace. -
Support for placing table partitions in general tablespaces was deprecated in MySQL 5.7.24 and removed in MySQL 8.0.13.
4.Undo Tablespaces
Undo tablespaces contain undo logs, which are collections of undo log records that contain information about how to undo the latest change by a transaction to a clustered index record. Undo logs exist within undo log segments, which are contained within rollback segments. The innodb_rollback_segments
variable defines the number of rollback segments allocated to each undo tablespace.
Two default undo tablespaces are created when the MySQL instance is initialized. Default undo tablespaces are created at initialization time to provide a location for rollback segments that must exist before SQL statements can be accepted. A minimum of two undo tablespaces is required to support automated truncation of undo tablespaces.
Default undo tablespaces are created in the location defined by the innodb_undo_directory
variable. If the innodb_undo_directory
variable is undefined, default undo tablespaces are created in the data directory. Default undo tablespace data files are named undo_001
and undo_002
. The corresponding undo tablespace names defined in the data dictionary are innodb_undo_001
and innodb_undo_002
.
As of MySQL 8.0.14, additional undo tablespaces can be created at runtime using SQL.
The initial size of an undo tablespace data file depends on the innodb_page_size
value. For the default 16KB page size, the initial undo tablespace file size is 10MiB. For 4KB, 8KB, 32KB, and 64KB page sizes, the initial undo tablespace files sizes are 7MiB, 8MiB, 20MiB, and 40MiB, respectively.
Adding Undo Tablespaces
Because undo logs can become large during long-running transactions, creating additional undo tablespaces can help prevent individual undo tablespaces from becoming too large. As of MySQL 8.0.14, additional undo tablespaces can be created at runtime using CREATE UNDO TABLESPACE
syntax.
CREATE UNDO TABLESPACE tablespace_name ADD DATAFILE 'file_name.ibu'
The undo tablespace file name must have an .ibu
extension. It is not permitted to specify a relative path when defining the undo tablespace file name. A fully qualified path is permitted, but the path must be known to InnoDB
. Known paths are those defined by the innodb_directories
variable. Unique undo tablespace file names are recommended to avoid potential file name conflicts when moving or cloning data.
At startup, directories defined by the innodb_directories
variable are scanned for undo tablespace files. (The scan also traverses subdirectories.) Directories defined by the innodb_data_home_dir
, innodb_undo_directory
, and datadir
variables are automatically appended to the innodb_directories
value, regardless of whether theinnodb_directories
variable is defined explicitly. An undo tablespace can therefore reside in paths defined by any of those variables.
If the undo tablespace file name does not include a path, the undo tablespace is created in the directory defined by the innodb_undo_directory
variable. If that variable is undefined, the undo tablespace is created in the data directory.
註意:The InnoDB
recovery process requires that undo tablespace files reside in known directories. Undo tablespace files must be discovered and opened before redo recovery and before other data files are opened to permit uncommitted transactions and data dictionary changes to be rolled back. An undo tablespace not found before recovery cannot be used, which can cause database inconsistencies. An error message is reported at startup if an undo tablespace known to the data dictionary is not found. The known directory requirement also supports undo tablespace portability.
To create undo tablespaces in a path relative to the data directory, set the innodb_undo_directory
variable to the relative path, and specify the file name only when creating an undo tablespace.
To view undo tablespace names and paths, query INFORMATION_SCHEMA.FILES
:
SELECT TABLESPACE_NAME, FILE_NAME FROM INFORMATION_SCHEMA.FILES WHERE FILE_TYPE LIKE 'UNDO LOG';
A MySQL instance supports up to 127 undo tablespaces including the two default undo tablespaces created when the MySQL instance is initialized.
註意:
Prior to MySQL 8.0.14, additional undo tablespaces are created by configuring the innodb_undo_tablespaces
startup variable. This variable is deprecated and no longer configurable as of MySQL 8.0.14.
Prior to MySQL 8.0.14, increasing the innodb_undo_tablespaces
setting creates the specified number of undo tablespaces and adds them to the list of active undo tablespaces. Decreasing the innodb_undo_tablespaces
setting removes undo tablespaces from the list of active undo tablespaces. Undo tablespaces that are removed from the active list remain active until they are no longer used by existing transactions. Theinnodb_undo_tablespaces
variable can be configured at runtime using a SET
statement or defined in a configuration file.
Prior to MySQL 8.0.14, deactivated undo tablespaces cannot be removed. Manual removal of undo tablespace files is possible after a slow shutdown but is not recommended, as deactivated undo tablespaces may contain active undo logs for some time after the server is restarted if open transactions were present when shutting down the server. As of MySQL 8.0.14, undo tablespaces can be dropped using DROP UNDO TABALESPACE
syntax.
Dropping Undo Tablespaces
As of MySQL 8.0.14, undo tablespaces created using CREATE UNDO TABLESPACE
syntax can be dropped at runtime using DROP UNDO TABALESPACE
syntax.
An undo tablespace must be empty before it can be dropped. To empty an undo tablespace, the undo tablespace must first be marked as inactive using ALTER UNDO TABLESPACE
syntax so that the tablespace is no longer used for assigning rollback segments to new transactions.
ALTER UNDO TABLESPACE tablespace_name SET INACTIVE;
After an undo tablespace is marked as inactive, transactions currently using rollback segments in the undo tablespace are permitted to finish, as are any transactions started before those transactions are completed. After transactions are completed, the purge system frees the rollback segments in the undo tablespace, and the undo tablespace is truncated to its initial size. (The same process is used when truncating undo tablespaces. ) When the undo tablespace is empty, it can be dropped.
DROP UNDO TABLESPACE tablespace_name;
註意:Alternatively, the undo tablespace can be left in an empty state and reactivated later, when needed, by issuing an ALTER UNDO TABLESPACE
statement.tablespace_name
SET ACTIVE
The state of an undo tablespace can be monitored by querying the INFORMATION_SCHEMA.INNODB_TABLESPACES
table.
SELECT NAME, STATE FROM INFORMATION_SCHEMA.INNODB_TABLESPACES WHERE NAME LIKE tablespace_name;
An inactive
state indicates that rollback segments in an undo tablespace are no longer used by new transactions. An empty
state indicates that an undo tablespace is empty and ready to be dropped, or made active again using an ALTER UNDO TABLESPACE
statement. Attempting to drop an undo tablespace that is not empty returns an error.tablespace_name
SET ACTIVE
The default undo tablespaces (innodb_undo_001
and innodb_undo_002
) created when the MySQL instance is initialized cannot be dropped. They can, however, be made inactive using an ALTER UNDO TABLESPACE
statement. Before a default undo tablespace can be made inactive, there must be an undo tablespace to take its place. A minimum of two active undo tablespaces are required at all times to support automated truncation of undo tablespaces.tablespace_name
SET INACTIVE
Configuring the Number of Rollback Segments
The innodb_rollback_segments
variable defines the number of rollback segments allocated to each undo tablespace and to the global temporary tablespace. Theinnodb_rollback_segments
variable can be configured at startup or while the server is running.
The default setting for innodb_rollback_segments
is 128, which is also the maximum value.
Truncating Undo Tablespaces
There are two methods of truncating undo tablespaces, which can be used individually or in combination to manage undo tablespace size. One method is automated, enabled using configuration variables. The other method is manual, performed using SQL statements.
The automated method does not require monitoring undo tablespace size and, once enabled, it performs deactivation, truncation, and reactivation of undo tablespaces without manual intervention. The manual truncation method may be preferable if you want to control when undo tablespaces are taken offline for truncation. For example, you may want to avoid truncating undo tablespaces during peak workload times.
The purge thread is responsible for emptying and truncating undo tablespaces. By default, the purge thread looks for undo tablespaces to truncate once every 128 times that purge is invoked. The frequency with which the purge thread looks for undo tablespaces to truncate is controlled by the inn