久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

Mysql百萬級數(shù)據(jù)遷移的示例分析

136次閱讀
沒有評論

共計 2151 個字符,預計需要花費 6 分鐘才能閱讀完成。

這篇文章將為大家詳細講解有關(guān) Mysql 百萬級數(shù)據(jù)遷移的示例分析,丸趣 TV 小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

                           

假如有這么一個場景,開發(fā)了一個小程序,趁著雙十一活動的熱度,一個月后迅速積累了一百多萬用戶,我們在小程序頁面增加了收集 formid 的埋點,用于給微信用戶發(fā)送模板消息通知。

隨著數(shù)據(jù)量的增大,之前使用的服務器空間開始有點不夠用,最近新寫了一個專門用于做小程序后臺開發(fā)的框架,于是想把原來的數(shù)據(jù)遷移到新系統(tǒng)的數(shù)據(jù)庫。買了一臺 4 核 8G 的機器,開始做數(shù)據(jù)遷移。下面對遷移過程做一個簡單的記錄。

方案選擇 mysqldump 遷移

平常開發(fā)中,我們比較經(jīng)常使用的數(shù)據(jù)備份遷移方式是用 mysqldump 工具導出一個 sql 文件,再在新數(shù)據(jù)庫中導入 sql 來完成數(shù)據(jù)遷移。

試驗發(fā)現(xiàn),通過 mysqldump 導出百萬級量的數(shù)據(jù)庫成一個 sql 文件,大概耗時幾分鐘,導出的 sql 文件大小在 1G 左右,然后再把這個 1G 的 sql 文件通過 scp 命令復制到另一臺服務器,大概也需要耗時幾分鐘。在新服務器的數(shù)據(jù)庫中通過 source 命令來導入數(shù)據(jù),我跑了一晚上都沒有把數(shù)據(jù)導入進來,cpu 跑滿。

腳本遷移

直接通過命令行操作數(shù)據(jù)庫進行數(shù)據(jù)的導出和導入是比較便捷的方式,但是數(shù)據(jù)量較大的情況下往往會比較耗時,對服務器性能要求也比較高。如果對數(shù)據(jù)遷移時間要求不是很高,可以嘗試寫腳本來遷移數(shù)據(jù)。雖然沒有實際嘗試,但是我想過大概有兩種腳本方案。

第一種方式,在遷移目標服務器跑一個遷移腳本,遠程連接源數(shù)據(jù)服務器的數(shù)據(jù)庫,通過設置查詢條件,分塊讀取源數(shù)據(jù),并在讀取完之后寫入目標數(shù)據(jù)庫。這種遷移方式效率可能會比較低,數(shù)據(jù)導出和導入相當于是一個同步的過程,需要等到讀取完了才能寫入。如果查詢條件設計得合理,也可以通過多線程的方式啟動多個遷移腳本,達到并行遷移的效果。

第二種方式,可以結(jié)合 redis 搭建一個“生產(chǎn) + 消費”的遷移方案。源數(shù)據(jù)服務器可以作為數(shù)據(jù)生產(chǎn)者,在源數(shù)據(jù)服務器上跑一個多線程腳本,并行讀取數(shù)據(jù)庫里面的數(shù)據(jù),并把數(shù)據(jù)寫入到 redis 隊列。目標服務器作為一個消費者,在目標服務器上也跑一個多線程腳本,遠程連接 redis,并行讀取 redis 隊列里面的數(shù)據(jù),并把讀取到的數(shù)據(jù)寫入到目標數(shù)據(jù)庫。這種方式相對于第一種方式,是一種異步方案,數(shù)據(jù)導入和數(shù)據(jù)導出可以同時進行,通過 redis 做數(shù)據(jù)的中轉(zhuǎn)站,效率會有較大的提升。

這里你也可以使用 go 語言來寫遷移腳本,利用其原生的并發(fā)特性,可以達到并行遷移數(shù)據(jù)的目的,提升遷移效率。

文件遷移

第一種遷移方案效率太低,第二種遷移方案編碼代價較高,通過對比和在網(wǎng)上找的資料分析,我最終選擇了通過 mysql 的。

select data into outfile file.txt、load data infile file.txt into table

的命令,以導入導出文件的形式完成了百萬級數(shù)據(jù)的遷移。

遷移過程

在源數(shù)據(jù)庫中導出數(shù)據(jù)文件

select * from dc_mp_fans into outfile  /data/fans.txt

復制數(shù)據(jù)文件到目標服務器

zip fans.zip /data/fans.txtscp fans.zip root@ip:/data/

在目標數(shù)據(jù)庫導入文件

unzip /data/fans.zipload data infile  /data/fans.txt  into table wxa_fans(id,appid,openid,unionid,@dummy,created_at,@dummy,nickname,gender,avatar_url,@dummy,@dummy,@dummy,@dummy,language,country,province,city,@dummy,@dummy,@dummy,@dummy,@dummy,@dummy,@dummy,@dummy,@dummy);

按照這么幾個步驟操作,幾分鐘內(nèi)就完成了一個百萬級數(shù)據(jù)表的跨服務器遷移工作。

注意項

mysql 安全項設置

在 mysql 執(zhí)行 load data infile 和 into outfile 命令都需要在 mysql 開啟了 secure_file_priv 選項,可以通過 show global variables like‘%secure%’; 查看 mysql 是否開啟了此選項,默認值 Null 標識不允許執(zhí)行導入導出命令。

通過 vim /etc/my.cnf 修改 mysql 配置項,將 secure_file_priv 的值設置為空:

[mysqld] secure_file_priv=

則可通過命令導入導出數(shù)據(jù)文件。

導入導出的數(shù)據(jù)表字段不對應

上面示例的從源數(shù)據(jù)庫的 dc_mp_fans 表遷移數(shù)據(jù)到目標數(shù)據(jù)庫的 wxa_fans 表,兩個數(shù)據(jù)表的字段分別為:dc_mp_fans

wxa_fans

在導入數(shù)據(jù)的時候,可以通過設置字段名來匹配目標字段的數(shù)據(jù),可以通過 @dummy 丟棄掉不需要的目標字段數(shù)據(jù)。

關(guān)于“Mysql 百萬級數(shù)據(jù)遷移的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-07-18發(fā)表,共計2151字。
轉(zhuǎn)載說明:除特殊說明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡搜集發(fā)布,轉(zhuǎn)載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 哈尔滨市| 察哈| 伊吾县| 定安县| 瓦房店市| 江安县| 洱源县| 宁蒗| 莎车县| 永昌县| 通江县| 南乐县| 安远县| 奇台县| 确山县| 施秉县| 乌审旗| 宁陕县| 小金县| 天镇县| 南充市| 海淀区| 温州市| 灵山县| 前郭尔| 宁化县| 安义县| 湘乡市| 正安县| 商都县| 曲周县| 安吉县| 法库县| 金湖县| 乌审旗| 涿州市| 交口县| 揭阳市| 鹤峰县| 临安市| 应用必备|