1. 首页 > 国产数据库教程 > 达梦DM教程 > 正文

数据库教程FGMT76:国产数据库-国产迁移‑Oracle‑MySQL‑PG‑SQLServer迁移到达梦数据库

数据库教程FGMT76:国产数据库-国产迁移‑Oracle‑MySQL‑PG‑SQLServer迁移到达梦数据库

## 一、前言与内容大纲

随着国产化替代战略的深入推进,信创产业进入规模化落地阶段,大量政企单位原有的 Oracle、MySQL、PostgreSQL、SQL Server 等数据库系统都需要平滑迁移到国产数据库之上。达梦数据库 DM8 凭借对主流关系型数据库的高度兼容性,成为国产化迁移中最具代表性的目标库之一。风哥教程本文将以**Oracle → 达梦、MySQL → 达梦、PostgreSQL → 达梦、SQL Server → 达梦**四条主线,从理论到实战完整还原一套可落地的迁移方法论。本套风哥教程不写空话套话,全部围绕真实生产环境展开,所有配置参数均按 **64G 内存、8 核 CPU** 的服务器规格设计,迁移路径统一使用 `/fgedudb`,数据库实例名、库名统一为 `fgedudb`,用户名统一为 `fgedu`,涉及的两台主机名分别为源端 `fgedu-net-cn1` 与目标端 `fgedu-net-cn2`。

在正式进入实战前,先给出本套风哥教程的内容大纲,方便读者建立整体认知:

– **第一章 前言与内容大纲介绍**:说明迁移背景、目标库选型与本文结构;
– **第二章 迁移理论基础**:讲解迁移概念、迁移类型、迁移重要性、迁移规划、工具选型、数据类型与语法差异;
– **第三章 环境与达梦目标库准备**:源端与目标端主机规划、达梦实例安装、表空间与用户创建;
– **第四章 Oracle 迁移到达梦实战**:评估、DTS 迁移、验证、切换;
– **第五章 MySQL 迁移到达梦实战**:mysqldump 导出、语法转换、导入验证;
– **第六章 PostgreSQL 迁移到达梦实战**:pg_dump 导出、类型适配、导入;
– **第七章 SQL Server 迁移到达梦实战**:bcp/dts 双路径迁移;
– **第八章 迁移后的验证、测试与优化**:数据核对、性能测试、统计信息与参数优化;
– **第九章 总结**:风哥针对本文总结。

读者按此顺序阅读即可完成从理论到落地的完整闭环。

## 二、迁移理论基础

### 2.1 什么是数据库迁移

数据库迁移是指将数据、数据库对象(表、索引、视图、存储过程、触发器、序列等)以及相关联的应用从一个数据库系统整体搬迁到另一个数据库系统的过程。迁移不是简单地把表数据倒一遍,它至少包含**数据迁移、对象迁移、应用迁移**三个层面。数据层面要求数据不丢失、不损坏;对象层面要求 DDL 与逻辑对象能在目标库正确重建;应用层面则要求原有 SQL 与存储过程在目标库能正常运行且性能达标。

达梦 DM8 之所以成为国产迁移的主选目标,是因为它在**存储层面、语法层面、接口层面**与 Oracle 保持高度兼容,同时针对 MySQL、PostgreSQL、SQL Server 也提供了良好的适配与专用迁移工具,移植成本被大幅降低。

### 2.2 迁移类型划分

从源库与目标库的差异角度,风哥教程把迁移划分为以下五类:

– **同构迁移**:源库与目标库类型相同或高度相似,如 Oracle → DM、MySQL → DM。优势是对象兼容性好、迁移相对简单;劣势是仍需处理字符集、分区、高级特性等细节差异。
– **异构迁移**:源库与目标库类型差异较大,如 PostgreSQL → DM、SQL Server → DM。优势是完成数据库类型的转换;劣势是数据类型、函数、语法转换工作量大。
– **版本迁移**:同一数据库的旧版本升级到新版本,如 DM7 → DM8,属升级类迁移。
– **跨平台迁移**:在不同操作系统之间搬迁,如 Windows → Linux、Linux → 麒麟,重点是平台差异与文件传输。
– **云迁移**:从本地机房迁往云数据库,需要额外处理网络与安全边界。

