从国外数据库迁移到国产数据库全过程-FGO2CDB工具

从国外数据库迁移到国产数据库全过程-FGO2CDB工具

**> FGO2CDB(全称: FGEDU Overseas to China DataBase Migration),是一款国外数据库 → 国产数据库 高性能统一迁移平台(命令行 + 可视化)

功能简介:FGO2CDB 是面向信创/国产化场景的一站式数据库迁移平台,覆盖 Oracle / MySQL / Percona / MariaDB / PostgreSQL / DB2 / SQL Server / Redis / MongoDB 等源端到达梦 DM / 金仓 KingbaseES V9 / TiDB / TDSQL / GBase / openGauss / OceanBase(MySQL/Oracle 双模式)/ GreatSQL / GaussDB(DWS) / GaussDB(TPOPS) / YashanDB / GoldenDB 等国产目标端的全流程迁移。平台支持表结构、数据、索引、视图、函数、存储过程、触发器、序列的自动转换与迁移,内置原生 C 类型映射引擎 + Python 流式管道,提供断点续传、暂停/恢复/停止、批量 COPY 写入、并发多表、内存保护、连接池重试、数据行数 + 抽样校验,以及可视化控制台、迁移评估报告。支持 KingbaseES V9、openGauss、GaussDB DWS/TPOPS、OceanBase 等多兼容模式切换,全链路 UTF-8 强制,确保 GB ~ TB 级数据零乱码迁移;对于无法自动转换的程序对象(视图/函数/存储过程/触发器),自动登记到人工处理清单。

一、程序介绍

1.1 项目概述

FGO2CDB 是由 风哥 倾力研发的面向信创/国产化场景的数据库迁移平台,工具底层采用C + Python混合架构,它将国外主流关系型/NoSQL 数据库统一抽象为「源端连接器 + 类型映射 + 流式管道 + 目标端写入器」的标准流水线,覆盖 结构迁移、数据迁移、对象迁移、进度跟踪、数据校验、迁移报告 全流程,支持 GB ~ TB 级数据量的稳定、高速、零乱码迁移。

1.2 作者信息

项目 内容
作者 风哥
官方网站 http://www.fgedu.net.cn
技术社区 http://www.itpux.com
数据库教程 https://edu.51cto.com/lecturer/8020378.html

1.3 设计理念

统一平台:所有源端/目标端组合在同一个工具内完成,无需切换多个迁移产品;

配置驱动:每个迁移对提供独立 YAML 模板,复制即用;

命令行优先:命令行是主交互方式,便于 DevOps/CI-CD 集成;

可视化辅助:Web 控制台用于实时监控、评估、报告查看;

稳定优先:断点续传、自动重试、内存保护、连接池,保证 TB 级任务不中断;

零乱码:全链路 UTF-8 强制 + 二进制列 bytes 直传 + COPY 转义。

────────────────────────────────────────

二、程序功能与特性

2.1 核心功能

功能 说明
表结构迁移 自动 DDL 转换(类型/约束/默认值/注释),跨方言兼容
数据迁移 流式游标读取 + 批量写入,支持 COPY FROM STDIN 高速导入
索引迁移 主键、唯一索引、普通索引自动重建
视图迁移 SQL 方言转换(MySQL/PG/Oracle 互相适配)
函数迁移 PL/SQL ↔ PL/pgSQL 方言转换,含函数映射表
存储过程迁移 过程体语法转换,必要时人工复核
触发器迁移 Oracle/YashanDB 等 PL/SQL 系支持
序列迁移 序列当前值同步,确保自增连续
迁移前评估 扫描源库对象,输出兼容性评分、风险清单、HTML 报告
进度跟踪 SSE 实时推送表级/行级进度到 Web 控制台
数据校验 行数校验 + 抽样比对 + checksum 双向验证
迁移报告 自动生成 HTML 报告(已迁移表/错误/警告/不一致表)
断点续传 每表独立检查点,中断重启自动跳过已完成表
并发迁移 线程池并发多表,I/O 与 CPU 充分利用

2.2 性能特性

原生 C 引擎:负责类型转换/转义/编码,性能数倍于纯 Python;

流式游标:服务端游标 + fetch_size 批量拉取,避免大表 OOM;

生产者-消费者管道:读/转/写三级流水线,queue_size 缓冲背压;

COPY 批量导入:PG 系目标(Kingbase/openGauss/GaussDB)走 COPY FROM STDIN;

多表并发:concurrency 参数控制并发表数(默认 8-10);

动态批大小:按表大小自动调整 batch_insert_size,大表用大批次;

内存保护:memory_hard_limit_mb 硬限,超限自动降速;

规模预设:scale_preset(small/medium/large)一键适配硬件规格。

2.3 稳定性特性

断点续传:checkpoint_dir 保存每表进度,重启自动恢复;

指数退避重试:retry_max 次数 + retry_backoff_base 退避基数;

连接池:max_open_conns 复用连接,避免频繁握手;

死锁恢复:检测死锁/连接异常自动重连重试;

一致快照:consistent_snapshot 选项保证源端读一致性;

超时保护:per_table_timeout / global_timeout 双层超时熔断;

错误隔离:单表失败不阻塞其他表,错误日志独立记录。

2.4 数据质量特性

零乱码:全链路 UTF-8,utf8mb4 支持 emoji/4 字节字符;

二进制直传:BLOB/IMAGE/BYTEA 以 bytes 直传,不经过字符串层;

二进制兜底映射:原生引擎未命中时,按 BLOB/RAW/IMAGE/BYTEA 模式自动映射到目标族二进制类型(BLOB/BYTEA/LONGBLOB),避免 bytes 经字符串层产生乱码;

字符串兜底:未识别的字符类型一律映射到 TEXT/CLOB/LONGTEXT,保证不丢数据;

COPY 转义:COPY 模式自动处理 \t \n \ \N 转义;

类型映射表:每个源-目标对都有详细类型映射 + 兜底策略(UNKNOWN → TEXT/CLOB/BLOB);

数据校验(强校验):行数比对 + 抽样 10 行 MD5 checksum 比对,双重保证不丢不错。

2.5 加固特性(防崩溃、防丢数、防乱码)

分批量提交:每表按 batch_insert_size 分批提交,单批失败按指数退避重试 retry_times 次,全部失败才标记失败;

断点续传强化:每批写入后立即保存 checkpoint(status=running, rows=N),中断重启自动跳过已完成表;

内存背压保护:按批次估算字节数,超过 memory_limit_mb 60% 自动降速,超过 memory_hard_limit_mb 强制降速,避免 OOM;

双层超时熔断:per_table_timeout(默认 86400s/1天)单表超时 + global_timeout(默认 432000s/5天)全局超时;

停止信号传播:web 控制台停止请求通过双重标志(_STOP_EVENT + pipeline._STOP_FLAG)传播到每个迁移线程,及时响应;

SSE 防过载:控制台 SSE 连接数硬限 100,每条队列上限 2000 条消息,30 分钟空闲自动断开,避免僵尸连接耗内存;

异常隔离:后台迁移线程异常不外泄到 Web 进程,单表失败不阻塞其他表;

重连恢复:单批失败重试时自动 disconnect+connect 重连目标端,处理死连接;

checksum 强校验:迁移后行数 + 抽样 MD5 比对,发现不一致即标记 fail,不静默通过。

────────────────────────────────────────

三、支持环境

3.1 支持的操作系统(信创生态全覆盖)

国产操作系统(主推):

OS 支持版本 架构
麒麟 Kylin Kylin V10 SP1/SP2/SP3、Kylin Server V10 x86_64, aarch64, loongarch64
统信 UOS UOS V20(1020/1021/1022/1060)、UOS Server x86_64, aarch64, loongarch64, mips64el
深度 Deepin Deepin 20.x / 23 x86_64, aarch64
欧拉 openEuler 20.03 / 22.03 / 24.03 LTS x86_64, aarch64, loongarch64
龙蜥 Anolis OS 7.9 / 8.x x86_64, aarch64
腾讯 TencentOS Server 2.4 / 3.1 x86_64, aarch64
鸿蒙 HarmonyOS Server(轻量场景) aarch64

国外操作系统:

OS 支持版本 架构
CentOS 7.x / 8.x / Stream 8/9 x86_64, aarch64
RHEL 7.x / 8.x / 9.x x86_64, aarch64, ppc64le
Ubuntu 18.04 / 20.04 / 22.04 / 24.04 LTS x86_64, aarch64
Debian 10 / 11 / 12 x86_64, aarch64
SUSE SLES 12 / 15 x86_64, aarch64
Oracle Linux 7 / 8 / 9 x86_64, aarch64
Rocky Linux 8 / 9 x86_64, aarch64
AlmaLinux 8 / 9 x86_64, aarch64
Fedora 38 / 39 / 40 x86_64, aarch64
Microsoft Windows Server 2016/2019/2022/2025、Windows 10/11 x86_64
Apple macOS 11+(Big Sur/Monterey/Sonoma/Sequoia) x86_64, arm64
IBM AIX 7.2 / 7.3 ppc64/ppc64le

