# dbsync-file **Repository Path**: stdylan/dbsync-file ## Basic Information - **Project Name**: dbsync-file - **Description**: No description available - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-09-17 - **Last Updated**: 2026-09-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # dbsync-file 把**远端数据库**的数据导出为文件,再拷贝到本机导入到 **PostgreSQL** 的工具。 适用于**本地无法直连远端数据库**(只能经跳板机/堡垒机)的场景:在能连远端库的主机上跑导出, 把产出的压缩包传回本机,再在本机导入。导出端完成跨类型转换,导入端只做 `COPY` 灌库。 ## 支持的源库 - 达梦 DM(`dm.jdbc.driver.DmDriver`) - Oracle(`oracle.jdbc.OracleDriver`) - PostgreSQL(`org.postgresql.Driver`) 目标库固定为本地 **PostgreSQL**(导入端只需本地有 PG)。 ## 目录结构 ``` dbsync-file/ ├── export.bat # 导出端入口(自动编译后运行) ├── import.bat # 导入端入口(自动编译后运行) ├── export.properties # 源库连接 + 过滤规则(远端改这个) ├── import.properties # 本地 PG 连接(本机改这个) ├── src/ # Common.java / Exporter.java / Importer.java ├── lib/ # 三库 JDBC 驱动(已自带,无需另下) └── out/ # 编译产物(已编译,可直接运行) ``` ## 前置 - JDK 8+(导出端在远端、导入端在本地都需要能跑 `java`)。 - 驱动已置于 `lib/`,无需额外下载。 ## 使用流程 ### 1. 远端:导出 编辑 `export.properties`,把 `src.*` 指向远端库(DM / PG / Oracle): ```properties src.type=dm # dm | pg | oracle,留空按 URL 自动推断 src.url=jdbc:dm://:5236 src.user= src.pwd= src.schema=TEST # DM/Oracle 必须大写;PG 写实际 schema dst.schema=postgres # 导入端落到本地 PG 的 schema(写进清单) ``` 运行: ```bat export.bat ``` 可选参数: ```bat export.bat --only=bs_mo,bs_wplan_*,jy_* # 只导出匹配的表(支持 * 通配) export.bat --limit=50 # 只处理前 50 张(试跑) export.bat --max-rows=0 # 本次关闭行数阈值 export.bat --config=其它.properties # 指定别的配置 ``` 产出:`dbsync-export-<时间戳>.zip`,内含 `manifest.txt`(表/列/类型/主键/行数/排除清单) 与每表一个 `data/<表名>.csv`(PG text `COPY` 格式,整体 DEFLATE 压缩)。 ### 2. 拷贝压缩包 把 `dbsync-export-*.zip` 用任意方式传回本机(U 盘 / `scp` / 对象存储均可,纯文件、无连通要求)。 ### 3. 本机:导入 编辑 `import.properties`,指向本地 PG: ```properties dst.url=jdbc:postgresql://localhost:5432/postgres dst.user=postgres dst.pwd=postgres dst.schema=postgres zip.file= # 留空=使用当前目录最新的 dbsync-export-*.zip ``` 运行: ```bat import.bat ``` 可选参数: ```bat import.bat --zip=dbsync-export-xxx.zip # 指定压缩包 import.bat --only=bs_mo # 只导入部分表 import.bat --schema=postgres # 覆盖目标 schema ``` 导入端行为:按 manifest **建表 / 补缺失列 / 清空覆盖**,用 PostgreSQL `CopyManager` 从 zip 条目流式 `COPY` 灌库;逐表独立事务,单表失败回滚不影响其它表。产出 `import-report.txt`。 ## 过滤规则(与 ims-v6-dbsync 一致) | 配置 | 作用 | |---|---| | `exclude.keywords` | 表名关键字黑名单(不区分大小写,包含即排除),默认 `_log,log_data,history,audit` | | `exclude.maxRows` | 行数阈值,超过则排除(`<=-0` 关闭),默认 `500000` | | `include.forceInclude` | 白名单,无视黑名单强制同步 | | `include.patterns` | 只同步匹配的表(留空=全部,支持 `*` 通配) | ## 类型映射要点 - **跨类型转换在导出端完成**:DM/Oracle 的 `NUMBER`/`VARCHAR2`/`DATE`/`CLOB`/... 在导出时就算成 PG 目标类型写进 `manifest`,导入端只信任 manifest,两端口径一致。 - 达梦字符长度按 `dm.charDivisor`(默认 4)换算:`varchar(字节长/4)`。 - `DATE`/`TIMESTAMP` 统一按 PG `timestamp` 处理(避免丢时分秒)。 - `CLOB` → `text`;`BLOB` → 列结构保留、**数据置空**(v1 限制,见下)。 ## 已知限制(v1) - **BLOB 列**:结构保留、数据填 `NULL`。CLOB 正常转为 `text`。需要真搬二进制可后续加 base64 + 临时表 staging。 - **全量导出会扫全库计数**:用于 50 万行阈值判断(远端单线程约几分钟);`--only` 已优化为只扫命中表,很快。 - 导入端对已有表只**补缺失列**、不改已有列类型;若类型严重不符,建议先 `DROP` 该表再导入。 ## 校验 导入后用 `import-report.txt` 看每张表结果(`ok / empty / error` 与行数)。 独立核对示例: ```sql SELECT count(*) FROM postgres.bs_mo; ```