雁过留声 发表于 2024-9-12 19:50:01

Datax数据迁移,MysqlToMysql使用自定义json的方式实现。

背景

   由于要进行mysql数据库以及表的重构,这里考虑使用datax进行数据的迁移。
留意:datax的迁移需要先有表布局。
DataX:介绍


[*] DataX是一个由阿里巴巴开源的离线数据同步工具,用于支持多种异构数据源之间的稳固高效数据同步。
[*] DataX采用了Reader-Writer框架设计,将复杂的同步链路简化为星型数据链路,使得差别数据源之间能够通过简单的插件接入实现无缝同步。这种设计不仅进步了同步服从,还低落了新数据源接入的难度。同时,DataX通过调度决策思绪,公道分配并发任务,确保了大规模数据同步的可靠性和稳固性。
[*] DataX的主要上风在于其插件化架构。通过将数据采集和写入抽象成Reader和Writer插件,并纳入到同步框架中,DataX可以灵活地扩展其支持的数据源范例。现在,DataX已经拥有较为全面的插件体系,包括主流的关系型数据库、NoSQL以及大数据计算体系等,这确保了其在数据同步领域的广泛应用。
在现实使用中,用户只需根据需要同步的数据源和目标,选择合适的Reader和Writer,并将设置信息定义在JSON文件中,即可通过简单下令提交数据同步任务。这种简便明白的操纵方式大大低落了用户的使用门槛,使得DataX成为很多企业进行数据迁移和同步的首选工具。
下载地点:
Datax下载地点
编写sql脚本

   作用:使用自定义的sql脚本实现对差别表的数据关联,然后通过自定义json 的方式实现数据的迁移。
例如(这些表是假设的):
重构前:现在有两张表
school_info:(id, ame, area)
student_info:(id, stu_no, school_id, name, sex, age)
重构后:
school_info:(id, name, area, code_id)
student_info:(id,stu_no, school_id, name, sex, age, creator, create_time, code_id)
–需求:student_info表的code_id要通过school_id关联school_info表的id更新对应的数据。
实现:
select t1.id,
           t1.stu_no,
           t1.school_id,
           t1.name,
           t1.sex,
           t1.age,
           null,-- 这里对应的是creator字段,可以根据需要进行修改
           now(), -- 当前时间。
           t2.code_id--更新的字段
from student_info t1
inner join school_info t2 on t1.school_id=t2.id;
python脚本

   由于会涉及很多表,所以编写一个python脚本,实现批量天生datax的json文件。这里通过将上述写的sql脚本放到txt文件中,通过python脚本读取txt文件,批量天生json文件。
可以根据自己需要进行修改。(这里仅供参考)
import json
import pymysql

import pymysql

# 数据库连接参数
db_config = {
    'host': '127.0.0.1',
    'port': 3306,
    'user': '****',
    'password': '****',
    'database': '*****'
}

# 连接到源数据库
connection = pymysql.connect(**db_config)

# 读取.txt文件,一行数据根据:切分为字典
def read_txt_file(file_path):
    with open(file_path, 'r',encoding='utf-8') as file:
      lines = file.readlines()
      return

tables = read_txt_file('sql.txt')

# 为每个表生成DataX的JSON配置
for table in tables:
    config = {
      "job": {
            "setting": {
                "speed": {
                  "channel": 1
                }
            },
            "content": [
                {
                  "reader": {
                        "name": "mysqlreader",
                        "parameter": {
                            "username": "****",
                            "password": "****",
                            "connection": [
                              {
                                    "querySql": [
                                        table
                                    ],
                                    "jdbcUrl": [
                                        "jdbc:mysql://127.0.0.1:3306/***?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=utf-8"
                                    ],
                              }
                            ]
                        }
                  },
                  "writer": {
                        "name": "mysqlwriter",
                        "parameter": {
                            "writeMode": "insert",
                            "username": "*****",
                            "password": "*******",
                            "column":[
                              "*"
                            ],
                            "connection": [
                              {
                                    "jdbcUrl": "jdbc:mysql://*****:****/*****?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=utf-8",
                                    "table": [
                                          table
                                    ]
                              }
                            ]
                        }
                  }
                }
            ]
      }
    }

    # 将配置写入JSON文件
    with open(f'{table}.json', 'w', encoding='utf-8') as f:
      json.dump(config, f, ensure_ascii=False, indent=4)

# 关闭数据库连接
connection.close()
txt文件格式
表名开头:冒号分隔,然后sql语句。
https://i-blog.csdnimg.cn/direct/602e7d75939d48baad6ff5c7d6f491bc.png
datax使用

将datax压缩包进行解压,然后到此目录(留意使用datax需要有python 的环境)
https://i-blog.csdnimg.cn/direct/049e17b1e5e14eb38f53e71a9e1aeb90.png
然后
通过打开cmd窗口,执行:大概会出现乱码的环境,如下进行修改。
出现乱码输入:CHCP 65001
python datax.py json文件
   扩展:
面临大量表的时间如果一个一个执行太麻烦,可以将全部的迁移文件放到一个shell脚本中,批量执行。框架如下:执行方式:脚本名称.sh all
#!/bin/bash
DATAX_HOME=D:/DataX/datax/datax

#数据同步
#参数:arg1-datax 配置文件路径;arg2-源数据所在路径
import_data() {
python $DATAX_HOME/bin/datax.py$1
}

case $1 in

"all")
import_data student_info.json
;;
esac

小结

大概会遇到某些问题,sql进行关联的时间,由于字符编码不一样就会导致报错。解决办法先看一下关联表的字符编码是否统一。
(这只是本人所能想到的方法,如果有错误望大佬指点)

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Datax数据迁移,MysqlToMysql使用自定义json的方式实现。