InnoDB
では、セッション一時テーブルスペースおよびグローバル一時テーブルスペースが使用されます。
セッション一時テーブルスペースには、InnoDB
がディスク上の内部一時テーブルの記憶域エンジンとして構成されている場合にオプティマイザによって作成されるユーザー作成一時テーブルおよび内部一時テーブルが格納されます。 MySQL 8.0.16 以降、ディスク上の内部一時テーブルに使用されるストレージエンジンは常に InnoDB
です。 (以前は、ストレージエンジンは internal_tmp_disk_storage_engine
の値によって決定されていました。)
セッション一時テーブルスペースは、ディスク上の一時テーブルを作成する最初のリクエストで、一時テーブルスペースのプールからセッションに割り当てられます。 セッションには最大 2 つのテーブルスペースが割り当てられます。1 つはユーザーが作成した一時テーブル用で、もう 1 つはオプティマイザによって作成された内部一時テーブル用です。 セッションに割り当てられた一時テーブルスペースは、セッションによって作成されたディスク上のすべての一時テーブルに使用されます。 セッションが切断されると、その一時テーブルスペースは切り捨てられ、プールに解放されます。 サーバーの起動時に、10 個の一時テーブルスペースのプールが作成されます。 プールのサイズは縮小されず、必要に応じてテーブルスペースがプールに自動的に追加されます。 一時テーブルスペースのプールは、通常の停止時または中断された初期化時に削除されます。 セッション一時テーブルスペースファイルは、作成時にサイズが 5 ページで、.ibt
ファイル名拡張子が付いています。
400 万の領域 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
に値が指定されていない場合、デフォルトの動作では、ibtmp1
という名前の単一の自動拡張データファイルが innodb_data_home_dir
ディレクトリに作成されます。 初期ファイルサイズは 12MB を少し超えています。
グローバル一時テーブルスペースは、通常の停止時または中断された初期化時に削除され、サーバーが起動するたびに再作成されます。 グローバル一時テーブルスペースは、作成時に動的に生成された領域 ID を受け取ります。 グローバル一時テーブルスペースを作成できない場合、起動は拒否されます。 サーバーが予期せず停止した場合、グローバル一時テーブルスペースは削除されません。 この場合、データベース管理者はグローバル一時テーブルスペースを手動で削除するか、MySQL サーバーを再起動できます。 MySQL サーバーを再起動すると、グローバル一時テーブルスペースが自動的に削除され、再作成されます。
グローバル一時テーブルスペースは RAW デバイスに配置できません。
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
には、グローバル一時テーブルスペースデータファイルの現在のサイズが表示されます。 その他のフィールド値の詳細は、セクション26.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
を構成するには、サーバーの再起動が必要です。