终究,我还是从innodb转到了myisam,光innodb库的大小就够我受的,更别说查询速度了。

但是我遇到了一个问题,从innodb转到myisam很快就能完成,ibdata1文件还是那么大,有27G。

嗯,可以理解,可能因为我的库还在。

但是当我删除一个大库的时候瞬间就完成了,那一瞬间我就感觉不妙,几百万的数据瞬间就能删完?

没错,ibdata1文件还是稳稳的27G,然后我就慌了,然后我把所有库都转成myisam,绝望的事情发生了,

ibdata1还是那么大,删掉它 让他重新生成还不行,直接启动不了:

Starting MySQL. ERROR! The server quit without updating PID file (/data/mysql/var/localhost.localdomain.pid)

看来innodb的缓存很难清了,只能把库全部备份,删了重新导了。

但是这样太麻烦,还可能出意外,于是我在网上找到了一个方法,只用了一半就搞定了,在这里备忘一下。

设置innodb一个表一个文件

默认innodb所有表的数据都在一个ibdata1里,但是如果设置一下每个表都分开,这样删了之前的ibdata1就没关系了,因为不依赖了。

如果你的表全部设置成了myisam了,确保没有表的数据在ibdata中,这时候想瘦身的话可以这样快速解决:

不管怎样先备份总不会错的

#mysqldump -q -uroot -ppassword --add-drop-table --all-databases >/home/backup/all.sql

打开my.ini或my.cnf文件
[mysqld]下增加下面配置
innodb_file_per_table=1

验证配置是否生效,可以重启mysql后,执行
#service mysqld restart
#mysql -uroot -ppassword
mysql> show variables like '%per_table%';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| innodb_file_per_table | ON |
+-----------------------+-------+
1 row in set (0.00 sec)

关闭mysql,删除ibdata1和ib_logfile*文件,启动mysql,完成。


 

如果你的部分表必须还要用innodb,只是想清理下ibdata1的话

上面的步骤执行完后,还需要导入之前的备份,因为你部分表的数据在之前的ibdata1中,已经被删了。

mysql -uroot -ppasswrod < /home/backup/all.sql

完成