3.2 CPU 架构

x86_64 (amd64) --- 主流服务器架构

aarch64 (arm64) --- 鲲鹏/飞腾/擎天等国产 CPU

loongarch64 --- 龙芯

mips64el --- 龙芯旧指令集

sw_64 --- 申威

ppc64/ppc64le --- PowerPC(AIX/Linux on POWER)

3.3 Python 环境

Python 3.8+(推荐 3.9 / 3.10 / 3.11)

依赖:Flask、PyYAML、psycopg2-binary、pymysql、cx_Oracle/oracledb、pyodbc、pymongo、redis 等

3.4 C 编译环境(编译原生引擎)

GCC 7+ 或 Clang 10+(国产 CPU 需对应交叉工具链)

Make 3.8+

Windows 需 Visual Studio 2019+ (MSVC)

国产系统:麒麟/UOS 自带 gcc,openEuler/Anolis 用 dnf 安装

3.5 支持的数据库版本

源端(国外数据库):

源端 支持版本 类型族 驱动/协议
Oracle 9i / 10g / 11g R1/R2 / 12c R1/R2 / 18c / 19c / 21c / 23ai / 26ai oracle oracledb
MySQL 5.6 / 5.7 / 8.0 / 8.1-8.4 mysql PyMySQL
MariaDB 10.3-10.11 / 11.x mysql PyMySQL
PostgreSQL 9.6 / 10-16 / 17 postgres psycopg2
IBM DB2 10.5 / 11.1 / 11.5 / 12.x (LUW) db2 pyodbc
MS SQL Server 2008 R2 / 2012/2014/2016/2017/2019/2022 sqlserver pyodbc
Redis 4.x / 5.x / 6.x / 7.x redis redis-py
MongoDB 3.6 / 4.0-4.4 / 5.0 / 6.0 / 7.0 mongodb pymongo

目标端(国产数据库):

目标 支持版本 类型族 协议兼容 默认端口
达梦 DM DM7 / DM8 / DM9 dm 自研(SQL 标准) 5236
金仓 KingbaseES V8R3 / V8R6 / V9 postgres PostgreSQL 54321
TiDB 4.0 / 5.x / 6.x / 7.x / 8.x mysql MySQL 4000
TDSQL TDSQL-C MySQL 5.7/8.0 / TDSQL-C PostgreSQL mysql MySQL(分布式) 15001
GBase GBase 8a 8.6/9.x / 8s 8.8/9.x / 8c gbase 自研 5258
openGauss 1.x-5.x / 6.x (B/Plus/企业版) postgres PostgreSQL 5432
OceanBase 3.x / 4.x (MySQL/Oracle 模式) mysql MySQL 模式 2881
GaussDB GaussDB 200/100 (DWS) / Top 1.x-2.x / 分布式版 postgres PostgreSQL (MPP) 25308
YashanDB 22.x / 23.x oracle Oracle 1688
GoldenDB 6.x / 7.x / 8.x mysql MySQL(分布式) 3306

3.6 硬件规格建议

规模预设 CPU 内存 磁盘 适用数据量
small 4 核 4 GB SSD 100 GB < 50 GB
medium 8 核 8 GB SSD 500 GB 50 GB ~ 500 GB
large 16 核 16 GB NVMe 1 TB 500 GB ~ 5 TB
xlarge 32 核 32 GB+ NVMe 2 TB+ 5 TB ~ 50 TB

3.7 关键配置参数(加固相关)

参数 默认值 说明
concurrency 8 多表并发度
batch_insert_size 50000 单批提交行数(分批量提交)
fetch_size 10000 流式游标每批拉取
retry_times 3 单批失败重试次数
retry_delay 5.0 重试退避基数(指数退避 2^n)
memory_limit_mb 2048 内存软限,超 60% 自动降速
memory_hard_limit_mb 4096 内存硬限,强制降速
per_table_timeout 86400 (1 天) 单表超时熔断
global_timeout 432000 (5 天) 全局超时熔断
large_table_threshold 1000000 大表阈值(启用更激进的批大小)
huge_table_threshold 10000000 巨表阈值(启用分片并行)
checkpoint_dir ./.checkpoint 断点续传目录

────────────────────────────────────────

四、程序使用

4.1 安装

# 1. 克隆项目

git clone <仓库地址> FGO2CDB

cd FGO2CDB

# 2. 安装 Python 依赖

pip install -r requirements.txt

# 3. 编译原生 C 引擎

make native

# 4. 验证安装

python3 -m fgo2cdb --version

4.2 命令行操作

4.2.1 全量迁移(DDL + 数据 + 对象)

python3 -m fgo2cdb convert -c config.yml

4.2.2 仅生成 DDL 脚本(不执行)

python3 -m fgo2cdb ddl -c config.yml -o ddl.sql

4.2.3 仅迁移数据(结构已存在)

python3 -m fgo2cdb data -c config.yml

4.2.4 数据校验

python3 -m fgo2cdb validate -c config.yml

4.2.5 迁移前评估

python3 -m fgo2cdb assess -c config.yml -o assess.html

4.2.6 生成迁移报告

python3 -m fgo2cdb report -c config.yml -o report.html

4.2.7 指定表清单迁移

python3 -m fgo2cdb convert -c config.yml \

--table-list t_user,t_order,t_order_item

4.2.8 断点续传(中断后重启)

# 直接重跑同一命令,自动加载 checkpoint

python3 -m fgo2cdb convert -c config.yml

4.2.9 使用模板配置

# 复制模板后修改连接信息即可

cp templates/oracle_to_dm.yml my_config.yml

vi my_config.yml

python3 -m fgo2cdb convert -c my_config.yml

4.3 可视化操作

4.3.1 启动控制台

# 前台启动

python3 webctl.py start

# 或指定端口

python3 webctl.py start --port 8088

# 或用 Python 模块

python3 -m fgo2cdb.web --port 8088

4.3.2 后台守护进程启动

python3 webctl.py start --daemon

4.3.3 查看状态 / 停止 / 重启

python3 webctl.py status

python3 webctl.py stop

python3 webctl.py restart

4.3.4 控制台页面

浏览器访问 http://<服务器IP>:8088,可执行:

配置编辑:在线编辑 YAML 配置,保存/加载;

连接测试:一键测试源端/目标端连通性;

迁移评估:扫描源库,输出兼容性评分与风险清单;

启动迁移:一键启动全量/数据迁移,SSE 实时进度推送;

停止迁移:安全停止当前任务(已迁移数据保留);

查看报告:迁移结束后生成 HTML 报告,含错误/警告/不一致表清单。

4.3.3 Web API 列表
方法 路径 说明
GET / 控制台首页
POST /api/test 测试源端/目标端连接
POST /api/assess 迁移前评估,返回评分/风险
GET /api/assess/report 获取评估 HTML 报告
POST /api/convert 启动迁移任务
POST /api/stop 停止当前迁移
POST /api/config/save 保存配置 YAML
GET /api/config/load 加载配置 YAML
GET /api/report 获取迁移 HTML 报告
GET /api/status 获取当前状态快照
GET /api/progress SSE 实时进度流

4.4 模板文件配置项说明

所有模板位于项目根目录 templates/,命名规则为 <源库>_to_<目标库>.yml(如 oracle_to_oceanbase.yml)。模板已按目标库族预置端口、字符集、并行度、批量大小等最佳实践值,复制后只需修改连接信息(host/port/username/password/database/schema)即可运行。完整结构如下:

# ========== 源端配置 ==========

source:

type: oracle # 源库逻辑类型:mysql/postgresql/oracle/db2/sqlserver/redis/mongodb

host: 10.0.0.10

port: 1521

username: SOURCE_USER

password: Source_Pwd_2024

database: ORCL # MySQL/PG/SQL Server 必填;Oracle 一般填 SID

schema: SOURCE_USER # Oracle/PG/DB2 必填;MySQL 留空

sid: "" # Oracle SID(与 service_name 二选一)

service_name: ORCL # Oracle service name

charset: UTF8 # 源库字符集(MySQL=utf8mb4 / Oracle=UTF8 / PG=UTF8)

connect_timeout: 30 # 连接超时(秒)

consistent_snapshot: true # 一致性快照(推荐开启,保证读一致性)

extra: # 源端专属参数

threaded: true # Oracle 多线程

driver: "ODBC Driver 17 for SQL Server" # SQL Server ODBC 驱动

encrypt: false # SQL Server 是否加密

auth_source: admin # MongoDB 认证库

# ========== 目标端配置 ==========

target:

type: oceanbase # 目标库逻辑类型:dm/kingbase/tidb/tdsql/gbase/opengauss/oceanbase/gaussdb/yashandb/goldendb

mode: oracle # ★ OceanBase 专属:mysql(默认)/oracle;其它目标库不需要

host: 10.0.0.20

