MySQL一次大表遷移的優化 一.問題描述 二. 解決方案

一.問題描述

  今天一個做Java開發的哥們向我諮詢了一個問題。

  他想把一個300多萬條數據數據的表遷移到本地測試環境,他處理的方案是 先通過mysqldump命令將該表做一個備份,然後傳輸到測試環境,最後執行備份文件。

  理想很豐滿,現實很骨感,300多萬的數據不大,備份下來也就2.5GB左右的sql文件,可是在測試環境居然執行了12個小時才執行了一半,無奈只能終止。

  於是這個哥們開始諮詢我,希望我能提供一個快速一點的方法。

二. 解決方案

  既然是批量數據的遷移,那就肯定想到調整參數和索引相關,於是從這兩個方向着手。

2.1 調整索引

將 dump.sql文件中除id列主鍵索引外的所有索引都去掉,數據同步完成後再創建索引。

2.2 調整參數

我調整的參數如下:

-- 默認值是128M,測試機器是16GB內存,可以調整爲10G,緩存更多數據
innodb_buffer_pool_size=10G

-- 默認值是50M,儘量調大,減少checkpoint
innodb_log_file_size=4G

-- 每次事務提交,都寫入os cache 緩存,可能1秒將cache裏面數據寫入磁盤,減少寫磁盤
innodb_flush_log_at_trx_commit=2

-- 設置爲0的時候,持久化操作留給文件系統 ,減少寫磁盤
sync_binlog=0

-- 關閉binlog,減少寫磁盤
skip-log-bin

2.3 重新導入數據

重新導入數據,速度快了很多,不到半個小時,300多萬的數據都導入成功了。

2.4 重建索引

因爲表有十多個索引,我放到一個文件裏面批量執行,一個索引預估20分鐘左右,索引預估需要3個小時左右,看來索引纔是大頭,導入數據其實沒那麼麻煩。


2.5 恢復mysql配置文件

最後被忘記將配置文件進行恢復,2.2步驟設置的,容易丟數據,還是雙1來的安心。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章