基于DataX将数据从Sqlserver同步到Oracle
DataX是阿里云推出的一款开源的ETL工具,通过配置json文件实现不同数据库之间的数据同步。先有需求是从Sqlserver同步数据到Oracle,网上关于DataX的介绍很多。
框架设计
DataX本身作为离线数据同步框架,采用Framework + plugin架构构建。将数据源读取和写入抽象成为Reader/Writer插件,纳入到整个同步框架中。
Reader:Reader为数据采集模块,负责采集数据源的数据,将数据发送给Framework。
Writer: Writer为数据写入模块,负责不断向Framework取数据,并将数据写入到目的端。
Framework:Framework用于连接reader和writer,作为两者的数据传输通道,并处理缓冲,流控,并发,数据转换等核心技术问题。
实践
1.环境
datax不需要安装,直接解压缩可用,但要先部署JDK环境和python环境。这里只说配置python环境时遇到的问题,python使用的是2.7.版本,python也是免安装版,直接配好环境变量即可。在配置python环境时,遇到“无法启动此程序 因为计算机中丢失python27.dll"报错,下载python27.dll,将其扔到System32和SysWOW64中可解决问题。
2.Sqlserver同步数据到Oracle
{
"job": {
"content": [
{
"reader": {
"name": "sqlserverreader",
"parameter": {
"column":["id",
"accid",
"accno",
"ismainacc",
"parentid",
"bindname",
"opentime",
"endtime",
"matuday",
"recordtime",
"isquery",
"remark",
"lastupdateuser",
"lastupdatetime"
],
"connection": [
{
"jdbcUrl": ["jdbc:sqlserver://{ip}:{端口号};DatabaseName=ReportServer$SQLEXPRESS"],//sqlserver数据库连接,注意端口号和数据库名
"table":["b2edb.dbo.BOE_ACCOUNT"]//sqlserver的表名
}
],
"password": "123456789",
"username": "sa",//登陆Sqlserver数据库的账号密码
}
},
"writer": {
"name": "oraclewriter",
"parameter": {
"username":"BOCZBT",
"password":"BOCZBT",//Oracle数据库的登陆名和密码
"column": ["id",
"accid",
"accno",
"ismainacc",
"parentid",
"bindname",
"opentime",
"endtime",
"matuday",
"recordtime",
"isquery",
"remark",
"lastupdateuser",
"lastupdatetime"
],
"connection": [
{
"jdbcUrl": "jdbc:oracle:thin:@{ip}:{端口号}:imsdev",//oracle数据库的连接串
"table": ["BOE_ACCOUNT"]//Oracle表
}
]
}
}
}
],
"setting": {
"speed": {
"channel": "1"
}
}
}
}
在实际操作中遇到了一些问题,记录如下:
1).执行是在Dos窗口中进入Datax的bin目录下执行,一般我们通过cmd命令默认在C盘下,更改盘符,进入datax的bin目录。
2).开始执行时,没有报错,没有日志,也没有同步成功,检查执行文件名是否有空格,保存的json文件有空格造成了执行没成功。
3).文件名称没有问题后,日志报错信息为Datax无法连接对应的数据库,并提示是Sqlserver连接有误,查看Sqlserver的连接IP,端口号,数据库名等是否正确。Sqlserver是傻瓜式安装,查看端口号为动态端口号,修改了端口号为1344,具体修改方法是:打开Sqlserver配置管理器-----SQL Server网络配置----SQLEXPRESS的协议(我的数据库实例是SQLEXPRESS)----TCP/IP,将状态改为已启用,右键属性,修改IPALLA的TCP端口为1433,应用,重启数据库服务。可利用存储过程exec sys.sp_readerrorlog 0,1,'listening'查看端口号。
4).开始在writer中写了”writeMode“:"insert",结果报”写入模式(writeMode)配置错误。因为Oracle不支持配置项writeMode:insert,Oracle只能使用insert sql插入数据,请检查您的配置并做出修改“。将”writeMode“:"insert"删掉。
5).sqlserver和oracle连接串的格式都有固定的样式,而且有的需要有[ ],可以通过向streamwriter写入打印的方式查看是否连接成功。
{
"job": {
"content": [
{
"reader": {
"name": "oraclereader",
"parameter": {
"column":["id",
"accid",
"accno",
"ismainacc",
"parentid",
"bindname",
"opentime",
"endtime",
"matuday",
"recordtime",
"isquery",
"remark",
"lastupdateuser",
"lastupdatetime"
],
"connection": [
{
"jdbcUrl": ["jdbc:oracle:thin:@{ip}:{端口号}:imsdev"],//oracle服务器IP&端口号
"table":["BOE_ACCOUNT"]
}
],
"password": "BOCZBT",
"username": "BOCZBT",
}
},
"writer": {
"name": "streamwriter",
"parameter": {
"encoding":"UTF-8",
"print":true
}
}
}
],
"setting": {
"speed": {
"channel": "5"
}
}
}
}
关于datax的介绍参考
https://blog.csdn.net/u011410529/article/details/74352549