port: 2883 # OceanBase OBProxy=2883 / 直连=2881;DM=5236;KingbaseES=54321;TiDB=4000;GBase=5258;YashanDB=1688;GaussDB=25308;TDSQL=15001;GoldenDB=3306

username: SYS

password:

database: target_db

schema: SOURCE_USER # PG/Oracle 系必填;MySQL 系留空

service_name: "" # Oracle/YashanDB/OceanBase Oracle 模式按需填

charset: UTF8 # 目标库字符集

connect_timeout: 30

extra: # 目标端专属参数

ob_tenant_mode: oracle # OceanBase 租户模式(与 mode 对齐)

driver: oracle # 显式指定驱动

pg_protocol: true # PG 系(KingbaseES/openGauss/GaussDB)走 COPY 批量

is_dws: true # GaussDB DWS 数仓模式

distribution: hash # GaussDB DWS 分布策略

# ========== 转换配置 ==========

conversion:

options: # 迁移内容开关(true=迁移,false=跳过)

tableddl: true # 表结构 DDL

data: true # 数据

indexes: true # 索引

views: false # 视图

functions: false # 函数

procedures: false # 存储过程(Oracle/OceanBase Oracle/YashanDB 支持)

triggers: false # 触发器

sequences: false # 序列

foreign_keys: false # 外键(默认关闭,迁移阶段避免约束阻塞)

validate_data: true # 数据校验(迁移后比对行数)

lowercase_tables: false # 是否把表名转为小写(PG 系常用 true)

lowercase_columns: false # 是否把列名转为小写

skip_existing_tables: true # 跳过已存在的表

truncate_before_sync: false # 同步前 truncate 目标表

use_table_list: false # 是否启用白名单(table_list)

table_list: [] # 白名单表

exclude_use_table_list: false

exclude_table_list: [] # 黑名单表

use_id_as_primary: true # MongoDB 专用:_id 作为主键

nested_doc_strategy: json # MongoDB 专用:嵌套文档存为 JSON/JSONB 列

limits: # 性能与稳定性

concurrency: 8 # 单表内并发度

parallel_tables: 4 # 多表并行度

batch_insert_size: 50000 # 批量插入大小

streaming_cursor: true # 流式游标(防大表内存爆)

fetch_size: 10000 # 每批抓取行数

queue_size: 4 # 队列深度

memory_limit_mb: 2048 # 软内存上限

memory_hard_limit_mb: 4096 # 硬内存上限(超过强制降速)

retry_times: 3 # 单批重试次数

retry_delay: 5.0 # 退避基数(秒)

bulk_insert: true # 启用 COPY/bulk 模式

large_table_threshold: 1000000 # 大表阈值(行)

huge_table_threshold: 10000000 # 巨表阈值(启用分片)

per_table_timeout: 86400 # 单表超时(秒)

global_timeout: 432000 # 全局超时(秒)

checkpoint_dir: "./.checkpoint" # 断点续传目录

scale_preset: large # 规模预设:small/medium/large/huge

# ========== 运行配置 ==========

run: # 日志与运行控制

show_progress: true # 控制台进度

error_log_path: ./errors.log # 错误日志

enable_file_logging: true

log_file_path: ./conversion.log

show_console_logs: true

log_level: INFO # DEBUG/INFO/WARNING/ERROR

字段优先级与兼容说明:

target.mode 是 OceanBase 专属字段,可选 mysql(默认,路由到 MySQLTarget)或 oracle(路由到 OracleTarget)。其它目标库无需填写,填写也会被忽略。

target.modetarget.extra.mode 等价(顶层优先);老模板未升级时仍可读取 extra.ob_tenant_mode / extra.driver / extra.compat_mode 作为参考。

source.type 必须在 SOURCE_FAMILIES 内;target.type 必须在 TARGET_FAMILIES 内。使用 python3 -m fgo2cdb version 可查看支持的类型清单。

sidservice_name 二选一:Oracle/YashanDB 优先用 service_name,缺省时回退到 sid,再回退到 database

schema:PG 系(KingbaseES/openGauss/GaussDB)与 Oracle 系(Oracle/YashanDB/OceanBase Oracle 模式)必填;MySQL 系(MySQL/TiDB/TDSQL/OceanBase MySQL 模式/GoldenDB)留空。

consistent_snapshot: true 推荐开启,可在长事务中保证读一致性,避免迁移过程中数据漂移。

limits.scale_preset 会按预设批量调整 concurrency / batch_insert_size / parallel_tables,手工设置的值优先级更高。

conversion.options.validate_data 默认开启,迁移完成后自动比对源/目标行数;不通过的表会在报告中列出。

────────────────────────────────────────

五、程序各种案例场景与操作过程

5.1 场景一:Oracle → 达梦 DM8(金融核心系统国产化)

背景:某银行核心系统从 Oracle 19c 迁移到达梦 DM8,数据量 2 TB,要求零停机窗口。

步骤:

# 1. 使用模板

cp templates/oracle_to_dm.yml bank_oracle_dm.yml

vi bank_oracle_dm.yml

# 修改 host/port/username/password/schema

# 2. 迁移前评估(生成评估报告)

python3 -m fgo2cdb assess -c bank_oracle_dm.yml -o assess.html

# 3. 先迁移表结构(预跑)

python3 -m fgo2cdb ddl -c bank_oracle_dm.yml -o ddl.sql

# 人工核对 DDL 后在 DM 执行

# 4. 全量数据迁移

python3 -m fgo2cdb convert -c bank_oracle_dm.yml

# 5. 数据校验

python3 -m fgo2cdb validate -c bank_oracle_dm.yml

# 6. 生成迁移报告

python3 -m fgo2cdb report -c bank_oracle_dm.yml -o report.html

关键配置(oracle_to_dm.yml):

source:

type: oracle

host: 10.0.0.10

port: 1521

consistent_snapshot: true # 一致快照保证读一致性

target:

type: dm

host: 10.0.0.20

port: 5236

conversion:

limits:

concurrency: 8 # 8 表并发

batch_insert_size: 50000

scale_preset: large # 大规模预设

5.2 场景二:MySQL → TiDB(互联网业务分布式改造)

背景:电商业务从单机 MySQL 8.0 迁移到 TiDB 7.x 分布式集群,数据量 800 GB。

cp templates/mysql_to_tidb.yml shop_mysql_tidb.yml

vi shop_mysql_tidb.yml

# 修改连接信息

# 评估

python3 -m fgo2cdb assess -c shop_mysql_tidb.yml

# 全量迁移(TiDB 走 MySQL 协议,几乎无类型转换)

python3 -m fgo2cdb convert -c shop_mysql_tidb.yml

# 校验

python3 -m fgo2cdb validate -c shop_mysql_tidb.yml

关键配置:

source:

type: mysql

charset: utf8mb4 # 4 字节字符支持

consistent_snapshot: true

target:

type: tidb

port: 4000

charset: utf8mb4

extra:

max_allowed_packet: 1073741824 # 1 GB 包大小

5.3 场景三:可视化控制台操作 Oracle → KingbaseES

步骤:

# 1. 启动控制台

python3 webctl.py start --port 8088 --daemon

# 2. 浏览器访问 http://10.0.0.30:8088

# 3. 在配置编辑页粘贴 oracle_to_kingbase.yml 模板,修改连接信息,点击「保存」

# 4. 点击「测试连接」,确认源端 Oracle 与目标端 KingbaseES 均可连通

# 5. 点击「迁移评估」,等待扫描完成,查看兼容性评分与风险清单

# 6. 点击「启动迁移」,实时查看表级进度条、已迁移行数、速率

# 7. 迁移完成后点击「查看报告」,下载 HTML 报告

# 8. 停止控制台

python3 webctl.py stop

5.4 场景四:PostgreSQL → openGauss(信创升级)

背景:政务系统从 PostgreSQL 14 迁移到 openGauss 3.x(Oracle 兼容模式)。

cp templates/postgresql_to_opengauss.yml gov_pg_opengauss.yml

vi gov_pg_opengauss.yml

python3 -m fgo2cdb convert -c gov_pg_opengauss.yml

python3 -m fgo2cdb validate -c gov_pg_opengauss.yml

关键配置:

target:

type: opengauss

extra:

db_compatibility: oracle # openGauss Oracle 兼容模式

pg_protocol: true # 走 PG 协议,可用 COPY 加速

5.5 场景五:SQL Server → GaussDB DWS(数仓上云)

背景:分析库从 SQL Server 2019 迁移到 GaussDB DWS(MPP 分布式数仓),数据量 3 TB。

cp templates/sqlserver_to_gaussdb.yml bi_mssql_gaussdb.yml

vi bi_mssql_gaussdb.yml

python3 -m fgo2cdb convert -c bi_mssql_gaussdb.yml

关键配置:

target:

type: gaussdb

extra:

is_dws: true

distribution: hash # 哈希分布

pg_protocol: true # COPY 批量导入

5.6 场景六:DB2 → 达梦 DM(保险核心改造)

