24.9 INFORMATION_SCHEMA FILEStable

FILEStable 提供有关存储 MySQLtable 空间数据的文件的信息。

FILEStable 提供有关InnoDB数据文件的信息。在 NDB 群集中,此 table 还提供有关存储 NDB 群集磁盘数据 table 的文件的信息。有关InnoDB的特定其他信息,请参见InnoDB Notes(本节后面的内容)。有关 NDB 群集的特定其他信息,请参见NDB Notes

FILEStable 具有以下列:

  • FILE_ID

对于InnoDB:table 空间 ID,也称为space_idfil_space_t::id

对于NDB:文件标识符。 FILE_ID列值是自动生成的。

  • FILE_NAME

对于InnoDB:数据文件的名称。每 table 文件和常规 table 空间的文件 extensions 为.ibd。撤消 table 空间以undo为前缀。系统 table 空间的前缀为ibdata。临时 table 空间以ibtmp为前缀。文件名包括文件路径,该文件路径可能相对于 MySQL 数据目录(datadir系统变量的值)。

对于NDB:由创建日志文件组更改日志文件组创建的UNDO日志文件的名称,或由CREATE TABLESPACEALTER TABLESPACE创建的数据文件的名称。

  • FILE_TYPE

对于InnoDB:table 空间文件类型。 InnoDB个文件有三种可能的文件类型。 TABLESPACE是保存 table,索引或其他形式的用户数据的任何系统,常规或每 table 文件 table 空间文件的文件类型。 TEMPORARY是临时 table 空间的文件类型。 UNDO LOG是用于存储撤消记录的撤消 table 空间的文件类型。

对于NDB:值UNDO LOGDATAFILETABLESPACE之一。

  • TABLESPACE_NAME

对于InnoDB:table 空间的 SQL 名称。一般的 table 空间名称是SYS_TABLESPACES.NAME值。对于其他 table 空间文件,名称以innodb_开头,例如innodb_systeminnodb_undoinnodb_file_per_table。每 table 文件 table 空间名称格式为innodb_file_per_table_##,其中* ## *是 table 空间 ID。

对于NDB:与文件关联的 table 空间的名称。

  • TABLE_CATALOG

此值始终为空。

  • TABLE_SCHEMA

始终为NULL

  • TABLE_NAME

始终为NULL

  • LOGFILE_GROUP_NAME

对于InnoDB:始终为NULL

对于NDB:日志文件或数据文件所属的日志文件组的名称。

  • LOGFILE_GROUP_NUMBER

对于InnoDB:始终为NULL

对于NDB:对于磁盘数据撤消日志文件,该日志文件所属的日志文件组的自动生成的 ID 号。此值与此撤消日志文件的ndbinfo.dict_obj_infotable 中的id列以及ndbinfo.logspacesndbinfo.logspacestable 中的log_id列显示的值相同。

  • ENGINE

对于InnoDB:始终为InnoDB

对于NDB:始终为ndbcluster

  • FULLTEXT_KEYS

始终为NULL

  • DELETED_ROWS

始终为NULL

  • UPDATE_COUNT

始终为NULL

  • FREE_EXTENTS

对于InnoDB:当前数据文件中的完全可用扩展区数。

对于NDB:文件尚未使用的扩展区数。

  • TOTAL_EXTENTS

对于InnoDB:当前数据文件中使用的完整扩展区数。文件末尾的任何部分范围不计算在内。

对于NDB:分配给文件的盘区总数。

  • EXTENT_SIZE

对于InnoDB:页面大小为 4KB,8KB 或 16KB 的文件的大小为 1048576(1MB)。对于 32KB 页面大小的文件,扩展大小为 2097152 字节(2MB),对于 64KB 页面大小的文件,扩展大小为 4194304(4MB)。 FILES不报告InnoDB页面大小。页面大小由innodb_page_size系统变量定义。范围大小信息也可以从INNODB_SYS_TABLESPACEStable 中的FILES.FILE_ID = INNODB_SYS_TABLESPACES.SPACE检索。

对于NDB:文件范围的大小,以字节为单位。

  • INITIAL_SIZE

对于InnoDB:文件的初始大小(以字节为单位)。

