Innodb數(shù)據(jù)庫(kù)對(duì)于已經(jīng)刪除的數(shù)據(jù)只是標(biāo)記為刪除,并不真正釋放所占用的磁盤(pán)空間,這就導(dǎo)致InnoDB數(shù)據(jù)庫(kù)文件不斷增長(zhǎng)。
如果在創(chuàng)建數(shù)據(jù)庫(kù)的時(shí)候設(shè)置innodb_file_per_table=1,這樣InnoDB會(huì)對(duì)每個(gè)表創(chuàng)建一個(gè)數(shù)據(jù)文件,然后只需要運(yùn)行OPTIMIZE TABLE 命令就可以釋放所有已經(jīng)刪除的磁盤(pán)空間。
運(yùn)行OPTIMIZE TABLE 表名后,雖然最后會(huì)報(bào)Table does not support optimize, doing recreate + analyze instead,但其實(shí)已經(jīng)成功了:)-------------------------------------------------------------如果沒(méi)有設(shè)置這個(gè)參數(shù),又想釋放空間,徹底釋放這些已經(jīng)刪除的數(shù)據(jù),需要把數(shù)據(jù)庫(kù)導(dǎo)出,刪除InnoDB數(shù)據(jù)庫(kù)文件,然后再倒入。下面是基本的步驟:
1 使用mysqldump命令將InnoDB數(shù)據(jù)庫(kù)導(dǎo)出2 停止MySQL3 刪除所有InnoDB數(shù)據(jù)庫(kù)文件和日志4 啟動(dòng)MySQL并自動(dòng)重建InnoDB數(shù)據(jù)庫(kù)文件和日志文件5 導(dǎo)入前面?zhèn)浞莸臄?shù)據(jù)庫(kù)文件# 備份數(shù)據(jù)庫(kù):mysqldump -uroot -proot --quick --force --all-databases > mysqldump.sql# 停止數(shù)據(jù)庫(kù)service mysqld stop# 刪除這些大文件rm /usr/local/mysql/var/ibdata1rm /usr/local/mysql/var/ib_logfile*# 手動(dòng)刪除除Mysql之外所有數(shù)據(jù)庫(kù)文件夾,然后啟動(dòng)數(shù)據(jù)庫(kù)service mysqld start# 還原數(shù)據(jù)mysql -uroot -proot < mysqldump.sql