gbase迁移mysql_基于datax实现从gbase到mysql的数据迁移--时间字段篇
項目背景
前期已經(jīng)寫過幾篇用datax實現(xiàn)異構數(shù)據(jù)遷移的文章,面對復雜的上游數(shù)據(jù),無法用一種通用的方式來實現(xiàn)所有業(yè)務表的遷移,比如一個大業(yè)務表中rowid字段與表記錄差異特別大(一個表有3億條記錄,里面的最大rowid為30億),這種情況下通過rowid切片也能實現(xiàn)遷移,但切片后的數(shù)據(jù)分布不均勻,這時基于時間字段來遷移則要順利得多。
系統(tǒng)環(huán)境
gbase8a 16節(jié)點集群
mysql5.6.46主從
遷移策略
遷移數(shù)據(jù)有幾種方式,需要根據(jù)實際的情況來決定采用哪一鐘,面對復雜的業(yè)務數(shù)據(jù),很難有標準的方式來實現(xiàn)所有業(yè)務數(shù)據(jù)的遷移,現(xiàn)把我遇到的遷移策略整理如下:
1、對于小表(百萬級)進行批量遷移
2、大表無時間字段(千萬以及億級),通過rowid字段切片
3、大表有時間字段,但rowid比表記錄大幾倍甚至幾十倍的情況 ,基于時間字段切片遷移
通過幾上三種方式組合,完美的解決了目前項目遇到的數(shù)據(jù)遷移問題
實現(xiàn)腳本
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數(shù)據(jù)庫里獲取大表的名稱和時間字段,按天生成同步記錄,存儲在table_name.txt文件中,格式為buf_aa.t_xx_pb_aayjl:in_xx_gbase_aa.t_xx_pb_aayjl:fssj:2020-06-01:2020-06-02,該步驟先通過手動實現(xiàn),可以一天、兩天,甚至一周為單位進行切分
#2、循環(huán)讀取table_name.txt中的內(nèi)容
#3、以天為單位抽取數(shù)據(jù)
#datax命令調(diào)用案例
#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
#定義文件與命令執(zhí)行路徑
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/'
#定義常用參數(shù)
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=''
#定義源數(shù)據(jù)庫的連接方式
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'
#定義目標數(shù)據(jù)庫的連接方式
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獲取表名、表記錄數(shù)并計算分片
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:代表源庫的數(shù)據(jù)庫名或schema名
t_xx_pb_aayjl:代表源庫的業(yè)務表名與目標下的業(yè)務表名一致
in_xx_gbase_aa:目標庫數(shù)據(jù)庫名或schema名
fssj:源庫業(yè)務表中的時間字段
2020-06-01:源庫業(yè)務表同步的起始時間
2020-06-02:源庫業(yè)務表同步的結束時間
總結:
1、不管是基于時間切分、rowid切分、小表批量遷移,只要一次處理的數(shù)據(jù)不超過datax的遇到內(nèi)存即可
2、表配置文件table_name.txt文件的時間沒有帶時、分、秒,這里是在shell腳本定義變量來實現(xiàn)的
3、當時基于時間切分遷移數(shù)據(jù)時,表配置文件table_name.txt里有500多條記錄,當運行到400多條記錄時,datax運行出問題了,將已經(jīng)同步完成的400多條記錄從table_name.txt清除后,繼續(xù)則沒有出現(xiàn)問題,有點奇怪。
總結
以上是生活随笔為你收集整理的gbase迁移mysql_基于datax实现从gbase到mysql的数据迁移--时间字段篇的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 听障学生计算机课本,面向听障学生程序设计
- 下一篇: git status查看文件的状态