本套风哥教程聚焦的正是前三类中的同构与异构迁移,即主流国外数据库向达梦的国产化迁移。

### 2.3 迁移的重要性与目标

数据库迁移在信创背景下的价值可概括为:响应国家国产化替代政策、降低数据库整体成本、借助达梦新特性获得性能提升、满足安全合规与等级保护要求、推动技术栈升级与运维体系重构。风哥提示,任何一次迁移都必须锚定以下四个硬性目标:

1. **数据完整性**:迁移全程数据不丢失、不损坏、不重复;
2. **业务连续性**:业务在切换窗口内不受不可接受的影响;
3. **最小化停机时间**:严格控制可接受的停机时长;
4. **性能达标**:迁移后核心 SQL 性能不低于源库水平。

### 2.4 迁移前的评估与规划

评估是迁移成败的第一道关口,风哥教程建议在动工前完成以下清单项:

– **停止应用**,避免迁移过程中产生增量数据造成数据不一致;
– 确认要迁移的用户、模式、库的范围;
– 记录源库中要迁移的对象数量与对象名称清单;
– 记录每个核心表的数据量(行数、大小);
– 识别高复杂度对象(分区表、物化视图、自定义函数、大事务);
– 创建目标实例,规划表空间与用户。

规划环节则要依次确定**需求分析、目标设定、方案选择、技术选型、资源规划、流程设计、风险控制、文档培训**八个维度。其中技术选型尤其关键。

### 2.5 迁移工具选型

达梦为迁移提供了完整工具链,风哥教程按场景给出选型建议:

– **DTS 数据迁移工具**:达梦官方图形化迁移工具,支持 Oracle、SQLServer、MySQL、DB2、PostgreSQL、Informix、Kingbase、ShenTong、Sybase、Access 等迁移到 DM,也支持 DM 到 DM、文件到 DM、DM 到文件。向导式操作,适合绝大多数业务库迁移,是首选。
– **导入导出工具 dexp / dimp**:达梦自身的逻辑备份恢复工具,适合 DM 到 DM、以及用 DMP 文件做中转的场景。
– **数据复制工具 DMHS(DM Data Hatch Sync)**:达梦主备与异构复制工具,适合需要在线同步、最小停机的高可用切换场景。
– **第三方工具**:针对特定场景的辅助工具,如基于 SQL 文本的转换脚本。

本套风哥教程以 **DTS 工具为主线**,辅以各源库的专用导出命令(mysqldump、pg_dump、bcp、expdp 等),形成图形化 + 命令行的双轨实战路径。

### 2.6 数据类型与语法差异

异构迁移的核心难点在于**数据类型映射**与**SQL 语法差异**。风哥教程列出最常见的映射关系与易错点:

| 源库类型 | 达梦目标类型 | 说明 |
| — | — | — |
| NUMBER(n) | NUMBER(n) / DECIMAL | Oracle 数字类型兼容 |
| VARCHAR2(n) | VARCHAR(n) | 注意字符长度计算方式 |
| DATE / TIMESTAMP | DATE / TIMESTAMP | 时区与格式差异 |
| BLOB / CLOB | BLOB / TEXT | 大对象类型基本一一对应 |
| MySQL AUTO_INCREMENT | IDENTITY 自增 | 自增语义需转换 |
| PG SERIAL / BIGSERIAL | IDENTITY | PG 序列语义转换 |
| SQL Server IDENTITY | IDENTITY | 直接兼容 |
| MySQL TEXT / JSON | TEXT / CLOB | JSON 建议转文本或 JSON 类型 |
| PG JSONB | TEXT / CLOB | 需按达梦版本适配 |

语法层面,Oracle 的 `ROWNUM` 在达梦中直接支持;MySQL 的反引号标识符需转为双引号;`AUTO_INCREMENT` 需转为 `IDENTITY`;PG 的 `$$` 函数体、`::` 类型转换、`ILIKE` 等需改写;SQL Server 的 `TOP`、`GETDATE()`、`NVARCHAR` 等需对应转换。这些问题会在后续各章实战命令中逐一体现。

### 2.7 本套风哥教程的硬件与参数规格

为便于读者在生产环境复现,本套风哥教程统一按以下硬件规格设计参数:

