我用的是无公害。我对应用程序的性能有问题。当我运行mysqlturner.pl时,我得到:
- InnoDB表中的数据: 8G (表:1890年)!分散表格共计:1890年
好的,我已经运行mysqlcheck -p --优化db。我已经声明innodb_file_per_table是禁用的。在过去的两年里,数据库没有被重新编入索引。我怎么能做到呢?
一切都会好吗?
发布于 2015-11-27 21:48:46
表分段
假的。
所有InnoDB表总是(根据该工具)是分段的。
实际上,每1000个表中只有一个需要去碎片化。
OPTIMIZE TABLE foo;将分解单个表。但是,我再说一遍,我说“不用麻烦”。
ibdata1臃肿
另一方面..。如果您担心ibdata1和Data_free的大小(SHOW TABLE STATUS)显示出很大一部分ibdata1是“免费的”,那么唯一的解决方法是痛苦的:如前所述:转储、停止、删除ibdata1、重新启动、重新加载。
但是..。如果您没有足够的磁盘空间来转储所有的东西,那么您将陷入深深的困境。
你有8GB的桌子吗?(Sum Data_length和Index_length跨所有InnoDB表)。如果ibdata1是,比如说10‘t,就不用费心了。如果它是100 If,那么您就有大量的浪费空间。但是如果你没有耗尽磁盘空间,我再说一遍“不用麻烦”。
如果您正在耗尽磁盘空间,而ibdata1似乎有很多“空闲”,那么请执行转储等操作。但是另外:如果您有1890年的表,那么大多数表可能都是“很小”的。也许几个有点大?也许某些表的大小波动很大(例如,增加一百万行,然后删除其中的大部分)?我建议在创建大表或浮动表时启用innodb_file_per_table;
在ibdata1中,小桌子占用的空间更少;如果需要的话,可以通过OPTIMIZE清理大/浮动的表。
发布于 2015-11-25 22:18:53
是的,那样就行了。在启动之前进行备份,并首先在主机副本上测试整个进程(尤指p)。精确的mysqldump命令,您不希望转储中有'information_schema‘这样的数据库。
还要确保一旦启动导出,其他服务就不能连接到您的db --它们更改的任何数据都将在导入过程中丢失。
在前面的问题中有详细的说明:Howto: Clean a mysql InnoDB storage engine?
https://stackoverflow.com/questions/33927077
复制相似问题