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

背景

由于要进行mysql数据库以及表的重构,这里考虑使用datax进行数据的迁移。
注意:datax的迁移需要先有表结构。

DataX:介绍

  1. DataX是一个由阿里巴巴开源的离线数据同步工具,用于支持多种异构数据源之间的稳定高效数据同步。

  2. DataX采用了Reader-Writer框架设计,将复杂的同步链路简化为星型数据链路,使得不同数据源之间能够通过简单的插件接入实现无缝同步。这种设计不仅提高了同步效率,还降低了新数据源接入的难度。同时,DataX通过调度决策思路,合理分配并发任务,确保了大规模数据同步的可靠性和稳定性。

  3. 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 [line.strip().split(':') for line in lines]

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[1]
                                    ],
                                    "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[0]
                                    ]
                                }
                            ]
                        }
                    }
                }
            ]
        }
    }

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

# 关闭数据库连接
connection.close()

txt文件格式
表名开头:冒号分隔,然后sql语句。
在这里插入图片描述

datax使用

将datax压缩包进行解压,然后到此目录(注意使用datax需要有python 的环境)
在这里插入图片描述
然后
通过打开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进行关联的时候,由于字符编码不一样就会导致报错。解决办法先看一下关联表的字符编码是否统一。
(这只是本人所能想到的方法,如果有错误望大佬指点)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值