上個月跟朋友一塊兒作了個微信小程序,趁着5.20節日的熱度,兩個禮拜內迅速積累了一百多萬用戶,咱們在小程序頁面增長了收集formid的埋點,用於給微信用戶發送模板消息通知。mysql
這個小程序一開始的後端邏輯是用douchat框架寫的,使用框架自帶的dc_mp_fans
表存儲微信端受權登陸的用戶信息,使用dc_mp_tempmsg
表存儲formid。截止到目前,收集到的數據超過380萬,很大一部分formid都已經成功使用給用戶發送過模板通知,起到了較好的二次推廣的效果。redis
隨着數據量的增大,以前使用的服務器空間開始有點不夠用,最近新寫了一個專門用於作小程序後臺開發的框架,因而想把原來的數據遷移到新系統的數據庫。買了一臺4核8G的機器,開始作數據遷移。下面對遷移過程作一個簡單的記錄。 sql
日常開發中,咱們比較常常使用的數據備份遷移方式是用mysqldump
工具導出一個sql文件,再在新數據庫中導入sql來完成數據遷移。試驗發現,經過mysqldump導出百萬級量的數據庫成一個sql文件,大概耗時幾分鐘,導出的sql文件大小在1G左右,而後再把這個1G的sql文件經過scp
命令複製到另外一臺服務器,大概也須要耗時幾分鐘。在新服務器的數據庫中經過source
命令來導入數據,我跑了一夜都沒有把數據導入進來,cpu
跑滿。shell
直接經過命令行操做數據庫進行數據的導出和導入是比較便捷的方式,可是數據量較大的狀況下每每會比較耗時,對服務器性能要求也比較高。若是對數據遷移時間要求不是很高,能夠嘗試寫腳原本遷移數據。雖然沒有實際嘗試,可是我想過大概有兩種腳本方案。數據庫
第一種方式,在遷移目標服務器跑一個遷移腳本,遠程鏈接源數據服務器的數據庫,經過設置查詢條件,分塊讀取源數據,並在讀取完以後寫入目標數據庫。這種遷移方式效率可能會比較低,數據導出和導入至關因而一個同步的過程,須要等到讀取完了才能寫入。若是查詢條件設計得合理,也能夠經過多線程的方式啓動多個遷移腳本,達到並行遷移的效果。小程序
第二種方式,能夠結合redis
搭建一個「生產+消費」的遷移方案。源數據服務器能夠做爲數據生產者,在源數據服務器上跑一個多線程腳本,並行讀取數據庫裏面的數據,並把數據寫入到redis隊列。目標服務器做爲一個消費者,在目標服務器上也跑一個多線程腳本,遠程鏈接redis,並行讀取redis隊列裏面的數據,並把讀取到的數據寫入到目標數據庫。這種方式相對於第一種方式,是一種異步方案,數據導入和數據導出能夠同時進行,經過redis作數據的中轉站,效率會有較大的提高。vim
可使用go
語言來寫遷移腳本,利用其原生的併發特性,能夠達到並行遷移數據的目的,提高遷移效率。後端
第一種遷移方案效率過低,第二種遷移方案編碼代價較高,經過對比和在網上找的資料分析,我最終選擇了經過mysql的select data into outfile file.txt
、load data infile file.txt into table
的命令,以導入導出文件的形式完成了百萬級數據的遷移。微信小程序
select * from dc_mp_fans into outfile '/data/fans.txt';
複製代碼
zip fans.zip /data/fans.txt
scp fans.zip root@ip:/data/
複製代碼
unzip /data/fans.zip
複製代碼
load 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);
複製代碼
按照這麼幾個步驟操做,幾分鐘內就完成了一個百萬級數據表的跨服務器遷移工做。安全
mysql安全項設置
在mysql執行load data infile
和into outfile
命令都須要在mysql開啓了secure_file_priv
選項, 能夠經過show global variables like '%secure%';
查看mysql是否開啓了此選項,默認值Null標識不容許執行導入導出命令。經過vim /etc/my.cnf
修改mysql配置項,將secure_file_priv
的值設置爲空:
[mysqld]
secure_file_priv=''
複製代碼
則可經過命令導入導出數據文件。
導入導出的數據表字段不對應
上面示例的從源數據庫的dc_mp_fans
表遷移數據到目標數據庫的wxa_fans
表,兩個數據表的字段分別爲:
dc_mp_fans
wxa_fans
在導入數據的時候,能夠經過設置字段名來匹配目標字段的數據,能夠經過@dummy
丟棄掉不須要的目標字段數據。
結合本次數據遷移經歷,總結起來就是:
mysqldump
命令進行導入導出,這種方式簡單便捷。在新系統展現數據的效果:
下一篇將寫一寫前段時間經過腳本20分鐘內給18萬微信小程序粉絲羣發模板通知的經歷。敬請期待。
轉載請註明原文連接:idoubi.cc