忘记密码   免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
12下一页
最近访问板块 发新帖
查看: 14700 | 回复: 13

查看innodb表碎片及清理 [复制链接]

论坛徽章:
1
处女座
日期:2014-01-14 13:59:48
发表于 2012-03-08 09:28 |显示全部楼层
现在我有一台mysql数据库,请高手指教如何查看innodb表的碎片以及如何清理,谢谢

论坛徽章:
0
发表于 2012-03-08 10:45 |显示全部楼层
据我所知,貌似innodb使用表空间,即使有碎片也看查不出来。
只能定期的optimize table来清理碎片。

论坛徽章:
1
处女座
日期:2014-01-14 13:59:48
发表于 2012-03-08 10:48 |显示全部楼层
optimize table这个语句是不是只能对myisam表有用??

论坛徽章:
0
发表于 2012-03-08 11:04 |显示全部楼层
对innodb也有用,系统会自动把它转成 alter table 的形式。

论坛徽章:
4
CU大牛徽章
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-03-13 15:38:15CU大牛徽章
日期:2013-03-13 15:38:52戌狗
日期:2013-12-27 15:08:11
发表于 2012-03-08 11:24 |显示全部楼层
定期检查mysql中 `information_schema`.`TABLES`字段,查看 DATA_FREE 字段,大于0话,就表示有碎片

ALTER TABLE table_name ENGINE = Innodb;

论坛徽章:
1
处女座
日期:2014-01-14 13:59:48
发表于 2012-03-08 14:16 |显示全部楼层
查了下`information_schema`.`TABLES`字段,查看 DATA_FREE 字段,绝大多数表的此字段的值都为635093123072,难道碎片有这么大??请高手指导

论坛徽章:
0
发表于 2012-03-08 15:12 |显示全部楼层
回复 6# mlxahcf


    这个查询结果,和show table status from your database\G;
从你的来看,这些表是用的innodb,而且是共享表空间的,这么大的空间,其中有一部分是undo 空间,
是可用的,只是mysql不会回收。

innodb的alter table engine=innodb,虽然是空操作,记得是lock表,而且是重新建表的。
所以生产系统的,大表空间的,操作要慎重
在主从架构中,此操作也会被复制到Slave上,影响slave的

可以在执行时SET SQL_LOG_BIN=0,记此操作不被记录到binlog中

2, innodb的独立表空间,此操作比较方便,可以对比.ibd文件
3,mysiam就是上面所说的操作,show table status中的data free字段能正常反应出来碎片情况。  

论坛徽章:
0
发表于 2012-03-08 15:28 |显示全部楼层
没办法回收,所以mysql都要使用独立表空间,但这个不是缺省值,要命的!!

论坛徽章:
0
发表于 2012-03-08 17:10 |显示全部楼层
回复 8# kerlion


    有相关经验吗? 可以分享呢!!
上次在项目中,我提过这种方案,但是担心崩溃,所以一直没有搞

论坛徽章:
0
发表于 2012-03-09 11:02 |显示全部楼层
在我们的项目中,生产环境一律采用独立的表空间,对于小表的话直接用ALTER TABLE table_name ENGINE = Innodb;回收表空间,对于大表就不能直接采用这种方式,因为会造成长时间的所表。可以采用新建表转移数据,然后删除旧表的形式
您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:wangnan@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP