实战SOP:CodeArts用CF CLI做R2智能备份

举报
shuai1021 发表于 2026/11/06 00:39:17 2026/11/06
【摘要】 把D1数据库到R2的备份方案用自然语言告诉码道CodeArts,让它操作wrangler CLI完成R2桶创建、数据库导出、上传R2、定时备份脚本全流程。本文记录五步从手动到智能备份的过程,附恢复演练、免费额度、监控建议,给用AI Agent做数据备份自动化的人一个可复制路径。

背景:数据库备份这活儿,能不能交给AI Agent全自动

数据库备份是运维里最"知道要做但总忘"的事。手动备份靠人记着敲命令,定时任务靠写cron脚本,出了事才发现备份过期或没跑成功。Cloudflare的R2对象存储免费10GB,拿来存数据库备份正合适,但配wrangler CLI、设R2桶、写备份脚本、设定时任务……步骤不少。

这次换个做法:把整个备份方案用自然语言告诉码道CodeArts,让它操作wrangler CLI完成R2桶创建、D1数据库导出、上传R2、配置定时备份脚本。全程不用自己敲一条命令。本文记录完整过程,给想用AI Agent做数据备份自动化的人一个可复制路径。

方案:五步从手动到智能备份

整体流程

步骤 人工做的事 CodeArts做的事
1.说需求 描述数据库和备份策略 解析需求,规划执行步骤
2.创建R2桶 确认执行 用wrangler创建R2存储桶
3.导出数据库 无 用wrangler导出D1数据库为SQL文件
4.上传R2 无 将导出文件上传到R2桶,带时间戳命名
5.配定时任务 无 写备份脚本,配cron定时执行

第一步:用自然语言下指令

打开码道CLI,输入需求:

帮我配置D1数据库到R2的智能备份,要求:
1. R2桶名设为db-backups,如果不存在就创建
2. 导出D1数据库my-db的全部数据为SQL文件
3. 上传到R2,文件名带日期时间戳,如backup-20261106-0030.sql
4. 写一个备份脚本,能放到cron里每天凌晨3点自动跑
5. 最后手动跑一次验证备份文件确实在R2里

CodeArts收到后列了五步执行计划,每步标注要跑的wrangler命令和预期结果。

第二步:创建R2存储桶

# 检查R2桶是否已存在
wrangler r2 bucket list | grep db-backups

# 不存在则创建
wrangler r2 bucket create db-backups

# 验证
wrangler r2 bucket list

输出列表里出现db-backups,创建成功。这步如果手动做,得先查wrangler r2子命令的文档确认语法,CodeArts直接知道用wrangler r2 bucket create。

第三步:导出D1数据库

# 导出线上数据库为SQL文件
wrangler d1 export my-db --remote --output=backup-temp.sql

# 检查文件大小确认导出成功
ls -lh backup-temp.sql

CodeArts导出后检查了文件大小,确认不是空文件。这步有个关键参数--remote——不加的话导出的是本地模拟库,不是线上真实数据。手动做很容易漏这个参数,CodeArts在需求里看到"线上数据库"就自动加了。

第四步:上传到R2并带时间戳命名

# 生成带时间戳的文件名
TIMESTAMP=$(date +%Y%m%d-%H%M)
BACKUP_FILE="backup-${TIMESTAMP}.sql"

# 重命名并上传到R2
mv backup-temp.sql "$BACKUP_FILE"
wrangler r2 object put "db-backups/${BACKUP_FILE}" --file="$BACKUP_FILE"

# 验证文件在R2里
wrangler r2 object list db-backups --prefix="backup-"

CodeArts上传后用r2 object list确认文件出现在R2桶里,比手动做多了个验证步骤。时间戳命名的好处是每次备份不覆盖,按时间排列方便找历史版本。

第五步:写定时备份脚本

CodeArts生成一个完整的备份脚本:

#!/bin/bash
# D1到R2自动备份脚本
# 用法:放到crontab,每天凌晨3点执行
# cron示例: 0 3 * * * /path/to/backup-d1-to-r2.sh