对于NDB:文件大小(以字节为单位)。该值与用于创建文件的创建日志文件组更改日志文件组CREATE TABLESPACEALTER TABLESPACE语句的INITIAL_SIZE子句中使用的值相同。

  • MAXIMUM_SIZE

对于InnoDB:文件中允许的最大字节数。对于除 sched 义系统 table 空间数据文件之外的所有数据文件,该值为NULL。系统 table 空间文件的最大大小由innodb_data_file_path定义。临时 table 空间的最大文件大小由innodb_temp_data_file_path定义。sched 义的系统 table 空间数据文件的NULL值 table 示未明确定义文件大小限制。

对于NDB:此值始终与INITIAL_SIZE值相同。

  • AUTOEXTEND_SIZE

对于InnoDBAUTOEXTEND_SIZE是由innodb_data_file_path定义的自动扩展大小(对于系统 table 空间)或由innodb_temp_data_file_path定义的临时 table 空间。

对于NDB:始终为NULL

  • CREATION_TIME

始终为NULL

  • LAST_UPDATE_TIME

始终为NULL

  • LAST_ACCESS_TIME

始终为NULL

  • RECOVER_TIME

始终为NULL

  • TRANSACTION_COUNTER

始终为NULL

  • VERSION

对于InnoDB:始终为NULL

对于NDB:文件的版本号。

  • ROW_FORMAT

对于InnoDB:始终为NULL

对于NDBFIXEDDYNAMIC之一。

  • TABLE_ROWS

始终为NULL

  • AVG_ROW_LENGTH

始终为NULL

  • DATA_LENGTH

始终为NULL

  • MAX_DATA_LENGTH

始终为NULL

  • INDEX_LENGTH

始终为NULL

  • DATA_FREE

对于InnoDB:整个 table 空间的可用空间总量(以字节为单位)。包括系统 table 空间和临时 tabletable 空间的 sched 义系统 table 空间可能具有一个或多个数据文件。

对于NDB:始终为NULL

  • CREATE_TIME

始终为NULL

  • UPDATE_TIME

始终为NULL

  • CHECK_TIME

始终为NULL

  • CHECKSUM

始终为NULL

  • STATUS

对于InnoDB:默认情况下,此值为NORMALInnoDB每 table 文件 table 空间可能报告IMPORTING,这 table 明该 table 空间尚不可用。

对于NDB:始终为NORMAL

  • EXTRA

对于InnoDB:始终为NULL

对于NDB:此列显示数据文件或撤消日志文件属于哪个数据节点(每个数据节点都有自己的每个文件副本);对于撤消日志文件,它还显示撤消日志缓冲区的大小。假设您在具有四个数据节点的 NDB 群集上使用此语句:

CREATE LOGFILE GROUP mygroup
    ADD UNDOFILE 'new_undo.dat'
    INITIAL_SIZE 2G
    ENGINE NDB;

成功运行创建日志文件组语句后,您应该看到与针对FILEStable 的此查询类似的结果:

mysql> SELECT LOGFILE_GROUP_NAME, FILE_TYPE, EXTRA
         FROM INFORMATION_SCHEMA.FILES
         WHERE FILE_NAME = 'new_undo.dat';

+--------------------+-----------+-----------------------------------------+
| LOGFILE_GROUP_NAME | FILE_TYPE | EXTRA                                   |
+--------------------+-----------+-----------------------------------------+
| mygroup            | UNDO LOG  | CLUSTER_NODE=5;UNDO_BUFFER_SIZE=8388608 |
| mygroup            | UNDO LOG  | CLUSTER_NODE=6;UNDO_BUFFER_SIZE=8388608 |
| mygroup            | UNDO LOG  | CLUSTER_NODE=7;UNDO_BUFFER_SIZE=8388608 |
| mygroup            | UNDO LOG  | CLUSTER_NODE=8;UNDO_BUFFER_SIZE=8388608 |
+--------------------+-----------+-----------------------------------------+

Notes

  • FILES是非标准的INFORMATION_SCHEMAtable。

InnoDB Notes