– 内存:**64G**;CPU:**8 核**;
– 磁盘:系统盘 + 数据盘分离,数据盘挂载至 `/fgedudb`;
– 目标实例:达梦 DM8,实例名 `fgedudb`,数据目录 `/fgedudb/dmdata`;
– 主机规划:源端 `fgedu-net-cn1`(承载各类源库),目标端 `fgedu-net-cn2`(承载达梦 DM8)。

达梦侧的关键初始化参数按 64G 内存推荐设置为:`MAX_OS_MEMORY` 控制在内存的约 60%–70%(约 40G 左右,具体以实际并发为准),`BUFFER`(缓冲区)建议 8G–16G,`MAX_SESSIONS` 建议 1000,`WORK_THRD_NUM` 与 CPU 核数对应。这些参数将在实战部分给出具体的 `ALTER SYSTEM` 命令。

风哥 itpux-com

## 三、环境与达梦目标库准备

### 3.1 环境规划

两台主机的规划如下:

“`
源端主机 fgedu-net-cn1 承载 Oracle 19c / MySQL 8.0 / PostgreSQL 14 / SQL Server 2019
目标端主机 fgedu-net-cn2 承载达梦 DM8,实例 fgedudb,数据目录 /fgedudb/dmdata
网络 fgedu-net-cn1 与 fgedu-net-cn2 内网互通
规格 两台均为 64G 内存 / 8 核 CPU / 独立数据盘
“`

### 3.2 达梦 DM8 安装与环境变量

在目标端 `fgedu-net-cn2` 上,风哥教程使用 `dmdba` 用户安装达梦。先创建数据目录并授权:

“`
[root@fgedu-net-cn2 ~]# mkdir -p /fgedudb/dmdata
[root@fgedu-net-cn2 ~]# mkdir -p /fgedudb/dmsoft
[root@fgedu-net-cn2 ~]# useradd dmdba
[root@fgedu-net-cn2 ~]# chown -R dmdba:dinstall /fgedudb
[root@fgedu-net-cn2 ~]# su – dmdba
“`

解压安装包并静默安装,安装路径统一放在 `/fgedudb/dmsoft/dmdbms`:

“`
[dmdba@fgedu-net-cn2 ~]$ cd /fgedudb
[dmdba@fgedu-net-cn2 fgedudb]$ unzip dm8_2024_x86_rh7_64.zip
[dmdba@fgedu-net-cn2 fgedudb]$ cd DMInstall
[dmdba@fgedu-net-cn2 DMInstall]$ ./DMInstall.bin -q \
-c /fgedudb/dmsoft/dmdbms
“`

安装完成后初始化实例 `fgedudb`,数据文件位于 `/fgedudb/dmdata`:

“`
[dmdba@fgedu-net-cn2 ~]$ export PATH=/fgedudb/dmsoft/dmdbms/bin:$PATH
[dmdba@fgedu-net-cn2 ~]$ dminit INI_PATH=/fgedudb/dmsoft/dmdbms/data \
PATH=/fgedudb/dmdata \
DB_NAME=fgedudb \
INSTANCE_NAME=fgedudb \
PAGE_SIZE=16 \
CASE_SENSITIVE=0 \
LENGTH_IN_CHAR=0
“`

> 风哥提示:`CASE_SENSITIVE=0` 表示大小写不敏感,更贴近多数业务习惯;`LENGTH_IN_CHAR=0` 表示 VARCHAR 长度按字节计算,需与源库字符语义核对。

注册并启动服务:

“`
[root@fgedu-net-cn2 ~]# /fgedudb/dmsoft/dmdbms/script/root/dm_service_installer.sh \
-t dmserver -p fgedudb -dm_ini /fgedudb/dmsoft/dmdbms/data/dm.ini
[root@fgedu-net-cn2 ~]# systemctl start DmServicefgedudb
[root@fgedu-net-cn2 ~]# systemctl enable DmServicefgedudb
“`

### 3.3 创建表空间与用户

使用 disql 连接实例,创建业务表空间 `FGEUDBS` 与业务用户 `fgedu`:

“`
[dmdba@fgedu-net-cn2 ~]$ disql SYSDBA/SYSDBA@localhost:5236

SQL> create tablespace FGEUDBS datafile ‘/fgedudb/dmdata/fgeudbs01.dbf’ size 8192;
SQL> create user fgedu identified by “Fgedu123″ default tablespace FGEUDBS;
SQL> grant dba, resource, public, vti to fgedu;
SQL> commit;
“`

