MySQL 8.0 リファレンスマニュアル


15.6.3.5 一時テーブルスペース

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 を構成するには、サーバーの再起動が必要です。


関連キーワード:  InnoDB, テーブル, スペース, 作成, temp, 構成, グローバル, INFORMATION, SCHEMA, セッション