最近发现自己服务器空间剩下不多了,因为我往MySQL中上传了一个将近7G的sql,于是本来还剩11G可用,瞬间变得只剩4G。关键是,后来我把这个超大的数据库drop掉,结果df -h一看存储,我的天,仍然只有4G可用,于是我慌了。
后来发现,是/var/lib/mysql/目录下有个ibdata1这么个东西,占了8.7G,同级目录下还有和每个数据库对应的一个文件夹,以及mysql/文件夹,和ib_logfile0、ib_logfile1等文件。所以占空间的主要就是这个ibdata1,这是个什么东西呢?能不能直接删掉呢?我把ibdata1改了个名字,改成ibdata1_bak,发现MySQL又自动生成了一个新的ibdata1,size小很多了,但是直接导致其他数据库无法正常使用,说明ibdata1里面存有其他数据库所需要的数据。
去网上查了下,这个ibdata1,连同ib_logfile0、ib_logfile1,三个文件一起存储着其他数据库的内容,因为MySQL默认是innodb存储,所以其他数据库所对应的文件夹里存储的只是表结构,真正的innodb数据全部在ibdata1里,所以这个东西,不能随便删!
那就很尴尬了,我现在已经drop那个最大的数据库了,但是ibdata1仍然在,而且和其他数据库的数据都捆绑在一起,导致我无法暴力清除相应的数据。
去网上找到了解决方案:
首先,备份你其他要用的全部数据库。这一步相当重要,一定要备份好你的数据,不然出差错了就什么都没有了;
其次,删除掉除information_schema、performance_schema、mysql三个数据库之外的其他全部数据库,其实也就是上面你已经备份好的那些数据库;
然后,停止MySQL服务,我是ubuntu系统,cd到/var/lib/mysql/,发现你的那些数据库所对应的文件夹都不在了,现在可以放心大胆地删掉ibdata1、ib_logfile0和ib_logfile1;
接着,找到你的MySQL配置文件,我的是在/etc/mysql/my.cnf,在以下部分中添加一行,使得每个数据库使用单独的innodb存储。
最后,重启MySQL服务,并且恢复你已备份好的全部数据库,你会发现,ibdata1的大小始终是18M左右。cd到每个数据库所对应的文件夹中,数据库里的每个表都包含frm和ibd两个文件,分别存储表结构和表数据。这就是我们想要的结果了,所有数据不再共用ibdata1,而是在自己的文件夹目录下单独存储数据。
再再再强调一次,折腾MySQL的时候,一定要把有用的数据库全部备份好,否则一旦出现意料之外的差错,数据就再也找不回来了!!!!!