风哥教程本文约定:所有迁移目标都进入模式 `fgedu`,业务表空间为 `FGEUDBS`。至此目标端准备完成,接下来进入四条迁移实战主线。

风哥教程 113257174

## 四、Oracle 迁移到达梦实战

### 4.1 源库评估

在源端 `fgedu-net-cn1` 上以 sysdba 身份统计对象规模:

“`
[root@fgedu-net-cn1 ~]# su – oracle
[oracle@fgedu-net-cn1 ~]$ sqlplus / as sysdba

SQL> select tablespace_name, sum(bytes)/1024/1024/1024 size_gb
from dba_data_files group by tablespace_name;
SQL> select count(*) from dba_tables where owner=’FGEDU’;
SQL> select count(*) from dba_objects where owner=’FGEDU’;
SQL> select count(*) from dba_procedures where owner=’FGEDU’;
“`

同时在目标端 `fgedu-net-cn2` 确认目标库为空库、无对象冲突。评估完成后记录待迁移对象清单,作为迁移后的核对基准。

### 4.2 使用 DTS 迁移 Oracle → DM

在 `fgedu-net-cn2` 上启动达梦 DTS 图形化工具:

“`
[root@fgedu-net-cn2 ~]# xhost +
[root@fgedu-net-cn2 ~]# su – dmdba
[dmdba@fgedu-net-cn2 ~]$ export DISPLAY=:0.0
[dmdba@fgedu-net-cn2 ~]$ cd /fgedudb/dmsoft/dmdbms/tool
[dmdba@fgedu-net-cn2 tool]$ ./dts
“`

DTS 图形界面操作步骤如下:

1. **新建工程**:工程名填 `Oracle-DM`,点击确定;
2. 在左侧迁移管理树中右键「迁移」→「新建迁移」;
3. 选择迁移方式 **Oracle ==> DM**;
4. 配置源端:主机 `fgedu-net-cn1`、端口 `1521`、服务名 `orcl`、用户名 `FGEDU`;
5. 配置目标端:主机 `fgedu-net-cn2`、端口 `5236`、库 `fgedudb`、用户名 `SYSDBA`;
6. 选择迁移对象:勾选表、索引、视图、序列、存储过程、触发器;
7. 配置迁移参数:并发数按 8 核 CPU 设为 8,批量提交大小设为 2000;
8. 点击「开始迁移」,实时监控进度与日志。

查看迁移日志:

“`
[dmdba@fgedu-net-cn2 tool]$ tail -f /fgedudb/dmsoft/dmdbms/log/dts.log
“`

### 4.3 命令行方式验证与类型适配

迁移完成后,在目标端核对对象与数据量,并验证 Oracle 特殊语法在达梦中的可用性:

“`
[dmdba@fgedu-net-cn2 ~]$ disql fgedu/Fgedu123@localhost:5236

SQL> select count(*) from fgedu.t_user;
SQL> select count(*) from fgedu.t_order;
SQL> select count(*) from fgedu.t_prod;
SQL> select * from fgedu.t_user where rownum <= 10;
SQL> select count(*) from user_tables;
SQL> select count(*) from user_procedures;
“`

若遇到 Oracle 特有函数或分区语法不兼容,风哥教程给出常见修正命令:

“`
— Oracle 的 LISTAGG 聚合,达梦可用 LISTAGG2 或改写
SQL> select dept_id, listagg2(name, ‘,’) within group(order by id)
from fgedu.t_emp group by dept_id;
— Oracle 层次查询 CONNECT BY,达梦兼容
SQL> select id, pid, level from fgedu.t_tree start with pid is null connect by prior id = pid;
“`

### 4.4 Oracle 迁移后切换与收尾

数据核对无差异后,按回滚可控原则进行切换:

“`
— 源端停应用、停库
[oracle@fgedu-net-cn1 ~]$ sqlplus / as sysdba
SQL> shutdown immediate;

— 目标端确认服务状态
[root@fgedu-net-cn2 ~]# systemctl status DmServicefgedudb
[root@fgedu-net-cn2 ~]# /fgedudb/dmsoft/dmdbms/bin/DmServicefgedudb status

— 切换后核对会话与连接
[dmdba@fgedu-net-cn2 ~]$ disql fgedu/Fgedu123@localhost:5236
SQL> select * from v$sessions;
“`