背景:保险核心库从 IBM DB2 迁移到达梦 DM8,数据量 1.2 TB。

cp templates/db2_to_dm.yml ins_db2_dm.yml

python3 -m fgo2cdb convert -c ins_db2_dm.yml

python3 -m fgo2cdb validate -c ins_db2_dm.yml

python3 -m fgo2cdb report -c ins_db2_dm.yml -o report.html

5.7 场景七:MongoDB → 达梦 DM(文档库结构化)

背景:日志库从 MongoDB 迁移到 DM8,集合 → 表,嵌套文档 → JSON 列。

cp templates/mongodb_to_dm.yml log_mongo_dm.yml

python3 -m fgo2cdb convert -c log_mongo_dm.yml

关键配置:

conversion:

options:

use_id_as_primary: true # _id 作为主键

nested_doc_strategy: json # 嵌套文档存为 JSON 列

5.8 场景八:断点续传(大表迁移中断恢复)

背景:迁移 5 TB 大表时网络抖动中断。

# 直接重跑同一命令,自动加载 checkpoint 跳过已完成表

python3 -m fgo2cdb convert -c big_table.yml

# 日志会显示:[checkpoint] 跳过已完成表 t_order (12345678 rows)

5.9 场景九:Oracle → OceanBase(Oracle 模式,PL/SQL 直接迁移)

背景:券商核心库从 Oracle 19c 迁移到 OceanBase 4.x Oracle 租户,要求存储过程/包/触发器原样保留,数据量 1.5 TB。

关键点:OceanBase 提供两种兼容模式------MySQL 模式与 Oracle 模式。本场景使用 Oracle 模式,程序会按 target.mode: oracle 路由到 OracleTarget,走 oracledb 协议,PL/SQL 几乎免改写。

# 1. 复制模板(已内置 mode: oracle)

cp templates/oracle_to_oceanbase.yml broker_oracle_ob.yml

vi broker_oracle_ob.yml

# 修改 host/port/username/password/service_name

# 2. 评估对象兼容性

python3 -m fgo2cdb assess -c broker_oracle_ob.yml

# 3. 导出 DDL 给 DBA 评审

python3 -m fgo2cdb ddl -c broker_oracle_ob.yml -o ddl.sql

# 4. 全量迁移(含过程/触发器/序列)

python3 -m fgo2cdb convert -c broker_oracle_ob.yml

# 5. 数据校验

python3 -m fgo2cdb validate -c broker_oracle_ob.yml

关键配置:

source:

type: oracle

host: 10.0.0.10

port: 1521

service_name: ORCL

schema: BROKER

consistent_snapshot: true

target:

type: oceanbase

mode: oracle # ★ OceanBase Oracle 兼容模式(路由到 OracleTarget)

host: 10.0.0.20

port: 2883 # OBProxy 端口

username: SYS

password:

schema: BROKER

charset: UTF8

conversion:

options:

procedures: true # OceanBase Oracle 模式支持 PL/SQL

triggers: true

sequences: true

5.10 场景十:MySQL → OceanBase(MySQL 模式,电商库分布式改造)

背景:电商业务库从单机 MySQL 8.0 迁移到 OceanBase 4.x MySQL 租户,数据量 600 GB,业务零改造。

关键点:使用 OceanBase MySQL 模式,程序按 target.mode: mysql(默认)路由到 MySQLTarget,走 PyMySQL 协议,类型/SQL 几乎无转换。

cp templates/mysql_to_oceanbase.yml shop_mysql_ob.yml

vi shop_mysql_ob.yml

python3 -m fgo2cdb assess -c shop_mysql_ob.yml

python3 -m fgo2cdb convert -c shop_mysql_ob.yml

python3 -m fgo2cdb validate -c shop_mysql_ob.yml

关键配置:

source:

type: mysql

host: 10.0.0.10

port: 3306

charset: utf8mb4

consistent_snapshot: true

target:

type: oceanbase

mode: mysql # ★ OceanBase MySQL 兼容模式(默认,可省略)

host: 10.0.0.20

port: 2881 # 直连端口;OBProxy 用 2883

username: root

password:

database: target_db

charset: utf8mb4

5.11 场景十一:PostgreSQL → OceanBase(MySQL 模式,政务系统改造)

背景:政务系统从 PostgreSQL 14 迁移到 OceanBase 4.x MySQL 租户,数据量 200 GB。

cp templates/postgresql_to_oceanbase.yml gov_pg_ob.yml

vi gov_pg_ob.yml

python3 -m fgo2cdb convert -c gov_pg_ob.yml

python3 -m fgo2cdb validate -c gov_pg_ob.yml

关键配置:

source:

type: postgresql

host: 10.0.0.10

port: 5432

schema: public

target:

type: oceanbase

mode: mysql # OceanBase MySQL 模式

host: 10.0.0.20

port: 2881

database: gov_db

charset: utf8mb4

conversion:

options:

lowercase_tables: true # PG 大小写敏感 -> OB 小写

lowercase_columns: true

5.12 场景十二:SQL Server → OceanBase(MySQL 模式,ERP 改造)

背景:制造企业 ERP 从 SQL Server 2019 迁移到 OceanBase 4.x MySQL 租户。

cp templates/sqlserver_to_oceanbase.yml erp_mssql_ob.yml

vi erp_mssql_ob.yml

python3 -m fgo2cdb convert -c erp_mssql_ob.yml

关键配置:

source:

type: sqlserver

host: 10.0.0.10

port: 1433

extra:

driver: "ODBC Driver 17 for SQL Server"

encrypt: false

trust_server_certificate: true

target:

type: oceanbase

mode: mysql

host: 10.0.0.20

port: 2881

database: erp_db

5.13 场景十三:Oracle → YashanDB(信创 Oracle 平替)

背景:某省级政务库从 Oracle 19c 迁移到崖山 YashanDB(Oracle 协议兼容),存储过程/触发器原样保留。

cp templates/oracle_to_yashandb.yml gov_oracle_yashan.yml

vi gov_oracle_yashan.yml

python3 -m fgo2cdb ddl -c gov_oracle_yashan.yml -o ddl.sql # 评审 DDL

python3 -m fgo2cdb convert -c gov_oracle_yashan.yml

python3 -m fgo2cdb validate -c gov_oracle_yashan.yml

关键配置:

source:

type: oracle

service_name: ORCL

schema: GOV

consistent_snapshot: true

target:

type: yashandb

host: 10.0.0.20

port: 1688

username: SYS

schema: GOV

charset: UTF8

conversion:

options:

procedures: true

triggers: true

sequences: true

5.14 场景十四:MySQL → GoldenDB(金融分布式改造)

背景:城商行核心库从 MySQL 5.7 迁移到 GoldenDB 分布式集群,数据量 1.8 TB。

cp templates/mysql_to_goldendb.yml bank_mysql_gdb.yml

vi bank_mysql_gdb.yml

python3 -m fgo2cdb convert -c bank_mysql_gdb.yml

关键配置:

source:

type: mysql

charset: utf8mb4

consistent_snapshot: true

target:

type: goldendb

host: 10.0.0.20

port: 3306 # GoldenDB 兼容 MySQL 协议

database: target_db

conversion:

limits:

concurrency: 8

batch_insert_size: 50000

5.15 场景十五:MySQL → GBase 8s(政企分析库改造)

背景:电信分析库从 MySQL 8.0 迁移到 GBase 8s,数据量 400 GB。

cp templates/mysql_to_gbase.yml tel_mysql_gbase.yml

vi tel_mysql_gbase.yml

python3 -m fgo2cdb convert -c tel_mysql_gbase.yml

python3 -m fgo2cdb validate -c tel_mysql_gbase.yml

关键配置:

source:

type: mysql

host: 10.0.0.10

port: 3306

target:

type: gbase

host: 10.0.0.20

port: 5258

database: target_db

5.16 场景十六:DB2 → KingbaseES(保险核心信创替代)

背景:保险核心库从 IBM DB2 11.5 迁移到金仓 KingbaseES V8(PG 兼容),数据量 900 GB。

cp templates/db2_to_kingbase.yml ins_db2_king.yml

vi ins_db2_king.yml

python3 -m fgo2cdb assess -c ins_db2_king.yml

python3 -m fgo2cdb convert -c ins_db2_king.yml

python3 -m fgo2cdb report -c ins_db2_king.yml -o report.html

关键配置:

source:

type: db2

host: 10.0.0.10

port: 50000

database: INSDB

schema: INS

target:

type: kingbase

host: 10.0.0.20

port: 54321

schema: ins

conversion:

limits:

parallel_tables: 6

batch_insert_size: 50000

5.17 场景十七:MongoDB → KingbaseES(文档库结构化)

背景:日志库从 MongoDB 5.0 迁移到 KingbaseES,集合 → 表,嵌套文档 → JSONB 列。

cp templates/mongodb_to_kingbase.yml log_mongo_king.yml

python3 -m fgo2cdb convert -c log_mongo_king.yml

关键配置:

conversion:

options:

