我的MySQL数据库的ibdata1文件随着时间的推移增长到了约32GB。最近,我从我的数据库中删除了约10GB的数据(并为了保险起见重新启动了mysql),但是该文件不会缩小。有没有办法减小这个文件的大小?
我的MySQL数据库的ibdata1文件随着时间的推移增长到了约32GB。最近,我从我的数据库中删除了约10GB的数据(并为了保险起见重新启动了mysql),但是该文件不会缩小。有没有办法减小这个文件的大小?
InnoDB表空间的文件大小不会自动缩小,无论您删除多少数据。
您可以做的事情是为每个表创建一个表空间,方法是设置
innodb_file_per_table
这段话的意思是,为了删除MySQL服务器中的数据,需要导出所有数据(建立新服务器会更容易),然后重新导入数据。 在一个单独的ibdata1文件中保存每个表的数据的代替方案是在很多名为“tablename.ibd”的文件中分别保存单个表的数据。
之后,如果你要从表中删除大量数据,可以通过下达命令让MySQL重新创建数据文件。alter table <tablename> engine=myisam;
切换到MyIsam(并删除该表的InnoDB数据文件)
alter table <tablename> engine=innodb;
重新创建表格。innodb_file_per_table
,否则ibdata1
将保存所有InnoDB
表和撤销操作。
该文件永远不会缩小。
要缩小它,您应该(自行承担风险):
- 备份并删除所有数据库中的InnoDB
表
- 手动删除文件
- 重新初始化InnoDB
存储(通过重启mysqld
)
- 从备份中恢复表格。
如果您设置了innodb_file_per_table
,则仍然需要执行此操作以回收空间,但在这种情况下,您将能够基于每个表格进行此操作,而不影响其他表格。
请注意,即使设置了innodb_file_per_table
,撤销操作仍然保存在ibdata
中。
运行 optimize table your_db.your_table;
SQL 请求,或使用 mysql workbench migration wizard,它将创建一个大小减小的数据库副本