--- name: "db-backup-enroll" description: "新建带库 agent 后核对每日 03:00 备份是否覆盖其库(backup-agent-dbs.sh 动态发现,无需改脚本)。" --- # DB Backup Enroll — 新 agent 的库是否已被每日备份覆盖 ## 目的 本地 Docker MySQL 有每日 03:00 自动备份(crontab + `/usr/local/bin/backup-agent-dbs.sh`)。新建带库 agent 后,**核对**其库已被自动覆盖;缺了就修根因,不要手工往脚本里塞库名。 ## 机制(2026-09-16 改造后,实测) | 项 | 内容 | |----|------| | 触发 | crontab:`0 3 * * * /usr/local/bin/backup-agent-dbs.sh` | | 目标发现 | **动态**:`agents.entries` 的 id ∩ MySQL 实际存在的库(排除 `mysql`/`information_schema`/`performance_schema`/`sys`) | | 备份方式 | `docker exec mysql mysqldump -uroot -p<从 .env 读> --single-transaction --routines --triggers --events ` | | 产物 | `workspace-/db/_.sql.gz` + `_latest.sql`;`main` 的目录是 `workspace`(无 `-` 后缀) | | 保留 | 30 天前的 `.sql.gz` 自动删除 | | 同步 | git add 各 `workspace-/db/`(`main` 的 `workspace/db/` 不纳入)→ commit → push Gitea | | 日志 | `workspace/db/backup.log` | | 凭据 | `.env` 的 `MYSQL_PWD_ROOT`(缺失时回退 `MYSQL_PWD`)、`PGPASSWORD`,由脚本内部读取 | > 旧版硬编码 `DB_MAP` 已废弃——脚本里只剩一句注释提到它。**不要再按「改三处名单(DB_MAP / 清理循环 / git add)」的旧流程操作**,那些循环现在都由动态 `TARGETS` 驱动。 ## 步骤 1. 确认库存在且归属正确:`~/.openclaw/scripts/db-conn.sh --sql "SELECT DATABASE()"` 返回 `` 才算通。 2. 确认 id 在配置里:`agents.entries` 含该 id。 - 用 `bash ~/.openclaw/scripts/new-agent.sh <中文名>` 建的 agent 两件事都会就位(建库 + 建号 + 授权 + 写 `.env` + 建 agent),此时**无需再动备份脚本**。 3. 核对覆盖情况:上次 03:00 之后看日志 ```bash tail -30 /home/yangxuan/.openclaw/workspace/db/backup.log ``` 日志应出现 `备份目标:... ...`,且该库有 `✅ MySQL -> ...` 行。 4. 目标里缺该库时,先修根因(库不存在 / id 不在 `agents.entries`),不要改脚本绕过。 5. 需要当天就见证而不等次日:执行一次备份脚本,再回看日志确认该库出现 `✅`(脚本会照常 git push,这是它设计内的行为)。 ## 红旗 - 备份脚本属 root:确有必要才 `sudo` 编辑,改前先 `sudo cp` 备份原件。 - 连接口令只在 `.env` / 脚本内部读取;**不要复制到命令参数、聊天或日志**。 - `docker exec` 容器名固定为 `mysql`;PostgreSQL 部分备份容器 `postgres` 的 `openclaw` 库,与本流程无关。 - 备份会自动 push 到 Gitea,属脚本设计的一部分,无需额外请示。 ## 相关文件 - 主脚本:`/usr/local/bin/backup-agent-dbs.sh` - 建 agent 入口:`/home/yangxuan/.openclaw/scripts/new-agent.sh` - 备份日志:`/home/yangxuan/.openclaw/workspace/db/backup.log`