為什麼 MySQL 數據庫在轉儲/導入後更大?
我有 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_packet 的原因是與接收數據庫相比具有相同的值- 不確定這是否相關。如果我沒有
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 表上執行。試一試 !!!