DB_NAME="my-db"
BUCKET="db-backups"
TIMESTAMP=$(date +%Y%m%d-%H%M)
BACKUP_FILE="backup-${TIMESTAMP}.sql"
LOG_FILE="/var/log/d1-backup.log"

echo "[$(date)] 开始备份 $DB_NAME" >> "$LOG_FILE"

# 导出数据库
wrangler d1 export "$DB_NAME" --remote --output="$BACKUP_FILE" 2>> "$LOG_FILE"
if [ $? -ne 0 ]; then
  echo "[$(date)] 导出失败" >> "$LOG_FILE"
  exit 1
fi

# 上传到R2
wrangler r2 object put "${BUCKET}/${BACKUP_FILE}" --file="$BACKUP_FILE" 2>> "$LOG_FILE"
if [ $? -ne 0 ]; then
  echo "[$(date)] 上传失败" >> "$LOG_FILE"
  exit 1
fi

# 清理本地临时文件
rm -f "$BACKUP_FILE"

# 清理30天前的旧备份
CUTOFF=$(date -d '30 days ago' +%Y%m%d)
wrangler r2 object list "$BUCKET" --prefix="backup-" --json | \
  jq -r '.[] | select(.key < "backup-'$CUTOFF'") | .key' | \
  while read old_file; do
    wrangler r2 object delete "${BUCKET}/${old_file}"
  done

echo "[$(date)] 备份完成: ${BACKUP_FILE}" >> "$LOG_FILE"

脚本除了核心的导出+上传,还加了日志记录、失败退出码、30天自动清理旧备份。CodeArts把这些运维最佳实践一次性写进去了,手动写脚本很容易漏掉错误处理和旧备份清理。

实践要点

  1. wrangler登录态要持久:wrangler login的凭证存在用户目录下,cron任务以指定用户运行时能复用。但如果用Docker或CI环境,凭证可能不存在,需要用CLOUDFLARE_API_TOKEN环境变量替代。让CodeArts在脚本注释里写清楚两种登录方式的切换条件。

  2. 备份不等于可恢复:备份文件上传到R2只是第一步,定期做恢复演练才靠谱。建议让CodeArts再写一个restore-test脚本,从R2拉最新备份,导入到一个临时D1库,跑几条count查询确认数据完整,然后删掉临时库。每月跑一次,确保备份文件不是坏的。

  3. R2免费额度要算清:R2免费10GB存储+100万次A类操作(写)+1000万次B类操作(读)。每天一个SQL备份文件,大小取决于数据库规模。如果单库导出超过500MB,10GB只能存20天的备份——要么压缩再传,要么定期清理(脚本里已含30天清理),要么升R2付费计划。

  4. 导出大库要分时段:wrangler d1 export会锁表(虽然D1是SQLite,影响有限),大库导出可能要几分钟。凌晨3点是安全窗口,避开业务高峰。如果库特别大,考虑用D1的time-travel功能做时间点快照,而不是全量导出。

  5. 让CodeArts帮你做监控:光有备份脚本不够,还得知道脚本有没有正常跑。让CodeArts在脚本末尾加一行通知——比如用curl调一个Webhook,或者写一个标记文件到R2,配合简单的监控就能知道"今天备份到底跑没跑成功"。

小结

用CodeArts操作wrangler CLI做R2数据库备份,核心价值是让"备份方案设计"这件事从查文档拼脚本变成说需求。它一次性把R2桶创建、数据库导出、文件上传、定时脚本、旧备份清理、日志记录全做了,而且每步都带验证——不是"跑完命令就算成功",而是"确认结果符合预期才往下走"。

从效率看,手动配这套备份方案约30分钟(含查wrangler文档、写脚本、调试cron),用CodeArts约8分钟。差距主要在"不用反复查wrangler子命令语法"和"脚本一次写对不用调试"这两点上。更重要的是,CodeArts生成的脚本自带错误处理和日志,手动写的脚本往往第一次能跑就行,出错了才发现没加日志不知道哪步坏的。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。