Oracle 迁移主线到此完成。整体思路同样适用于后续三种源库,区别仅在源端导出方式与类型转换细节。

网上搜索风哥教程可以学习全套数据库教程

## 五、MySQL 迁移到达梦实战

### 5.1 源库评估与导出

在源端 `fgedu-net-cn1` 上统计 MySQL 各库规模:

“`
[root@fgedu-net-cn1 ~]# mysql -uroot -p
mysql> select table_schema,
round(sum(data_length+index_length)/1024/1024/1024,2) size_gb
from information_schema.tables
group by table_schema;
mysql> select count(*) from information_schema.tables where table_schema=’fgedu’;
“`

确认无误后,使用 mysqldump 做逻辑导出,`–single-transaction` 保证一致性,`–routines –triggers` 保留存储过程与触发器:

“`
[root@fgedu-net-cn1 ~]# mysqldump -uroot -p –single-transaction \
–routines –triggers –hex-blob fgedu > /fgedudb/fgedu_mysql.sql
[root@fgedu-net-cn1 ~]# ls -lh /fgedudb/fgedu_mysql.sql
[root@fgedu-net-cn1 ~]# scp /fgedudb/fgedu_mysql.sql fgedu@fgedu-net-cn2:/fgedudb/
“`

### 5.2 MySQL 语法转换脚本

MySQL 的 `AUTO_INCREMENT`、反引号、`ENGINE=InnoDB` 等语法需要在导入达梦前转换。风哥教程给出一个可复用的 sed 转换脚本:

“`
[root@fgedu-net-cn1 ~]# cat > /fgedudb/conv_mysql2dm.sh << ‘EOF’
#!/bin/bash
# 功能:把 mysqldump 导出的 MySQL 脚本转换为达梦可执行脚本
IN_FILE=/fgedudb/fgedu_mysql.sql
OUT_FILE=/fgedudb/fgedu_dm.sql
sed -e ‘s/ENGINE=InnoDB//g’ \
-e ‘s/ENGINE=MyISAM//g’ \
-e ‘s/AUTO_INCREMENT/IDENTITY(1,1)/g’ \
-e ‘s/`//g’ \
-e ‘s/\\”/”/g’ \
-e ‘s/DEFAULT CHARSET=[^;]*//g’ \
-e ‘s/COLLATE=[^;]*//g’ \
$IN_FILE > $OUT_FILE
echo “转换完成: $OUT_FILE”
EOF
[root@fgedu-net-cn1 ~]# chmod +x /fgedudb/conv_mysql2dm.sh
[root@fgedu-net-cn1 ~]# /fgedudb/conv_mysql2dm.sh
“`

> 风哥提示:`AUTO_INCREMENT` 转为 `IDENTITY(1,1)` 时,需确认原表的主键/唯一键能承接自增语义,避免重复键冲突。

### 5.3 导入达梦并验证

在目标端执行转换后的脚本:

“`
[dmdba@fgedu-net-cn2 ~]$ disql fgedu/Fgedu123@localhost:5236

