终究,我还是从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
完成