我需要回收一些磁盘空间,因此我从服务器中删除了一个旧的 Magento 数据库。该数据库大小约为 16 GB。令我惊讶的是,删除数据库后,并没有真正释放磁盘空间。
我尝试重新启动 MySQL 服务器,但它仍然占用该空间。
如果这很重要的话,Magento 数据库会大量使用 innoDB。
我能做些什么来恢复这个磁盘空间吗?
答案1
我在 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
[mysqld]
innodb_file_per_table
innodb_flush_method=O_DIRECT
innodb_log_file_size=1G
innodb_buffer_pool_size=4G
旁注:无论您设置了 innodb_buffer_pool_size,请确保innodb_log_file_size是 innodb_buffer_pool_size 的 25%。
5)删除 ibdata1、ib_logfile0 和 ib_logfile1
此时,/var/lib/mysql 中应该只有 mysql 模式
6)重启mysql
这将重新创建 10MB 的 ibdata1、1G 的 ib_logfile0 和 ib_logfile1
7)将SQLData.sql重新加载到mysql中
ibdata1 将增长但仅包含表元数据
每个 InnoDB 表都将存在于 ibdata1 之外
假设你有一个名为 mydb.mytable 的 InnoDB 表。如果你进入 /var/lib/mysql/mydb,你会看到两个代表该表的文件
- mytable.frm(存储引擎头)
- mytable.ibd(mydb.mytable 的表数据和表索引的主页)
ibdata1 将不再包含 InnoDB 数据和索引。
使用 /etc/my.cnf 中的 innodb_file_per_table 选项,您可以运行 OPTIMIZE TABLE mydb.mytable,并且文件 /var/lib/mysql/mydb/mytable.ibd 实际上会缩小。
在我担任 MySQL DBA 的职业生涯中,我曾多次这样做
事实上,我第一次这样做时,将 50GB 的 ibdata1 文件压缩成了 500MB。
试试吧。如果您对此有进一步的问题,请给我发电子邮件。相信我。这在短期和长期都会有效。!!!
答案2
目前,回收已删除的 InnoDB 数据库使用的空间的唯一方法是转储所有数据库、停止 MySQL、删除底层存储文件、重新启动 MySQL,最后导入数据库转储。
MySQL 文档有更多信息对这个。