教你如何实现数据压缩打包,云存储上传,链接推送全流程自动化通知

迭代数据迁移功能,支持表结构迁移、数据下载链接消息推送功能。实现**数据压缩打包,云存储上传,链接推送全流程自动化通知.**

导数到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)

这段代码主要处理数据同步后的文件打包、上传和清理操作。让我逐步解释:

  1. 文件打包部分

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 确保有足够的权限

  1. 文件权限修改

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)
  • 如果打包失败,记录警告日志

  • 如果打包成功,修改文件所有权为当前用户

  1. 上传到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存储

  • 获取文件的下载链接

  1. 清理临时文件

# 删除临时tar文件
os.system(f"sudo rm -f {tar_file}")
# 删除原始结果文件
delete_file = f"sudo rm -rf {result_file}"
(status4, details4) = subprocess.getstatusoutput(delete_file)
  • 删除临时创建的tar文件

  • 删除原始的结果文件

  1. 日志记录

# 记录上传结果
add_operate_log(title="upload_result", content={'status': 'success', 'message': '文件上传成功'})
# 记录清理结果
add_operate_log(title="clean_result", content={'status': 'success', 'message': 'clean done'})
  • 记录每个操作的结果状态

  • 包括成功和失败的情况

主要功能:

  1. 文件打包:将同步结果打包成tar.gz格式

  2. 文件上传:将打包后的文件上传到S3存储

  3. 权限管理:确保文件权限正确

  4. 清理工作:删除临时文件

  5. 日志记录:记录每个步骤的执行结果

错误处理:

  1. 打包失败的处理

  2. 上传失败的处理

  3. 清理失败的处理

安全考虑:

  1. 使用sudo确保有足够的权限

  2. 修改文件所有权为当前用户

  3. 使用唯一的文件名避免冲突

这段代码主要用于数据同步后的文件处理,确保用户可以方便地下载同步结果,同时保持系统整洁。

你这段代码在使用 sudo 执行 tarchown,这是因为在 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 的方式,前提是系统权限允许?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值