文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  暫時表空間

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 需要重新啟動伺服器。