背景
由于要进行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进行关联的时候,由于字符编码不一样就会导致报错。解决办法先看一下关联表的字符编码是否统一。
(这只是本人所能想到的方法,如果有错误望大佬指点)