下文应用场景。
系统:centos 7
python:python 2.7.5
java:jdk1.8.0_341/1.8.0_172
由sql server 2008 向 mysql 8.0.30 全量同步
以下示例经过测试从sql server读取1.5亿+数据,并进行分库分表写入mysql。速度在3/4W条每秒左右,但执行一段时间后速度变慢,原因待查。
2022年12月14日 补充
不适用screen也可,可以使其后台运行,如下命令
nohup /opt/datax/bin/datax.py /opt/datax/job/你的job.json > /opt/datax/输出的日志.out 2>&1 &
或者可以调整堆栈大小
nohup /opt/datax/bin/datax.py --jvm=“-Xms4G -Xmx4G” /opt/datax/job/你的job.json > /opt/datax/输出的日志.out 2>&1 &
下文示例为将数据全量一次性迁移,所以不开启CDC也可。
datax依赖于python于java环境,需要检查当前系统环境是否匹配。
因java安全参数设置问题(与java判断有关),如果是==
1.8.0_172
可以忽略此步骤(直接进入2)==,如果大于此版本请按照本文描述进行修改。
查看环境变量指向java目录(此处仅列举 通过源码 指定jdk环境的方式,如果是rpm安装请自行参照其安装说明找到jdk目录(或jre))
cat /etc/profile
通过以上命令找到java环境执行目录,如
vim /usr/local/java8/jre/lib/security/java.security
修改 {java_home}/jre/lib/security/java.security 文件
修改jdk.tls.disabledAlgorithms
参数
删除\3DES_EDE_CBC\
,或修改为以下内容
jdk.tls.disabledAlgorithms=SSLv3,RC4, DES, MD5withRSA, \
DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, \
include jdk.disabled.namedCurves
经过测试,datax版本(2022/10)支持python2(有其他看法或反对请提出,此处不太严谨)。需要对 /usr/lib/
下python命令直接软链接至python2。
例如:
ln -s /usr/local/python2/python /usr/bin/python
下载并解压
datax官方下载,此下载链接为下载最近版datax,链接摘自https://github.com/alibaba/DataX/。
将tar.gz包放至/opt/datax/
下并解压。
删除某些文件
rm -rf /opt/datax/dataz/plugin/*/._*
修改数据源头,使sql server开启CDC功能(进入sql server 命令行界面)
命令参考
-- 查看已启用cdc的数据库
SELECT name,is_cdc_enabled FROM sys.databases WHERE is_cdc_enabled = 1;
-- 查看已开启cdc的表
SELECT name,is_tracked_by_cdc FROM sys.tables WHERE is_tracked_by_cdc = 1;
# 启用数据库cdc
EXECUTE sys.sp_cdc_enable_db;
# 禁用数据库cdc
EXECUTE sys.sp_cdc_disable_db;
# 启用表cdc
EXEC sys.sp_cdc_enable_table
@source_schema = 'schema_name',
@source_name = 'table_name',
@role_name = NULL
# 不需要控制权限,则role_name为NULL
# 禁用表cdc
EXEC sys.sp_cdc_disable_table
@source_schema = 'schema_name',
@source_name = 'table_name',
@capture_instance = 'cdc.change_tables中capture_instance字段'
新增自己的job
在/opt/datax/job
目录下新建自己的任务,如
下文为 sql server 2008 -> mysql 8.0.30
官方说最新版已经支持写入mysql8。具体在写入mysql8中遇到很多问题(无法创建连接之类的)。
touch 你的job文件.json
{
"job": {
"setting": {
"speed": {
"channel": "16"
},
"errorLimit": {
"record": 0
}
},
"content": [
{
"reader": {
"name": "sqlserverreader",
"parameter": {
"username": "账号",
"password": "密码",
"fetchSize": "4096",
"where": "",
"connection": [
{
"querySql": [
"同步的字段查询的sql 如 select * from tableName"
],
"jdbcUrl": [
"jdbc:sqlserver://sql server ip:1433;DatabaseName=名称"
]
}
]
}
},
"writer": {
"name": "mysqlwriter",
"parameter": {
"writeMode": "insert",
"username": "数据库用户名",
"password": "数据库密码",
"batchSize": "4096",
"column": [
"你的字段"
],
"session": [
"set session sql_mode='ANSI'"
],
"connection": [
{
"jdbcUrl": "jdbc:mysql://你的数据库ip:3306/你的数据库端口?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8",
"table": [
"数据库的表名"
]
}
]
}
}
}
]
}
}
/opt/datax/bin/datax.py --jvm="-Xms3G -Xmx3G" /opt/datax/job/你的job文件.json
因datax运行大部分是以前台方式运行,即 声明周期为当前session,如果断开连接,datax任务即刻终止。所以建议采用screen来管理session
centos系统可以直接使用sudo yum install screen -y
来进行安装
# 创建一个会话,并指定名字 unique_name 为指定名称 并进入该会话
screen -S unique_name
# 列出活动的会话
screen -ls
# 从正在运行的会话中分离,使其在后台运行 Ctrl+a d(即按住Ctrl,依次再按a,d)
Control + A/a + D/d
# 恢复会话 unique_name 为指定名称
screen -r unique_name
# 退出会话 -r恢复会话或在创建时进入 使用以下命令退出会话(并删除)
exit
使用此web界面管理工具可以简单高效的配置datax任务。
gitee开源项目https://gitee.com/WeiYe-Jing/datax-web
请参考https://github.com/WeiYe-Jing/datax-web/blob/master/doc/datax-web/datax-web-deploy.md进行安装部署。
本文展示了sql server 的读,以及mysql的写,其他数据库支持范围可以参考如下(以下表格摘自datax官网):
或自行到官网https://github.com/alibaba/DataX在github目录下各个文件名均代表其作用。每个目录下均有 doc/***reader.md,markdown文档内均含参数说明。
类型 | 数据源 | Reader(读) | Writer(写) | 文档 |
---|---|---|---|---|
RDBMS 关系型数据库 | MySQL | √ | √ | 读 、写 |
Oracle | √ | √ | 读 、写 | |
OceanBase | √ | √ | 读 、写 | |
SQLServer | √ | √ | 读 、写 | |
PostgreSQL | √ | √ | 读 、写 | |
DRDS | √ | √ | 读 、写 | |
Kingbase | √ | √ | 读 、写 | |
通用RDBMS(支持所有关系型数据库) | √ | √ | 读 、写 | |
阿里云数仓数据存储 | ODPS | √ | √ | 读 、写 |
ADS | √ | 写 | ||
OSS | √ | √ | 读 、写 | |
OCS | √ | 写 | ||
Hologres | √ | 写 | ||
AnalyticDB For PostgreSQL | √ | 写 | ||
阿里云中间件 | datahub | √ | √ | 读 、写 |
SLS | √ | √ | 读 、写 | |
阿里云图数据库 | GDB | √ | √ | 读 、写 |
NoSQL数据存储 | OTS | √ | √ | 读 、写 |
Hbase0.94 | √ | √ | 读 、写 | |
Hbase1.1 | √ | √ | 读 、写 | |
Phoenix4.x | √ | √ | 读 、写 | |
Phoenix5.x | √ | √ | 读 、写 | |
MongoDB | √ | √ | 读 、写 | |
Cassandra | √ | √ | 读 、写 | |
数仓数据存储 | StarRocks | √ | √ | 读 、写 |
ApacheDoris | √ | 写 | ||
ClickHouse | √ | 写 | ||
Hive | √ | √ | 读 、写 | |
kudu | √ | 写 | ||
无结构化数据存储 | TxtFile | √ | √ | 读 、写 |
FTP | √ | √ | 读 、写 | |
HDFS | √ | √ | 读 、写 | |
Elasticsearch | √ | 写 | ||
时间序列数据库 | OpenTSDB | √ | 读 | |
TSDB | √ | √ | 读 、写 | |
TDengine | √ | √ | 读 、写 |
在DataX内部对每个Channel会有严格的速度控制,分两种,一种是控制每秒同步的记录数,另外一种是每秒同步的字节数,默认的速度限制是1MB/s,可以根据具体硬件情况设置这个byte速度或者record速度
"core":{
"transport":{
"channel":{
"speed":{
"channel": 2, ## 此处为数据导入的并发度,建议根据服务器硬件进行调优
"record":-1, ##此处解除对读取行数的限制
"byte":-1, ##此处解除对字节的限制
"batchSize":2048 ##每次读取batch的大小
}
}
}
}
https://blog.csdn.net/WANTAWAY314/article/details/112947868
https://github.com/alibaba/DataX
https://github.com/alibaba/DataX/issues/1005
https://xiaozhuanlan.com/topic/7860594132