Mysql

MySQL 數據庫佔用太多磁碟空間

  • March 12, 2020

我在Ubuntu Server 18.04上執行MySQL 伺服器 5.7.27InnoDB。我確認 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 做最大的幾個表。這將有助於管理任務。
  • 考慮為每個數據庫設置一個表空間,特別是如果您最終將刪除一個數據庫(因為它們聞起來相同)。

引用自:https://dba.stackexchange.com/questions/247018