迭代数据迁移功能,支持表结构迁移、数据下载链接消息推送功能。实现**数据压缩打包,云存储上传,链接推送全流程自动化通知.**
导数到Sit支持仅导出表结构
前端增加开关:仅表结构,默认关闭
后端dag:app/dag/mysql_sync_data_to_sit.py:mydumper增加--no-data参数
测试数据:原数据库base_dms_platform/dms_main_beta,目标库:base_dms / creat_db_test_4
导数到Sit支持下载
前端增加开关:通知下载链接,默认关闭
后端实现:
使用tar命令打包成一个文件
上传到s3:参考代码 res = default_cos_manage.get_secload_download_url(user_email, filename)
推送的卡片消息增加s3链接
问题mydumper版本兼容问题 0.10.0可以
1.新增导出表结构功能
1.1前端 新增开关 structure
<FormItem2 label="structure" name="structure" help="选中后只导出表结构,不导出表数据" > <Switch v-model="applyForm.structure" /> </FormItem2>
# 如果需要下载,打包并上传到S3 download_url = None if params.download: try: # 打包文件 tar_file = f"{result_file}.tar.gz" # 使用sudo创建tar文件 tar_cmd = f"sudo tar -czf {tar_file} -C {os.path.dirname(result_file)} {os.path.basename(result_file)}" (status5, details5) = subprocess.getstatusoutput(tar_cmd) if status5 != 0: add_operate_log(title="tar_result", content={'status': 'warning', 'message': f'打包文件失败: {details5}'}) logging.warning(f'打包文件失败: {details5}') else: # 使用sudo更改文件权限 chown_cmd = f"sudo chown {os.getuid()}:{os.getgid()} {tar_file}" subprocess.getstatusoutput(chown_cmd) # 上传到S3 filename = f"mysql_sync_data_to_sit/{params.source_cluster_name}_{params.source_db_name}2{params.target_cluster_name}_{params.target_db_name}_{time.time()}.tar.gz" with open(tar_file, 'rb') as f: default_cos_manage.upload_file_from_buffer(f.read(), filename) # 获取下载链接 download_url = default_cos_manage.get_secload_download_url('gaohongyu@xiaohongshu.com', filename) # 使用sudo删除临时tar文件 os.system(f"sudo rm -f {tar_file}") add_operate_log(title="upload_result", content={'status': 'success', 'message': '文件上传成功'}) except Exception as e: add_operate_log(title="upload_result", content={'status': 'warning', 'message': f'上传文件失败: {str(e)}'}) logging.warning(f'上传文件失败: {str(e)}') # 清理临时文件 delete_file = f"sudo rm -rf {result_file}" (status4, details4) = subprocess.getstatusoutput(delete_file) if status4 != 0: add_operate_log(title="clean_result", content={'status': 'warning', 'message': f'清理临时文件失败: {details4}'}) logging.warning(f'清理临时文件失败: {details4}') else: add_operate_log(title="clean_result", content={'status': 'success', 'message': 'clean done'}) # 使用os.makedirs创建目录 os.makedirs(parent_dir, exist_ok=True)
这段代码主要处理数据同步后的文件打包、上传和清理操作。让我逐步解释:
-
文件打包部分:
if params.download: try: # 创建tar.gz压缩文件 tar_file = f"{result_file}.tar.gz" # 使用sudo权限打包文件 tar_cmd = f"sudo tar -czf {tar_file} -C {os.path.dirname(result_file)} {os.path.basename(result_file)}" (status5, details5) = subprocess.getstatusoutput(tar_cmd)
-
如果用户选择了下载选项,开始打包文件
-
使用
tar
命令将结果文件压缩成.tar.gz
格式 -
使用
sudo
确保有足够的权限
-
文件权限修改:
if status5 != 0: # 打包失败的处理 add_operate_log(title="tar_result", content={'status': 'warning', 'message': f'打包文件失败: {details5}'}) else: # 修改文件所有权 chown_cmd = f"sudo chown {os.getuid()}:{os.getgid()} {tar_file}" subprocess.getstatusoutput(chown_cmd)
-
如果打包失败,记录警告日志
-
如果打包成功,修改文件所有权为当前用户
-
上传到S3:
# 生成唯一的文件名 filename = f"mysql_sync_data_to_sit/{params.source_cluster_name}_{params.source_db_name}2{params.target_cluster_name}_{params.target_db_name}_{time.time()}.tar.gz" # 上传文件 with open(tar_file, 'rb') as f: default_cos_manage.upload_file_from_buffer(f.read(), filename) # 获取下载链接 download_url = default_cos_manage.get_secload_download_url('gaohongyu@xiaohongshu.com', filename)
-
生成包含源和目标数据库信息的唯一文件名
-
将文件上传到S3存储
-
获取文件的下载链接
-
清理临时文件:
# 删除临时tar文件 os.system(f"sudo rm -f {tar_file}") # 删除原始结果文件 delete_file = f"sudo rm -rf {result_file}" (status4, details4) = subprocess.getstatusoutput(delete_file)
-
删除临时创建的tar文件
-
删除原始的结果文件
-
日志记录:
# 记录上传结果 add_operate_log(title="upload_result", content={'status': 'success', 'message': '文件上传成功'}) # 记录清理结果 add_operate_log(title="clean_result", content={'status': 'success', 'message': 'clean done'})
-
记录每个操作的结果状态
-
包括成功和失败的情况
主要功能:
-
文件打包:将同步结果打包成tar.gz格式
-
文件上传:将打包后的文件上传到S3存储
-
权限管理:确保文件权限正确
-
清理工作:删除临时文件
-
日志记录:记录每个步骤的执行结果
错误处理:
-
打包失败的处理
-
上传失败的处理
-
清理失败的处理
安全考虑:
-
使用sudo确保有足够的权限
-
修改文件所有权为当前用户
-
使用唯一的文件名避免冲突
这段代码主要用于数据同步后的文件处理,确保用户可以方便地下载同步结果,同时保持系统整洁。
你这段代码在使用 sudo
执行 tar
和 chown
,这是因为在 Linux 系统中,以 sudo
方式创建的文件默认属于 root
用户,而非当前运行 Python 程序的普通用户。
📌 场景解释:
1. sudo tar ...
的行为:
tar_cmd = f"sudo tar -czf {tar_file} ..."
这行命令是用 root 权限 创建了一个 .tar.gz
压缩包。
所以,
tar_file
的所属用户(owner)和组(group)都是root
。
2. sudo chown ...
的目的:
chown_cmd = f"sudo chown {os.getuid()}:{os.getgid()} {tar_file}"
你接着执行了 chown
命令,把 .tar.gz
文件的所有权改回当前用户。这样做的目的是:
-
避免后续操作(比如:读取、传输、删除该文件)被权限限制;
-
防止当前用户在后续操作中遇到
Permission denied
; -
保证非特权环境下的代码可以处理该压缩文件。
✅ 总结:为什么要更改文件权限?
因为你用 sudo
创建了文件,它默认属于 root
用户,如果不 chown
,你后续作为普通用户读取或删除这个文件可能会失败。
是否需要我帮你改成不使用 sudo
的方式,前提是系统权限允许?