SQL> start /fgedudb/fgedu_dm.sql;
SQL> select count(*) from fgedu.t_user;
SQL> select count(*) from fgedu.t_order;
SQL> select sum(amount) from fgedu.t_order;
SQL> select * from fgedu.t_user where rownum <= 10;
“`

MySQL 的 `TEXT/JSON` 类型在达梦中分别落到 `TEXT/CLOB`,风哥教程建议对 JSON 字段单独做一次类型与语义抽查:

“`
SQL> select column_name, data_type from user_tab_columns where table_name=’T_CONFIG’;
SQL> select * from fgedu.t_config;
“`

数据与类型核对通过后,MySQL 迁移主线即告完成。

风哥数据库教程 itpux-com

## 六、PostgreSQL 迁移到达梦实战

### 6.1 源库评估与导出

在源端 `fgedu-net-cn1` 上统计 PG 库规模:

“`
[root@fgedu-net-cn1 ~]# su – postgres
[postgres@fgedu-net-cn1 ~]$ psql -c “select pg_size_pretty(pg_database_size(‘fgedudb’));”
[postgres@fgedu-net-cn1 ~]$ psql -d fgedudb -c “\dt”
“`

使用 pg_dump 做逻辑导出,保留数据与 schema:

“`
[postgres@fgedu-net-cn1 ~]$ pg_dump -U postgres -h 127.0.0.1 \
-d fgedudb –no-owner –no-privileges \
-F c -f /fgedudb/fgedudb_pg.dump
[postgres@fgedu-net-cn1 ~]$ ls -lh /fgedudb/fgedudb_pg.dump
[postgres@fgedu-net-cn1 ~]$ scp /fgedudb/fgedudb_pg.dump fgedu@fgedu-net-cn2:/fgedudb/
“`

### 6.2 PostgreSQL 到达梦的适配要点

PG 与达梦的差异集中体现在三处,风哥教程逐项给出处理方案:

– **SERIAL / BIGSERIAL**:PG 的序列自增,达梦中转为 `IDENTITY`;
– **类型转换运算符 `::`**:PG 的 `x::type` 写法需改写为达梦的 `CAST(x AS type)`;
– **函数体 `$$` 与 `%TYPE`**:PL/pgSQL 需按达梦 PL/SQL 语法改写。

典型改写示例:

“`
— PG 写法
CREATE TABLE t_user (id SERIAL PRIMARY KEY, name VARCHAR(50));
SELECT id::bigint FROM t_user;

— 达梦写法
CREATE TABLE fgedu.t_user (id INT IDENTITY PRIMARY KEY, name VARCHAR(50));
SELECT CAST(id AS BIGINT) FROM fgedu.t_user;
“`

若对象数量多、改写工作量大,优先使用 **DTS 的 PostgreSQL ==> DM** 向导,DTS 会内置完成大部分类型映射。

### 6.3 通过 DTS 迁移 PG → DM

在 `fgedu-net-cn2` 启动 DTS,选择 **PostgreSQL ==> DM**,依次配置源端(`fgedu-net-cn1:5432`,库 `fgedudb`)与目标端,勾选全部对象后执行迁移。

迁移完成后命令行核对:

“`
[dmdba@fgedu-net-cn2 ~]$ disql fgedu/Fgedu123@localhost:5236

SQL> select count(*) from fgedu.t_user;
SQL> select count(*) from fgedu.t_order;
SQL> select * from fgedu.t_user where rownum <= 10;
“`

### 6.4 PG 函数与 JSONB 处理

PG 中大量使用的自定义函数与 JSONB,是迁移中的高频易错点。风哥教程给出验证与兜底命令:

“`
SQL> select count(*) from user_procedures;
— JSONB 若无法直接映射,按文本迁移后确认业务可用
SQL> select data from fgedu.t_event where rownum <= 5;
“`

数据核对、函数编译通过后,PostgreSQL 迁移主线完成。

上51CTO搜索风哥可以学习全套数据库教程

## 七、SQL Server 迁移到达梦实战

### 7.1 源库评估

在源端 `fgedu-net-cn1` 上以 SQLCMD 统计对象与数据量:

“`
C:\> sqlcmd -S localhost -U sa -P ****** -d fgedudb
1> select name from sys.tables;
2> go
1> select sum(rows) from sys.partitions p
inner join sys.tables t on p.object_id=t.object_id;
2> go
“`

SQL Server 与达梦的差异主要在于:`NVARCHAR/NTEXT`、`GETDATE()`、`TOP n`、`IDENTITY` 自增、T-SQL 存储过程。其中 `IDENTITY` 语义与达梦 `IDENTITY` 天然对应,兼容性较好。

### 7.2 命令行 bcp 全量导出路径

对纯数据迁移,风哥教程给出基于 bcp 的命令行路径。先在源端为每张核心表导出数据文件:

“`
C:\> bcp fgedudb.dbo.t_user out C:\fgedudb\t_user.dat -c -S localhost -U sa -P ******
C:\> bcp fgedudb.dbo.t_order out C:\fgedudb\t_order.dat -c -S localhost -U sa -P ******
“`

将数据文件传到目标端 `fgedu-net-cn2` 的 `/fgedudb/` 目录,然后通过 bcp 对应的导入方式(或用 disql 按表导入)写入达梦:

“`
C:\> pscp C:\fgedudb\t_user.dat fgedu@fgedu-net-cn2:/fgedudb/
C:\> pscp C:\fgedudb\t_order.dat fgedu@fgedu-net-cn2:/fgedudb/
“`

### 7.3 使用 DTS 迁移 SQL Server → DM

推荐主路径仍是 DTS 的 **SQL Server ==> DM** 向导,它能在迁移过程中自动完成 T-SQL 语法与数据类型适配。配置项包括:源端主机 `fgedu-net-cn1:1433`、库 `fgedudb`、用户 `sa`;目标端 `fgedu-net-cn2:5236`。

迁移完成后验证:

“`
[dmdba@fgedu-net-cn2 ~]$ disql fgedu/Fgedu123@localhost:5236

