通过datax批量从oracle迁移数据到oracle
程序员文章站
2022-07-13 08:46:49
...
项目背景
https://blog.csdn.net/weixin_41561946/article/details/106957890
说明
1、datax软件已经在/home/oracle目录下安装好
2、将oracle_to_oracle_sigle.sh放在/home/oracle/datax/script下
3、将oracle_to_oracle.json放在/home/oracle/datax/job
4、将table_name.txt放在/home/oracle/datax/job
shell脚本
#!/bin/bash
#function:
#version:0.3
#author:lineqi
#crt_time:2020-04-26
#迁移思路
#1、查询需要同步的表生成格式为schema.table_name:schema.table_name,该步骤先通过手动实现
#第一个schema为源库中的schema,第二个schema为目标库中的schema
#2、将第一步生成好的配置文件存放在table_name.txt中
#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='/home/oracle/datax/job/table_name.txt'
v_exec_command='/home/oracle/datax/bin/datax.py'
v_path_json='/home/oracle/datax/job/oracle_to_oracle.json'
v_path_log='/home/oracle/datax/log/'
#定义常用参数
let v_split_num=60000
let v_start_num=0
let v_end_num=0
v_source_table_name=''
v_target_table_name=''
v_sync_start_time=`date -d "today" +"%Y-%m-%d-%H-%M-%S"`
#定义源数据库的连接方式
v_gbase_user='user'
v_gbase_pwd='password'
v_gbase_conn='jdbc:oracle:thin:@xx.xx.xx.xx:1521:实例名'
v_gbase_reader='oraclereader'
#定义目标数据库的连接方式
v_mysql_user='user'
v_mysql_pwd='password'
v_mysql_reader='oraclewriter'
v_mysql_conn='jdbc:oracle:thin:@xx.xx.xx.xx:11521:实例名'
#从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_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} \
-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
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",
"column": ["*"],
"connection": [
{
"table": [
"$source_table_name"
],
"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"
}
]
}
}
}
]
}
}
表配置文件
SOURCE_SCHEMA.TABLE_NAME:TARGET_SCHEMA.TABLE_NAME
说明:
SOURCE_SCHEMA源库的schema名
TABLE_NAME源库的表名,正常情况与目标库的表名一致
TARGET_SCHEMA目标库的schema名
以上格式的配置内容同步sql语句生成即可。
总结:
1、datax的配置文件模板是从gbase到mysql同步模板拷贝过来的,所以有些参数没有改
2、批量同步适合小表,这里一次性同步了70多张小表,每张表不到20万条记录,90秒同步一个表,与用kettle 同步的所用时间差不多。
3、同步时需要注释源库和目录库的字符集问题,这里源库与目标库是一致的,所以在#定义数据库的连接方式时,并没有指定字符集
推荐阅读
-
Oracle数据库从入门到精通 多表查询知识以及范例
-
通过创建SQLServer 2005到 Oracle10g 的链接服务器实现异构数据库数据转换方案
-
Oracle数据库从入门到精通 单行函数问题
-
Oracle数据库Schema快速从测试环境迁移到生产环境的方法
-
Oracle数据库从入门到精通 多表查询知识以及范例
-
通过datax批量从oracle迁移数据到oracle
-
记一次从TXT文件导入数据到Oracle数据库的经历
-
Oracle数据库从入门到精通-分组统计查询
-
使用pyspark模仿sqoop从oracle导数据到hive的主要功能(自动建表,分区导入,增量,解决数据换行符问题)
-
从oracle11g导数据到oracle 10g导数据,遇到的bug和解决办法