以下说明适用于InnoDB数据文件。

  • FILES报告的数据从InnoDB内存中的高速缓存中报告打开的文件。相比之下,INNODB_SYS_DATAFILES报告来自InnoDB SYS_DATAFILES内部数据字典 table 的数据。

  • FILES报告的数据包括临时 table 空间数据。该数据在InnoDB SYS_DATAFILES内部数据字典 table 中不可用,因此INNODB_SYS_DATAFILES不会报告。

  • FILES报告撤消 table 空间数据。

  • 以下查询返回与InnoDBtable 空间相关的所有数据。

SELECT
  FILE_ID, FILE_NAME, FILE_TYPE, TABLESPACE_NAME, FREE_EXTENTS,
  TOTAL_EXTENTS, EXTENT_SIZE, INITIAL_SIZE, MAXIMUM_SIZE,
  AUTOEXTEND_SIZE, DATA_FREE, STATUS
FROM INFORMATION_SCHEMA.FILES WHERE ENGINE='InnoDB'\G

NDB Notes

  • FILEStable 仅提供有关磁盘数据文件的信息;您不能将其用于确定单个NDBtable 的磁盘空间分配或可用性。但是,可以使用ndb_desc来查看为每个NDBtable 在磁盘上存储了数据分配了多少空间,以及剩余多少可用于该 table 在磁盘上存储数据。

  • CREATION_TIMELAST_UPDATE_TIMELAST_ACCESSED值由 os 报告,而不由NDB存储引擎提供。如果 os 没有提供任何值,则这些列显示NULL

  • TOTAL EXTENTSFREE_EXTENTS列之间的区别是文件当前正在使用的扩展数据块数:

SELECT TOTAL_EXTENTS - FREE_EXTENTS AS extents_used
    FROM INFORMATION_SCHEMA.FILES
    WHERE FILE_NAME = 'myfile.dat';

要估算文件正在使用的磁盘空间量,请将该差异乘以EXTENT_SIZE列的值,该值将以字节为单位给出文件范围的大小:

SELECT (TOTAL_EXTENTS - FREE_EXTENTS) * EXTENT_SIZE AS bytes_used
    FROM INFORMATION_SCHEMA.FILES
    WHERE FILE_NAME = 'myfile.dat';

同样,您可以通过将FREE_EXTENTS乘以EXTENT_SIZE来估算给定文件中剩余的可用空间量:

SELECT FREE_EXTENTS * EXTENT_SIZE AS bytes_free
    FROM INFORMATION_SCHEMA.FILES
    WHERE FILE_NAME = 'myfile.dat';

Important

前面的查询产生的字节值仅是近似值,其精度与EXTENT_SIZE的值成反比。即,EXTENT_SIZE越大,近似值的精度越低。

同样重要的是要记住,一旦使用了扩展盘区,就不能再次释放它,除非删除它所属于的数据文件。这意味着从“磁盘数据”table 中删除不会释放磁盘空间。

范围大小可以在CREATE TABLESPACE语句中设置。有关更多信息,请参见第 13.1.19 节“ CREATE TABLESPACE 语句”

  • 创建日志文件组后,FILEStable 中还有一行。该行的FILE_NAME列值为NULLFILE_ID列的值为0FILE_TYPE列的值始终为UNDO LOG,而STATUS列的值始终为NORMAL。该行的ENGINE列的值始终为ndbcluster

此行的FREE_EXTENTS列显示了可用于属于给定日志文件组的所有撤消文件的可用扩展区总数,其名称和编号分别显示在LOGFILE_GROUP_NAMELOGFILE_GROUP_NUMBER列中。

假设您的 NDB 群集上没有现有的日志文件组,并使用以下语句创建一个:

mysql> CREATE LOGFILE GROUP lg1
         ADD UNDOFILE 'undofile.dat'
         INITIAL_SIZE = 16M
         UNDO_BUFFER_SIZE = 1M
         ENGINE = NDB;

现在,您查询FILEStable 时可以看到此NULL行:

mysql> SELECT DISTINCT
         FILE_NAME AS File,
         FREE_EXTENTS AS Free,
         TOTAL_EXTENTS AS Total,
         EXTENT_SIZE AS Size,
         INITIAL_SIZE AS Initial
         FROM INFORMATION_SCHEMA.FILES;