SQL> select count(*) from fgedu.t_user;
SQL> select count(*) from fgedu.t_order;
SQL> select sum(amount) from fgedu.t_order;
SQL> select * from fgedu.t_user where rownum <= 10;
“`

### 7.4 SQL Server 语法适配检查

重点检查以下易错语法在达梦中的执行情况:

“`
— GETDATE() 在达梦中用 SYSDATE 替代
SQL> select sysdate from dual;
— TOP n 在达梦中用 rownum 实现
SQL> select * from fgedu.t_user where rownum <= 10;
— NVARCHAR 在达梦中使用 VARCHAR 即可
SQL> select column_name, data_type from user_tab_columns
where table_name=’T_USER’;
“`

语法与数据均通过后,SQL Server 迁移主线完成。

风哥 itpux-com

## 八、迁移后的验证、测试与优化

四条迁移主线全部完成后,风哥教程进入统一的收尾阶段。此阶段不可省略,直接决定生产切换能否安全进行。

### 8.1 数据完整性验证

对每张核心表做**行数级、内容级、汇总级**三层核对,源库与目标库对照:

“`
— 源端(以 Oracle 为例)
[oracle@fgedu-net-cn1 ~]$ sqlplus fgedu/fgedu123@orcl
SQL> select count(*) from t_user;
SQL> select sum(amount) from t_order;

— 目标端
[dmdba@fgedu-net-cn2 ~]$ disql fgedu/Fgedu123@localhost:5236
SQL> select count(*) from fgedu.t_user;
SQL> select sum(amount) from fgedu.t_order;
“`

风哥教程给出一个一键对比脚本思路,将两端行数与关键汇总值输出后 diff:

“`
[root@fgedu-net-cn2 ~]# cat > /fgedudb/verify_count.sh << ‘EOF’
#!/bin/bash
# 生成源端与目标端行数清单
TABLES=”t_user t_order t_prod t_config”
for t in $TABLES; do
echo “$t:$(disql fgedu/Fgedu123@localhost:5236 -e “select count(*) from fgedu.$t;”)”
done > /fgedudb/dm_count.txt
EOF
“`

### 8.2 功能与性能测试

依次执行查询、插入、更新、删除四类操作,验证功能正确性并用 `set timing on` 观测响应时间:

“`
[dmdba@fgedu-net-cn2 ~]$ disql fgedu/Fgedu123@localhost:5236

SQL> set timing on;
SQL> select * from fgedu.t_user where id = 100;
SQL> insert into fgedu.t_user(id,name) values (1001,’测试用户’);
SQL> commit;
SQL> update fgedu.t_user set name=’更新用户’ where id=1001;
SQL> commit;
SQL> delete from fgedu.t_user where id=1001;
SQL> commit;
“`

再模拟一段包含多表关联的业务 SQL,验证迁移后执行计划是否走索引:

“`
SQL> select /*+ index(fgedu.idx_order_user_id) */ *
from fgedu.t_order where user_id = 100;
SQL> explain select * from fgedu.t_order where user_id=100;
“`

### 8.3 统计信息收集与索引重建

迁移完成后数据分布与源库不同,风哥教程强调必须重新收集统计信息并重建失效索引:

“`
[dmdba@fgedu-net-cn2 ~]$ disql fgedu/Fgedu123@localhost:5236