use_id_as_primary: true # _id 作为主键

nested_doc_strategy: jsonb # 嵌套文档存为 JSONB 列

5.18 场景十八:Redis → KingbaseES(缓存数据落库)

背景:缓存数据从 Redis 迁移到 KingbaseES,KV → 两列表(key/value)。

cp templates/redis_to_kingbase.yml cache_redis_king.yml

python3 -m fgo2cdb convert -c cache_redis_king.yml

5.19 场景十九:Oracle → KingbaseES V9 Oracle 兼容版(PL/SQL 平替)

背景:某省级公积金系统从 Oracle 19c 迁移到金仓 KingbaseES V9R2C14 Oracle 兼容版,要求存储过程/包/触发器原样保留,数据量 1.2 TB。

关键点:KingbaseES V9 提供 Oracle/MySQL/SQL Server/PG 四种兼容模式,V9R2C14 为 Oracle 兼容版(默认 Oracle 模式)。程序按 target.mode: oracle 路由到 OracleTarget,走 Oracle 协议,PL/SQL 几乎免改写。

cp templates/oracle_to_kingbase.yml gov_oracle_kingv9.yml

vi gov_oracle_kingv9.yml

# 修改 host/port/username/password/schema

python3 -m fgo2cdb assess -c gov_oracle_kingv9.yml

python3 -m fgo2cdb ddl -c gov_oracle_kingv9.yml -o ddl.sql

python3 -m fgo2cdb convert -c gov_oracle_kingv9.yml

python3 -m fgo2cdb validate -c gov_oracle_kingv9.yml

关键配置:

source:

type: oracle

service_name: ORCL

schema: HOUSING_FUND

consistent_snapshot: true

target:

type: kingbase

mode: oracle # ★ KingbaseES V9 Oracle 兼容模式

host: 10.0.0.20

port: 54321

schema: housing_fund

extra:

compatible_mode: oracle # 对应 kingbase.conf 的 sql_compatibility

conversion:

options:

procedures: true # 存储过程/包/触发器原样迁移

triggers: true

sequences: true

5.20 场景二十:MySQL → KingbaseES V9 MySQL 兼容版(电商库改造)

背景:电商平台从 MySQL 8.0 迁移到金仓 KingbaseES V9R3C18 MySQL 兼容版,数据量 500 GB。

关键点:V9R3C18 为 MySQL 兼容版,程序按 target.mode: mysql 路由到 MySQLTarget,走 PyMySQL 协议,SQL 方言几乎无转换。

cp templates/mysql_to_kingbase.yml shop_mysql_kingv9.yml

vi shop_mysql_kingv9.yml

python3 -m fgo2cdb convert -c shop_mysql_kingv9.yml

python3 -m fgo2cdb validate -c shop_mysql_kingv9.yml

关键配置:

source:

type: mysql

host: 10.0.0.10

port: 3306

charset: utf8mb4

consistent_snapshot: true

target:

type: kingbase

mode: mysql # ★ KingbaseES V9 MySQL 兼容模式

host: 10.0.0.20

port: 54321

database: shop_db

charset: utf8mb4

extra:

compatible_mode: mysql

5.21 场景二十一:SQL Server → KingbaseES V9 SQL Server 兼容版(ERP 改造)

背景:制造企业 ERP 从 SQL Server 2019 迁移到金仓 KingbaseES V9R4C19 SQL Server 兼容版,数据量 300 GB。

关键点:V9R4C19 为 SQL Server 兼容版,程序按 target.mode: sqlserver 路由,T-SQL 语法近乎原样保留。

cp templates/sqlserver_to_kingbase.yml erp_mssql_kingv9.yml

vi erp_mssql_kingv9.yml

python3 -m fgo2cdb convert -c erp_mssql_kingv9.yml

python3 -m fgo2cdb validate -c erp_mssql_kingv9.yml

关键配置:

source:

type: sqlserver

host: 10.0.0.10

port: 1433

extra:

driver: "ODBC Driver 17 for SQL Server"

target:

type: kingbase

mode: sqlserver # ★ KingbaseES V9 SQL Server 兼容模式

host: 10.0.0.20

port: 54321

database: erp_db

extra:

compatible_mode: sqlserver

5.22 场景二十二:Oracle → openGauss Oracle 兼容模式(政务信创)

背景:某市级政务大厅从 Oracle 19c 迁移到 openGauss 6.0 LTS(Oracle 兼容模式 A),数据量 800 GB。

关键点:openGauss 通过 CREATE DATABASE DBCOMPATIBILITY='A' 设置 Oracle 兼容模式。程序按 target.mode: A(或 oracle)路由到 OracleTarget。

cp templates/oracle_to_opengauss.yml gov_oracle_og.yml

vi gov_oracle_og.yml

python3 -m fgo2cdb assess -c gov_oracle_og.yml

python3 -m fgo2cdb ddl -c gov_oracle_og.yml -o ddl.sql

python3 -m fgo2cdb convert -c gov_oracle_og.yml

python3 -m fgo2cdb validate -c gov_oracle_og.yml

关键配置:

source:

type: oracle

service_name: ORCL

schema: GOV

consistent_snapshot: true

target:

type: opengauss

mode: A # ★ openGauss Oracle 兼容模式(DBCOMPATIBILITY='A')

host: 10.0.0.20

port: 5432

schema: gov

extra:

db_compatibility: A

conversion:

options:

procedures: true

triggers: true

5.23 场景二十三:MySQL → openGauss MySQL 兼容模式(互联网改造)

背景:SaaS 业务从 MySQL 8.0 迁移到 openGauss 6.0(MySQL 兼容模式 B,需安装 dolphin 插件),数据量 200 GB。

关键点:openGauss 通过 DBCOMPATIBILITY='B' 设置 MySQL 兼容模式,需安装 dolphin 扩展插件。程序按 target.mode: B(或 mysql)路由到 MySQLTarget。

cp templates/mysql_to_opengauss.yml saas_mysql_og.yml

vi saas_mysql_og.yml

python3 -m fgo2cdb convert -c saas_mysql_og.yml

python3 -m fgo2cdb validate -c saas_mysql_og.yml

关键配置:

source:

type: mysql

charset: utf8mb4

consistent_snapshot: true

target:

type: opengauss

mode: B # ★ openGauss MySQL 兼容模式(需 dolphin 插件)

host: 10.0.0.20

port: 5432

database: saas_db

charset: utf8mb4

extra:

db_compatibility: B

extension: dolphin

5.24 场景二十四:Oracle → GaussDB TPOPS 集中式版(OLTP 信创)

背景:某股份制银行核心库从 Oracle 19c 迁移到 GaussDB V2.0-8.x 集中式版(TPOPS 部署),Oracle 兼容模式,数据量 2 TB。

关键点:GaussDB 集中式版面向 OLTP 场景,通过 TPOPS(云数据库 GaussDB 管理平台)部署。程序按 target.mode: oracle 路由到 OracleTarget。

cp templates/oracle_to_gaussdb.yml bank_oracle_gauss.yml

vi bank_oracle_gauss.yml

python3 -m fgo2cdb assess -c bank_oracle_gauss.yml

python3 -m fgo2cdb ddl -c bank_oracle_gauss.yml -o ddl.sql

python3 -m fgo2cdb convert -c bank_oracle_gauss.yml

python3 -m fgo2cdb validate -c bank_oracle_gauss.yml

python3 -m fgo2cdb report -c bank_oracle_gauss.yml -o report.html

关键配置:

source:

type: oracle

service_name: ORCL

schema: CORE

consistent_snapshot: true

target:

type: gaussdb

mode: oracle # ★ GaussDB Oracle 兼容模式

host: 10.0.0.20

port: 5432

schema: core

extra:

deployment: tpops # TPOPS 部署

architecture: centralized # 集中式版

db_compatibility: A

conversion:

options:

procedures: true

triggers: true

sequences: true

limits:

concurrency: 8

batch_insert_size: 50000

scale_preset: large

5.25 场景二十五:MySQL → GaussDB TPOPS 分布式版(HTAP 场景)

背景:社交平台从 MySQL 8.0 迁移到 GaussDB V2.0-8.x 分布式版(TPOPS 部署),MySQL 兼容模式,数据量 1.5 TB。

关键点:GaussDB 分布式版面向 HTAP 场景,通过 TPOPS 部署。程序按 target.mode: mysql 路由到 MySQLTarget。

cp templates/mysql_to_gaussdb.yml social_mysql_gauss.yml

vi social_mysql_gauss.yml

python3 -m fgo2cdb convert -c social_mysql_gauss.yml

python3 -m fgo2cdb validate -c social_mysql_gauss.yml

关键配置:

source:

type: mysql

charset: utf8mb4

consistent_snapshot: true

target:

type: gaussdb

mode: mysql # ★ GaussDB MySQL 兼容模式

host: 10.0.0.20

port: 5432

database: social_db

extra:

deployment: tpops # TPOPS 部署

architecture: distributed # 分布式版

