MySQL InnoDB 删除资料后释放硬盘空间


MySQL 使用 InnoDB 时,当资料表用 DELETE FROM 删除资料后,硬盘空间并不会立即释放,因为 MySQL 只对已删除的资料标记为删除,并没有真正删除资料,这会导致 InnoDB 的档案不断扩大。只有在 DROP TABLE 及 TRUNCATE TABLE 时才会释放空间。

如果没有开启 innodb_file_per_table,所有 InnoDB 的资料都会储存在 ibdata 档案内,对于数据库的体积很大的 MySQL Server,要释放硬盘空间会很痛苦,因为只有将 MySQL 数据库导出,再重新将备份还原才可以释放空间。如果 innodb_file_per_table 有开启,每个 InnoDB 资料表都会有独立的档案,可以较简单地释放硬盘空间, 以下是 innodb_file_per_table 开启及关闭的释放空间方法。

innodb_file_per_table 开启

首先是较简单的情况, 在 innodb_file_per_table 开启时, 当用 DELETE 删除资料后, 可以用以下方法释放硬盘空间。

1. OPTIMIZE TABLE

只要执行 OPTIMIZE TABLE 指令, 将资料表最佳化, 便可以释放硬盘空间, 例如资料表名称是 table_name:

2. ALTER TABLE

另一个方法是用 ALTER TABLE 指令:

innodb_file_per_table 关闭

如果 innodb_file_per_table 是关闭,要释放经由 DELETE 删除的资料的空间,需要把数据库导出,删除 innodb 数据库,然后再汇入, 以下是操作步骤, 但请务必关闭 MySQL Server 后, 将数据库目录先备份, 即使有问题要还原也较快。

1. 使用 mysqldump 指令将 innodb 数据库导出:

2. 删除所有数据库, 但要留下 “mysql” 及 “information_schema” 两个数据库不要删除.

3. 关闭 MySQL 服务器:

# systemctl stop mysql

4. 删除 ibdata 档案及日志:

# rm /var/lib/mysql/ibdata1
# rm /var/lib/mysql/ib_logfile*

5. 为了避避免日后易于维护, 开启 innodb_file_per_table, 开启档案 /etc/my.cnf:

# vi /etc/my.cnf

在 [mysqld] 段落加入以下一行:

innodb_file_per_table=1

6. 启动 MySQL Server:

# systemctl start mysql

7. 汇入数据库备份:

Leave a Reply