Mysql

為什麼 MySQL 數據庫在轉儲/導入後更大?

  • September 10, 2019

我有 2 個 VPS 併計劃將數據庫從第一個遷移到第二個。原始數據庫佔用了大約 15GB 的儲存空間,我設法轉儲了 7GB 的 SQL。但是,當我將 SQL 導入第二個 VPS 時,它佔用了 2 倍的儲存空間,變為 32GB。

我的問題是:

  • 什麼可能導致我的數據庫從 15GB 變成 32GB 只是轉儲 + 導入?
  • 我怎樣才能避免這種情況?

以下是一些進一步的細節:

  • 兩個 VPS 並不完全相同,MySQL 版本也是如此。源數據庫是版本 5.5.47。接收數據庫是版本 5.7.13。
  • 接收數據庫是新安裝的並且是空的。
  • 我用來轉儲 SQL 的命令是:mysqldump -u <username> -p --all-databases --add-drop-database --max_allowed_packet=16777216 --single-transaction > full_dump.sql. 我設置 max_allowed_pa​​cket 的原因是與接收數據庫相比具有相同的值
  • 不確定這是否相關。如果我沒有single-transaction在我的 mysqldump 命令中指定,它會出錯mysqldump: Got error: 2006: MySQL server has gone away when using LOCK TABLES
  • 源 DB 儲存分佈與接收 DB 不同:

14858M /var/lib/mysql

14483M/var/lib/mysql/ibdata1

365M /var/lib/mysql/wordpress

  • 這是接收數據庫儲存分佈:

31558M /var/lib/mysql

31306M /var/lib/mysql/wordpress

337M /var/lib/mysql/wordpress/wp_wfLeechers.ibd

101M /var/lib/mysql/wordpress/wp_1059_posts.ibd

  • 我試圖執行表優化,但沒有影響

首先引起我注意的是您使用的 MySQL 版本。

你說

  • 源數據庫是版本 5.5.47
  • 接收數據庫是版本 5.7.13

這兩個版本的 MySQL 對 innodb_file_format 使用不同的預設值

如文件中所述,MySQL 5.7 具有儲存 InnoDB 的新方法。請注意:

Barracuda文件格式需要使用壓縮或動態行格式和相關功能,例如壓縮、大型可變長度列的頁外儲存和大型索引鍵前綴(請參閱 innodb_large_prefix)。此限制不適用於儲存在通用表空間中的表。

如果您的數據具有較大的可變長度列,則重新載入的結果可能是 BTree 索引之外的數據和索引資訊的儲存以及頁面的額外拆分。有關這方面的更多詳細資訊,請參閱動態和壓縮行格式。許多新的 InnoDB 文件格式功能在 MySQL 5.7 中已棄用,最終將在未來的版本中消失。

建議 #1

即使已棄用,您也可以在 MySQL 5.7 伺服器上將innodb_file_format設置為 Antelope,重新啟動 MySQL,然後重新載入 mysqldump。

建議 #2

使用 MySQL 5.5/5.6 作為 Master 而不是 MySQL 5.7。在 Master 上重新啟動 MySQL,並將 mysqldump 重新載入到 Master 中。

建議#3

ALTER TABLE innodbtable ROW_FORMAT=COMPRESSED;在所有 MySQL 5.7 InnoDB 表上執行。

試一試 !!!

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