#!/usr/bin/env bash # 备份/快照的**目录契约**:任何一台扮演"目标库所在主机"的机器(现在的测试云主机、 # 未来的生产云主机、以及本地演练机)都跑这一份,得到同一套落点。 # # 为什么要统一:发布前的留档、整库逻辑备份、ES 快照仓、发布包归档分属不同脚本, # 一旦各自选路径,换主机时就要逐个改脚本,且"发布前快照"的门禁会指到错的地方。 # # 目录布局($KB_BACKUP_ROOT 底下): # target-kb-snapshots/-/ 发布/导入前的行级留档(PG 8 表 + ES 文档,小、随发布留) # rds-logical// 整库逻辑备份(pg_dump -Fd 目录格式,按天轮转) # es-snapshots/ Elasticsearch 共享仓库 kb_backup 的宿主目录 # logs/ 上述脚本的运行日志 # # 用法(在目标主机上): # bash backup_layout.sh # 建目录 + 落配置,打印现状 # KB_BACKUP_ROOT=/data/kb-backups bash backup_layout.sh # bash backup_layout.sh --print # 只打印契约,不动磁盘 # # 产出配置:/etc/knowledge-governance/backup.env(KB_BACKUP_ROOT=…),供各脚本 source。 set -euo pipefail KB_BACKUP_ROOT="${KB_BACKUP_ROOT:-/srv/kb-backups}" CONFIG_FILE="${CONFIG_FILE:-/etc/knowledge-governance/backup.env}" SUBDIRS=(target-kb-snapshots rds-logical es-snapshots logs) PRINT_ONLY=0 [ "${1:-}" = "--print" ] && PRINT_ONLY=1 echo "备份根目录: $KB_BACKUP_ROOT" echo "配置文件 : $CONFIG_FILE" echo "子目录 :" total_bytes=0 for sub in "${SUBDIRS[@]}"; do path="$KB_BACKUP_ROOT/$sub" if [ "$PRINT_ONLY" = "0" ]; then mkdir -p "$path" fi if [ -d "$path" ]; then usage="$(du -sh "$path" 2>/dev/null | cut -f1)" entries="$(find "$path" -mindepth 1 -maxdepth 1 -type d 2>/dev/null | wc -l)" printf ' %-20s %-6s %s 个子项\n' "$sub" "$usage" "$entries" else printf ' %-20s (未创建)\n' "$sub" fi done if [ "$PRINT_ONLY" = "1" ]; then echo "(--print:未改动磁盘)" exit 0 fi mkdir -p "$(dirname "$CONFIG_FILE")" cat >"$CONFIG_FILE" <