第1套前厅达梦数据库迁移手册(车公庄)

本包是升级后的达梦 SQL、长文本附件及校验工具,不能按 MySQL 命令导入。目标为客户新服务器 10.10.235.2 的 DMSERVER:5236;业务用户 ZHCT_APP,独立表空间 ZHCT_TBS。共284表、4187字段、74333条记录。新应用在数据库验收完成之前保持未启动。本包已包含升级后的完整数据,不要再在达梦上执行原MySQL差异脚本zywxb.sql。

1. 文件和版本确认

本包基于2026-10-23 03:10的本套MySQL5.6备份,经store/db/init/zywxb/zywxb.sql升级。用户批准零日期按未设置转NULL、固定排菜账号不限有效期、仅授权本套餐厅。每套新增一条数据授权,所以最终总行数比原备份多1。approved-data-changes.json保存逐主键原值和批准变更;不要删掉它。

应用代码须包含CODE_REQUIREMENTS.md和required-code.patch中的三类兼容修复,再由你的云效流水线打包。仅使用原e8de470f制品不代表包含后来修复。这里不部署前厅PHP程序,不修改现有食安。

2. 上传到新服务器并校验

在客户麒麟电脑终端执行(文件先放在/home/Huawei/桌面/tmp/):

ssh root@10.10.235.2 'install -d -m 700 /workspace/front-db-migration'
scp /home/Huawei/桌面/tmp/front1-dm-e8de470f-20261024.tar.gz /home/Huawei/桌面/tmp/front1-dm-e8de470f-20261024.tar.gz.sha256 root@10.10.235.2:/workspace/front-db-migration/

登录新服务器root后执行:

cd /workspace/front-db-migration
sha256sum -c front1-dm-e8de470f-20261024.tar.gz.sha256

必须显示成功。下一步只在目录还不存在时解压:

(
  set -e
  cd /workspace/front-db-migration
  if [ -e front1-dm-e8de470f-20261024 ] || [ -L front1-dm-e8de470f-20261024 ]; then
    echo '解压目录已存在,停止,不覆盖'
    exit 1
  fi
  tar -xzf front1-dm-e8de470f-20261024.tar.gz
  cd /workspace/front-db-migration/front1-dm-e8de470f-20261024
  sha256sum -c PAYLOAD.sha256 > payload-check.log 2>&1
)

紧接着执行echo $?,必须为0;非0停止并保留报错。若属于包内校验失败,再查看本包目录中的payload-check.log,不要继续。任何已有目标用户、表空间、数据文件或非空模式都应停下核对,不能通过删库或改账号绕过检查。

3. 准备目录和私有连接文件

先检查工具:

/opt/foodsafe-node/bin/node -v
python3 --version
ls -l /home/dmdba/dmdbms/bin/disql
id dmdba
df -h /data /workspace

每套建议在/data至少预留5GB以容纳数据和临时探测对象,两套合计至少10GB;/workspace至少预留1GB用于解压、日志和独立导出。空间不足先停止。

本包依赖已经装好的Node20、Python3.7及达梦原生DIsql;dmdb驱动在包内,无需npm安装。然后执行:

install -d -o dmdba -g dinstall -m 750 /data/dmdata/front1
cd /workspace/front-db-migration/front1-dm-e8de470f-20261024
python3 prepare_target.py

按脚本提示核对现场参数;本包固定本套用户和表空间,不允许改成食安账号或另一套前厅。默认DM完整build为--03134284488-20260902-347071-20200 Pack30,兼容模式4、大小写不敏感、UTF8、32KB页。若服务器参数变化,停止重新核验。工具生成随机口令并保存在private目录,不在屏幕输出;不要把private内容、密码、截图发到聊天。

4. 创建本套独立用户和表空间

执行:

cd /workspace/front-db-migration/front1-dm-e8de470f-20261024/private
DM_BIN=/home/dmdba/dmdbms/bin
LD_LIBRARY_PATH="$DM_BIN:${LD_LIBRARY_PATH:-}" "$DM_BIN/disql" /nolog

出现SQL>后输入login。服务名填127.0.0.1:5236,用户名填SYSDBA,密码现场输入;其余选项无特殊要求时回车。看到“普通打开状态”后,再逐行执行:

SET ECHO OFF
SET LOCAL_CODE UTF8
SET CHAR_CODE UTF8
@01-provision.sql
EXIT

使用短相对路径@01-provision.sql。看到任何错误就停止。脚本不会覆盖已经存在的业务用户或表空间。不要重复执行成功的创建步骤。

5. 先做现场能力探测,再绑定结果

cd /workspace/front-db-migration/front1-dm-e8de470f-20261024
/opt/foodsafe-node/bin/node probe_target.cjs private/probe.private.json

