MySQL 數據庫佔用太多磁碟空間
我在Ubuntu Server 18.04上執行MySQL 伺服器 5.7.27和InnoDB。我確認 InnoDB file-per-table 已打開。我有一個 mysqldump 包含我所有的數據庫,它佔用了大約1.3 GB的磁碟空間。
使用 導入備份後
sudo mysql -u root < myfile.sql
,我注意到驅動器上的剩餘空間明顯減少。我檢查了新創建的數據庫的磁碟空間使用情況,/var/lib/mysql
它們的總大小約為14 GB。我跑去
sudo mysqlcheck -o --all-databases -u root
優化表,但它只將大小減少到11 GB:root@ip-x-x-x-x:/var/lib/mysql# du -sm * | sort -nr 1468 dbvwgcayak57wx 1468 dbmuj7j8scnzt6 1468 dbmmqtf5sss9pk 1468 dbf9ynyscjzw83 1468 dbdr5hk7kvsh73 1468 db3mj8b7b5ezuw 1468 db22z4jcfbf9yn 544 db7b5ezuwb8ca4 76 ibdata1 48 ib_logfile1 48 ib_logfile0 35 dbbz9e6hcmqbtb 23 db688zwgk7uvdh 19 mysql 12 ibtmp1 3 phpmyadmin 2 performance_schema 1 sys 1 ib_buffer_pool 1 dbzqcfb9scuv3h 1 dbscjzw83rv253 1 auto.cnf 0 debian-5.7.flag
我所有的大型數據庫都包含數百個小型表(根據 phpmyadmin 小於 2 MB),但它們佔用了更多的實際磁碟空間(大約 8 MB)。
我還能做些什麼來減少磁碟空間?
我通過設置
innodb_file_per_table = 0
我的 MySQL 配置 (/etc/mysql/mysql.conf.d/mysqld.cnf
) 並在刪除所有數據庫後重新導入 mysqldump 解決了這個問題。包含所有 DB 數據的 ibdata1 文件大約只有2.4 GB。root@ip-x-x-x-x:/var/lib/mysql# du -sm * | sort -nr | head -15 2445 ibdata1 48 ib_logfile1 48 ib_logfile0 12 ibtmp1 11 dbvwgcayak57wx 11 dbmuj7j8scnzt6 11 dbmmqtf5sss9pk 11 dbf9ynyscjzw83 11 dbdr5hk7kvsh73 11 db3mj8b7b5ezuw 11 db22z4jcfbf9yn 4 db7b5ezuwb8ca4 1 phpmyadmin 1 mysql 1 ib_buffer_pool
如果您的數據庫包含許多小表,那麼似乎為每個表都擁有一個 *.ibd 文件實際上可能是不利的。
放置小桌子可能需要更少的空間。在其中一個數據庫上試試這個:
ibdata1``innodb_file_per_table = OFF
SET GLOBAL innodb_file_per_table = OFF; logout and login SHOW VARIABLES LIKE 'innodb_file_per_table'; -- to verify check the size of ibdata1 USE db; ALTER TABLE table1 ENGINE=InnoDB; ALTER TABLE table2 ENGINE=InnoDB; ... compare the size of ibdata1 `du` on the db directory
8MB 是由於預先分配空間的方式。該表正好處於小型緊湊與大型預分配不重要百分比的邊界。
您可能會考慮擁有一個每個數據庫的表空間。請參閱“通用表空間”。遷移程式碼將與上述類似。
請提供
SHOW CREATE TABLE
一張典型的表格;可能還有其他技術可以應用。此外,如果大多數表是“相同的”,我強烈建議使用單個表而不是將數據分佈在相同的表中。同樣,這SHOW
將有助於進一步討論這個問題。哎呀,現在我看到了您的答案,其中您有效地按照我的建議進行了操作。仍然…
- 用 file_per_table 做最大的幾個表。這將有助於管理任務。
- 考慮為每個數據庫設置一個表空間,特別是如果您最終將刪除一個數據庫(因為它們聞起來相同)。