Files
knowledge-governance/scripts/wiki_cleanup_backup.sh
姚章浩 e1c5f6895a
build / build (push) Failing after 21s
chore(deploy): 部署与备份脚本、示例配置与忽略规则
- 新增 scripts/deploy-api-web.sh(API/Web 构建发布)与 scripts/wiki_cleanup_backup.sh(wiki 清理前备份)
- 更新 .env.example、compose.yaml 与 README 说明;忽略 /spool/ingestion 运行期产物
2026-09-30 10:54:07 +08:00

62 lines
4.9 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env bash
# 清理前备份:把待删知识库/平台记录导出成可回滚的文件(只读,不删任何东西)
# 用法:bash scripts/wiki_cleanup_backup.sh [目标目录]
set -uo pipefail
cd "$(dirname "$0")/.."
OUT=${1:-backups/wiki-cleanup-$(date +%Y%m%d-%H%M%S)}
mkdir -p "$OUT"; chmod 700 "$OUT"
PDB=knowledge-governance-p1-postgres-1
SDB=WKNFull-postgres
echo "### 1. 平台库(治理)全量数据备份"
docker exec $PDB pg_dump -U governance -d governance --data-only --no-owner \
-t test_publications -t source_items -t source_item_versions -t routing_kb_bindings \
-t processing_confirmations -t acceptance_results -t job_failures -t content_objects -t jobs \
> "$OUT/platform-data.sql" 2>"$OUT/platform-dump.err" && echo " platform-data.sql $(wc -l < "$OUT/platform-data.sql") 行" || cat "$OUT/platform-dump.err"
echo "### 2. 源端本地 WeKnora 全量数据备份(知识库/文档/分片/wiki/解析跨度)"
docker exec $SDB pg_dump -U weknora -d weknora_full --data-only --no-owner \
-t knowledge_bases -t knowledges -t chunks -t wiki_pages -t wiki_folders \
-t knowledge_processing_spans -t task_dead_letters \
> "$OUT/source-weknora-data.sql" 2>"$OUT/source-dump.err" && echo " source-weknora-data.sql $(wc -l < "$OUT/source-weknora-data.sql") 行" || cat "$OUT/source-dump.err"
echo "### 3. 目标端(测试服 RDS)本次测试库的行备份"
docker run --rm --network host --env-file /tmp/target_pg.env postgres:16-alpine \
pg_dump --data-only --no-owner \
-t knowledges -t chunks -t wiki_pages -t wiki_folders \
> "$OUT/target-testrows-data.sql" 2>"$OUT/target-dump.err" && echo " target-testrows-data.sql $(wc -l < "$OUT/target-testrows-data.sql") 行(全表,含真实库行,只作参照)" || cat "$OUT/target-dump.err"
echo "### 4. 归档 bundle 卷备份"
docker run --rm --user 0:0 -v knowledge-governance-release-bundles:/b -v "$PWD/$OUT":/out alpine:3.20 \
sh -c "cd /b && tar czf /out/release-bundles.tgz ." && echo " release-bundles.tgz $(du -h "$OUT/release-bundles.tgz" | cut -f1)"
echo "### 5. 清单(人读)"
{
echo "# 清理前清单 $(date -Iseconds)"
echo; echo "## 源端知识库"
docker exec $SDB psql -U weknora -d weknora_full -At -P pager=off -c \
"with d as (select kb.id, kb.name, kb.indexing_strategy->>'wiki_enabled' w, (select count(*) from knowledges k where k.knowledge_base_id=kb.id and k.deleted_at is null) docs, (select count(*) from wiki_pages p where p.knowledge_base_id=kb.id) wp from knowledge_bases kb where kb.deleted_at is null) select id||' | '||name||' | docs='||docs||' | wiki_pages='||wp||' | wiki_on='||coalesce(w,'null') from d order by docs desc"
echo; echo "## 平台记录"
docker exec $PDB psql -U governance -d governance -At -P pager=off -c \
"select 'test_publications='||(select count(*) from test_publications)||' (1b52c140='||(select count(*) from test_publications where test_kb_id='1b52c140-2e18-4676-afc5-4c7d8d190a8c')||')'||' jobs='||(select count(*) from jobs)||' processing_confirmations='||(select count(*) from processing_confirmations)||' acceptance_results='||(select count(*) from acceptance_results)||' job_failures='||(select count(*) from job_failures)||' content_objects='||(select count(*) from content_objects)||' source_items='||(select count(*) from source_items)||' catalog_nodes='||(select count(*) from source_catalog_nodes)"
echo; echo "## 目标端知识库"
docker run --rm --network host --env-file /tmp/target_pg.env postgres:16-alpine psql -At -P pager=off -c \
"select kb.id||' | '||kb.name||' | docs='||(select count(*) from knowledges k where k.knowledge_base_id=kb.id and k.deleted_at is null)||' | wiki_pages='||(select count(*) from wiki_pages p where p.knowledge_base_id=kb.id) from knowledge_bases kb where kb.deleted_at is null order by 3 desc"
echo; echo "## 归档 bundle 卷"
docker run --rm --user 0:0 -v knowledge-governance-release-bundles:/b alpine:3.20 sh -c 'for d in /b/*/; do echo "$(basename $d) files=$(ls $d | wc -l)"; done'
} > "$OUT/INVENTORY.md" 2>&1
echo " INVENTORY.md $(wc -l < "$OUT/INVENTORY.md") 行"
cat > "$OUT/ROLLBACK.md" <<'EOF'
# 回滚说明(删了之后想恢复)
1. 平台记录:`docker exec -i knowledge-governance-p1-postgres-1 psql -U governance -d governance < platform-data.sql`
(先确认目标表为空,否则会主键冲突;这是 INSERT 回放,不是幂等 upsert)
2. 源端 WeKnora 知识库/文档/wiki:`docker exec -i WKNFull-postgres psql -U weknora -d weknora_full < source-weknora-data.sql`
注意:这只是把行写回 DB,**不会**重建解析产物/检索索引;恢复后需要对该库重跑解析。
更干净的路子是从钉钉来源目录重新扫描导入(source_items 191 项仍在)。
3. 归档 bundle:`docker run --rm -u 0:0 -v knowledge-governance-release-bundles:/b -v <本目录>:/in alpine:3.20 sh -c 'cd /b && tar xzf /in/release-bundles.tgz'`
EOF
echo " ROLLBACK.md 已写"
echo
echo "备份目录:$OUT"
ls -la "$OUT"