必须看到passed:true且identity_clone_tests为281。后续保持同一包目录、文件、Node和驱动不变,不能混用两套目录。这个步骤仅向本套临时探测模式写入合成数据,验证当前现场build、全部DDL、索引、长文本、字符、大小写唯一性和自增编号。失败不应手改passed、绕过探针或导入正式模式。

第一次成功后使用其最新结果绑定:

cd /workspace/front-db-migration/front1-dm-e8de470f-20261024
PROBE_DIR=$(ls -dt probe-[0-9]*/ | head -n 1)
python3 bind_probe.py private/import.private.json "${PROBE_DIR}result.json"

必须显示绑定成功。工具会再次确认同一包、同一数据库、同一套账号及相同驱动;失败结果不会被接受。

6. 导入全量数据

cd /workspace/front-db-migration/front1-dm-e8de470f-20261024
/opt/foodsafe-node/bin/node import_dm.cjs private/import.private.json

等待输出imported:true、tables为284、rows为74333。它会调用原生DIsql执行SQL和LOB附件,写入过程中不要断电、关终端或启动前厅。导入报错时保留run-*目录,不要重新运行、清空或删除用户;先定位失败阶段,避免重复数据。

7. 核验自增和权限

cd /workspace/front-db-migration/front1-dm-e8de470f-20261024
PROBE_DIR=$(ls -dt probe-[0-9]*/ | head -n 1)
RUN_DIR=$(ls -dt run-[0-9]*/ | head -n 1)
python3 finalize_identity.py private/import.private.json "${PROBE_DIR}result.json" "${RUN_DIR}result.json"
python3 capture_roles.py /opt/foodsafe-node/bin/node private/import.private.json

capture_roles会要求现场输入SYSDBA密码,仅用于只读核验本套授权和探测对象,不保存该管理员密码。

/opt/foodsafe-node/bin/node verify_front_metadata.cjs private/import.private.json "$PWD" "$PWD/private/metadata-result.json"

必须核对metadataVerified为true、failed为0、核心unverified为空。另有独立的behaviorValidation:当前138项固定精度FLOAT/DOUBLE的未来写入舍入、29项binary列的比较语义,尚未逐项完整证明,总167项。因此overallValidationComplete仍为false;这不只是第三方服务是否联通的问题。已保真核对全部历史值,并验证本手册列出的主业务以及部分浮点边界,但不能声称全部产品、全部未来输入行为均已验收。启用涉及这些字段的新流程前,应按对应业务做写入、读取、计算及边界验收。索引大小写唯一性已单独强制探测,但不能代替所有普通查询比较的验证。

8. 独立导出并逐字段对账

cd /workspace/front-db-migration/front1-dm-e8de470f-20261024
/opt/foodsafe-node/bin/node export_dm_data.cjs private/import.private.json "$PWD/private/dm-export"
python3 verify_front_values.py --baseline verification/source/baseline.json --float-source verification/float-source.json --target-dir private/dm-export --manifest private/dm-export/export-manifest.json --output private/data-verification.json

必须输出equal=true、status=complete、284表、74333行、different_tables为空,命令退出码为0。这个过程会检查所有字段,金额精确比较,浮点按对应IEEE位比较,并区分NULL与空字符串;不是只对行数。

9. 数据库验收完成后再部署前厅

先按CODE_REQUIREMENTS.md把兼容修复提交到用于流水线的分支;部署后的8个运行文件必须通过REQUIRED_CODE.sha256检查。四个主业务FLOAT字段的标准ORM写入及物理读取已做492个真实对照,原始SQL表达式等更广范围仍以行为覆盖报告为准。将本套生成的业务用户和口令只写入本套前厅的私有部署配置;第一套使用prod/zhct_zywxb,第二套使用prod/zhct_zywxb2。前厅应用安装位置、PHP/PDO_DM、Nginx和端口按前厅部署手册继续处理。本包中的front_php_acceptance.php是隔离演练工具,拒绝直接在现场生产5236执行合成事务;现场通过页面验收登录、排菜、菜品、配方、统计、导出和硬件联动。

数据库导入和对账成功不等于现场应用已经上线。hcgj独立后厨库尚未提供;不创建假库,也不把它合并进本次两套主库。设备打印、支付、第三方HTTP、实际Excel上传及浏览器交互需要现场另行验收。

10. 异常与保留材料

- 任何步骤报错都保留private、probe-*、run-*及所有校验日志;不要把完整私有目录发到公共渠道。

- 不删除原始SQL.gz、原值变更清单、最终基线、迁移包和SHA256文件。

- 不通过改全局DM参数解决单套问题;现有两套食安共用实例,需保护其运行。

- 临时探测模式只能在证据保存、数据库及应用验收完成后由管理员按精确名称清理;本手册不自动删库。

- 本包初次创建的表空间128MB、每次增长64MB,上限在生成SQL中明确;请随日常运维监测磁盘空间。