db_compatibility: B

5.26 场景二十六:PostgreSQL → GaussDB DWS(数仓迁移)

背景:企业数据仓库从 PostgreSQL 14 迁移到 GaussDB(DWS) 8.x OLAP 数仓服务,数据量 4 TB。

关键点:DWS(Data Warehouse Service)为 MPP 架构数仓,程序按 target.mode: pg(默认)路由到 PostgresTarget,走 COPY 批量导入。

cp templates/postgresql_to_gaussdb.yml dw_pg_dws.yml

vi dw_pg_dws.yml

python3 -m fgo2cdb convert -c dw_pg_dws.yml

python3 -m fgo2cdb validate -c dw_pg_dws.yml

关键配置:

source:

type: postgresql

host: 10.0.0.10

port: 5432

schema: public

target:

type: gaussdb

mode: pg # ★ GaussDB PG 兼容模式(DWS 默认)

host: 10.0.0.20

port: 5432

schema: public

extra:

is_dws: true # ★ DWS 数仓服务

distribution: hash # 哈希分布

pg_protocol: true # COPY 批量导入

conversion:

limits:

batch_insert_size: 100000

scale_preset: xlarge

5.27 场景二十七:Oracle → DM8(政务大表迁移)

背景:某省级税务系统从 Oracle 19c 迁移到 DM8.1,核心大表 5 亿行,数据量 1.5 TB。

cp templates/oracle_to_dm.yml tax_oracle_dm.yml

vi tax_oracle_dm.yml

python3 -m fgo2cdb assess -c tax_oracle_dm.yml

python3 -m fgo2cdb convert -c tax_oracle_dm.yml

python3 -m fgo2cdb validate -c tax_oracle_dm.yml

python3 -m fgo2cdb report -c tax_oracle_dm.yml -o report.html

关键配置:

source:

type: oracle

service_name: ORCL

schema: TAX

consistent_snapshot: true

target:

type: dm

host: 10.0.0.20

port: 5236

schema: tax

conversion:

limits:

concurrency: 16

batch_insert_size: 100000

scale_preset: large

5.28 场景二十八:MySQL → DM8(中小型业务库迁移)

背景:OA 系统从 MySQL 5.7 迁移到 DM8.1,数据量 50 GB。

cp templates/mysql_to_dm.yml oa_mysql_dm.yml

vi oa_mysql_dm.yml

python3 -m fgo2cdb convert -c oa_mysql_dm.yml

python3 -m fgo2cdb validate -c oa_mysql_dm.yml

关键配置:

source:

type: mysql

host: 10.0.0.10

port: 3306

charset: utf8mb4

target:

type: dm

host: 10.0.0.20

port: 5236

database: oa_db

5.29 场景二十九:PostgreSQL → DM8(PG 库信创替代)

背景:物联网平台从 PostgreSQL 15 迁移到 DM8.2,数据量 300 GB。

cp templates/postgresql_to_dm.yml iot_pg_dm.yml

vi iot_pg_dm.yml

python3 -m fgo2cdb convert -c iot_pg_dm.yml

python3 -m fgo2cdb validate -c iot_pg_dm.yml

关键配置:

source:

type: postgresql

host: 10.0.0.10

port: 5432

schema: iot

target:

type: dm

host: 10.0.0.20

port: 5236

schema: iot

conversion:

options:

lowercase_tables: true

lowercase_columns: true

5.30 场景三十:SQL Server → DM8(制造 ERP 迁移)

背景:制造企业 ERP 从 SQL Server 2019 迁移到 DM8.1,数据量 200 GB。

cp templates/sqlserver_to_dm.yml erp_mssql_dm.yml

vi erp_mssql_dm.yml

python3 -m fgo2cdb convert -c erp_mssql_dm.yml

python3 -m fgo2cdb validate -c erp_mssql_dm.yml

关键配置:

source:

type: sqlserver

host: 10.0.0.10

port: 1433

extra:

driver: "ODBC Driver 17 for SQL Server"

encrypt: false

trust_server_certificate: true

target:

type: dm

host: 10.0.0.20

port: 5236

database: erp_db

5.31 场景三十一:Oracle → TiDB(HTAP 分布式改造)

背景:保险理赔库从 Oracle 19c 迁移到 TiDB 7.x,利用 TiKV + TiFlash 实现 HTAP,数据量 1 TB。

cp templates/oracle_to_tidb.yml ins_oracle_tidb.yml

vi ins_oracle_tidb.yml

python3 -m fgo2cdb assess -c ins_oracle_tidb.yml

python3 -m fgo2cdb convert -c ins_oracle_tidb.yml

python3 -m fgo2cdb validate -c ins_oracle_tidb.yml

关键配置:

source:

type: oracle

service_name: ORCL

schema: CLAIM

consistent_snapshot: true

target:

type: tidb

host: 10.0.0.20

port: 4000

database: claim_db

charset: utf8mb4

extra:

max_allowed_packet: 1073741824

5.32 场景三十二:PostgreSQL → TiDB(互联网库分布式迁移)

背景:内容平台从 PostgreSQL 14 迁移到 TiDB 8.x,数据量 400 GB。

cp templates/postgresql_to_tidb.yml content_pg_tidb.yml

vi content_pg_tidb.yml

python3 -m fgo2cdb convert -c content_pg_tidb.yml

python3 -m fgo2cdb validate -c content_pg_tidb.yml

关键配置:

source:

type: postgresql

host: 10.0.0.10

port: 5432

schema: content

target:

type: tidb

host: 10.0.0.20

port: 4000

database: content_db

charset: utf8mb4

conversion:

options:

lowercase_tables: true

lowercase_columns: true

5.33 场景三十三:SQL Server → TiDB(零售系统分布式改造)

背景:连锁零售 POS 系统从 SQL Server 2019 迁移到 TiDB 7.x,数据量 600 GB。

cp templates/sqlserver_to_tidb.yml retail_mssql_tidb.yml

vi retail_mssql_tidb.yml

python3 -m fgo2cdb convert -c retail_mssql_tidb.yml

python3 -m fgo2cdb validate -c retail_mssql_tidb.yml

关键配置:

source:

type: sqlserver

host: 10.0.0.10

port: 1433

extra:

driver: "ODBC Driver 17 for SQL Server"

target:

type: tidb

host: 10.0.0.20

port: 4000

database: retail_db

charset: utf8mb4

5.34 场景三十四:DB2 → TiDB(保险历史库迁移)

背景:保险历史保单库从 IBM DB2 11.5 迁移到 TiDB 7.x,数据量 800 GB。

cp templates/db2_to_tidb.yml ins_db2_tidb.yml

vi ins_db2_tidb.yml

python3 -m fgo2cdb convert -c ins_db2_tidb.yml

python3 -m fgo2cdb validate -c ins_db2_tidb.yml

关键配置:

source:

type: db2

host: 10.0.0.10

port: 50000

database: POLICY

schema: HISTORY

target:

type: tidb

host: 10.0.0.20

port: 4000

database: policy_db

charset: utf8mb4

5.35 场景三十五:MongoDB → TiDB(文档库结构化迁移)

背景:用户行为日志从 MongoDB 6.0 迁移到 TiDB 8.x,集合 → 表,嵌套文档 → JSON 列。

cp templates/mongodb_to_tidb.yml behavior_mongo_tidb.yml

vi behavior_mongo_tidb.yml

python3 -m fgo2cdb convert -c behavior_mongo_tidb.yml

关键配置:

conversion:

options:

use_id_as_primary: true

nested_doc_strategy: json

5.36 场景三十六:Oracle → GBase 8s(信创分析库迁移)

背景:企业报表库从 Oracle 19c 迁移到 GBase 8s,数据量 500 GB。

cp templates/oracle_to_gbase.yml rpt_oracle_gbase.yml

vi rpt_oracle_gbase.yml

python3 -m fgo2cdb convert -c rpt_oracle_gbase.yml

python3 -m fgo2cdb validate -c rpt_oracle_gbase.yml

关键配置:

source:

type: oracle

service_name: ORCL

schema: REPORT

consistent_snapshot: true

target:

type: gbase

host: 10.0.0.20

port: 5258

database: report_db

5.37 场景三十七:Oracle → GoldenDB(银行核心分布式迁移)

背景:农商行核心库从 Oracle 19c 迁移到 GoldenDB 8.x 分布式集群,数据量 1.2 TB。

cp templates/oracle_to_goldendb.yml bank_oracle_gdb.yml

vi bank_oracle_gdb.yml

python3 -m fgo2cdb assess -c bank_oracle_gdb.yml

python3 -m fgo2cdb convert -c bank_oracle_gdb.yml

python3 -m fgo2cdb validate -c bank_oracle_gdb.yml

关键配置:

source:

type: oracle

service_name: ORCL

schema: CORE

consistent_snapshot: true

target:

type: goldendb

host: 10.0.0.20

port: 3306

database: core_db

conversion:

limits:

concurrency: 8

batch_insert_size: 50000