+--------------+---------+---------+------+----------+
| File         | Free    | Total   | Size | Initial  |
+--------------+---------+---------+------+----------+
| undofile.dat |    NULL | 4194304 |    4 | 16777216 |
| NULL         | 4184068 |    NULL |    4 |     NULL |
+--------------+---------+---------+------+----------+

由于维护撤消文件所需的开销,可用于撤消日志记录的可用扩展区总数总是略小于日志文件组中所有撤消文件的TOTAL_EXTENTS列值的总和。通过向日志文件组添加第二个撤消文件,然后对FILEStable 重复上一个查询,可以看出这一点:

mysql> ALTER LOGFILE GROUP lg1
         ADD UNDOFILE 'undofile02.dat'
         INITIAL_SIZE = 4M
         ENGINE = NDB;

mysql> SELECT DISTINCT
         FILE_NAME AS File,
         FREE_EXTENTS AS Free,
         TOTAL_EXTENTS AS Total,
         EXTENT_SIZE AS Size,
         INITIAL_SIZE AS Initial
         FROM INFORMATION_SCHEMA.FILES;
+----------------+---------+---------+------+----------+
| File           | Free    | Total   | Size | Initial  |
+----------------+---------+---------+------+----------+
| undofile.dat   |    NULL | 4194304 |    4 | 16777216 |
| undofile02.dat |    NULL | 1048576 |    4 |  4194304 |
| NULL           | 5223944 |    NULL |    4 |     NULL |
+----------------+---------+---------+------+----------+

可用磁盘空间 table 使用此日志文件组进行撤销日志记录的可用空间(以字节为单位)可以通过将可用扩展盘区数乘以初始大小来估算:

mysql> SELECT
         FREE_EXTENTS AS 'Free Extents',
         FREE_EXTENTS * EXTENT_SIZE AS 'Free Bytes'
         FROM INFORMATION_SCHEMA.FILES
         WHERE LOGFILE_GROUP_NAME = 'lg1'
         AND FILE_NAME IS NULL;
+--------------+------------+
| Free Extents | Free Bytes |
+--------------+------------+
|      5223944 |   20895776 |
+--------------+------------+

如果创建 NDB 群集磁盘数据 table,然后在其中插入一些行,则可以看到大约剩余的空间可用于以后的撤消日志记录,例如:

mysql> CREATE TABLESPACE ts1
         ADD DATAFILE 'data1.dat'
         USE LOGFILE GROUP lg1
         INITIAL_SIZE 512M
         ENGINE = NDB;

mysql> CREATE TABLE dd (
         c1 INT NOT NULL PRIMARY KEY,
         c2 INT,
         c3 DATE
         )
         TABLESPACE ts1 STORAGE DISK
         ENGINE = NDB;

mysql> INSERT INTO dd VALUES
         (NULL, 1234567890, '2007-02-02'),
         (NULL, 1126789005, '2007-02-03'),
         (NULL, 1357924680, '2007-02-04'),
         (NULL, 1642097531, '2007-02-05');

mysql> SELECT
         FREE_EXTENTS AS 'Free Extents',
         FREE_EXTENTS * EXTENT_SIZE AS 'Free Bytes'
         FROM INFORMATION_SCHEMA.FILES
         WHERE LOGFILE_GROUP_NAME = 'lg1'
         AND FILE_NAME IS NULL;
+--------------+------------+
| Free Extents | Free Bytes |
+--------------+------------+
|      5207565 |   20830260 |
+--------------+------------+
  • FILEStable 中对于任何 NDB 群集 table 空间都有一个额外的行,无论是否有任何数据文件与该 table 空间相关联。该行的FILE_NAME列值为NULL,而FILE_ID列的值始终为0FILE_TYPE列中显示的值始终为TABLESPACE,而STATUS列中的值始终为NORMAL。该行的ENGINE列的值始终为ndbcluster

  • 有关其他信息,以及创建和删除 NDB 群集磁盘数据对象的示例,请参见第 21.5.10 节“ NDB 群集磁盘数据 table”

  • 从 MySQL 5.7.31 开始,您必须具有PROCESS特权才能查询此 table。