前言:在使用datax抄写数据的时候,需要将源端的用户权限最小化,比如,只需要抄写T1表,那么我只将T1表的SELECT权限授权给dataxuser用户
1.在源端创建用户并授权
SQL> show pdbs;
SQL> alter session set container=hbhe;
SQL> select count(*) from hbhe.T1
COUNT(*)
----------
100
SQL> create user dataxuser identified by wwwwww;
SQL> grant connect, resource to dataxuser;
SQL> grant select on HBHE.T1 to datauser;
SQL> alter user dataxuser identified by passw0rd;
2.编写oracle to oracle的json文件
{
"job": {
"content": [
{
"reader": {
"name": "oraclereader",
"parameter": {
"connection": [
{
"jdbcUrl": ["jdbc:oracle:thin:@IP:PORT/dbname"],
"querySql": ["select * FROM schema.table where 1=1"],
}
],
"password": "password",
"username": "username"
}
},
"writer": {
"name": "oraclewriter",
"parameter": {
"column": ["*"],
"batchWriteCount": "10000",
"connection": [
{
"jdbcUrl": "jdbc:oracle:thin:@IP:Port/dbname",
"table": ["schema.table"]
}
],
"password":"password",
"preSql": ["truncate table schema.table"],
"username":"username"
}
}
}
],
"setting": {
"speed": {
"channel": "36",
}
}
}
}
3.这里有个乌龙,将preSql写成postSql,导致执行datax后,日志显示已经抄写完成,但是目标端的数据一直是空的。
在datax官网找到答案:
https://github.com/alibaba/DataX/blob/master/postgresqlwriter/doc/postgresqlwriter.md
postSql
描述:写入数据到目的表后,会执行这里的标准语句。(原理同 preSql )
必选:否
默认值:无
preSql
描述:写入数据到目的表前,会先执行这里的标准语句。如果 Sql 中有你需要操作到的表名称,请使用 @table 表示,这样在实际执行 Sql 语句时,会对变量按照实际表名称进行替换。比如你的任务是要写入到目的端的100个同构分表(表名称为:datax_00,datax01, … datax_98,datax_99),并且你希望导入数据前,先对表中数据进行删除操作,那么你可以这样配置:”preSql”:[“delete from @table”],效果是:在执行到每个表写入数据前,会先执行对应的 delete from 对应表名称
必选:否
默认值:无
4.编写脚本
#!/bin/sh
python /datax/bin/datax.py /datax/job/t1.json >> /datax/datax_shot.log 2>&1
5.将datax加入crontab -e中,每隔两小时一次
[dataxuser@test01 ~]$ crontab -l
* */2 * * * /datax/bin/fullSync.sh
版权声明:本文为博主原创文章,未经博主允许不得转载。
DATAX