MySQL判别InnoDB表是独立表空间还是共享表空间的方法详解

  

  

InnoDB采用按表空间(表空间)的方式进行存储数据,默认配置情况下会有一个初始大小为10 mb,名字为ibdata1的文件,该文件就是默认的表空间文件(tablespce文件),用户可以通过参数innodb_data_file_path对其进行设置,可以有多个数据文件,如果没有设置innodb_file_per_table的话,那些InnoDB存储类型的表的数据都放在这个共享表空间中,而系统变量innodb_file_per_table=1的话,那么InnoDB存储引擎类型的表就会产生一个独立表空间,独立表空间的命名规则为:表名.idb。这些单独的表空间文件仅存储该表的数据,索引和插入缓冲位图等信息,其它信息还是存放在共享表空间中,那么如何判别数据库中哪些表是独立表空间,哪些表是共享表空间呢?

  

<强> InnoDB逻辑存储结构
  

  

 MySQL判别InnoDB表是独立表空间还是共享表空间的方法详解

  

  

如果表的存储引擎是InnoDB,而且表空间(表空间)是共享表空间的话,那么数据库对应目录下面是没有“表名.ibd”文件的。独立表空间的表的话,则有“表名.ibd”文件。只是这个方法很笨,对于生产环境,大量的表通过这种方式判别,确实不是一个好方法。

        mysql>显示变量如“innodb_file_per_table”;   + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +   | | Variable_name |值   + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +   | innodb_file_per_table |>   mysql>显示变量如“innodb_file_per_table”;   + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +   | | Variable_name |值   + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +   | innodb_file_per_table | |   + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +   1行集(0.00秒)      mysql>使用MyDB;   完成阅读表信息表和列的名称   你可以关掉这个功能——更快的启动      数据库修改   mysql>创建表common_tablespace(名字varchar (64));   查询好,0行影响(0.02秒)      mysql>退出   再见   [root@DB-Server MyDB] # ls轻轨车common_tablespace *   -rw-rw mysql mysql——8560 8月21日22:08 common_tablespace.frm   [root@DB-Server MyDB] #      

  

<强> MySQL 5.6

  

5.6 INFORMATION_SCHEMA MySQL。INNODB_SYS_TABLESPACES关于这个系统表提供了有关表格的格式和存储特性,包括行格式,压缩页面大小位级别的信息(如适用),INNODB的表空间信息。

  
  

INNODB_SYS_TABLESPACES表提供了关于InnoDB表空间元数据,相当于在InnoDB SYS_TABLESPACES表中的信息数据字典。

     

花了点时间了解了一下INFORMATION_SCHEMA数据库下面的INNODB_SYS_TABLESPACES这个表,遂写了一个SQL来判断那些InnoDB引擎表是独立表空还是共享表空间

  

共享表空间:

        选择TABLE_SCHEMA   ,TABLE_NAME   ,TABLE_TYPE   N”共享表空间的TABLE_SPACE   、发动机   ,版本   ,TABLE_ROWS   ,AVG_ROW_LENGTH   ,CREATE_TIME   ,UPDATE_TIME   从INFORMATION_SCHEMA。表T   加入INFORMATION_SCHEMA离开了。INNODB_SYS_TABLESPACES我alt=" MySQL判别InnoDB表是独立表空间还是共享表空间的方法详解">

  

不过这个脚本有个小小的错误,对于包含特殊字符的表名,有可能出现错误情况,这个是因为如果表名包含特殊字符,那么文件名或INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES中的名字做了转义处理,如下所示

  

 MySQL判别InnoDB表是独立表空间还是共享表空间的方法详解

  

独立表空间

        选择TABLE_SCHEMA   ,TABLE_NAME   ,TABLE_TYPE   N的独立表空间的TABLE_SPACE   、发动机   ,版本   ,TABLE_ROWS   ,AVG_ROW_LENGTH   ,CREATE_TIME   ,UPDATE_TIME   从INFORMATION_SCHEMA。表T   内连接INFORMATION_SCHEMA。INNODB_SYS_TABLESPACES我alt=" MySQL判别InnoDB表是独立表空间还是共享表空间的方法详解">

  

  

<强> MySQL 5.7

  

如果是MySQL 5.7的话,比MySQL 5.6有多了一种方法,MySQL 5.7的INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES中多了SPACE_TYPE字段,不过其值全部为单身,而INFORMATION_SCHEMA。INNODB_SYS_TABLES中也多了字段SPACE_TYPE,其值有单与系统分别表示单独表空间和共享表空间。

MySQL判别InnoDB表是独立表空间还是共享表空间的方法详解