datax从gbase8a同步上亿大表到mysql5.7中

背景

需要从gbase8a同步一些大表到mysql5.7数据库中,gbase8a中的大表基本上是没有有效的时间戳标识,直接通过datax抽取时,会报gc错误,除非设置同步使用的内存大于表的大小,这个在生产环境是不太现实的,目前想到的方式有两种,一是通过limit进行分页,二是通过rowid切片(这里得给gbase8a点个赞,好的设计,解决了后面基于rowid增量同步的问题)

系统环境:

[root@test-161 libs]# cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)

gbase> select version();
±------------------------+
| version() |
±------------------------+
| 8.6.2.43-R7-free.110605 |

mysql> select version();
±-----------+
| version() |
±-----------+
| 5.7.29-log |
±-----------+
1 row in set (0.00 sec)

下面通过rowid切片方式来实现

#!/bin/bash
#function:
#version:0.3
#author:lineqi
#crt_time:2020-04-26
#大表同步思路
#1、从gbase8a数据库里获取大表的名称和数据记录数,存储在table_name.txt文件中,格式为表名:表的记录数,该步骤先通过手动实现
#2、循环读取table_name.txt中的内容
#3、根据每个表的记录数进行rowid切片,每个分片的数据量默认为20万条记录
#4、对每个表按分片的记录数进行数据抽取

#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=’/opt/datax/job/table_name.txt’
v_exec_command=’/opt/datax/bin/datax.py’
v_path_json=’/opt/datax/job/gbasetomysql57.json’
v_path_log=’/opt/datax/log/’

#定义常用参数
let v_split_num=200000
let v_start_num=0
let v_end_num=0
v_table_name=’’
v_sync_start_time=date -d "today" +"%Y-%m-%d %H:%M:%S"

#定义源数据库的连接方式
v_gbase_user=‘test’
v_gbase_pwd=‘test’
v_gbase_conn=‘jdbc:gbase://192.168.40.164:5258/test’
v_gbase_reader=‘rdbmsreader’

#定义目标数据库的连接方式
v_mysql_user=‘admin2020’
v_mysql_pwd=‘admin2020’
v_mysql_reader=‘mysqlwriter’
v_mysql_conn=‘jdbc:mysql://192.168.40.164:3308/wbi2020’

#从table_name.txt获取表名、表记录数并计算分片

for table_name in cat $v_table_list
do
#get table_name
v_table_name=echo $table_name|awk -F ":" '{print $1}'
#get table total nums
let v_total_num=echo $table_name|awk -F ":" '{print $2}'
#split pages
v_pages= ( ( (( (((( v t o t a l n u m / v_total_num/ vtotalnum/v_split_num))+1))
#根据分片数据,调用datax同步命令
for ((i=1;i<= v p a g e s ; i + + ) ) d o v s t a r t n u m = v_pages;i++)) do v_start_num= vpages;i++))dovstartnum=(( ( ( (( ((i-1))* v s p l i t n u m ) ) v e n d n u m = v_split_num)) v_end_num= vsplitnum))vendnum=(( i ∗ i* iv_split_num))

		$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_table_name} \
		-Dsource_db_start_rowid=${v_start_num} \
		-Dsource_db_end_rowid=${v_end_num} \
		-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_table_name} \
		" $v_path_json >>"$v_path_log"$v_table_name"$v_sync_start_time".log 2>&1

	   # echo $v_table_name,$v_start_num,$v_end_num

	done

done

注意事项

1、将gbase的驱动gbase-connector-java-8.3.81.53-build55.2.1-bin.jar上传datax的plugin/reader/rdbmsreader/libs目录即可

配置文件

/opt/datax/job/gbasetomysql57.json

{
    "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 rowid>=$source_db_start_rowid and rowid<$source_db_end_rowid;"
                                ],
                                "jdbcUrl": [
                                    "$source_db_conn"
                                ]
                            }
                        ],
                        "fetchSize": 1024
                    }
                },
				"writer": {
                    "name": "$target_reader",
                    "parameter": {
                        "username": "$target_db_user",
                        "password": "$target_db_pwd",
        				"session": [],
        				"preSql": [],
                        "column": ["*"],
                        "connection": [
                            {
                                "table": [
                                    "$target_table_name"
                                ],
				"jdbcUrl": "$target_db_conn"
                            }
                        ]
                    }
                }
            }
        ]
    }
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值