MySQL數(shù)據(jù)庫遷移快速導(dǎo)出導(dǎo)入大量數(shù)據(jù)
數(shù)據(jù)庫遷移是我們經(jīng)??捎龅降膯栴},對于少量的數(shù)據(jù),遷移基本上不會有什么問題。生產(chǎn)環(huán)境中,有以下情況需要做遷移工作:
- 磁盤空間不夠。比如一些老項(xiàng)目,選用的機(jī)型并不一定適用于數(shù)據(jù)庫。隨著時(shí)間的推移,硬盤很有可能出現(xiàn)短缺;
- 業(yè)務(wù)出現(xiàn)瓶頸。比如項(xiàng)目中采用單機(jī)承擔(dān)所有的讀寫業(yè)務(wù),業(yè)務(wù)壓力增大,不堪重負(fù)。如果 IO 壓力在可接受的范圍,會采用讀寫分離方案;
- 機(jī)器出現(xiàn)瓶頸。機(jī)器出現(xiàn)瓶頸主要在磁盤 IO 能力、內(nèi)存、CPU,此時(shí)除了針對瓶頸做一些優(yōu)化以外,選擇遷移是不錯(cuò)的方案;
- 項(xiàng)目改造。某些項(xiàng)目的數(shù)據(jù)庫存在跨機(jī)房的情況,可能會在不同機(jī)房中增加節(jié)點(diǎn),或者把機(jī)器從一個(gè)機(jī)房遷移到另一個(gè)機(jī)房。再比如,不同業(yè)務(wù)共用同一臺服務(wù)器,為了緩解服務(wù)器壓力以及方便維護(hù),也會做遷移。
MySQL遷移通常使用的有三種方法:
1、數(shù)據(jù)庫直接導(dǎo)出,拷貝文件到新服務(wù)器,在新服務(wù)器上導(dǎo)入。
2、使用第三方遷移工具。
3、數(shù)據(jù)文件和庫表結(jié)構(gòu)文件直接拷貝到新服務(wù)器,掛載到同樣配置的MySQL服務(wù)下。
第一種方案的優(yōu)點(diǎn):會重建數(shù)據(jù)文件,減少數(shù)據(jù)文件的占用空間,兼容性最好,導(dǎo)出導(dǎo)入很少發(fā)生問題,需求靈活。缺點(diǎn):使用傳統(tǒng)導(dǎo)出導(dǎo)入時(shí)間占用長。
第二種方案的優(yōu)點(diǎn):設(shè)置完成后傳輸無人值守,自動完成。缺點(diǎn):不夠靈活,設(shè)置繁瑣,傳輸時(shí)間長,異常后很難從異常的位置繼續(xù)傳輸。
第三種方案的優(yōu)點(diǎn):時(shí)間占用短,文件可斷點(diǎn)傳輸,操作步驟少。缺點(diǎn):新舊服務(wù)器中MySQL版本及配置必須相同,可能引起未知問題。
假如數(shù)據(jù)庫遷移是因?yàn)闃I(yè)務(wù)瓶頸或項(xiàng)目改造等需要變動數(shù)據(jù)表結(jié)構(gòu)的(比如分區(qū)分表),我們便只能使用第一種方法了。
使用MySQL的SELECT INTO OUTFILE 、LOAD DATA INFILE快速導(dǎo)出導(dǎo)入數(shù)據(jù)
LOAD DATA INFILE
語句從一個(gè)文本文件中以很高的速度讀入一個(gè)表中。MySQL官方文檔也說明了,該方法比一次性插入一條數(shù)據(jù)性能快20倍。
當(dāng)用戶一前一后地使用SELECT ... INTO OUTFILE
和LOAD DATA INFILE
將數(shù)據(jù)從一個(gè)數(shù)據(jù)庫寫到一個(gè)文件中,然后再從文件中將它讀入數(shù)據(jù)庫中時(shí),兩個(gè)命令的字段和行處理選項(xiàng)必須匹配。否則,LOAD DATA INFILE 將不能正確地解釋文件內(nèi)容。
下面是一個(gè)項(xiàng)目的例子,MySQL由windows平臺遷移到Linux平臺,數(shù)據(jù)總量12G
Windows平臺導(dǎo)出數(shù)據(jù):
tables.txt是保存數(shù)據(jù)表名稱的文件,通過從文件中讀取數(shù)據(jù)表名稱,循環(huán)導(dǎo)出所有表:如果過程中攝及到分表,可根據(jù)分表規(guī)則修改導(dǎo)出的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平臺導(dǎo)入數(shù)據(jù):
#!/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
數(shù)據(jù)導(dǎo)入之前需在新機(jī)器上創(chuàng)建表結(jié)構(gòu),12G的數(shù)據(jù)導(dǎo)出用時(shí)3分鐘左右,導(dǎo)入用時(shí)4分鐘左右(執(zhí)行時(shí)間根據(jù)機(jī)器的配置會有所不同,不具有參考價(jià)值)
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
相關(guān)文章
MySQL定時(shí)備份之使用Linux下的crontab定時(shí)備份實(shí)例
這篇文章主要介紹了使用Linux下的crontab進(jìn)行MySQL定時(shí)備份的例子,需要的朋友可以參考下2014-04-04MySQL服務(wù)器默認(rèn)安裝之后調(diào)節(jié)性能的方法
在面試MySQL DBA或者那些打算做MySQL性能優(yōu)化的人時(shí),我最喜歡問題是:MySQL服務(wù)器按照默認(rèn)設(shè)置安裝完之后,應(yīng)該做哪些方面的調(diào)節(jié)呢?2011-05-05Mysql匿名登錄無法創(chuàng)建數(shù)據(jù)庫問題解決方案
這篇文章主要介紹了Mysql匿名登錄無法創(chuàng)建數(shù)據(jù)庫問題解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-12-12/var/log/pacct文件導(dǎo)致MySQL啟動失敗的案例分享
這篇文章主要介紹了/var/log/pacct文件導(dǎo)致MySQL啟動失敗的案例分享,這是個(gè)比較讓人郁悶的問題,找不到MySQL啟動失敗的原因進(jìn)可以按此文的方法試一試,需要的朋友可以參考下2015-01-01MySQL優(yōu)化必須調(diào)整的10項(xiàng)配置
這篇文章主要介紹了MySQL優(yōu)化必須調(diào)整的10項(xiàng)配置,使用這些方法可以讓你快速地獲得一個(gè)穩(wěn)健的MySQL配置,需要的朋友可以參考下2014-02-02MySQL數(shù)據(jù)庫監(jiān)控軟件lepus使用問題以及解決辦法
這篇文章主要介紹了MySQL數(shù)據(jù)庫監(jiān)控軟件lepus使用問題及解決辦法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-09-09MySQL?從0到1打開數(shù)據(jù)庫管理操作方法
數(shù)據(jù)庫管理系統(tǒng)(DataBase?Management?System)是用來創(chuàng)建數(shù)據(jù)庫和管理數(shù)據(jù)庫數(shù)據(jù)的一個(gè)管理軟件,我們口頭說的MySQL數(shù)據(jù)庫就是這個(gè)管理系統(tǒng),這篇文章主要介紹了MySQL從0到1打開數(shù)據(jù)庫管理,需要的朋友可以參考下2023-06-06MySQL 存儲過程傳參數(shù)實(shí)現(xiàn)where id in(1,2,3,...)示例
一個(gè)MySQL 存儲過程傳參數(shù)的問題想實(shí)現(xiàn)例如篩選條件為:where id in(1,2,3,...),下面有個(gè)不錯(cuò)的示例,感興趣的朋友可以參考下2013-10-10Linux利用UDF庫實(shí)現(xiàn)Mysql提權(quán)
根據(jù)MySQL函數(shù)族的可擴(kuò)展機(jī)制,意味著用戶可以自己建立包含有自定義函數(shù)的動態(tài)庫來創(chuàng)建自定義函數(shù),簡稱udf2014-07-07