Mysql:General Tablespace:一般(普通)(用户共享)表空间
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:
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 all table row formats and associated features.
-
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.
General tablespaces are created using CREATE TABLESPACE
syntax.
CREATE TABLESPACEtablespace_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 to InnoDB
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
).
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
mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY) TABLESPACE ts1;
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.
For detailed syntax information, see CREATE TABLE
and ALTER TABLE
.
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 to FILE_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 64K InnoDB
page sizes. For more information about KEY_BLOCK_SIZE
, see CREATE TABLE
, and Section 15.9.1.2, “Creating Compressed Tables”.
Table 15.3 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. The FILE_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 to innodb_page_size
, the tablespace may only contain tables with an uncompressed row format (COMPACT
, REDUNDANT
, and DYNAMIC
row formats).
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 tablespaces.
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. See CREATE TABLESPACE
for more information.
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 the TABLESPACE
option.
Restrictions apply when moving tables from encrypted tablespaces. See Encryption Limitations.
Renaming a general tablespace is supported using ALTER TABLESPACE ... RENAME TO
syntax.
ALTER TABLESPACE s1 RENAME TO s2;
The CREATE TABLESPACE
privilege is required to rename a general tablespace.
RENAME TO
operations are implicitly performed in autocommit
mode, regardless of the autocommit
setting.
A RENAME TO
operation cannot be performed while LOCK TABLES
or FLUSH TABLES WITH READ LOCK
is in effect for tables that reside in the tablespace.
Exclusive metadata locks are taken on tables within a general tablespace while the tablespace is renamed, which prevents concurrent DDL. Concurrent DML is supported.
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 ts1 Engine=InnoDB;
mysql>DROP TABLE t1;
mysql>DROP TABLESPACE ts1;
is a case-sensitive identifier in MySQL.tablespace_name
-
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.
-
The
ADD DATAFILE
clause is not supported in a replication environment where the master and slave reside on the same host. Tablespace creation cannot be replicated to the same directory on the same host.
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. See Truncating 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. See Adding Undo Tablespaces.
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.
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 TABLESPACEtablespace_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 the innodb_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. See Moving Undo Tablespaces.
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. The innodb_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. See 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. See 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
Undo tablespaces created with CREATE UNDO TABLESPACE
syntax can be moved while the server is offline to any known directory. Known directories are those defined by the innodb_directories
variable. Directories defined by innodb_data_home_dir
, innodb_undo_directory
, and datadir
are automatically appended to the innodb_directories
value regardless of whether the innodb_directories
variable is defined explicitly. Those directories and their subdirectories are scanned at startup for undo tablespaces files. An undo tablespace file moved to any of those directories is discovered at startup and assumed to be the undo tablespace that was moved.
The default undo tablespaces (innodb_undo_001
and innodb_undo_002
) created when the MySQL instance is initialized must always reside in the directory defined by the innodb_undo_directory
variable. If the innodb_undo_directory
variable is undefined, default undo tablespaces reside in the data directory. If default undo tablespaces are moved while the server is offline, the server must be started with the innodb_undo_directory
variable configured to the new directory.
The I/O patterns for undo logs make undo tablespaces good candidates for SSD storage.
The innodb_rollback_segments
variable defines the number of rollback segments allocated to each undo tablespace and to the global temporary tablespace. The innodb_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. For information about the number of transactions that a rollback segment supports, see Section 15.6.6, “Undo Logs”.
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.
Automated Truncation
Automated truncation of undo tablespaces requires a minimum of two active undo tablespaces, which ensures that one undo tablespace remains active while the other is taken offline to be truncated. By default, two undo tablespaces are created when the MySQL instance is initialized.
To have undo tablespaces automatically truncated, enable the innodb_undo_log_truncate
variable. For example:
mysql> SET GLOBAL innodb_undo_log_truncate=ON;
When the innodb_undo_log_truncate
variable is enabled, undo tablespaces that exceed the size limit defined by the innodb_max_undo_log_size
variable are subject to truncation. The innodb_max_undo_log_size
variable is dynamic and has a default value of 1073741824 bytes (1024 MiB).
mysql> SELECT @@innodb_max_undo_log_size;
+----------------------------+
| @@innodb_max_undo_log_size |
+----------------------------+
| 1073741824 |
+----------------------------+
When the innodb_undo_log_truncate
variable is enabled:
-
Default and user-defined undo tablespaces that exceed the
innodb_max_undo_log_size
setting are marked for truncation. Selection of an undo tablespace for truncation is performed in a circular fashion to avoid truncating the same undo tablespace each time. -
Rollback segments residing in the selected undo tablespace are made inactive so that they are not assigned to new transactions. Existing transactions that are currently using rollback segments are permitted to finish.
-
The purge system frees rollback segments that are no longer in use.
-
After all rollback segments in the undo tablespace are freed, the truncate operation runs and truncates the undo tablespace to its initial size. The initial size of an undo tablespace 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.The size of an undo tablespace after a truncate operation may be larger than the initial size due to immediate use following the completion of the operation.
The
innodb_undo_directory
variable defines the location of default undo tablespace files. If theinnodb_undo_directory
variable is undefined, default undo tablespaces reside in the data directory. The location of all undo tablespace files including user-defined undo tablespaces created usingCREATE UNDO TABLESPACE
syntax can be determined by querying theINFORMATION_SCHEMA.FILES
table:SELECT TABLESPACE_NAME, FILE_NAME FROM INFORMATION_SCHEMA.FILES WHERE FILE_TYPE LIKE 'UNDO LOG';
-
Rollback segments are reactivated so that they can be assigned to new transactions.
Manual Truncation
Manual truncation of undo tablespaces requires a minimum of three active undo tablespaces. Two active undo tablespaces are required at all times to support the possibility that automated truncation is enabled. A minimum of three undo tablespaces satisfies this requirement while permitting an undo tablespace to be taken offline manually.
To manually initiate truncation of an undo tablespace, deactivate the undo tablespace by issuing the following statement:
ALTER UNDO TABLESPACE tablespace_name
SET INACTIVE;
After the 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, the undo tablespace is truncated to its initial size, and the undo tablespace state changes from inactive
to empty
.
When an ALTER UNDO TABLESPACE
statement deactivates an undo tablespace, the purge thread looks for that undo tablespaces at the next opportunity. Once the undo tablespace is found and marked for truncation, the purge thread returns with increased frequency to quickly empty and truncate the undo tablespace.tablespace_name
SET INACTIVE
To check the state of an undo tablespace, query the INFORMATION_SCHEMA.INNODB_TABLESPACES
table.
SELECT NAME, STATE FROM INFORMATION_SCHEMA.INNODB_TABLESPACES
WHERE NAME LIKE tablespace_name
;
Once the undo tablespace is in an empty
state, it can be reactivated by issuing the following statement:
ALTER UNDO TABLESPACE tablespace_name
SET ACTIVE;
An undo tablespace in an empty
state can also be dropped. See Dropping Undo Tablespaces.
Expediting Automated Truncation of Undo Tablespaces
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 innodb_purge_rseg_truncate_frequency
variable, which has a default setting of 128.
mysql> SELECT @@innodb_purge_rseg_truncate_frequency;
+----------------------------------------+
| @@innodb_purge_rseg_truncate_frequency |
+----------------------------------------+
| 128 |
+----------------------------------------+
To increase that frequency, decrease the innodb_purge_rseg_truncate_frequency
setting. For example, to have the purge thread look for undo tabespaces once every 32 timees that purge is invoked, set innodb_purge_rseg_truncate_frequency
to 32.
mysql> SET GLOBAL innodb_purge_rseg_truncate_frequency=32;
When the purge thread finds an undo tablespace that requires truncation, the purge thread returns with increased frequency to quickly empty and truncate the undo tablespace.
Performance Impact of Truncating Undo Tablespace Files
When an undo tablespace is truncated, the rollback segments in the undo tablespace are deactivated. The active rollback segments in other undo tablespaces assume responsibility for the entire system load, which may result in a slight performance degradation. The amount of performance degradation depends on a number of factors:
-
Number of undo tablespaces
-
Number of undo logs
-
Undo tablespace size
-
Speed of the I/O susbsystem
-
Existing long running transactions
-
System load
The easiest way to avoid impacting performance when truncating undo tablespaces is to increase the number of undo tablespaces.
Monitoring Undo Tablespace Truncation
As of MySQL 8.0.16, undo
and purge
susbsystem counters are provided for monitoring background activities associated with undo log truncation. For counter names and descriptions, query the INFORMATION_SCHEMA.INNODB_METRICS
table.
SELECT NAME, SUBSYSTEM, COMMENT FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME LIKE '%truncate%';
For information about enabling counters and querying counter data, see Section 15.15.6, “InnoDB INFORMATION_SCHEMA Metrics Table”.
The following status variables permit tracking the total number of undo tablespaces, implicit (InnoDB
-created) undo tablespaces, explicit (user-created) undo tablespaces, and the number of active undo tablespaces:
mysql> SHOW STATUS LIKE 'Innodb_undo_tablespaces%';
+----------------------------------+-------+
| Variable_name | Value |
+----------------------------------+-------+
| Innodb_undo_tablespaces_total | 2 |
| Innodb_undo_tablespaces_implicit | 2 |
| Innodb_undo_tablespaces_explicit | 0 |
| Innodb_undo_tablespaces_active | 2 |
+----------------------------------+-------+
For status variable descriptions, see Section 5.1.10, “Server Status Variables”.