MySQL資料庫遷移快速匯出匯入大量資料
資料庫遷移是我們經常可遇到的問題,對於少量的資料,遷移基本上不會有什麼問題。生產環境中,有以下情況需要做遷移工作:
- 磁碟空間不夠。比如一些老專案,選用的機型並不一定適用於資料庫。隨著時間的推移,硬碟很有可能出現短缺;
- 業務出現瓶頸。比如專案中採用單機承擔所有的讀寫業務,業務壓力增大,不堪重負。如果 IO 壓力在可接受的範圍,會採用讀寫分離方案;
- 機器出現瓶頸。機器出現瓶頸主要在磁碟 IO 能力、記憶體、CPU,此時除了針對瓶頸做一些優化以外,選擇遷移是不錯的方案;
- 專案改造。某些專案的資料庫存在跨機房的情況,可能會在不同機房中增加節點,或者把機器從一個機房遷移到另一個機房。再比如,不同業務共用同一臺伺服器,為了緩解伺服器壓力以及方便維護,也會做遷移。
MySQL遷移通常使用的有三種方法:
1、資料庫直接匯出,拷貝檔案到新伺服器,在新伺服器上匯入。
2、使用第三方遷移工具。
3、資料檔案和庫表結構檔案直接拷貝到新伺服器,掛載到同樣配置的MySQL服務下。
第一種方案的優點:會重建資料檔案,減少資料檔案的佔用空間,相容性最好,匯出匯入很少發生問題,需求靈活。缺點:使用傳統匯出匯入時間佔用長。
第二種方案的優點:設定完成後傳輸無人值守,自動完成。缺點:不夠靈活,設定繁瑣,傳輸時間長,異常後很難從異常的位置繼續傳輸。
第三種方案的優點:時間佔用短,檔案可斷點傳輸,操作步驟少。缺點:新舊伺服器中MySQL版本及配置必須相同,可能引起未知問題。
假如資料庫遷移是因為業務瓶頸或專案改造等需要變動資料表結構的(比如分割槽分表),我們便只能使用第一種方法了。
使用MySQL的SELECT INTO OUTFILE 、LOAD DATA INFILE快速匯出匯入資料
LOAD DATA INFILE
語句從一個文字檔案中以很高的速度讀入一個表中。MySQL官方文件也說明了,該方法比一次性插入一條資料效能快20倍。
當用戶一前一後地使用SELECT ... INTO OUTFILE
和LOAD DATA INFILE
將資料從一個數據庫寫到一個檔案中,然後再從檔案中將它讀入資料庫中時,兩個命令的欄位和行處理選項必須匹配。否則,LOAD DATA INFILE 將不能正確地解釋檔案內容。
下面是一個專案的例子,MySQL由windows平臺遷移到Linux平臺,資料總量12G
Windows平臺匯出資料:
tables.txt是儲存資料表名稱的檔案,通過從檔案中讀取資料表名稱,迴圈匯出所有表:如果過程中攝及到分表,可根據分表規則修改匯出的sql語句和批處理程式碼,非常靈活。
@echo off & setlocal enabledelayedexpansion for /f %%i in (tables.txt) do ( set table=%%i echo "dump table -- !table! --" mysql -uroot -p12345678 codetc_old -e "SELECT * INTO OUTFILE 'F:/MySQL/Uploads/!table!.txt' FIELDS TERMINATED BY ',' FROM !table!" ) pause
Linux平臺匯入資料:
#!/bin/bash while read line do mysql -uroot -p12345678 codetc_new -e "LOAD DATA INFILE '/var/lib/mysql-files/$line.txt' INTO TABLE $line FIELDS TERMINATED BY ','" done < tables.txt
資料匯入之前需在新機器上建立表結構,12G的資料匯出用時3分鐘左右,匯入用時4分鐘左右(執行時間根據機器的配置會有所不同,不具有參考價值)
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對我們的支援。如果你想了解更多相關內容請檢視下面相關連結