SQL> sp_init_stats_sys(1);
SQL> dbms_stats.gather_schema_stats(‘FGEDU’);
SQL> select index_name, table_name, status from user_indexes where status=’UNUSABLE’;
SQL> alter index fgedu.idx_user_id rebuild;
SQL> alter index fgedu.idx_order_user_id rebuild online;
“`

### 8.4 按 64G/8 核规格调整达梦参数

收尾阶段按 64G 内存、8 核 CPU 规格,风哥教程给出推荐参数调整命令,修改后重启生效:

“`
[dmdba@fgedu-net-cn2 ~]$ disql SYSDBA/SYSDBA@localhost:5236

SQL> alter system set ‘MAX_SESSIONS’ = 1000 scope=spfile;
SQL> alter system set ‘MAX_OS_MEMORY’ = 60 scope=spfile; — 上限占比(百分比)
SQL> alter system set ‘BUFFER’ = 16384 scope=spfile; — 缓冲区 16G
SQL> alter system set ‘WORK_THRD_NUM’ = 8 scope=spfile; — 与 8 核对应
SQL> alter system set ‘WORKER_THREADS’ = 8 scope=spfile;
SQL> alter system set ‘CHECKPOINT_FLUSH_INTERVAL’ = 300 scope=spfile;
“`

重启实例使参数生效并再次确认状态:

“`
[root@fgedu-net-cn2 ~]# systemctl restart DmServicefgedudb
[root@fgedu-net-cn2 ~]# /fgedudb/dmsoft/dmdbms/bin/DmServicefgedudb status
[dmdba@fgedu-net-cn2 ~]$ disql SYSDBA/SYSDBA@localhost:5236
SQL> select * from v$parameter where name in (‘MAX_SESSIONS’,’BUFFER’,’WORK_THRD_NUM’);
“`

### 8.5 应用切换与回滚预案

切换遵循「先演练、后正式、再观察」的原则:

– 提前完成一次**演练切换**,记录时间窗口;
– 正式切换:停止源库应用写入 → 完成增量数据追平 → 修改应用连接串指向 `fgedu-net-cn2:5236` → 启动应用;
– 保留源库在**只读/停机保留**状态至少一个观察周期,以便异常时回滚;
– 回滚预案:保留源端全部备份与迁移前脚本,确保可一键回切。

切换后监控会话与告警日志:

“`
[dmdba@fgedu-net-cn2 ~]$ disql SYSDBA/SYSDBA@localhost:5236
SQL> select count(*) from v$sessions;
[root@fgedu-net-cn2 ~]# tail -f /fgedudb/dmsoft/dmdbms/log/dm_alert.log
“`风哥教程 113257174

## 九、总结

风哥针对本文总结如下:国产化迁移不是简单的数据倒腾,而是一项覆盖**评估、规划、工具选型、数据迁移、对象迁移、语法适配、验证测试、参数优化、应用切换、回滚预案**的完整系统工程。本套风哥教程以达梦 DM8 为目标库,完整演示了 Oracle、MySQL、PostgreSQL、SQL Server 四种主流数据库迁移到达梦的实战路径,主线工具为达梦 DTS,辅以 mysqldump、pg_dump、bcp 等源端导出命令,全程按 64G 内存、8 核 CPU 规格设计参数,主机统一为 `fgedu-net-cn1` 与 `fgedu-net-cn2`,路径统一使用 `/fgedudb`,库名与实例名统一为 `fgedudb`、用户统一为 `fgedu`。

风哥教程本文的核心经验可提炼为四条:其一,**迁移前评估决定迁移成败**,对象清单与数据量必须记录并作为事后核对基准;其二,**异构迁移的难点在类型映射与语法差异**,DTS 能自动完成大部分适配,剩余高频差异(自增、反引号、TOP/ROWNUM、SERIAL/IDENTITY、函数体)需人工重点核查;其三,**迁移后的验证与优化不可省略**,统计信息收集、索引重建、参数调整直接决定性能是否达标;其四,**切换必须留足回滚空间**,演练在前、观察在后,保证业务连续性。按此方法论执行,任何主流关系型数据库都能实现到达梦的高质量国产化迁移。风哥教程本文到此结束,更多达梦与国产数据库迁移细节,欢迎持续关注风哥教程后续内容。风哥数据库教程 itpux-com

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息