Mysql

載入巨大的mysqldump(500G)

  • June 27, 2022

我有一個 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背後的理念。在此處查看對並行表導入的評估:

為了更快,您必須求助於物理備份而不是轉儲文件(即Percona XtraBackup)或文件系統快照。

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