Mysql
MySQL 有什麼方法可以更快地導入一個巨大的(32 GB)sql 轉儲?
我有這個巨大的 32 GB SQL 轉儲,需要導入 MySQL。我以前不必導入如此龐大的 SQL 轉儲。我照常做:
mysql -uroot dbname < dbname.sql
時間太長了。有一個大約有 3 億行的表,在大約 3 個小時內達到了 150 萬行。因此,整個過程似乎需要 600 小時(即 24 天)並且是不切實際的。所以我的問題是,有沒有更快的方法來做到這一點?
更多資訊/調查結果
Percona 的 Vadim Tkachenko 製作了這張精美的 InnoDB 圖形表示
您肯定需要更改以下內容
innodb_buffer_pool_size = 4G innodb_log_buffer_size = 256M innodb_log_file_size = 1G innodb_write_io_threads = 16 innodb_flush_log_at_trx_commit = 0
為什麼要進行這些設置?
- innodb_buffer_pool_size會記憶體頻繁讀取的數據
- innodb_log_buffer_size:更大的緩衝區減少了對事務日誌的寫入 I/O
- innodb_log_file_size:更大的日誌文件減少檢查點和寫入 I/O
- innodb_write_io_threads
.ibd
:對文件的服務寫入操作。根據MySQL 上的文件Configuring the Number of Background InnoDB I/O Threads
,每個執行緒最多可以處理 256 個掛起的 I/O 請求。MySQL 的預設值為 4,Percona Server 的預設值為 8。最大是 64。- innodb_flush_log_at_trx_commit
- 如果發生崩潰,0 和 2 都可能失去一秒鐘的數據。
- 權衡是 0 和 2 都提高了寫入性能。
- 我選擇 0 而不是 2,因為 0 每秒一次將 InnoDB 日誌緩衝區刷新到事務日誌(ib_logfile0、ib_logfile1),無論是否送出。設置 2 僅在送出時刷新 InnoDB 日誌緩衝區。前 Percona 講師 @jynus 提到的設置 0 還有其他優點。
像這樣重啟mysql
service mysql restart --innodb-doublewrite=0
這將禁用 InnoDB 雙寫緩衝區
導入您的數據。完成後,正常重啟mysql
service mysql restart
這將重新啟用 InnoDB 雙寫緩衝區
試一試 !!!