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。
不幸的是,是的,你必须做每个数据库。我于2010 年 10 月 29 日在 StackOverflow 上写下了一个分步流程,并详细解释了为什么您无能为力。
你还问了
是否有可能 mysqldump 一半的数据库来回收空间,或者您真的必须对每个数据库都进行操作吗?
你无法收回一半。这是一个全有或全无的决定。当innodb_file_per_table被禁用时,最好记住 ibdata1 中的内容:
Pictorial Representation of 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_IBD
ibdata1
:作为.ibd
文件驻留在外部的 InnoDB 表的数量IB_SYS
:驻留在内部的 InnoDB 表的数量ibdata1
归档时间: |
|
查看次数: |
3474 次 |
最近记录: |