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_id
或fil_space_t::id
。
对于NDB
:文件标识符。 FILE_ID
列值是自动生成的。
FILE_NAME
对于InnoDB
:数据文件的名称。每 table 文件和常规 table 空间的文件 extensions 为.ibd
。撤消 table 空间以undo
为前缀。系统 table 空间的前缀为ibdata
。临时 table 空间以ibtmp
为前缀。文件名包括文件路径,该文件路径可能相对于 MySQL 数据目录(datadir系统变量的值)。
对于NDB
:由创建日志文件组或更改日志文件组创建的UNDO
日志文件的名称,或由CREATE TABLESPACE或ALTER TABLESPACE创建的数据文件的名称。
FILE_TYPE
对于InnoDB
:table 空间文件类型。 InnoDB
个文件有三种可能的文件类型。 TABLESPACE
是保存 table,索引或其他形式的用户数据的任何系统,常规或每 table 文件 table 空间文件的文件类型。 TEMPORARY
是临时 table 空间的文件类型。 UNDO LOG
是用于存储撤消记录的撤消 table 空间的文件类型。
对于NDB
:值UNDO LOG
,DATAFILE
或TABLESPACE
之一。
TABLESPACE_NAME
对于InnoDB
:table 空间的 SQL 名称。一般的 table 空间名称是SYS_TABLESPACES.NAME
值。对于其他 table 空间文件,名称以innodb_
开头,例如innodb_system
,innodb_undo
和innodb_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.logspaces和ndbinfo.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 TABLESPACE或ALTER 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
对于InnoDB
:AUTOEXTEND_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
。
对于NDB
:FIXED
或DYNAMIC
之一。
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
:默认情况下,此值为NORMAL
。 InnoDB
每 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_SCHEMA
table。
InnoDB Notes
以下说明适用于InnoDB
数据文件。
-
FILES报告的数据从
InnoDB
内存中的高速缓存中报告打开的文件。相比之下,INNODB_SYS_DATAFILES报告来自InnoDB
SYS_DATAFILES
内部数据字典 table 的数据。 -
FILES报告的数据包括临时 table 空间数据。该数据在
InnoDB
SYS_DATAFILES
内部数据字典 table 中不可用,因此INNODB_SYS_DATAFILES不会报告。 -
FILES报告撤消 table 空间数据。
-
以下查询返回与
InnoDB
table 空间相关的所有数据。
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
-
FILES
table 仅提供有关磁盘数据文件的信息;您不能将其用于确定单个NDB
table 的磁盘空间分配或可用性。但是,可以使用ndb_desc来查看为每个NDBtable 在磁盘上存储了数据分配了多少空间,以及剩余多少可用于该 table 在磁盘上存储数据。 -
CREATION_TIME
,LAST_UPDATE_TIME
和LAST_ACCESSED
值由 os 报告,而不由NDB存储引擎提供。如果 os 没有提供任何值,则这些列显示NULL
。 -
TOTAL EXTENTS
和FREE_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
列值为NULL
,FILE_ID
列的值为0
;FILE_TYPE
列的值始终为UNDO LOG
,而STATUS
列的值始终为NORMAL
。该行的ENGINE
列的值始终为ndbcluster
。
此行的FREE_EXTENTS
列显示了可用于属于给定日志文件组的所有撤消文件的可用扩展区总数,其名称和编号分别显示在LOGFILE_GROUP_NAME
和LOGFILE_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
列的值始终为0
。FILE_TYPE
列中显示的值始终为TABLESPACE
,而STATUS
列中的值始终为NORMAL
。该行的ENGINE
列的值始终为ndbcluster
。 -
有关其他信息,以及创建和删除 NDB 群集磁盘数据对象的示例,请参见第 21.5.10 节“ NDB 群集磁盘数据 table”。
-
从 MySQL 5.7.31 开始,您必须具有PROCESS特权才能查询此 table。