成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

百萬級MySQL的數據量,該如何快速的完成數據遷移?

數據庫
上個月跟朋友一起做了個微信小程序,趁著5.20節日的熱度,兩個禮拜內迅速積累了一百多萬用戶,我們在小程序頁面增加了收集formid的埋點,用于給微信用戶發送模板消息通知。

背景

上個月跟朋友一起做了個微信小程序,趁著5.20節日的熱度,兩個禮拜內迅速積累了一百多萬用戶,我們在小程序頁面增加了收集formid的埋點,用于給微信用戶發送模板消息通知。

這個小程序一開始的后端邏輯是用douchat框架寫的,使用框架自帶的dc_mp_fans表存儲微信端授權登錄的用戶信息,使用dc_mp_tempmsg表存儲formid。截止到目前,收集到的數據超過380萬,很大一部分formid都已經成功使用給用戶發送過模板通知,起到了較好的二次推廣的效果。

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

方案選擇

mysqldump遷移

平常開發中,我們比較經常使用的數據備份遷移方式是用mysqldump工具導出一個sql文件,再在新數據庫中導入sql來完成數據遷移。試驗發現,通過mysqldump導出百萬級量的數據庫成一個sql文件,大概耗時幾分鐘,導出的sql文件大小在1G左右,然后再把這個1G的sql文件通過scp命令復制到另一臺服務器,大概也需要耗時幾分鐘。在新服務器的數據庫中通過source命令來導入數據,我跑了一晚上都沒有把數據導入進來,cpu跑滿。

腳本遷移

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

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

第二種方式,可以結合redis搭建一個“生產+消費”的遷移方案。源數據服務器可以作為數據生產者,在源數據服務器上跑一個多線程腳本,并行讀取數據庫里面的數據,并把數據寫入到redis隊列。目標服務器作為一個消費者,在目標服務器上也跑一個多線程腳本,遠程連接redis,并行讀取redis隊列里面的數據,并把讀取到的數據寫入到目標數據庫。這種方式相對于第一種方式,是一種異步方案,數據導入和數據導出可以同時進行,通過redis做數據的中轉站,效率會有較大的提升。關注公眾號互聯網架構師,回復關鍵字2T,獲取最新架構視頻

可以使用go語言來寫遷移腳本,利用其原生的并發特性,可以達到并行遷移數據的目的,提升遷移效率。

文件遷移

第一種遷移方案效率太低,第二種遷移方案編碼代價較高,通過對比和在網上找的資料分析,我最終選擇了通過mysql的select data into outfile file.txt、load data infile file.txt into table的命令,以導入導出文件的形式完成了百萬級數據的遷移。

遷移過程

在源數據庫中導出數據文件

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

復制數據文件到目標服務器

  1. zip fans.zip /data/fans.txt 
  2. scp fans.zip root@ip:/data/ 

在目標數據庫導入文件 

  1. unzip /data/fans.zip 
  2.  
  3. load data infile '/data/fans.txt' into table wxa_fans(id,appid,openid,unionid,@dummy,created_at,@dummy,nickname,gender,avatar_url,@dummy,@d 

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

注意項

  • 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的值設置為空:

  1. [mysqld] 
  2.   secure_file_priv='' 

則可通過命令導入導出數據文件。

導入導出的數據表字段不對應

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

wxa_fans

 

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

總結

結合本次數據遷移經歷,總結起來就是:小數據量可以使用mysqldump命令進行導入導出,這種方式簡單便捷。- 數據量較大,且有足夠的遷移耐心時,可以選擇自己寫腳本,選擇合適的并行方案遷移數據,這種方式編碼成本較高。- 數據量較大,且希望能在短時間內完成數據遷移時,可以通過mysql導入導出文件的方式來遷移,這種方式效率較高。

 

責任編輯:未麗燕 來源: 今日頭條
相關推薦

2021-04-07 10:20:31

MySQL數據庫命令

2024-01-23 12:56:00

數據庫微服務MySQL

2017-11-22 15:33:56

MySQL快速插入語句優化

2011-03-03 10:32:07

Mongodb億級數據量

2020-05-15 17:18:40

豌豆BI數據分析

2018-05-31 14:16:47

SQL ServerMySQL數據遷移

2018-04-02 15:37:33

數據庫MySQL翻頁

2023-02-21 15:06:01

MySQL數據庫

2011-08-16 09:21:30

MySQL大數據量快速語句優化

2025-04-14 08:30:00

架構分庫查詢

2024-07-30 15:56:42

2020-06-29 19:15:54

MySQL 數據量性能

2018-06-01 09:42:43

數據Spark規模

2020-01-13 10:20:30

架構聊天架構百萬并發量

2015-03-21 06:19:53

數據路由

2010-12-01 09:18:19

數據庫優化

2015-03-09 10:40:44

MySQL大量數據插入

2022-09-25 22:09:09

大數據量技術HDFS客戶端

2011-04-14 10:18:20

數據遷移

2012-12-26 09:23:56

數據庫優化
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲欧洲一区二区 | av免费看在线 | 欧美精品a∨在线观看不卡 欧美日韩中文字幕在线播放 | 免费看黄色小视频 | 99久久久国产精品免费消防器 | 久久久久国色av免费观看性色 | 人操人免费视频 | 狠狠狠干| 国产精品综合网 | 欧美黄色片 | 亚洲国产精品成人久久久 | 自拍偷拍第1页 | 色婷婷国产精品 | 精品少妇一区二区三区日产乱码 | 中文字幕国产精品 | 男人天堂视频在线观看 | 成人激情免费视频 | 性国产xxxx乳高跟 | 99热这里只有精品8 激情毛片 | 色在线视频网站 | av免费看片 | 久久专区 | av网站在线免费观看 | 国产精品久久一区二区三区 | 日韩精品一区二区三区视频播放 | 7777在线| 一区二区三区精品视频 | 欧美日本在线观看 | 亚洲欧美自拍偷拍视频 | 国产精品大片 | 欧美黄色录像 | 久久精品在线免费视频 | 国产精品一区二区无线 | 久久偷人 | 国产视频一视频二 | 二区中文| 欧美mv日韩mv国产网站91进入 | 国精产品一品二品国精在线观看 | 91亚洲精品久久久电影 | 久久av影院 | 91精品91久久久 |