詳解MySQL表空間以及ibdata1文件過大問題


ibdata1文件過大

原因分析

ibdata1是一個用來構建innodb系統表空間的文件,關於系統表空間詳細介紹參考MySQL官網文檔

上面是一個數據庫的ibdata1文件,達到了780多G,而且還在不斷增長。

這個文件包含了innodb數據字典、修改buffer和雙寫buffer、撤銷日志,還包含在用戶在系統表空間創建的表信息和索引數據。

顯然,由於所有表的數據索引和緩存都存在這個文件中,隨着數據庫的不斷增大,這個文件肯定會越來越大的。

解決方法

和系統表空間(也稱作共享表空間)對應,MySQL提供了另外一種存儲文件的方式:獨立表空間。

獨立表空間模式下,每個innodb表都有自己獨立的表空間文件(.ibd文件),存儲各種表的索引和數據。

通過配置項:innodb_file_per_table指定MySQL使用獨立表空間,MySQL5.6.6以后的版本默認值是ONMySQL5.6.5以前的版本默認值是OFF

解決ibdata1文件過大具體操作步驟

如果當前MySQL使用系統表空間的模式,是無法在開啟數據庫的情況下進行切換到共享表空間的。必須關閉MySQL重建數據結構。步驟如下:

備份數據庫

使用mysqldump備份所有InnoDB數據表,包括MySQL的系統表。

使用下面的命令可以參考當前系統表:

SELECT TABLE_NAME from INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='mysql' and ENGINE='InnoDB';

MySQL5.6中包含五張系統表:

  • innodb_index_stats
  • innodb_table_stats
  • slave_master_info
  • slave_relay_log_info
  • slave_worker_info

如果數據庫只用了InnoDB表,可以直接備份所有數據庫。

mysqldump -h localhost -uroot -pxxxxx –all-databases > dump.sql

關閉MySQL服務

使用mysqld_safe關閉MySQL服務。

mysqladmin -uroot -pxxxxx shutdown

刪除現有數據庫文件

首先需要刪除當前存在的所有表空間文件(.idb),包括ibdata1和ib_log文件,以及數據庫自帶的.idb文件。

然后需要刪除所有的表結構描述文件:*.frm。位於數據庫名稱相應的文件夾下。

修改配置文件

在數據庫配置文件my.cnf中的[mysqld]下添加innodb_file_per_table=1配置。

[mysqld]
innodb_file_per_table=1

重新啟動服務器並導入數據

最后使用新的配置文件重新啟動mysql服務。

mysqld_safe --defaults-file=/your/config/path/my.cnf &

然后導入mysaldump備份的數據

# 登錄進入mysql
mysql -hlocalhost -uroot -pxxxxx database_name

# 導入數據
source /your/backup/file/path/dump.sql

獨立表空間的優點

剛開始建立數據庫時,就推薦使用獨立表空間,MySQL5.6.6以后的版本默認是獨立表空間。

使用獨立表空間很顯然能夠提高存儲效率,拆分表和表之間的耦合,將對數據庫的操作粒度降低到表級別。

獨立表空間對於存儲優化,遷移,備份,恢復和監控來說,都更加靈活和強大。下面列舉一些代表性的好處:

  • truncate和drop表時會釋放掉磁盤空間,共享表空間並不會釋放而是在ibdata1中開辟新的空間
  • truncate table時速度更快
  • 可以將表放在不同的磁盤上(用於I/O優化等),共享表空間必須所有表都反正ibdata1中
  • 可以對每個表使用 OPTIMIZE TABLE命令進行優化和重建,回收未使用的空間
  • 可以移動單個表,或者將單個表從一個實例復制到另外一個實例
  • 使用Barracuda文件格式,至此壓縮和動態行等功能
  • 使用動態行(dynamic row format)可以使得存儲大型BLOB和TEXT格式數據更高效
  • 當文件損壞時,提高成功恢復機會,節省服務器重啟或備份的時間

當然獨立表空間也有一些潛在的缺點:

  • 由於每個表都存在為使用的空間,這些空間只能同一個表使用,可能會造成空間浪費
  • fsync操作必須在每個打開的表上運行
  • mysqld必須為每個表保留一個打開的文件句柄,如果表過多,可能會影響性能
  • 在刪除表空間的文件時會掃描緩沖池,如果緩沖池達到幾十G,則需要幾秒的時間,而掃描會造成鎖,可能會延遲其他操作
  • 如果許多表正在增長,可能會存在更多的碎片,這回妨礙刪除表和掃描表的性能。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM