DATAX异构数据库迁移

182 阅读2分钟

datax有自带的reader和weiter模板
reader模板:datax/plugin/reader/
writer模板:datax/plugin/writer/

合并模板:
python3 /data/tools/datax_2024920/bin/datax.py -r sqlserverreader -w mysqlwriter  > /data/tools/datax_2024920/job/sqlserver2mysql.json

json解释

{
        "job": {
                "content": [{
                        "reader": {
                                "name": "sqlserverreader",
                                "parameter": {
                                        "username": "1",--用户名
                                        "password": "11111",---密码
                                        "column": ["*"],--字段
                                        "connection": [{
                                                "table": ["$readTable"],---表名
                                                "jdbcUrl": ["jdbc:sqlserver://IP:端口;DatabaseName=库名"]
                                        }],
                                        "fetchSize": 20000   ---单次读取数量
                                }
                        },
                        "writer": {
                                "name": "mysqlwriter",
                                "parameter": {
                                        "username": "1",--用户名
                                        "password": "1",---密码
                                        "writeMode": "insert",---写入模式
                                        "column": ["*"],---字段
                                        "connection": [{
                                                "jdbcUrl": "jdbc:mysql://IP:端口/库名",
                                                "table": ["$writeTable"]-----表名
                                        }],
                                        "batchSize":20000, ---单次写入数量
                                        "ignoreTagsUnmatched": false  -----源表和目标表的字段不匹配,写入停止并报错
                                }
                        }
                }],
                "setting": {
                        "speed": {
                                "channel": "64"  ----并发
                        }
                }
        }
}

writeMode支持的参数:

  1. insert:这是默认模式,DataX会使用insert into语句将数据插入到目标表中。如果遇到主键或唯一索引冲突,将会报错。
  2. replace:在这种模式下,如果存在重复的记录(基于主键或唯一索引),DataX会使用replace into语句替换掉原有的记录。这在MySQL中是可行的,但在其他数据库中可能需要使用不同的语法。
  3. update:在update模式下,DataX会使用INSERT INTO ... ON DUPLICATE KEY UPDATE语句(MySQL)或者相应的语法(其他数据库)来更新那些已经存在的记录。如果记录不存在,则会插入新记录。这种模式在MySQL中使用,并且需要指定更新的列。
  4. append:这种模式下,DataX会将数据添加到文件的末尾,主要用于写入HDFS等文件系统。
  5. truncate:在写入之前,DataX会清空表中的所有数据,然后写入新数据。
启动: python3 /data/tools/datax_2024920/bin/datax.py  /data/tools/datax_2024920/job/sqlserver2mysql.json

MySQL内字段类型:datetime--精确到秒

SQL server字段类型:datetime---精确到毫秒

写入的时候没有报错,影响数据精度。

字段不匹配,所有数据不会导入(读取字段为浮点数导入整数时,可正常导入为整数)

#每半小时同步一次的json
{
    "job": {
        "content": [{
            "reader": {
                "name": "sqlserverreader",
                "parameter": {
                    "username": "1",
                    "password": "11111",
                    "column": ["*"],
                    "connection": [{
                        "table": ["${readTable}"],
                        "jdbcUrl": ["jdbc:sqlserver://IP:端口;DatabaseName=库名"]
                    }],
                    "where": "时间字段 >= '${startTime}' AND 时间字段 < '${endTime}'",
                    "fetchSize": 20000
                }
            },
            "writer": {
                "name": "mysqlwriter",
                "parameter": {
                    "username": "1",
                    "password": "1",
                    "writeMode": "insert",
                    "column": ["*"],
                    "connection": [{
                        "jdbcUrl": "jdbc:mysql://IP:端口/库名",
                        "table": ["${writeTable}"]
                    }],
                    "batchSize": 20000,
                    "ignoreTagsUnmatched": false
                }
            }
        }],
        "setting": {
            "speed": {
                "channel": "64"
            }
        }
    }
}
#!/bin/bash
# 获取当前时间和30分钟前的时间
end=$(date +"%Y-%m-%d %H:%M:%S")
start=$(date --date='-30 minutes' +"%Y-%m-%d %H:%M:%S")

# 设置DataX路径
DATAX_HOME=/data/tools/datax_202409
# 设置jobs路径
JOBS_HOME=/data/tools/datax_202409/job

# 增量导入数据
python $DATAX_HOME/bin/datax.py -p "-DstartTime=$start" -p "-DendTime=$end" $JOBS_HOME/sqlserver2mysql.json
半小时执行一次任务
*/10 * * * * /data/tools/datax_202409/datax_sync.sh >> /data/tools/datax_202409/datax_sync_$(date +%Y-%m-%d_%H-%M-%S).log 2>&1