IT评测·应用市场-qidao123.com技术社区
标题:
Datax数据迁移,MysqlToMysql使用自定义json的方式实现。
[打印本页]
作者:
雁过留声
时间:
2024-9-12 19:50
标题:
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 [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进行关联的时间,由于字符编码不一样就会导致报错。解决办法先看一下关联表的字符编码是否统一。
(这只是本人所能想到的方法,如果有错误望大佬指点)
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/)
Powered by Discuz! X3.4