MySQL的ibdata1檔案佔用過大瘦身
處理MySQL的ibdata1檔案過大問題
本人在對資料庫進行大量的資料插入和刪除的時候,發現ibdata1的佔了將近一個T
ibdata1檔案是什麼?
ibdata1是一個用來構建innodb系統表空間的檔案,這個檔案包含了innodb表的元資料、撤銷記錄、修改buffer和雙寫buffer。如果file-per-table選項開啟的話,該檔案則不一定包含所有表的資料。當innodb_file_per_table選項開啟的話,新建立表的資料和索引則不會存在系統表空間中,而是存放在各自表的.ibd檔案中.
顯然這個檔案會越來越大,innodb_autoextend_increment選項則指定了該檔案每次自動增長的步進,預設是8M.
是什麼原因導致ibdata1檔案會越來越大?
ibdata1存放資料,索引和快取等,是MYSQL的最主要的資料。所以隨著資料庫越來越大,表也會越大,這個無法避免的。如果時間長了,越來越大,我們在處理日誌和空間的時候就不是那麼方便了,就不知從何入手了。接下來我們就要處理下這樣的情況,分庫儲存資料。
該如何處理呢?
首先我們把資料庫檔案備份下來,然後直接刪除ibdata檔案(為了保險起見最好先全備一次,做到資料安全和完整),然後再重新匯入資料庫檔案即可!
具體操作步驟如下(截圖並不完整,但是首先要弄懂大概情況和原理):
第一種方法:
1、停止業務,備份一次全庫
mysqldump -uroot -ppassword --all-databases > all_mysql.sql2、備份完成,停止資料庫
systemctl stop mariadb 或者 service mysqld stop3、修改配置檔案
在[mysqld]下增加下面配置 innodb_file_per_table=1 驗證配置是否生效,可以重啟mysql後,執行 #service mysqld restart4、驗證
mysql -uroot -ppassword mysql
show variables like '%per_table%';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| innodb_file_per_table | ON |
+-----------------------+-------+
1 row in set (0.00 sec)
innodb_file_per_table的狀態變為ON
5、刪除ibdata1檔案和日誌
rm -rf ibdata1
rm -rf ib_logfile*
6、還原資料庫
mysql -uuser -ppassword
source all_mysql.sql
資料檔案單獨存放(共享表空間改為每個表獨立的表空間檔案)。
第二種方法:
把資料庫的表引擎為InnoDB 的資料錶轉為MyIsam 後,刪除ibdata1,按上面方法修改成獨立的表空間,在把改成MyIsam引擎的表改為InnoDB,這個就要衡量那種方法的時間耗時最短,兩者取其優。資料的表和庫很多的通常不建議這麼做,耗時間。