• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 临时表空间

    InnoDB使用会话临时表空间和全局临时表空间。

    会话临时表空间

    会话临时表空间存储用户创建的临时表和当InnoDB配置为磁盘内部临时表的存储引擎时由优化器创建的内部临时表。从MySQL 8.0.16开始,用于磁盘内部临时表的存储引擎始终为InnoDB。(以前,存储引擎由的值确定internal_tmp_disk_storage_engine。)

    在创建磁盘临时表的第一个请求上,会话临时表空间从临时表空间池分配给会话。最多可将两个表空间分配给一个会话,一个用于用户创建的临时表,另一个用于由优化程序创建的内部临时表。分配给会话的临时表空间用于该会话创建的所有磁盘上的临时表。当会话断开连接时,其临时表空间将被截断并释放回池中。启动服务器时,将创建10个临时表空间的池。池的大小永远不会缩小,并且表空间会根据需要自动添加到池中。在正常关闭或初始化中止时,将删除临时表空间池。会话临时表空间文件在创建时大小为5页,并且具有.ibt文件扩展名。

    为会话临时表空间保留了40万个空间ID。因为每次启动服务器时都会重新创建会话临时表空间池,所以在关闭服务器时,会话临时表空间的空间ID不会保留,并且可以重新使用。

    innodb_temp_tablespaces_dir变量定义创建会话临时表空间的位置。默认位置是#innodb_temp数据目录中的目录。如果无法创建临时表空间池,则拒绝启动。

    shell>cd BASEDIR/data/#innodb_temp
    shell>ls
    temp_10.ibt  temp_2.ibt  temp_4.ibt  temp_6.ibt  temp_8.ibt
    temp_1.ibt   temp_3.ibt  temp_5.ibt  temp_7.ibt  temp_9.ibt
    

    在基于语句的复制(SBR)模式下,在从属服务器上创建的临时表驻留在单个会话临时表空间中,该表空间仅在MySQL服务器关闭时才被截断。

    INNODB_SESSION_TEMP_TABLESPACES表提供有关会话临时表空间的元数据。

    INFORMATION_SCHEMA.INNODB_TEMP_TABLE_INFO表提供有关在InnoDB实例中处于活动状态的用户创建的临时表的元数据。

    全局临时表空间

    全局临时表空间(ibtmp1)存储用于对用户创建的临时表进行更改的回滚段。

    innodb_temp_data_file_path变量定义全局临时表空间数据文件的相对路径,名称,大小和属性。如果未为指定任何值innodb_temp_data_file_path,则默认行为是创建一个ibtmp1innodb_data_home_dir目录中命名的自动扩展数据文件。初始文件大小略大于12MB。

    全局临时表空间在正常关闭或初始化中止时被删除,并在每次启动服务器时重新创建。全局临时表空间在创建时会接收动态生成的空间ID。如果无法创建全局临时表空间,则拒绝启动。如果服务器意外停止,则不会删除全局临时表空间。在这种情况下,数据库管理员可以手动删除全局临时表空间或重新启动MySQL服务器。重新启动MySQL服务器会自动删除并重新创建全局临时表空间。

    全局临时表空间不能驻留在原始设备上。

    INFORMATION_SCHEMA.FILES提供有关全局临时表空间的元数据。发出与此查询类似的查询以参见全局临时表空间元数据:

    mysql> SELECT * FROM INFORMATION_SCHEMA.FILES WHERE TABLESPACE_NAME='innodb_temporary'\G
    

    默认情况下,全局临时表空间数据文件是自动扩展的,并根据需要增加大小。

    要确定全局临时表空间数据文件是否正在自动扩展,请检查以下innodb_temp_data_file_path设置:

    mysql> SELECT @@innodb_temp_data_file_path;
    +------------------------------	+
    | @@innodb_temp_data_file_path 	|
    +------------------------------	+
    | ibtmp1:12M:autoextend        	|
    +------------------------------	+
    

    要检查全局临时表空间数据文件的大小,请INFORMATION_SCHEMA.FILES使用类似于以下查询的查询表:

    mysql> SELECT FILE_NAME, TABLESPACE_NAME, ENGINE, INITIAL_SIZE, TOTAL_EXTENTS*EXTENT_SIZE 
           AS TotalSizeBytes, DATA_FREE, MAXIMUM_SIZE FROM INFORMATION_SCHEMA.FILES 
           WHERE TABLESPACE_NAME = 'innodb_temporary'\G
    *************************** 1. row 	***************************
          FILE_NAME	: ./ibtmp1
    TABLESPACE_NAME	: innodb_temporary
             ENGINE	: InnoDB
       INITIAL_SIZE	: 12582912
     TotalSizeBytes	: 12582912
          DATA_FREE	: 6291456
       MAXIMUM_SIZE	: NULL
    

    TotalSizeBytes显示全局临时表空间数据文件的当前大小。有关其他字段值的信息,请参见“ INFORMATION_SCHEMA FILES表”。

    或者,检查操作系统上的全局临时表空间数据文件大小。全局临时表空间数据文件位于innodb_temp_data_file_path变量定义的目录中。

    要回收全局临时表空间数据文件占用的磁盘空间,请重新启动MySQL服务器。重新启动服务器会根据定义的属性删除并重新创建全局临时表空间数据文件innodb_temp_data_file_path

    要限制全局临时表空间数据文件的大小,请配置innodb_temp_data_file_path为指定最大文件大小。例如:

    [mysqld]
    innodb_temp_data_file_path=ibtmp1:12M:autoextend:max:500M
    

    配置innodb_temp_data_file_path需要重新启动服务器。