diff --git a/DEMO_RUNBOOK.md b/DEMO_RUNBOOK.md index eb90253b8..c82690c54 100644 --- a/DEMO_RUNBOOK.md +++ b/DEMO_RUNBOOK.md @@ -5,8 +5,9 @@ ## 当前验收边界 -Round 5V-2 用户已明确批准仅对目标QA库执行005增量迁移,但备份/隔离恢复前提 -尚未满足,当前状态为 `MIGRATION_AUTHORIZED_BLOCKED_RESTORE`,005未执行。 +Round 5V-3 已成功接管SSH管理入口,完成匹配V9原生一致性备份及归档完整读取。 +005授权有效,但独立恢复环境尚未确认或获准创建,当前状态为 +`MIGRATION_AUTHORIZED_BLOCKED_ISOLATED_RESTORE`,005未执行。 不能将 H2/替身测试、构建成功或登录页显示称为 Kingbase 事务/浏览器业务闭环验收。真实硬件验收始终未进行。 迁移前置、失败回滚和核验清单见 [迁移计划](docs/iot/ROUND5V_KINGBASE_MIGRATION_PLAN.md)。 @@ -66,10 +67,14 @@ python3 scripts/qa/qa.py verify-snapshot --snapshot-dir .qa-runtime/snapshot-REP 检查使用只读 repeatable-read 事务并 rollback,记录版本、schema、列、索引和计数; 不打印业务行。快照含两张受影响表的敏感内容,仅存 `.qa-runtime/`(目录0700, 数据0600);其 XML 解析和 SHA 验证不等同于原生全库备份或数据库恢复演练。 -在本轮已检查范围中未找到匹配的原生备份客户端,本机Docker守护进程不可用, -也未发现或取得可用的独立恢复实例。仅有两表快照不能通过恢复门禁。 -需要提供已有且获准使用的恢复环境、匹配版本工具和受保护的QA库DDL管理配置; -不要创建数据库、猜测密码、提权或把业务账号当成迁移账号。 +服务器现有kingbase容器的 `/home/kingbase/install/kingbase/bin/` 已确认具备 +V009R003C018原生工具;现有kingbase管理角色可经容器本地连接认证,不需要给 +fusion_qa_app提权。已完成原生备份,服务器及本机副本均在非Git目录,目录0700、文件0600。 +最新位置、SHA及独立恢复解阻方案见 [本轮记录](docs/iot/ROUND5V3_SERVER_BACKUP.md)。 +`sys_restore --file=/dev/null`成功仅证明归档可完整读取,不能替代实际数据库恢复。 +本机Docker守护进程不可用;服务器只确认一个共享V9实例,旧V8目录不是获准的 +兼容恢复环境。需提供已有独立恢复目标,或明确另行批准隔离容器/实例及恢复库。 +不要自行创建数据库、启动新容器或复用共享库进行覆盖恢复。 ## 3. 启停隔离 QA(迁移批准并完成后) @@ -118,6 +123,6 @@ stop只处理本脚本账本中且进程命令身份仍匹配的PID;不会清 `.gitlab-ci.yml` 已改为显式web+RUN_FUSION_VALIDATION=true才允许的验证流水线; Java21、私有JDBC预检及npm ci,**无部署job**。本轮未Push,也未触发/验证远程Runner。 -005授权已明确;当前仍缺可用的原生备份/隔离恢复条件、已配置的授权DDL管理账号、真实Kingbase生命周期验证和 +005授权、原生备份及既有管理连接均已确认;当前仍缺实际独立恢复证明、真实Kingbase生命周期验证和 依托新QA后端的完整Chrome验收。迁移安全前提未满足时,单独前端会明确返回502, 不得用旧实验后端或伪造API响应冒充新版本验收。 diff --git a/docs/iot/ROUND5V3_SERVER_BACKUP.md b/docs/iot/ROUND5V3_SERVER_BACKUP.md new file mode 100644 index 000000000..34ac10a0f --- /dev/null +++ b/docs/iot/ROUND5V3_SERVER_BACKUP.md @@ -0,0 +1,98 @@ +# Round 5V-3 — SSH接管、原生备份完成,独立恢复仍待解阻 + +日期:2026-10-14;工作分支 `fix/iot-safety-hardening`;开始提交 +`b94ac7f05aef80e092fddcf3d6ff3ac0a1a890b3`。本轮没有重新运行H2或源码安全审计。 +凭据仅用于SSH认证输入,未写入工程、命令行参数、报告或凭据文件。 + +## 1. 实际服务器和共机边界 + +- 实际登录 `root@192.168.139.218:22`,hostname为`localhost.localdomain`, + NFSChina Server4.0,Linux4.19.113-72.nfs4.x86_64,UID0。 +- 4321由docker-proxy映射至现有`kingbase`容器54321。 + 镜像`kingbase_v009r003c018b0003_single_x86:v1`,现有容器用户kingbase。 +- 同机GitLab、MySQL、MongoDB及其他应用持续运行。Kingbase和GitLab的启动时间 + 均保持2026-10-06,未重启、改配置、改端口、改防火墙或安装软件。 +- 根分区约余535–536GiB;可用内存约372000MiB;备份前load约0.56/0.66/0.71。 + 原生备份单进程、低压缩等级1,无并发dump,无新容器或数据库。 + +## 2. Kingbase及权限实际核验 + +- 工具目录:容器`/home/kingbase/install/kingbase/bin/`。 + `sys_dump --version`、`sys_restore --version`、`ksql --version`均为V009R003C018。 +- 数据目录:容器`/home/kingbase/userdata/data`;宿主机bind源 + `/opt/kingbase-docker/data`,配置文件为数据目录内kingbase.conf。 +- 使用现有OS用户kingbase的容器本地连接,实际数据库角色kingbase、rolsuper=true。 + 没有新建管理账号或给fusion_qa_app授予额外权限;没有复用SSH口令猜测数据库口令。 +- 数据库显式限定`railwaysystem_fusion_qa_20261013`,数据库大小23005379字节。 + App账号只读核验也成功:public54表、iotlocks9表;学员47、参训57、住宿34、 + 授权10、命令15。5S执行元数据仍缺失,005没有执行。 +- 宿主机root和容器kingbase用户crontab未发现sys_dump/sys_rman相关条目; + 这不等于已排除外部备份平台或其他调度策略,不能宣称原先存在可靠恢复保障。 + +## 3. 已完成的原生一致性备份(不是恢复演练) + +主备份: + +- 服务器目录:`/opt/railway-fusion-qa-backup-20261014.YLjmJ0/` +- 本机独立副本:`/Users/wzb/railway-fusion-qa-backup-20261014.6cgPn7/` +- 主文件:`fusion-qa-pre005-v2.dump`,380907字节。 +- SHA256:`caa62bc985bd433b5d428b36e34d684b557c82576b69e5e5d9d348edfdf316b4`。 +- 两端目录0700、备份及清单文件0600,均在Git工作树外。备份含敏感业务数据, + 不提交、不打印、不上传公共服务;保留原始备份和清单,不自动清理。 + +实际过程: + +1. 在目标QA库开启`REPEATABLE READ READ ONLY`事务,设置会话局部5分钟空闲事务、 + 30秒语句及5秒锁超时,导出快照;事务在备份及清单完成前保持有效。 +2. 匹配版本sys_dump使用custom格式、压缩等级1、5秒锁等待和**同一个导出快照**, + 显式`-d railwaysystem_fusion_qa_20261013`。未使用--create/--clean,未导出其他库。 +3. 原生sys_restore读取TOC,并用`--exit-on-error --file=/dev/null`完整解码归档。 + 两步exit0;dump、TOC读取、完整读取的stderr均0字节。 +4. 清单来自相同快照:63张表均有唯一schema-qualified名称及行数,归档含63个TABLE + 和63个TABLE DATA对象。授权/命令的整表排序指纹与备份前、备份后保持一致。 +5. 同步到本机独立副本后SHA256一致。源只读快照事务均显式ROLLBACK并退出, + 最终没有本任务遗留的idle-in-transaction连接。 + +辅助证据文件:`archive-toc-v2.list`、`source-table-counts-v2.tsv`;服务器另保留 +`dump-v2.stderr`、`toc-v2.stderr`、`archive-read-v2.stderr`(均空)。 +首次草稿的清单使用`||`拼接,在当前SQL兼容模式下生成了错误的布尔标签;已经 +改用concat,并重新做整套同快照备份/清单。主证据明确采用v2,初稿保留但不用于 +表名对账。这个普通SQL兼容问题未通过提权或修改数据库模式解决。 + +**归档读取通过仅证明文件可读取,不是把数据真正恢复到独立Kingbase的证明。** + +## 4. 当前独立恢复门禁 + +- 运行中及停止容器清单只发现一个Kingbase V9容器,即正在承载共享业务的实例。 + 同实例的旧QA/备份数据库不是独立恢复实例,未连接它们执行业务查询或恢复。 +- 宿主机存在`/opt/Kingbase/ES/V8/data`旧目录;未确认其为可用、获准且兼容的 + V9恢复环境,因此没有启动它、覆盖它或把它当作恢复证明。 +- 本机Docker守护进程不可用;已有SSH别名wzbmatebook的主机MateBook14上, + PATH未找到Kingbase/Docker工具,未报告Kingbase/Postgres进程或所检查安装根。 + 没有尝试在该主机安装软件或初始化实例。 +- 没有取得其他已存在且获准写入的独立V9恢复目标及其受保护连接配置。 + +ISOLATED_RESTORE_VERIFIED=BLOCKED,所以005迁移、DDL失败回滚演练、实际Kingbase +业务事务、新Spring Boot启动及完整Chrome E2E全部保持BLOCKED。 + +## 5. 最小解阻方案(需用户选择/批准,不自动执行) + +优先方案:提供**已有且获准操作**的独立V009R003C018恢复实例、预建空恢复库及 +受保护连接配置。先确认不属于共享源实例、没有业务对象及活动业务写入,再恢复 +本备份并对照63表结构/计数和授权命令指纹,检查完整恢复日志。不要在聊天中发口令。 + +如无现成环境,可单独批准以下新增操作:在当前服务器使用已有同版本授权镜像, +创建一个仅用于恢复演练的独立容器/实例和专用恢复数据库。建议资源上限2CPU、 +2GiB内存,至少5GiB独立存储;不发布宿主机端口,network none,仅docker exec +访问。数据卷绝不复用`/opt/kingbase-docker/data`。先核实许可允许该验证实例, +认证信息用受保护方式注入。创建实例、数据库和容器均超出当前授权,**现在没有做**。 +验证后保留证据和环境,删除/销毁也需明确批准,不自动清理。 + +获得恢复目标授权后:原生恢复使用错误即停及单事务策略,不使用--create/--clean, +不覆盖源库。恢复目标角色/ACL映射需审核,不自动创建角色或扩大权限。恢复和 +DDL回滚验证都通过后,才按005已批准范围对目标QA执行16列和4索引,随后连续 +完成真实Service/Mapper事务、Java21启动与Chrome软件联动,不重做整个架构。 + +本轮实际完成:SSH接管、原生工具/容量/身份确认、一致性备份及双端保护校验。 +本轮未完成:真正独立恢复、迁移、Kingbase业务恢复测试、后端及浏览器完整验收。 +真实设备写入仍false;未连接真实MQTT控制或人脸服务,未Push/Merge/部署。 diff --git a/docs/iot/ROUND5V_KINGBASE_MIGRATION_PLAN.md b/docs/iot/ROUND5V_KINGBASE_MIGRATION_PLAN.md index 6894ae236..22c173d7e 100644 --- a/docs/iot/ROUND5V_KINGBASE_MIGRATION_PLAN.md +++ b/docs/iot/ROUND5V_KINGBASE_MIGRATION_PLAN.md @@ -1,16 +1,20 @@ # Round 5V — isolated Kingbase migration and rollback gate -## Current Round 5V-2 decision +## Current Round 5V-3 decision The user explicitly authorized migration 005 **only** on `railwaysystem_fusion_qa_20261013`, together with protected backup and isolated restore rehearsal. Scope SHA256 remains `90648b6ac67470f9a14f0795c4479dfb4811d4907e41a13ee5eeada16582b87f`. -Authorization is no longer missing. Status: `MIGRATION_AUTHORIZED_BLOCKED_RESTORE`. -No DDL or business data writes have been performed because native backup and -actual isolated restore cannot yet be proved. Existing two-table XML snapshots -are not an acceptable substitute. Do not create a database or elevate privileges -to overcome this gate. See [current evidence](ROUND5V2_ACCEPTANCE.md). +Authorization is no longer missing. Status: +`MIGRATION_AUTHORIZED_BLOCKED_ISOLATED_RESTORE`. +SSH access, matching native tools, existing management-role access and consistent +native backup are now verified. Actual independent database restore is still +unverified. No DDL or business DML has been performed. Do not create a database, +initialize an instance, start a new container or elevate privileges to overcome +this gate without separate authorization. See [current evidence and minimal +resource proposal](ROUND5V3_SERVER_BACKUP.md). The previous Round5V2 report remains +historical evidence, not the current infrastructure status. ## Scope and observed prestate @@ -57,13 +61,13 @@ the global/database/user search path or accidentally query system `sys_user` vie transaction, private WebRowSet XML and SHA256 manifest under `.qa-runtime/`. These contain credentials/personal data from rows: never commit, print or upload. This is an affected-table snapshot, **not a native full-database backup**. -4. Before executing DDL, the administrator must also produce an authorized native - Kingbase full QA backup (schema/data/sequences/ACLs) using the matching licensed - vendor tools and validate it in an approved isolated restore destination. No - native backup utility or restore destination is assumed or provisioned here. +4. Before executing DDL, produce an authorized native Kingbase full QA backup + (schema/data/sequences/ACLs) using matching licensed vendor tools and validate + it in an approved isolated restore destination. Round5V3 completed the native + backup; the restore destination is still neither confirmed nor provisioned. Do not use a mismatched PostgreSQL client or restore into any shared database. -## Execution and failure rollback (authorized, blocked on backup/restore) +## Execution and failure rollback (authorized, blocked on isolated restore) With an approved migration account, enforce `current_database()` equals the exact target before any change. Begin a transaction, set a local lock timeout (5s),