我们的 ibdata1 数据库文件已经增长到几十 GB,其中大部分 SQL 数据肯定是 Magento 中的日志表,占用了数据库 90% 的空间。
清空并清理这些表之后,ibdata1 文件仍然在服务器上使用相同数量的磁盘使用量,并且据我了解,这将永远不会被“释放”到操作系统。
这是正确的吗? 难道没有任何标准且简单的方法来“优化” MySQL 数据库中的表,以便操作系统看到 ibdata1 文件的“更新”版本,从而减少物理磁盘使用量?
PS:根据我的理解,当优化表时,MySQL 将尝试重新使用先前由日志数据等使用的空间。
答案1
你基本上要做的是
- 使用创建完整数据库转储
mysqldump
,启用innodb_file_per_table
选项 - 清除 mysql 数据目录中的数据(或使用新的 ibdata 文件集关闭另一个 mysql 实例)
- 并重新导入数据库转储。
这将导致停机时间,具体停机时间取决于转储/恢复操作的持续时间(以及数据库大小)以及您在 MySQL 数据库处理方面的灵活性。
看一眼DBA.SE 上有这个问题获得更详细的解释,或者这篇博文进行完整的演练,以最大限度地减少操作期间的停机时间。
答案2
这也许不能直接回答您的问题。但是,如果您在创建表之前使用了服务器设置 innodb_file_per_table,则将使用单独的文件来存储表的数据,运行优化后将释放磁盘空间。
答案3
是否值得创建一个 cron 作业来定期清除日志表?以及 index_event 表。
您还可以从管理区域设置定期清除的日志:
系统 > 配置 > 高级 > 系统 > 日志清理
您可以配置您的商店以自动清理这些日志。
将“保存日志,天数”设置为 2 或 3 天。并启用日志清理。希望这有帮助?
答案4
如果我理解正确,您希望在清理 ibdata1 文件后释放磁盘空间。重新启动 MySql 以恢复空间。如果 Linux 中的某个进程打开了一个文件,则您将无法在不重新启动该进程的情况下恢复磁盘空间。在 *nix 中,文件是引用计数的,只要有引用(即打开的 fd),即使没有指向 inode 的链接,它仍会存在。
我希望这有帮助。