載入巨大的mysqldump(500G)
我有一個 500G 的 mysqldump 要載入,它似乎需要很長時間。我的伺服器配備 Intel i9-10920X @ 3.5GHz 和 128GB RAM。數據庫設置在 HDD 硬碟中。我的 mysql (Ver 8.0.29-0ubuntu0.20.04.3) 設置如下:
innodb_buffer_pool_size = 32G innodb_log_buffer_size = 512M innodb_log_file_size = 2G innodb_write_io_threads = 32 innodb_flush_log_at_trx_commit = 0 innodb_doublewrite = 0
我在源 .sql 文件之前進一步設置了以下內容:
SET global max_allowed_packet=1000000000; SET autocommit=0; SET unique_checks=0; SET foreign_key_checks=0;
現在它每秒讀取 20k 行。如何進一步優化?謝謝!
當你說永遠時,你的意思是多久?小時?天?如果需要幾天時間,我不會感到驚訝。
眾所周知,導入 .sql 轉儲文件非常耗時。它必然是單執行緒的,所以無論你有什麼類型的 CPU,你都只能使用一個 CPU 核心。
I/O 系統很重要。當您填充 2G InnoDB 日誌文件時,緩衝池中的髒頁必須刷新到磁碟。使用像 NVMe 這樣的快速直連磁碟系統會有所幫助。使用條帶化 RAID-0 或 RAID-10 會有所幫助。使用遠端儲存(例如 AWS EBS)不利於延遲。
在表中使用最少的索引會有所幫助。想想每行寫入乘以表中的索引數。表本身儲存為聚集索引,這是一次寫入。然後每個二級索引都是一個額外的寫入。唯一索引必須是同步寫入(儘管如果您設置 unique_checks=off,這很容易)。非唯一索引可以通過更改緩衝延遲,但它們最終確實需要合併到表空間中。
與其載入 .sql 文件,不如使用 .sql 文件要快得多
LOAD DATA [LOCAL] INFILE
。請參閱我的展示文稿快速載入數據!. 但是您不能將其與 .sql 轉儲文件一起使用。它適用於 CSV 文件和類似文件。使用並行載入多個表
LOAD DATA [LOCAL] INFILE
可能是批量載入大型數據集的最佳方法。這就是MySQL Shell Parallel Table Import Utility背後的理念。在此處查看對並行表導入的評估:
- https://www.percona.com/blog/2020/12/16/mysql-shell-8-0-22-data-export-import-utilities-tested-with-mysql-8-5-7-5-6/
- https://www.percona.com/blog/backup-restore-performance-conclusion-mysqldump-vs-mysql-shell-utilities-vs-mydumper-vs-mysqlpump-vs-xtrabackup/
為了更快,您必須求助於物理備份而不是轉儲文件(即Percona XtraBackup)或文件系統快照。