ibdata1是一个用来构建innodb系统表空间的文件,这个文件包含了innodb表的元数据、撤销记录、修改buffer和双写buffer,时间久了这个文件就会变的非常大。

当innodb_file_per_table选项打开,新创建表的数据和索引则不会存在系统表空间中,而是存放在各自表的.ibd文件中。


1、备份所有的数据库

mysqldump -uroot -pxxxx --all-databases --add-drop-table > /home/all_database.sql

2、删除所有的用户数据库,系统数据库(MySQL,performance_schema,INFORMATION_SCHEMA)除外


3、停止mysql服务,修改mysql配置

service mysqldstop
vi /etc/my.cnf
[mysqld] 
innodb_file_per_table   = 1 #主要是这个配置 
innodb_flush_method     = O_DIRECT 
innodb_log_file_size    = 1G
innodb_buffer_pool_size = 4G #innodb_buffer_pool_size的值最好设置物理内存70%


4、删除ibdata1、ib_logfile*文件

rm ibdata1 
rm ib_logfile*

我一般为了安全起见,不直接使用rm,用mv命令移动到其他备份文件夹下,等确认所有的修改没问题且启动运行成功后再删除也不迟。


5、重启mysql服务

service mysqld start


6、恢复数据

mysql -uroot -pxxx < /home/all_database.sql


mysql -uroot -p #进入mysql 
source /home/all_database.sql

导入成功后,我们可以查看ibdata1文件大小du-sh*还可以进入,mysql数据库文件夹下查看是否有ibd文件生成,数据及索引都变成了针对单个表的小ibd文件了

image.png