我刚刚将我的 Wordpress 数据库切换为使用 InnoDB 引擎。
使用 MyISAM 时,我曾经运行Optimize和Repair table. 但是,对于 InnoDB,这些不起作用。
我手动运行OPTIMIZE TABLE并建议ALTER TABLE但没有一个删除开销。我在mysqltuner显示 14 个碎片表的服务器上运行- 我总共有 14 个表。即使在运行optimizeand 之后alter tables,所有 14 个表仍然碎片化!
我怎样才能正确地OPTIMIZE和REPAIRInnoDB 表?
哎哟你已经关闭了 innodb_file_per_table
我之前写过这方面的文章。您必须转换 InnoDB 基础架构。
Oct 29, 2010:我在 StackOverflow 中的原始帖子Apr 01, 2012:innodb_file_per_table 是否可取?Mar 25, 2012:为什么InnoDB将所有数据库存储在一个文件中?Feb 03, 2012:MySQL InnoDB中表的定时优化Nov 26, 2011:文件第 6308 行出现错误 1114 (HY000) & 表 user_analysis 已满一旦你这样做了,任何时候你对 InnoDB 进行 OPTIMIZE TABLE 操作,它实际上都会收缩。
如果不执行 InnoDB 基础设施清理,ibdata1 文件的大小实际上会增加。更糟糕的是,我认为 mysqltuner.pl 使用了一种奇怪的算法来确定 InnoDB 碎片。我倾向于忽略它。
我以不同的方式检查碎片。
早在 2012 年 4 月 19 日,我就回答了一个类似的问题:How do youremovefragmentation from InnoDBtables? 。
这是我在之前的帖子中所说的:
运行上述步骤后,如何确定哪些表需要进行碎片整理?可以找到,但你需要编写脚本。
这是一个示例:假设您有表
mydb.mytable. 启用 innodb_file_per_table 后,您将拥有文件 /var/lib/mysql/mydb/mytable.ibd您将必须检索两个号码
操作系统中的文件大小:您可以像这样从操作系统中确定文件大小
Run Code Online (Sandbox Code Playgroud)ls -l /var/lib/mysql/mydb/mytable.ibd | awk '{print $5}'FILESIZE FROM INFORMATION_SCHEMA :您可以从 information_schema.tables 确定文件大小,如下所示:
Run Code Online (Sandbox Code Playgroud)SELECT (data_length+index_length) tblsize FROM information_schema.tables WHERE table_schema='mydb' AND table_name='mytable';只需从操作系统值中减去 INFORMATION_SCHEMA 值,然后将差值除以 INFORMATION_SCHEMA 值即可。
从那里您可以决定有多少百分比认为有必要对该表进行碎片整理。换句话说,如果.ibd文件的文件大小与 INFORMATION_SCHEMA.TABLES 中的数字之间存在很大差异,请继续使用OPTIMIZE TABLE. 无论文件大小如何,如果碎片小于 1%,请不要担心。
| 归档时间: |
|
| 查看次数: |
10377 次 |
| 最近记录: |