政务网络数据库网络迁移实战|瀚高 HGDB跨业务网/政务外网多Schema全自动迁移批处理脚本(分步独立日志持久化,全程排错可追溯)

📅 2026/7/20 13:37:40
政务网络数据库网络迁移实战|瀚高 HGDB跨业务网/政务外网多Schema全自动迁移批处理脚本(分步独立日志持久化,全程排错可追溯)
核心亮点解决迁移日志丢失、参数报错、权限冲突、多Schema串行兼容、无人值守等全套实操踩坑方案脚本每一步单独输出日志文件无需额外校验脚本依靠完整执行日志即可排查表/索引/约束同步问题一、项目业务背景1. 网络与数据库架构本次政务项目进行网络架构整体升级原有业务内网全线停用所有业务切换至隔离政务外网需完成两套源数据库全量割接至政务外网瀚高集群源库1瀚高安全版V4.5.7 单机业务网192.168.1.2源库2PostgreSQL 12.22 单机业务网192.168.3.8目标库瀚高安全版V4.5.10 集群政务外网192.168.3.3网络互通业务网客户端可路由访问政务外网集群无需中转服务器统一Windows客户端执行迁移操作。迁移规则多业务Schema完整同步至目标同名Schema割接窗口期周末停机保证源库无写入数据静态一致。2. 传统迁移痛点实操踩坑汇总命令行日志瞬时丢失直接CMD窗口输出pg_dump/pg_restore日志窗口刷新、关闭后报错信息全部丢失无法定位哪张表、索引同步失败换行参数粘连报错批处理^换行后带空格命令拼接成--verbose--host非法参数迁移直接中断系统日期带中文/空格%date%自带星期中文、分隔空格拼接备份文件名、日志路径触发写入异常for循环goto跳出全流程单个Schema报错直接终止全部循环剩余Schema不会自动执行SET ROLE sysdba权限报错源备份携带角色切换语句目标账号无sysdba权限恢复直接抛出异常索引已存在阻断流程目标提前创建空Schema恢复时索引、主键重复脚本判定整体失败磁盘容量未预警大批量备份未预估存储空间中途磁盘占满迁移半截中断无记录无分步隔离日志结构、数据导出导入日志混杂无法区分是建表失败还是插入数据失败。3. 本文脚本核心优化点四步骤独立日志持久化导出结构/导入结构/导出数据/导入数据分别生成单独日志文件每一步执行明细完整留存事后可直接打开对应日志排查触发器、外键、索引创建问题纯数字无特殊字符时间戳采用wmic读取系统标准时间YYYYMMDDHHMMSS彻底规避中文、空格、斜杠造成路径报错分层流程控制仅导出结构失败跳过当前Schema导入阶段索引、约束警告不阻断后续数据同步流程源头过滤角色语句导出阶段剔除角色、表空间、安全标签配置恢复增加角色跳过参数彻底解决SET ROLE sysdba权限报错Windows原生批处理无需Python/Java环境仅依赖瀚高自带pg_dump/pg_restore/psql工具自动创建备份根目录避免目录不存在导致写入设备错误多Schema串行循环执行降低源库IO压力适合政务低配置数据库全程免密配置无需人工弹窗输入数据库账号密码。二、环境前置准备客户端环境Windows Server/Win10安装hgdeveloper瀚高客户端工具目录E:\soft\hgdbdeveloper\dbclient存在pg_dump.exe、pg_restore.exe网络连通客户端可同时访问业务网源库、政务外网目标集群前置操作迁移周末停机停止所有业务写入保证源库数据静态不变存储要求备份目录E:\tdsc\data预留足够磁盘空间避免备份写入中断数据库权限源账号拥有全库读取权限目标账号拥有Schema创建、表写入、索引创建权限目标提前手动新建对应空Schema脚本不执行DROP删除操作复用现有空库。三、完整成品迁移批处理脚本migrate_all_schema.bat脚本设计说明全局总日志记录每个Schema启动、结束、整体成功/失败标识单Schema四步独立日志LOG_FILE1pg_dump导出结构完整输出日志LOG_FILE2pg_restore导入结构完整输出日志LOG_FILE3pg_dump导出数据完整输出日志LOG_FILE4pg_restore导入数据完整输出日志执行逻辑导出结构异常直接跳过当前Schema导入出现索引重复、约束警告不中断继续执行数据导出导入所有工具命令输出重定向 xxx.log 21标准输出错误日志全部落盘留存导出参数屏蔽角色、权限、表空间信息从根源消除角色切换SQL数据导入携带--disable-triggers批量插入临时关闭触发器提升导入速度、规避外键校验报错。四、脚本运行效果展示1. CMD控制台运行截图运行时按顺序打印每个Schema四步执行进度直观看到当前处于导出/导入哪一阶段无需等待完整执行即可判断流程走向。2. 备份日志目录文件截图脚本自动生成全局总日志migrate_all_schema_时间.log每个Schema独立4份分步明细日志结构备份.backup文件、数据备份文件夹按Schema时间戳命名多次执行不会覆盖历史文件。3. 正常导入明细日志片段LOG_FILE2示例日志完整记录每张表、索引、触发器、外键约束创建过程同步完成后可打开日志核对所有对象是否生成pg_restore: creating TRIGGER zrzysc.td_zd_jzd_shdk_his_2000 trg_td_zd_jzd_shdk_his_2000_tb pg_restore: creating TRIGGER zrzysc.td_zd_jzd_unit_2000 trg_td_zd_jzd_unit_2000_tb pg_restore: creating TRIGGER zrzysc.td_zd_jzd_unit_his_2000 trg_td_zd_jzd_unit_his_2000_tb pg_restore: creating FK CONSTRAINT zrzysc.td_jzd_upload_report fk_td_jzd_u_reference_td_jzd_u pg_restore: creating FK CONSTRAINT zrzysc.t_xxyd_mx fk_xxyd_guid五、实操全流程踩坑问题根治方案坑1pg_dump换行^后带空格报illegal option --verbose--host报错现象参数拼接粘连工具识别非法命令解决方案严格控制^仅在行末尾后方无任何空格本脚本已规范换行格式直接复制无此问题。坑2系统%date%带中文星期、空格日志/备份路径写入失败根因Windows区域日期格式包含中文、分隔空格根治使用wmic读取标准14位纯数字时间戳无任何特殊字符路径永久兼容。坑3for循环内goto直接终止全部Schema单个报错整体停摆现象第一个Schema出错剩余Schema完全不执行优化方案仅导出结构失败时跳转导入警告不触发跳转循环会自动进入下一个Schema。坑4恢复时报SET ROLE sysdba权限不足根因源备份内置角色切换SQL目标账号无sysdba超级权限双重处理pg_dump增加--no-security-labels --no-tablespaces导出时不记录角色相关语句不生成角色切换SQL从源头规避报错。坑5目标空Schema创建索引报“关系已存在”脚本判定失败根因pg_restore默认遇到对象冲突返回非0错误码处理逻辑仅导出结构失败标记SCHEMA_SUCCESS0导入阶段警告不修改标记继续执行数据同步。坑6CMD窗口日志刷新丢失无法定位哪张表同步失败核心优化每一步执行输出重定向至独立日志文件 xxx.log 21标准输出、错误信息全部持久化留存事后打开对应步骤日志逐行核对表、索引、触发器创建记录。坑7echo输出|管道符号批处理解析报错文件路径规避方案本脚本全局日志输出无管道符号无需转义无此类报错。坑8未预估磁盘容量大批量备份中途空间占满迁移中断运维规范迁移前手动检查E:\tdsc\data剩余存储空间超大业务库拆分多批次迁移。坑9无分步日志无法区分是建表失败还是插入数据失败脚本解决方案导出结构、导入结构、导出数据、导入数据分别生成独立日志哪一步出问题直接打开对应日志文件排查定位效率大幅提升。六、迁移完成后校验排错方法无需独立校验脚本本方案不配套单独COUNT行数校验脚本依靠分步持久化日志完成完整性核对操作步骤检查表完整性打开第二步导入结构日志检索CREATE TABLE核对源库全部业务表是否存在创建记录核对索引/触发器/约束日志检索CREATE INDEX、CREATE TRIGGER、FK CONSTRAINT确认无缺失索引、外键排查数据导入异常打开第四步数据导入日志检索error/warning查看是否存在主键重复、唯一索引冲突全局总日志快速筛查检索【严重错误】关键词快速定位导出失败的Schema检索【警告】查看同步存在冲突的表补充精准行数校验可选手动执行如需核对真实数据量手动psql执行SELECT COUNT(1) FROM 表名对比源/目标库。七、生产环境迁移运维规范迁移窗口期固定周末业务停机停止所有业务写入保证源库数据静态无新增分步执行原则先结构、后数据结构层问题优先暴露修复成本更低串行多Schema不并行多Schema导出避免压垮源库磁盘IO日志留存规范迁移完成后备份整套日志备份文件至少留存7天方便割接复盘、回滚核对权限最小化迁移账号仅分配读写必需权限不使用sysdba超级账号事后必查迁移结束打开分步日志筛查error、warning关键字确认无同步异常再切换业务。八、总结本文针对政务国产化HGDB跨网络割接场景落地一套Windows原生批处理自动迁移脚本解决了传统手动迁移效率低、执行日志丢失、权限参数报错、多Schema执行中断等一系列实操痛点。脚本最大核心优势是四步骤独立日志持久化留存无需额外开发数据校验脚本依靠完整执行明细日志即可完成表、索引、触发器、约束同步完整性排查适配政务项目无额外中间件、低运维成本的使用场景所有踩坑问题均提供可落地根治方案国产数据库运维人员可直接复制脚本修改配置投入生产使用。写在最后脚本适配瀚高 V4、兼容 PostgreSQL 同源语法大家可根据自身 IP、账号、Schema 列表修改配置区直接使用实操过程中遇到换行参数报错、角色权限报错、日志无法写入、多 Schema 循环异常等问题可以在评论区留言我有时间的话会逐条回复排错思路如果有拓展需求自动清理过期备份、增加定时执行、邮件告警、行数校验脚本补充也可以评论提出后续更新迭代脚本。文章配套完整 bat 脚本已贴在文末复制保存为 ANSI 编码即可运行。完整脚本内容echo off chcp 936 nul setlocal enabledelayedexpansion :::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: 【配置区根据自身数据库信息修改】 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::: set PG_BINE:\soft\hgdbdeveloper\dbclient :: 源库业务网待迁移库 set SRC_HOST192.168.1.2 set SRC_PORT5866 set SRC_USERzrzysc set SRC_PWDZrzysc set SRC_DBzrzysc :: 目标库政务外网集群 set DST_HOST192.168.3.3 set DST_PORT5866 set DST_USERkfly_yx set DST_PWDAmExJ set DST_DBtdscdtjcjg_ywk :: 需要批量迁移的Schema空格分隔 set SCHEMA_LISTjsyd dds :: 备份、日志统一存放根目录 set BACKUP_ROOTE:\tdsc\data :: 多线程导出导入并发数 set JOB_NUM8 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: 自动创建备份目录不存在则新建消除写入设备报错 if not exist %BACKUP_ROOT% md %BACKUP_ROOT% :::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: 获取纯数字时间戳 YYYYMMDDHHMMSS无中文/空格/斜杠/冒号 for /f tokens2 delims %%a in (wmic os get LocalDateTime /value) do set raw_dt%%a set GLOBAL_TIME!raw_dt:~0,14! :: 全局总日志记录每个Schema执行概况 set LOG_FILE%BACKUP_ROOT%\migrate_all_schema_!GLOBAL_TIME!.log :::::::::::::::::::::::::::::::::::::::::::::::::::::::::: echo !LOG_FILE! echo 瀚高多Schema批量迁移启动 全局时间戳!GLOBAL_TIME! !LOG_FILE! echo 待迁移Schema列表!SCHEMA_LIST! !LOG_FILE! echo 迁移开始时间%date% %time% !LOG_FILE! echo !LOG_FILE! echo. !LOG_FILE! :: 循环遍历每一个业务Schema串行处理 for %%s in (!SCHEMA_LIST!) do ( set CUR_SCHEMA%%s set SCHEMA_SUCCESS1 echo echo 当前处理Schema!CUR_SCHEMA! echo echo 【%date% %time%】开始处理Schema!CUR_SCHEMA! !LOG_FILE! :: 当前Schema四步独立明细日志文件 set LOG_FILE1%BACKUP_ROOT%\migrate_!CUR_SCHEMA!_schema_!GLOBAL_TIME!_1.log set LOG_FILE2%BACKUP_ROOT%\migrate_!CUR_SCHEMA!_schema_!GLOBAL_TIME!_2.log set LOG_FILE3%BACKUP_ROOT%\migrate_!CUR_SCHEMA!_schema_!GLOBAL_TIME!_3.log set LOG_FILE4%BACKUP_ROOT%\migrate_!CUR_SCHEMA!_schema_!GLOBAL_TIME!_4.log :: 当前Schema专属结构备份、数据备份目录 set STRUCT_FILE%BACKUP_ROOT%\dump-!CUR_SCHEMA!-!GLOBAL_TIME!-struct.backup set DATA_DIR%BACKUP_ROOT%\dump-!CUR_SCHEMA!-!GLOBAL_TIME!-data :: 第1步导出Schema完整表结构、索引、约束、触发器 echo 第1步导出 !CUR_SCHEMA! 表结构 echo 【%date% %time%】开始导出!CUR_SCHEMA!结构 !LOG_FILE! set PGPASSWORD!SRC_PWD! :: 过滤角色、表空间、安全标签源头不生成SET ROLE语句 %PG_BIN%\pg_dump --verbose --host !SRC_HOST! --port !SRC_PORT! --username !SRC_USER! ^ --schema-only --no-owner --no-privileges --no-security-labels --no-tablespaces ^ --format custom --encoding UTF8 --file !STRUCT_FILE! --schema !CUR_SCHEMA! !SRC_DB! !LOG_FILE1! 21 :: 判断导出结构是否失败失败直接跳过本Schema所有流程 if !errorlevel! neq 0 ( echo 【严重错误】!CUR_SCHEMA! 结构导出失败跳过当前Schema全部流程 echo 【%date% %time%】!CUR_SCHEMA! 结构导出异常 !LOG_FILE! set SCHEMA_SUCCESS0 ) if !SCHEMA_SUCCESS! equ 0 goto NEXT_SCHEMA echo 【%date% %time%】!CUR_SCHEMA! 结构导出完成 !LOG_FILE! echo. :: 第2步导入表结构至目标库 echo 第2步导入 !CUR_SCHEMA! 表结构至目标库 echo 【%date% %time%】开始导入!CUR_SCHEMA!结构 !LOG_FILE! set PGPASSWORD!DST_PWD! %PG_BIN%\pg_restore --verbose --host !DST_HOST! --port !DST_PORT! -U !DST_USER! -d !DST_DB! --schema-only --no-owner --no-privileges !STRUCT_FILE! !LOG_FILE2! 21 :: 索引/约束已存在仅警告不修改SCHEMA_SUCCESS继续执行后续数据同步 echo 【%date% %time%】!CUR_SCHEMA! 结构导入流程执行完毕 !LOG_FILE! echo. :: 第3步导出全量业务数据 echo 第3步导出 !CUR_SCHEMA! 业务数据 echo 【%date% %time%】开始导出!CUR_SCHEMA!数据 !LOG_FILE! set PGPASSWORD!SRC_PWD! %PG_BIN%\pg_dump --verbose --host !SRC_HOST! --port !SRC_PORT! --username !SRC_USER! ^ --data-only --no-owner --no-privileges --no-security-labels --no-tablespaces ^ --format directory --encoding UTF8 -j !JOB_NUM! --file !DATA_DIR! --schema !CUR_SCHEMA! !SRC_DB! !LOG_FILE3! 21 if !errorlevel! neq 0 ( echo 【警告】!CUR_SCHEMA! 数据导出存在异常明细查看步骤3日志 echo 【%date% %time%】!CUR_SCHEMA! 数据导出异常 !LOG_FILE! ) echo 【%date% %time%】!CUR_SCHEMA! 数据导出流程执行完毕 !LOG_FILE! echo. :: 第4步导入业务数据至目标库 echo 第4步导入 !CUR_SCHEMA! 数据至目标库 echo 【%date% %time%】开始导入!CUR_SCHEMA!数据 !LOG_FILE! set PGPASSWORD!DST_PWD! :: --disable-triggers 批量导入关闭触发器提升速度规避外键冲突 %PG_BIN%\pg_restore --verbose --host !DST_HOST! --port !DST_PORT! -U !DST_USER! -d !DST_DB! --data-only --no-owner --no-privileges --disable-triggers -j !JOB_NUM! !DATA_DIR! !LOG_FILE4! 21 if !errorlevel! neq 0 ( echo 【警告】!CUR_SCHEMA! 数据导入存在约束冲突明细查看步骤4日志 echo 【%date% %time%】!CUR_SCHEMA! 数据导入存在警告 !LOG_FILE! ) echo 【%date% %time%】!CUR_SCHEMA! 数据导入流程执行完毕 !LOG_FILE! echo. echo !CUR_SCHEMA! 全部迁移步骤执行完成 echo 【%date% %time%】!CUR_SCHEMA! 迁移流程结束 !LOG_FILE! :NEXT_SCHEMA echo. !LOG_FILE! echo. !LOG_FILE! echo echo 切换至下一个待迁移Schema echo echo. ) echo !LOG_FILE! echo 全部Schema遍历执行完毕迁移结束时间%date% %time% !LOG_FILE! echo 总日志路径!LOG_FILE! echo 分步明细日志、备份文件统一存放目录%BACKUP_ROOT% echo !LOG_FILE! echo. echo 批量迁移脚本执行完成所有日志文件存放%BACKUP_ROOT% pause endlocal