mysql innodb 删除_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:
mysql> OPTIMIZE TABLE table_name;
1
mysql>OPTIMIZETABLEtable_name;
2. ALTER TABLE
另一个方法是用 ALTER TABLE 指令:
ALTER TABLE table_name ENGINE = InnoDB;
1
ALTERTABLEtable_nameENGINE=InnoDB;
innodb_file_per_table 关闭
如果 innodb_file_per_table 是关闭,要释放经由 DELETE 删除的资料的空间,需要把数据库导出,删除 innodb 数据库,然后再汇入, 以下是操作步骤, 但请务必关闭 MySQL Server 后, 将数据库目录先备份, 即使有问题要还原也较快。
1. 使用 mysqldump 指令将 innodb 数据库导出:
# mysqldump -u root -p --all-databases > alldb.sql
1
# mysqldump -u root -p --all-databases > alldb.sql
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. 汇入数据库备份:
# mysql -u root -p < alldb.sql
1
# mysql -u root -p < alldb.sql
你可能感兴趣的内容: