日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

gbase迁移mysql_基于datax实现从gbase到mysql的数据迁移--时间字段篇

發布時間:2024/9/27 数据库 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 gbase迁移mysql_基于datax实现从gbase到mysql的数据迁移--时间字段篇 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

項目背景

前期已經寫過幾篇用datax實現異構數據遷移的文章,面對復雜的上游數據,無法用一種通用的方式來實現所有業務表的遷移,比如一個大業務表中rowid字段與表記錄差異特別大(一個表有3億條記錄,里面的最大rowid為30億),這種情況下通過rowid切片也能實現遷移,但切片后的數據分布不均勻,這時基于時間字段來遷移則要順利得多。

系統環境

gbase8a 16節點集群

mysql5.6.46主從

遷移策略

遷移數據有幾種方式,需要根據實際的情況來決定采用哪一鐘,面對復雜的業務數據,很難有標準的方式來實現所有業務數據的遷移,現把我遇到的遷移策略整理如下:

1、對于小表(百萬級)進行批量遷移

2、大表無時間字段(千萬以及億級),通過rowid字段切片

3、大表有時間字段,但rowid比表記錄大幾倍甚至幾十倍的情況 ,基于時間字段切片遷移

通過幾上三種方式組合,完美的解決了目前項目遇到的數據遷移問題

實現腳本

datax配置文件

{

"job": {

"setting": {

"speed": {

"byte": 1048576

},

"errorLimit": {

"record": 0,

"percentage": 0.02

}

},

"content": [

{

"reader": {

"name": "$source_reader",

"parameter": {

"username": "$source_db_user",

"password": "$source_db_pwd",

"connection": [

{

"querySql": [

"select * from $source_table_name where $date_column>='$start_time' and $date_column

],

"jdbcUrl": [

"$source_db_conn"

]

}

],

"fetchSize": 1024

}

},

"writer": {

"name": "$target_reader",

"parameter": {

"username": "$target_db_user",

"password": "$target_db_pwd",

"session": [],

"preSql": [],

"column": ["REC_ID","PRO_ORG_NO","TG_ID","ORG_NO","TG_NO","TG_NAME","STAT_DATE","CONS_NUM","TG_CAP","PPQ","UPQ","LOSS_PQ","LINELOSS_RATE","ABNORMAL_LL_TYPE","METER_SUM","METER_COVER_SUM","COVER_RATE","IS_COVER","METER_SUCC_SUM","SUCC_RATE","IS_MONITOR","COLL_TYPE","IS_CALC","EVAL_TYPE","BUF_UPDATETIME","PUBLIC_MET_CNT","LOW_MET_CNT","DISTRIBUTED_MET_CNT","RESP_EMP_NO"],

"connection": [

{

"table": [

"$target_table_name"

],

"jdbcUrl": "$target_db_conn"

}

]

}

}

}

]

}

}

遷移腳本文件/data/datax/job/gbasetomysql.json

#!/bin/bash

#function:

#version:0.3

#author:lineqi

#crt_time:2020-04-26

#大表同步思路

#1、從gbase8a數據庫里獲取大表的名稱和時間字段,按天生成同步記錄,存儲在table_name.txt文件中,格式為buf_aa.t_xx_pb_aayjl:in_xx_gbase_aa.t_xx_pb_aayjl:fssj:2020-06-01:2020-06-02,該步驟先通過手動實現,可以一天、兩天,甚至一周為單位進行切分

#2、循環讀取table_name.txt中的內容

#3、以天為單位抽取數據

#datax命令調用案例

#eg:/opt/datax/bin/datax.py -p "-Dsource_reader=${v_gbase_reader}" /opt/datax/job/mysqltest.json >> /opt/datax/log/table_name_2020-04-26.log

#定義文件與命令執行路徑

v_table_list='/data/datax/job/table_name.txt'

v_exec_command='/data/datax/bin/datax.py'

v_path_json='/data/datax/job/gbasetomysql.json'

v_path_log='/data/datax/log/'

#定義常用參數

v_source_table_name=''

v_target_table_name=''

v_sync_start_time=`date -d "today" +"%Y-%m-%d-%H-%M-%S"`

v_start_time=''

v_end_time=''

v_append_time=" 00:00:00"

v_date_column=''

#定義源數據庫的連接方式

v_gbase_user='qyw_qjqx'

v_gbase_pwd='qyw12_19QJQX#'

v_gbase_conn='jdbc:gbase://10.xx.xx.28:15258/xx_amr'

v_gbase_reader='rdbmsreader'

#定義目標數據庫的連接方式

v_mysql_user='qjqx'

v_mysql_pwd='Whayer1234'

v_mysql_reader='mysqlwriter'

v_mysql_conn='jdbc:mysql://25.xx.xx.68:13306/xx_gbase8a_xx_amr'

#從table_name.txt獲取表名、表記錄數并計算分片

for table_name in `cat $v_table_list`

do

#get table_name

v_source_table_name=`echo $table_name|awk -F ":" '{print $1}'`

v_target_table_name=`echo $table_name|awk -F ":" '{print $2}'`

v_date_column=`echo $table_name|awk -F ":" '{print $3}'`

v_start_time=`echo $table_name|awk -F ":" '{print $4}'`"$v_append_time"

v_end_time=`echo $table_name|awk -F ":" '{print $5}'`"$v_append_time"

$v_exec_command -p "\

-Dsource_reader=${v_gbase_reader} \

-Dsource_db_user=${v_gbase_user} \

-Dsource_db_pwd=${v_gbase_pwd} \

-Dsource_db_conn=${v_gbase_conn} \

-Dsource_table_name=${v_source_table_name} \

-Ddate_column=${v_date_column} \

-Dstart_time='${v_start_time}' \

-Dend_time='${v_end_time}' \

-Dtarget_reader=${v_mysql_reader} \

-Dtarget_db_user=${v_mysql_user} \

-Dtarget_db_pwd=${v_mysql_pwd} \

-Dtarget_db_conn=${v_mysql_conn} \

-Dtarget_table_name=${v_target_table_name} \

" $v_path_json >>"$v_path_log"$v_source_table_name"$v_sync_start_time".log 2>&1

# echo $v_table_name,$v_start_num,$v_end_num

done

表配置文件table_name.txt

buf_aa.t_xx_pb_aayjl:in_xx_gbase_aa.t_xx_pb_aayjl:fssj:2020-06-03:2020-06-04

buf_aa.t_xx_pb_aayjl:in_xx_gbase_aa.t_xx_pb_aayjl:fssj:2020-06-02:2020-06-03

buf_aa.t_xx_pb_aayjl:in_xx_gbase_aa.t_xx_pb_aayjl:fssj:2020-06-01:2020-06-02

說明:表配置文件中的第一行由7個部分組成,分別代表的含義如下

buf_aa:代表源庫的數據庫名或schema名

t_xx_pb_aayjl:代表源庫的業務表名與目標下的業務表名一致

in_xx_gbase_aa:目標庫數據庫名或schema名

fssj:源庫業務表中的時間字段

2020-06-01:源庫業務表同步的起始時間

2020-06-02:源庫業務表同步的結束時間

總結:

1、不管是基于時間切分、rowid切分、小表批量遷移,只要一次處理的數據不超過datax的遇到內存即可

2、表配置文件table_name.txt文件的時間沒有帶時、分、秒,這里是在shell腳本定義變量來實現的

3、當時基于時間切分遷移數據時,表配置文件table_name.txt里有500多條記錄,當運行到400多條記錄時,datax運行出問題了,將已經同步完成的400多條記錄從table_name.txt清除后,繼續則沒有出現問題,有點奇怪。

總結

以上是生活随笔為你收集整理的gbase迁移mysql_基于datax实现从gbase到mysql的数据迁移--时间字段篇的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。