文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  暫存表空間

17.6.3.5 暫存表空間

InnoDB 使用會話暫存表空間和全域暫存表空間。

會話暫存表空間

會話暫存表空間儲存使用者建立的暫存表格和最佳化工具建立的內部暫存表格,當 InnoDB 設定為磁碟內部暫存表格的儲存引擎時。磁碟上的內部暫存表格使用 InnoDB 儲存引擎。

從暫存表空間池中,將會話暫存表空間分配給會話,在第一次建立磁碟上的暫存表格時。最多將兩個表空間分配給一個會話,一個用於使用者建立的暫存表格,另一個用於最佳化工具建立的內部暫存表格。分配給會話的暫存表空間用於該會話建立的所有磁碟上的暫存表格。當會話斷線時,其暫存表空間會被截斷並釋放回池中。伺服器啟動時,會建立一個包含 10 個暫存表空間的池。池的大小永遠不會縮小,並且會根據需要自動將表空間新增到池中。暫存表空間池會在正常關機或中止初始化時移除。會話暫存表空間檔案在建立時大小為五頁,並且具有 .ibt 檔案名稱副檔名。

保留 40 萬個空間 ID 的範圍用於會話暫存表空間。由於每次啟動伺服器時都會重新建立會話暫存表空間池,因此在伺服器關閉時不會保留會話暫存表空間的空間 ID,並且可能會重複使用。

變數 innodb_temp_tablespaces_dir 定義了建立會話暫存表空間的位置。預設位置是資料目錄中的 #innodb_temp 目錄。如果無法建立暫存表空間池,則會拒絕啟動。

$> cd BASEDIR/data/#innodb_temp
$> 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 指定值,則預設行為是在 innodb_data_home_dir 目錄中建立一個名為 ibtmp1 的單一自動擴充資料檔。初始檔案大小略大於 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 顯示全域暫存表空間資料檔的目前大小。有關其他欄位值的信息,請參閱第 28.3.15 節「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 需要重新啟動伺服器。