在MYSQL 5.5中,有没有一种方法可以检查每个表是否设置了innodb_file_per_table?

22
我想要检查在使用MYSQL-5.5查询时是否设置了innodb_file_per_table(即创建了.ibd)用于每个数据库表。

有什么方法可以做到吗?

2个回答

64
mysql> show variables like 'innodb_file_per_table';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_file_per_table | ON    |
+-----------------------+-------+
1 row in set (0.00 sec)

8
这句话的意思是告诉你这个设置是否已启用。在启用 file_per_table 之前创建的任何表都将位于全局表空间中,而那些在启用后创建的表则会有自己的文件。根据问题描述,他们想知道哪些表确实拥有自己的文件(它们是在启用 file_per_table 后创建的)。 - antriver

23
SELECT NAME, SPACE FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES;

SPACE对于全局表空间(ibdata1)将为0,而对于每个表的文件表空间则是一个更大的数字。

请参见http://dev.mysql.com/doc/refman/5.6/en/innodb-sys-tables-table.html


由于您使用的是MySQL 5.5版本,上述解决方案将不起作用。在MySQL 5.5中,您可以使用以下内容:

SELECT DISTINCT TABLE_NAME, SPACE FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGE_LRU
WHERE TABLE_NAME IS NOT NULL AND TABLE_NAME NOT LIKE 'SYS%';

全局表空间的SPACE为0,每个表的文件则使用更大的整数。

需要注意的是,查询结果仅涉及在缓冲池中有页面的表。如果您没有查询某个表,则它在缓冲池LRU中没有任何页面,并且该查询不会报告该表的任何结果。

另一种解决方案是在数据目录中使用ls命令。 :-)


1
出现错误 ERROR 1109 (42S02): Unknown table 'INNODB_SYS_TABLES' in information_schema - Deepak Ingole
它在MySQL 5.6和Percona Server 5.1中被引入。 - Bill Karwin
嘿,我想在MySQL 5.5中找到解决方案。 - Deepak Ingole
1
在MySQL 8中,它是 SELECT NAME, SPACE FROM INFORMATION_SCHEMA.INNODB_TABLES; - Vovkin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接