我需要回收一些磁盘空间,所以我从我的服务器上删除了一个旧的 Magento 数据库。数据库大小约为 16 GB。令我惊讶的是,一旦数据库被删除,它并没有真正释放磁盘空间。
我尝试重新启动 MySQL 服务器,但它仍在占用该空间。
如果重要的话,Magento 数据库会大量使用 innoDB。
我能做些什么来恢复这个磁盘空间吗?
我需要回收一些磁盘空间,所以我从我的服务器上删除了一个旧的 Magento 数据库。数据库大小约为 16 GB。令我惊讶的是,一旦数据库被删除,它并没有真正释放磁盘空间。
我尝试重新启动 MySQL 服务器,但它仍在占用该空间。
如果重要的话,Magento 数据库会大量使用 innoDB。
我能做些什么来恢复这个磁盘空间吗?
我在 StackOverflow 中为 InnoDB 写了一个 CleanUp 程序
https://stackoverflow.com/a/4056261/491757(2010年 10 月 29 日)
这里是
要一劳永逸地缩小 ibdata1,您必须执行以下操作:
1) MySQLDump所有数据库到一个SQL文本文件中(称之为SQLData.sql)
2)删除所有数据库(mysql模式除外)
3)关闭mysql
4)将以下行添加到/etc/my.cnf
旁注:无论您为 innodb_buffer_pool_size 设置什么,请确保innodb_log_file_size是 innodb_buffer_pool_size 的 25%。
5)删除ibdata1、ib_logfile0和ib_logfile1
此时,/var/lib/mysql 中应该只有mysql schema
6)重启mysql
这将以 10MB 的大小重新创建 ibdata1,以 1G 的大小重新创建 ib_logfile0 和 ib_logfile1
7) 重新加载 SQLData.sql 到 mysql
ibdata1 会增长但只包含表元数据
每个 InnoDB 表都将存在于 ibdata1 之外
假设您有一个名为 mydb.mytable 的 InnoDB 表。如果你进入 /var/lib/mysql/mydb,你会看到两个代表表的文件
ibdata1 将不再包含 InnoDB 数据和索引。
使用 /etc/my.cnf 中的 innodb_file_per_table 选项,您可以运行 OPTIMIZE TABLE mydb.mytable 文件 /var/lib/mysql/mydb/mytable.ibd 实际上会缩小。
在我作为 MySQL DBA 的职业生涯中,我已经做过很多次了
事实上,我第一次这样做时,将一个 50GB 的 ibdata1 文件压缩为 500MB。
试试看。如果您对此有进一步的疑问,请给我发电子邮件。相信我。这将在短期和长期内发挥作用。!!!
目前,回收已删除的 InnoDB 数据库所用空间的唯一方法是转储所有数据库,停止 MySQL,删除底层存储文件,重新启动 MySQL,最后导入数据库转储。
MySQL 文档有关于此的更多信息。