mysql MGR集群資料初始化方案

2021-10-13 23:05:34 字數 2756 閱讀 1625

mysql的乙個主從備份策略,達到高可用的效果。多台mysql伺服器組成乙個集群(一般是單數,因為有一台宕機後需要判斷是否多數機器是好的),只提供乙個節點供讀寫其餘幾個節點負責從主節點請求binarylog(主節點的sql操作記錄),同步到本地執行,達到資料結構、資料都能同步的目的。

因此,binarylog的同步效率成為資料寫入速度、單次寫入大小的瓶頸。一般是145m,再大就會報提交失敗異常(error on observer while running replication hook 'before_commit')。

資料原始檔是csv檔案,資料間用英文逗號分隔,每條資料以換行符分隔,utf-8編碼,unix換行符。

col1,col2,col3,col4

cola,colb,colc,cold

使用mysql的load data命令匯入

#!/bin/bash

mysql -h$host -u$user -p$port -p$pwd --enable-local-infile 當單個csv檔案特別大,達到幾百萬的時候會出現提交異常:error on observer while running replication hook 'before_commit'。導致整個匯入失敗。

遞迴的思想(d&c),通過把大檔案拆成小檔案,分開處理的方式。

#!/bin/bash

file="big file absolutely path"

if [ -f "$file"]

then

split -l 200000 $file $targetpath"tmp" -d # 將大檔案按行切成小檔案,輸出到$targetpath,字尾是tmp -d表示用數字公升序作為檔案結尾

files=$(ls -l "$targetpath"tmp* | awk '') # 將切出來的檔案都找出來放到files中

echo "$files" | wc -w # 輸出一共切出多少個檔案

for f in $files; do

set sql_mode=''; # 方便整表更新

mysql -h$host -u$user -p$port -p$pwd --enable-local-infile 優化:上述shell可以通過使用source命令,將變數提取到外部,建立乙個配置項並引入;輸出日誌可以通過重定向到文字檔案的方式代替控制台輸出,或者使用tee -a 將日誌在終端輸出的同時也輸出到文字檔案。

全量的資料寫入,使用上述方案即可解決問題。如果是增量的資料匯入,涉及到舊資料的,如果資料匯入失誤則可能導致整張表不能用。

因此,需要考慮資料匯入失敗,如何回退的問題。

當歷史資料量較少,且不需要自動化處理的情況下。可以先將表備份,匯出整張表資料做乙個全量的備份。再進行批量匯入,如果失敗則truncate掉重新import即可。

歷史資料量賊大,而匯入資料量不大,且不方便備份表的情況下。可以匯入正式表的同時,也匯入到一張臨時表,如果操作失敗則可以通過連表delete的方式回滾資料。

歷史資料量大,且匯入資料量也大,也不方便資料備份的情況下。這種方式比較麻煩,在匯入資料的同時也插入到一張臨時表,回退時由於資料量過大,連表的方式不能刪除(單次提交binlog超過145m)。

目前想到的是,將臨時表資料匯出成乙個csv(需要和匯入標準一致),再通過切檔案的方式匯入到一張temporary 表,再用temporary表和正式錶連delete的方式解決。

或者,分批次讀取臨時表的主鍵,維護臨時表查詢位置的偏移量,連正式表進行刪除,**樣例:

通過建立臨時表(***_tmp)來存放單批次資料,使得單次資料量可以控制,並且可以進行加工(更新,修改),加工完成後replace into 生產表,由於臨時表是通過temporary建立的,所以會自動**。

通過建立結果集表(***_res)來儲存增量資料,用於表示本次更新的資料。如果需要回退則有跡可循。

匯入流程就是: 資料檔案 --> 切成小檔案 --> 迴圈小檔案 --> 插入tmp表 --> 加工tmp表 --> 將tmp表複製到res表和生產表 

回退流程就是:res表匯出成csv --> 切成小檔案 --> 匯入到tmp表(用完mysql會**)--> tmp錶連生產表做delete --> 每個迴圈完成刪除對應的小檔案

資料初始化

資料初始化的面試題 a 乙個類的初始化過程 b 子父類的構造執行過程 c 分層初始化 看程式寫結果 a 成員變數的問題 int x 10 成員變數是基本型別 student s new student 成員變數是引用型別 b 乙個類的初始化過程 先父後子,先靜後非靜 成員變數的初始化 預設初始化 顯...

初始化 指定初始化

id alloc 物件的誕生過程,主要是從作業系統獲得一塊足夠大的記憶體,以存放該類的全部例項變數,並將其指定為存放記憶體物件的實力變數的位置。alloc方法同時將這塊記憶體全部設定為0。結果是 bool變數初始化為no,所有的int型別變數為0,float變數為0.0,所有的指標為nil.obje...

初始化 1 預設初始化 列表初始化

初始化的基本概念 事實 初始化和賦值是兩個完全不同的操作。初始化,是建立變數時賦予其乙個初始值。賦值,是把物件的當前值擦除,用乙個新值代替。列表初始化 p39 作為c 11新標準的一部分,用花括號 來初始化變數得到了全面應用。出於某些原因,這種初始化的方式叫做列表初始化。現在,無論是初始化物件還是某...