5.38 场景三十八:Oracle → TDSQL-C(金融 MySQL 协议迁移)

背景:支付系统从 Oracle 19c 迁移到 TDSQL-C MySQL 8.0 版,数据量 600 GB。

cp templates/oracle_to_tdsql.yml pay_oracle_tdsql.yml

vi pay_oracle_tdsql.yml

python3 -m fgo2cdb convert -c pay_oracle_tdsql.yml

python3 -m fgo2cdb validate -c pay_oracle_tdsql.yml

关键配置:

source:

type: oracle

service_name: ORCL

schema: PAY

consistent_snapshot: true

target:

type: tdsql

host: 10.0.0.20

port: 3306

database: pay_db

charset: utf8mb4

extra:

engine: mysql # TDSQL-C MySQL 版

5.39 场景三十九:MySQL → TDSQL-C PostgreSQL 版(PG 协议迁移)

背景:SaaS 平台从 MySQL 8.0 迁移到 TDSQL-C PostgreSQL 15 版,利用 PG 生态工具链,数据量 300 GB。

cp templates/mysql_to_tdsql.yml saas_mysql_tdsql.yml

vi saas_mysql_tdsql.yml

python3 -m fgo2cdb convert -c saas_mysql_tdsql.yml

python3 -m fgo2cdb validate -c saas_mysql_tdsql.yml

关键配置:

source:

type: mysql

charset: utf8mb4

consistent_snapshot: true

target:

type: tdsql

host: 10.0.0.20

port: 5432 # PG 协议端口

database: saas_db

extra:

engine: postgresql # TDSQL-C PostgreSQL 版

5.40 场景四十:MySQL → YashanDB(信创 MySQL 协议平替)

背景:中小企业 ERP 从 MySQL 8.0 迁移到 YashanDB 23.x,数据量 150 GB。

cp templates/mysql_to_yashandb.yml erp_mysql_yashan.yml

vi erp_mysql_yashan.yml

python3 -m fgo2cdb convert -c erp_mysql_yashan.yml

python3 -m fgo2cdb validate -c erp_mysql_yashan.yml

关键配置:

source:

type: mysql

host: 10.0.0.10

port: 3306

charset: utf8mb4

target:

type: yashandb

host: 10.0.0.20

port: 1688

database: erp_db

5.41 场景四十一:PostgreSQL → KingbaseES(PG 原生迁移)

背景:能源监控系统从 PostgreSQL 16 迁移到 KingbaseES V9 PG 兼容模式,数据量 350 GB。

cp templates/postgresql_to_kingbase.yml energy_pg_king.yml

vi energy_pg_king.yml

python3 -m fgo2cdb convert -c energy_pg_king.yml

python3 -m fgo2cdb validate -c energy_pg_king.yml

关键配置:

source:

type: postgresql

host: 10.0.0.10

port: 5432

schema: monitor

target:

type: kingbase

mode: pg # ★ KingbaseES V9 PG 兼容模式(默认)

host: 10.0.0.20

port: 54321

schema: monitor

extra:

compatible_mode: pg

5.42 场景四十二:PostgreSQL → YashanDB(PG 库信创替代)

背景:物流系统从 PostgreSQL 14 迁移到 YashanDB 23.x,数据量 200 GB。

cp templates/postgresql_to_yashandb.yml logistics_pg_yashan.yml

vi logistics_pg_yashan.yml

python3 -m fgo2cdb convert -c logistics_pg_yashan.yml

python3 -m fgo2cdb validate -c logistics_pg_yashan.yml

关键配置:

source:

type: postgresql

host: 10.0.0.10

port: 5432

schema: logistics

target:

type: yashandb

host: 10.0.0.20

port: 1688

database: logistics_db

5.43 场景四十三:DB2 → GaussDB DWS(数仓迁移)

背景:保险分析库从 IBM DB2 11.5 迁移到 GaussDB(DWS) 8.x OLAP 数仓,数据量 2.5 TB。

cp templates/db2_to_gaussdb.yml ins_db2_dws.yml

vi ins_db2_dws.yml

python3 -m fgo2cdb convert -c ins_db2_dws.yml

python3 -m fgo2cdb validate -c ins_db2_dws.yml

关键配置:

source:

type: db2

host: 10.0.0.10

port: 50000

database: ANA

schema: REPORT

target:

type: gaussdb

mode: pg

host: 10.0.0.20

port: 5432

schema: report

extra:

is_dws: true

distribution: hash

pg_protocol: true

conversion:

limits:

batch_insert_size: 100000

scale_preset: xlarge

5.44 场景四十四:SQL Server → KingbaseES(ERP 信创改造)

背景:制造企业 MES 从 SQL Server 2019 迁移到 KingbaseES V9 通用版(PG 兼容),数据量 250 GB。

cp templates/sqlserver_to_kingbase.yml mes_mssql_king.yml

vi mes_mssql_king.yml

python3 -m fgo2cdb convert -c mes_mssql_king.yml

python3 -m fgo2cdb validate -c mes_mssql_king.yml

关键配置:

source:

type: sqlserver

host: 10.0.0.10

port: 1433

extra:

driver: "ODBC Driver 17 for SQL Server"

target:

type: kingbase

mode: pg # KingbaseES V9 通用版 PG 兼容

host: 10.0.0.20

port: 54321

database: mes_db

extra:

compatible_mode: pg

5.45 场景四十五:可视化控制台暂停与恢复迁移

背景:迁移 3 TB 大库时业务高峰来临,需要暂停迁移释放目标端资源,业务低峰再恢复。

操作步骤:

# 1. 启动控制台并启动迁移

python3 webctl.py start --port 8088 --daemon

# 浏览器访问 http://10.0.0.30:8088,点击「启动迁移」

# 2. 业务高峰来临,点击「暂停迁移」

# 系统在当前批次完成后阻塞,不退出迁移线程

# 3. 业务低峰,点击「继续迁移」恢复

# 系统清除暂停标志,从断点继续

# 4. 紧急情况点击「停止迁移」终止

# 已迁移数据保留,下次重跑自动跳过已完成表

关键说明:

暂停迁移:当前批次写完后阻塞,不退出线程,目标端连接保持

继续迁移:清除暂停标志并唤醒阻塞线程,从断点继续

停止迁移:终止当前迁移,已迁移数据保留,下次重跑自动跳过已完成表

暂停期间可通过 SSE 实时查看已迁移行数与进度

────────────────────────────────────────

5.56 场景五十六:Oracle → OceanBase(Oracle) 独立目标类型(PL/SQL 平替)

背景:某银行核心库从 Oracle 19c 迁移到 OceanBase 4.x Oracle 兼容租户,PL/SQL 存储过程直接平替,配置时希望以独立目标类型显式声明 Oracle 兼容模式,避免与 MySQL 模式混淆。操作步骤: # 1. 复制 Oracle → OceanBase(Oracle) 模板``cp templates/oracle_to_oceanbase.yml config.yml``# 2. 修改 target.type 为 oceanbase_oracle(独立类型,无需 mode 切换)``# target:``# type: oceanbase_oracle # 独立目标类型:直接路由到 OracleTarget``# host: 10.0.0.20``# port: 2883 # OBProxy Oracle 模式端口``# schema: SCOTT # Oracle 系 schema 必填``# 3. 执行完整迁移``python3 -m fgo2cdb migrate -c config.yml``# 4. 校验数据一致性``python3 -m fgo2cdb validate -c config.yml关键说明:• oceanbase_oracle 是独立目标类型,族 = oracle,无需 target.mode 切换• 相比 type: oceanbase + mode: oracle 写法,独立类型配置语义更清晰• 走 OracleTarget + oracledb 协议,PL/SQL 存储过程/函数/包/触发器原样保留• 端口默认 2883(OBProxy Oracle 模式),直连端口仍可用 2881• 失败对象登记到 result"manual_fix" 供人工处理

5.57 场景五十七:Percona → OceanBase(Oracle) 独立类型(Percona OLTP 转 OB 分布式 OLAP)

