确定 MySQL InnoDB 表是否在其自己的文件中,而不是在系统表空间中的最佳方法

Dav*_* I. 5 mysql innodb mysqldump

我有一个 MySQL 开发服务器,它在某些数据库中使用 InnoDB 表。它最初是使用默认值设置的,因此所有数据都进入系统表空间(例如主表空间)ibdata1文件)。一路上,我启用了innodb_file_per_table以便新的数据库表进入它们自己的文件。

我现在想通过删除一些开发数据库来回收磁盘空间。我知道我必须 mysqldump 并重新导入系统表空间中的那些数据库。确定重点关注哪些的最佳方法是什么?

我没有看到任何明显的东西 information_schema数据库中。我可以使用 SSH shell 手动浏览服务器,但我正在寻找一种更自动化或更优雅的方式来做到这一点。

在一些较旧的数据库中,我只看到.frm数据库目录中的文件,在较新的数据库中我看到.frm.ibd文件。这似乎是知道数据在哪里的关键......

健全性检查:是否可以通过 mysqldump 一半的数据库来回收空间,或者你真的必须对每个数据库都做?该服务器中有 54 个使用 InnoDB 表的数据库。

注意:在 UNIX 上使用 MySQL v5.1。

Rol*_*DBA 2

不幸的是,是的,你必须做每个数据库。我于2010 年 10 月 29 日在 StackOverflow 上写下了一个分步流程,并详细解释了为什么您无能为力。

你还问了

是否有可能 mysqldump 一半的数据库来回收空间,或者您真的必须对每个数据库都进行操作吗?

你无法收回一半。这是一个全有或全无的决定。当innodb_file_per_table被禁用时,最好记住 ibdata1 中的内容:

不过,如果您想知道哪些 InnoDB 表位于 ibdata1 中以及哪些位于它们自己的表空间文件 ( .ibd) 中,请执行以下操作:

步骤 01:在 MySQL 客户端中运行此查询

SELECT COUNT(1) InnoDBTableCount
FROM information_schema.tables
WHERE engine='InnoDB';
Run Code Online (Sandbox Code Playgroud)

步骤02.ibd :收集操作系统中的文件数量

ls -lR | grep -c ".ibd$"
Run Code Online (Sandbox Code Playgroud)

步骤 03:减去操作系统中的这些值

这是计算这些东西的 shell 脚本

cd /var/lib/mysql
SQLSTMT="SELECT COUNT(1) FROM information_schema.tables WHERE engine='InnoDB'"
IB_TOT=`mysql -uroot -p... -ANe"${SQLSTMT}"`
IB_IBD=`ls -lR | grep -c ".ibd$"`
(( IB_SYS = IB_TOT - IB_IBD ))
echo ${IB_SYS}
Run Code Online (Sandbox Code Playgroud)

如果您有分区表,请执行以下操作:

cd /var/lib/mysql
SQLSTMT="SELECT COUNT(1) FROM information_schema.partitions WHERE engine='InnoDB'"
IB_TOT=`mysql -uroot -p... -ANe"${SQLSTMT}"`
IB_IBD=`ls -lR | grep -c ".ibd$"`
(( IB_SYS = IB_TOT - IB_IBD ))
echo ${IB_SYS}
Run Code Online (Sandbox Code Playgroud)

这是你得到的:

  • IB_TOT:MySQL实例中InnoDB表的数量
  • IB_IBDibdata1:作为.ibd文件驻留在外部的 InnoDB 表的数量
  • IB_SYS:驻留在内部的 InnoDB 表的数量ibdata1