背景:某电商客户 Percona Server for MySQL 8.0 的 OLTP 业务库,需要将历史分析数据迁移到 OceanBase 4.x Oracle 兼容租户做分布式 OLAP 分析。操作步骤: # 1. 复制 Percona → OceanBase 模板并改 target.type 为 oceanbase_oracle``cp templates/percona_to_oceanbase.yml config.yml``# 2. 修改源端 Percona 和目标端 OceanBase(Oracle)``# source: { type: percona, host: 10.0.0.10, port: 3306 }``# target:``# type: oceanbase_oracle # 独立 Oracle 模式类型``# host: 10.0.0.20``# port: 2883``# schema: ANALYTICS``# 3. 迁移 + 校验``python3 -m fgo2cdb migrate -c config.yml && python3 -m fgo2cdb validate -c config.yml关键说明: • 源端 Percona 自动路由到 MySQLSource(族 mysql)• 目标端 oceanbase_oracle 自动路由到 OracleTarget(族 oracle)• 跨族转换:MySQL IFNULL/DATE_FORMAT/GROUP_CONCAT 自动重写为 Oracle NVL/TO_CHAR/LISTAGG• 全链路 UTF-8 强制,emoji 与中文不乱码• 大表通过流式游标 + 批量 INSERT 写入,支持断点续传5.58 场景五十八:可视化控制台选择 OceanBase(Oracle) / GreatSQL / GaussDB(DWS/TPOPS)背景:运维人员通过 Web 控制台完成 Percona → OceanBase(Oracle)、MySQL → GreatSQL、Oracle → GaussDB(DWS) 三种新目标类型的迁移任务,需熟悉下拉框选项与兼容模式切换。操作步骤: # 1. 启动可视化控制台``python3 -m fgo2cdb web -H 0.0.0.0 -p 8088``# 浏览器访问 http://10.0.0.30:8088目标端下拉框新增选项(用户友好标签): • OceanBase (MySQL) --- value=oceanbase,路由 MySQLTarget• OceanBase (Oracle) --- value=oceanbase_oracle,路由 OracleTarget(独立类型,无需 mode 切换)• GreatSQL (MySQL) --- value=greatsql,路由 MySQLTarget(万里数据库,MGR 集群)• GaussDB (DWS) --- value=gaussdb_dws,路由 PostgresTarget(数仓服务 OLAP)• GaussDB (TPOPS) --- value=gaussdb_tpops,路由 PostgresTarget(集中式 + 分布式 HTAP)• GaussDB (TPOPS) --- value=gaussdb,旧别名,等同 gaussdb_tpops关键说明:• 源端下拉框新增 Percona (MySQL) 选项,value=percona,自动路由到 MySQLSource• 多模式国产库选中后自动显示「兼容模式」二级下拉框• OceanBase (Oracle) 作为独立类型,无需二级兼容模式选择,配置更简洁• 端口自动填充:OceanBase(Oracle)→2883,GreatSQL→3306,GaussDB(DWS/TPOPS)→25308• 表单点击「启动迁移」后通过 SSE 实时显示行数、速率、阶段进度六、常用问题与排查

6.1 连接问题

现象 原因 排查
源端连接超时 网络/防火墙 telnet <host> <port> 测试端口
Oracle ORA-12541 监听未启动 检查 lsnrctl status
DM 连接失败 默认端口 5236 确认 disql SYSDBA/SYSDBA001@localhost:5236
SQL Server SSL 错误 ODBC 驱动加密 配置 encrypt: false, trust_server_certificate: true
MongoDB auth 失败 认证库不对 检查 auth_source: admin
Redis 权限错误 需要密码 配置 password 字段

6.2 编码乱码问题

现象 原因 解决
中文变 ? 源端 charset 不对 源端配置 charset: utf8mb4(MySQL)/ UTF8(Oracle)
emoji 丢失 MySQL 用 utf8 而非 utf8mb4 改为 utf8mb4
目标端乱码 目标库字符集不对 目标端 charset: UTF-8 / UTF8
COPY 模式报错 含制表符/换行 工具已自动转义 \t \n \\ \N,检查是否禁用了 streaming_cursor

6.3 性能问题

现象 原因 解决
迁移速度慢 并发太低 提高 concurrency: 10-16
单表慢 fetch_size 太小 fetch_size: 10000-50000
目标写入慢 未用 COPY PG 系目标确保 streaming_cursor: true
内存爆 queue 太大 queue_size: 2,设 memory_hard_limit_mb
源端 CPU 100% 全表扫描 源端加索引或分批迁移
大表卡死 无主键无法分批 评估阶段已提示,需人工指定分布键

6.4 数据一致性问题

现象 原因 解决
行数不一致 源端有写入 开启 consistent_snapshot: true
抽样比对失败 浮点精度 工具已按类型容差比对,检查 NUMBER/FLOAT 精度
大字段丢失 BLOB 未直传 检查目标端是否用 BLOB/CLOB 接收
序列不连续 序列未同步 确保开启 sequences: true

6.5 稳定性问题

现象 原因 解决
中断后重跑从头开始 checkpoint 丢失 确认 checkpoint_dir 可写,不要用 /tmp
死锁 目标端并发冲突 concurrency,关闭 foreign_keys: false
连接耗尽 连接池太小 提高 max_open_conns: 100-200
长事务超时 per_table_timeout 太小 提高 per_table_timeout: 86400(1 天)

6.6 类型映射问题

现象 原因 解决
某字段变 TEXT 类型未识别 查看评估报告 unmapped 列表,手动映射
Oracle NUMBER → DM 数值溢出 NUMBER(38,0) 超 BIGINT 工具自动映射为 DECIMAL/NUMERIC
MySQL JSON → PG 报错 PG 需 jsonb 类型 工具自动映射为 JSON/JSONB
SQL Server IMAGE → 目标乱码 未用二进制列 工具自动映射为 BLOB/BYTEA,bytes 直传

6.7 可视化控制台问题

现象 原因 解决
页面打不开 端口未放行 检查防火墙 firewall-cmd --add-port=8088/tcp
进度不刷新 SSE 被代理缓冲 Nginx 加 proxy_buffering off
任务卡住 后台线程异常 python3 webctl.py status 查日志,restart 重启
配置保存失败 目录无写权限 确认 config.yml 所在目录可写

6.8 通用排查命令

# 1. 查看迁移日志

tail -f conversion.log

# 2. 查看错误日志

tail -f errors.log

# 3. 查看检查点状态

ls -la .checkpoint/

# 4. 验证安装

python3 -m fgo2cdb --version

python3 -c "from fgo2cdb import native; print(native.engine_version(), native.native_loaded())"

# 5. 查看控制台日志

python3 webctl.py logs

# 6. 清理检查点(重新全量迁移)

rm -rf .checkpoint/

────────────────────────────────────────

七、目录结构

FGO2CDB/

├── fgo2cdb/ # Python 主包

│ ├── __init__.py # 版本/族定义

│ ├── __main__.py # 模块入口

│ ├── cli.py # 命令行接口

│ ├── config.py # 配置数据类

│ ├── converter.py # 迁移编排核心

│ ├── pipeline.py # 并发管道

│ ├── typemap.py # 类型映射

│ ├── funcmap.py # 函数映射

│ ├── assessor.py # 迁移前评估

│ ├── report.py # 迁移报告

│ ├── checkpoint.py # 断点续传

│ ├── native.py # C 引擎绑定

│ ├── web.py # Flask 可视化

│ ├── source/ # 源端连接器

│ │ ├── mysql.py / oracle.py / postgresql.py

│ │ ├── db2.py / sqlserver.py / mongodb.py / redis.py

│ └── target/ # 目标端写入器

│ ├── dm.py / postgres.py / mysql.py / oracle.py / gbase.py

├── native/ # 原生 C 引擎

│ ├── fgconv.c / fgconv.h

│ ├── libfgo2cdb.so

│ └── Makefile

├── templates/ # 迁移模板配置(40+ 模板)

│ ├── oracle_to_dm.yml / oracle_to_kingbase.yml ...

│ ├── mysql_to_tidb.yml / mysql_to_dm.yml ...

│ └── postgresql_to_dm.yml / db2_to_dm.yml ...

├── docs/ # 文档

│ ├── README.md # 本说明手册

│ └── README.docx # Word 版本

├── config.example.yml # 示例配置

├── webctl.py # 可视化控制脚本

├── fgo2cdb.py # 快捷入口

├── Makefile # 构建自动化

└── requirements.txt # Python 依赖

────────────────────────────────────────

八、版本与致谢

当前版本:1.0.0

作者:风哥

官方网站:http://www.fgedu.net.cn | http://www.itpux.com

数据库教程:https://edu.51cto.com/lecturer/8020378.html

────────────────────────────────────────

FGO2CDB --- 让国产数据库迁移更简单、更快速、更可靠。

相关推荐
带鱼吃猫2 小时前
LangChain:提示词模板与少样本提示功能
服务器·数据库·langchain
lisw052 小时前
MySQL 数据库:概念、历史、内容与展望!
数据库·mysql
foolishlee3 小时前
Neon proxy云端控制面
数据库
小蒜学长4 小时前
借助于大模型工具Cursor的中药材交易系统的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端
底层玩家老张4 小时前
数据库上K8s,运维为什么反而更累了?从StatefulSet到Operator的复盘
数据库·kubernetes·operator·数据库运维·架构选型
Tisfy5 小时前
LeetCode 2058.找出临界点之间的最小和最大距离:遍历+遇到极值则更新(这种题谁空间复杂度不是O(1)啊)
linux·数据库·leetcode·链表·题解·模拟·遍历
数据库小学妹5 小时前
MySQL死锁排查:锁机制原理、死锁日志与information_schema定位
运维·数据库·mysql
2601_967338715 小时前
Text2SQL智能体基础到实战课程
数据库·oracle
CadeCode5 小时前
Oracle 逗号拼接字段处理
数据库·后端·性能优化