第五周技术博客

0 阅读8分钟

dblink及数据迁移

DM外部链接(DBLINK)是一种用于连接远程数据库的实体对象,支持公/私有两种模式,可实现跨库查询、增删改及存储过程调用。使用时需注意:同构环境不支持MPP,异构环境支持;本地与远程库的大小写敏感参数及字符集编码必须一致;禁止环回连接;不支持INTO语句、游标增删改、复合类型列及LOB类型列操作(常量赋值除外);异构库还需关注数据类型、语法兼容性及视图创建方式。实际业务中主要用于跨库查询分析。

一、DM8同构及异构数据库dblink搭建

1 DBLINK 核心概念

DBLINK(数据库链接)是达梦数据库中的一种特殊实体对象,它记录了远程数据库的连接路径与认证信息,建立后用户可通过表名@链路名的语法直接访问远程表,支持查询与增删改操作。

分类与连接方式

  • 同构链路(DM-DM):使用 DPI 接口,无需额外驱动,配置最简单,性能最优。
  • 异构链路(DM-Oracle):使用 OCI 接口,需要部署 Oracle 客户端驱动库。
  • 异构链路(DM-MySQL):使用 ODBC 接口,需要安装 unixODBC 与 MySQL ODBC 驱动。

使用限制

  • 本地库与远程库的CASE_SENSITIVE(大小写敏感)参数建议保持一致,避免表名列名识别异常。
  • 两端字符集建议统一为 UTF-8,减少中文乱码问题。
  • DBLINK 不支持 MPP 环境下的同构链路,异构链路支持 MPP。
  • 不支持远程 LOB 类型字段的复杂操作,仅支持常量方式的简单增删改。
2 同构 DBLINK 搭建(DM-DM)
2.1 前置说明

基于已搭建完成的单机多实例一主一备实时数据守护集群,参考 DM8 同构 dblink(DPI 方式,无需额外依赖、性能最优)部署,集群信息如下:

节点实例名IP服务端口角色数据目录
主库GRP1_RT_01192.168.137.1295237PRIMARY/dmdata/data/DMTEST
备库GRP1_RT_02192.168.137.1295238STANDBY/dmdata/data/DMTEST_S/DMTEST
  1. DM-DM 同构 dblink 使用DPI 驱动,无需安装 OCI/ODBC 组件,开箱即用;
  2. 集群约束:备库默认 STANDBY 只读,dblink 只能查询备库,不能通过 dblink 向备库写入;主库可双向查询;
  3. 核心前提:两个实例 CASE_SENSITIVE 大小写敏感、CHARSET 字符集必须完全一致(初始化参数统一,满足条件);
2.2 DBLINK创建
# 登录主库 disql
su - dmdba
cd /home/dmdba/dmdbms/bin
./disql SYSDBA/Tristan4304@localhost:5237
-- 创建主库访问备库的dblink,DPI方式,目标备库地址192.168.137.129:5238
CREATE PUBLIC LINK LINK_MAIN_TO_STANDBY 
CONNECT 'DPI' 
WITH SYSDBA 
IDENTIFIED BY "Tristan4304" 
USING '192.168.137.129:5238';
  • PUBLIC:所有数据库用户均可使用;去掉 PUBLIC 则为私有链接,仅创建用户可用
  • USING 填写远程实例 IP: 对外服务端口(不是 MAL 端口)
-- 验证 dblink 是否创建成功
-- 查询所有dblink
SELECT OWNER,DB_LINK,USERNAME,HOST,CREATED FROM DBA_DB_LINKS;

image.png 通过系统视图鉴别法验证DBLINK

本次测试摒弃数据差异化验证,采用官方推荐的系统实例标识鉴别法,100%精准区分本地查询和DBLINK远程查询,不受主备数据同步影响,适合正式环境验证。核心逻辑:本地查询返回主库实例名,带DBLINK查询返回备库实例名。

-- 步骤1:主库本地查询(无DBLINK,访问自身):查看当前数据库实例信息
SELECT INSTANCE_NAME,MODE$,STATUS$ FROM V$INSTANCE;

预期结果:INSTANCE_NAME = GRP1_RT_01,MODE$=PRIMARY,代表查询的是主库本地实例。

步骤2:DBLINK远程查询(带@链路,访问备库)

-- 步骤2:DBLINK远程查询(带@链路,访问备库):通过DBLINK远程查询备库实例信息
SELECT INSTANCE_NAME,MODE$,STATUS$ FROM V$INSTANCE@LINK_MAIN_TO_STANDBY;

预期结果:INSTANCE_NAME = GRP1_RT_02,MODE$=STANDBY,代表DBLINK链路通畅,成功访问远程备库实例。

image.png

-- 步骤3:业务表精准归属验证(彻底区分数据源)
-- 1. 查主库本地业务表,归属主库实例
SELECT 
  (SELECT INSTANCE_NAME FROM V$INSTANCE) AS LOCAL_INSTANCE,
  TABLE_NAME 
FROM USER_TABLES;

-- 2. 查备库远程业务表,归属备库实例(DBLINK生效核心证明)
SELECT 
  (SELECT INSTANCE_NAME FROM V$INSTANCE@LINK_MAIN_TO_STANDBY) AS REMOTE_INSTANCE,
  TABLE_NAME 
FROM USER_TABLES@LINK_MAIN_TO_STANDBY;

image.png

3 异构 DBLINK 搭建(DM-Oracle)

达梦数据库(DM8)在实际业务环境中经常需要与 Oracle 数据库进行数据交互,例如国产数据库替代过程中,需要访问原 Oracle 系统中的历史数据。

DM8 提供多种异构访问方式:推荐达梦DBLINK使用Oralce OCI的方式去访问Oracle数据库。

  • ODBC:通过通用数据库接口访问 Oracle
  • OCI:直接调用 Oracle Call Interface(Oracle 底层 C 接口)访问 Oracle

本实验采用 OCI 方式搭建 DM8 → Oracle19c 异构 DBLINK

相比 ODBC,OCI 方式绕过了中间层,直接调用 Oracle Client 库:

DM8
 |
 | OCI接口
 |
Oracle Instant Client
 |
 | Oracle Net
 |
Oracle19c

具有性能更高、配置链路更短、稳定性更好的优点。

3.1 环境准备

oracle19c安装部署参考链接CentOS安装Oracle 19c 数据库(保姆级别)_centos安装oracle19c-CSDN博客

image.png

环境分类配置详情
宿主机CentOS7,IP:192.168.137.133;Oracle、DM8 同机部署
Oracle19c端口 1521,服务名 ORCL;初始监听绑定 127.0.0.1 需改本机 IP系统用户:oracle;业务用户:dm_test / Tristan4304
达梦 DM8端口 5237;系统用户:dmdba管理员:SYSDBA / Tristan4304,登录工具:disql
3.2 安装 Oracle Instant Client

创建安装目录

# 使用 root
mkdir -p /opt/dblink/instantclient
# 进入目录
cd /opt/dblink/instantclient

解压 Oracle Client:

上传三个压缩包:

instantclient-basic-linux.x64-19.31.0.0.0dbru.zip
instantclient-sdk-linux.x64-19.31.0.0.0dbru.zip
instantclient-sqlplus-linux.x64-19.31.0.0.0dbru.zip
# 解压
unzip instantclient-basic-linux.x64-19.31.0.0.0dbru.zip
unzip -o instantclient-sdk-linux.x64-19.31.0.0.0dbru.zip
unzip -o instantclient-sqlplus-linux.x64-19.31.0.0.0dbru.zip

检查目录:

cd instantclient_19_31
ls -l

正常包含:

libclntsh.so -> libclntsh.so.19.1
libclntsh.so.19.1
sqlplus
sdk/

说明 OCI Client 安装完成。

3.3 配置 Oracle Client 环境变量

使用 dmdba 用户配置:

su - dmdba
vi ~/.bash_profile

export PATH修改为:

export ORACLE_HOME=/opt/dblink/instantclient/instantclient_19_31

export LD_LIBRARY_PATH=/opt/dblink/instantclient/instantclient_19_31:/home/dmdba/dmdbms/bin

export PATH=/opt/dblink/instantclient/instantclient_19_31:$PATH

export TNS_ADMIN=/opt/dblink/instantclient/instantclient_19_31/network/admin

export NLS_LANG=AMERICAN_AMERICA.AL32UTF8

image.png

# 生效检查
source ~/.bash_profile
echo $ORACLE_HOME
echo $LD_LIBRARY_PATH

image.png

3.4 Oracle数据库准备

创建访问用户:

# 登录 Oracle
sqlplus / as sysdba
-- 创建用户
CREATE USER dm_test IDENTIFIED BY "Tristan4304";
-- 授权
GRANT CONNECT, RESOURCE TO dm_test;
--授权表空间
ALTER USER dm_test QUOTA UNLIMITED ON USERS;

创建测试表:

-- 切换用户
conn dm_test/"Tristan4304"
-- 创建
CREATE TABLE TEST_TAB
(
    ID NUMBER,
    NAME VARCHAR2(50)
);
-- 插入数据
INSERT INTO TEST_TAB VALUES(1,'oracle test');
COMMIT;
-- 查询
SELECT * FROM TEST_TAB;

image.png

3.5 Oracle Client连接测试

使用 dmdba 用户:

# 使用 dmdba 用户
sqlplus dm_test/"Tristan4304"@localhost:1521/orcl

成功说明:

DM服务器用户环境
        |
        |
Oracle Instant Client
        |
        |
Oracle19c

连接正常。

image.png

3.6 重启达梦数据库,加载 OCI 驱动

dmdba 用户执行:

# 进入达梦bin目录
cd /home/dmdba/dmdbms/bin
# 重启数据库服务
./DmServiceDBLINK_TEST restart

image.png

3.6 创建 DM-Oracle DBLINK
./disql SYSDBA/Tristan4304@192.168.137.133:5237
CREATE PUBLIC LINK dm_link_oracle
CONNECT 'ORACLE'
WITH dm_test IDENTIFIED BY "Oracle@123456"
USING '192.168.137.133:1521/ORCL'
OPTION(
    LOCAL_CODE='UTF-8',
    DATA_CHARSET='UTF-8',
    CONVERT_MODE=1
);

image.png

验证结果:

-- 1:查询 Oracle 远端数据表(核心实验结果)
SELECT * FROM TEST_TAB@dm_link_oracle;
-- 通过dblink向Oracle插入新数据
INSERT INTO TEST_TAB@dm_link_oracle VALUES(2,'insert from dm8');
COMMIT;
-- 再次查询核对
SELECT * FROM TEST_TAB@dm_link_oracle;

image.png

4 异构 DBLINK 搭建(DM-Mysql)
4.1 环境准备

Mysql安装部署参考[【MySQL】在CentOS7环境下----手把手教你安装MySQL详细教程(附带图例详解!!)_centos7安装mysql教程-CSDN博客](

image.png

环境分类配置详情
宿主机CentOS7,IP:192.168.137.134;Oracle、DM8、MySQL 同机部署
MySQL8.0端口 3306,数据库库名 testmysqldblink;监听 0.0.0.0 允许远程访问;业务访问用户:dm_test_mysql / Tristan4304.;字符集 utf8mb4
达梦 DM8端口 5237;系统运行用户 dmdba;管理员账号 SYSDBA / Tristan4304;客户端工具 disql;通过 unixODBC+MySQL ODBC9.5 驱动搭建 dblink 访问 MySQL
4.2 MySQL 数据库准备

启动 MySQL 服务:

systemctl start mysqld
systemctl status mysqld

查看MySQL初始化密码:

# MySQL 8.0首次启动会自动生成root临时密码。
grep 'temporary password' /var/log/mysqld.log

登录MySQL:

mysql -uroot -p
-- 进入MySQL后修改root密码
ALTER USER 'root'@'localhost'
IDENTIFIED BY 'Mysql@123456';
-- 检查
SELECT user,host FROM mysql.user;

**创建DM8访问MySQL用户:**DM8后面通过ODBC连接MySQL,因此需要允许远程访问。

-- 创建dm_test_mysql用户
CREATE USER 'dm_test_mysql'@'%'
IDENTIFIED BY 'Tristan4304.';
-- 给dm_test_mysql用户授予所有数据库的所有权限
GRANT ALL PRIVILEGES ON *.* TO 'dm_test_mysql'@'%';
-- 检查
SELECT user,host FROM mysql.user;

image.png

创建测试数据库:

-- 创建testmysqldblink数据库
CREATE DATABASE testmysqldblink DEFAULT CHARACTER SET utf8mb4;
-- 使用新数据库
USE testmysqldblink;
-- 创建测试表
CREATE TABLE TEST_MYSQL
(
    ID INT,
    NAME VARCHAR(50)
);
-- 插入数据
INSERT INTO TEST_MYSQL VALUES(1,'mysql dblink test');
COMMIT;
-- 查询
SELECT * FROM TEST_MYSQL;
image-20260730133628315转存失败,建议直接上传图片文件

image.png

4.3 配置MySQL允许远程连接

编辑配置文件:

vi /etc/my.cnf

增加:

[mysqld]
bind-address=0.0.0.0
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
default-time_zone = '+8:00'
# 重启
systemctl restart mysqld

测试远程连接:

# 先查看MySQL端口
netstat -tunlp | grep 3306
# 然后测试
mysql -h 127.0.0.1 -udm_test -p

image.png

4.4 安装 MySQL ODBC 驱动

DM8访问MySQL架构:

DM8
 |
 |
unixODBC
 |
 |
MySQL Connector ODBC
 |
 |
MySQL Server

下面需要安装MySQL Connector/ODBC

安装ODBC驱动:

# 检查
rpm -qa | grep unixODBC
# 如果没有安装
yum install unixODBC unixODBC-devel -y

安装MySQL ODBC Driver:

yum -y install mysql-connector-odbc --nogpgcheck
# 验证安装
rpm -ql mysql-connector-odbc

image.png

配置ODBC:

# 配置 /etc/odbcinst.ini
vi /etc/odbcinst.ini
[DM8 ODBC DRIVER]
Description=DM ODBC DRIVER FOR DM8
Driver=/home/dmdba/dmdbms/drivers/odbc/libdodbc.so
FileUsage=1


[MySQL ODBC 9.5 Unicode Driver]
Description=MySQL ODBC 9.5 Unicode Driver
Driver=/usr/lib64/libmyodbc9w.so
UsageCount=1


[MySQL ODBC 9.5 ANSI Driver]
Description=MySQL ODBC 9.5 ANSI Driver
Driver=/usr/lib64/libmyodbc9a.so
UsageCount=1

配置DSN:

vi /etc/odbc.ini
[DM8]
DRIVER=DM8 ODBC DRIVER
SERVER=192.168.137.134
UID=SYSDBA
PWD=Tristan4304
TCP_PORT=5237

[MYSQL_DBLINK]
Driver=MySQL ODBC 9.5 Unicode Driver
Server=192.168.137.134
Port=3306
Database=testmysqldblink
User=dm_test_mysql
Password=Tristan4304.
Charset=utf8mb4

测试ODBC:

isql MYSQL_DBLINK

image.png

ODBC链路成功完成,表明整个 ODBC 环境已经正常。

DM8后续访问MySQL
        |
        |
        ↓
      unixODBC
        |
        |
        ↓
MySQL ODBC Driver 9.5
        |
        |
        ↓
MySQL 8.0.46

验证 ODBC 是否能访问 MySQL 表:

-- 在isql中执行
show tables;
SELECT * FROM TEST_MYSQL;

image.png

4.5 配置环境变量

使用 dmdba 用户配置:

su - dmdba
vi ~/.bash_profile

export PATH修改为:

PATH=$PATH:$HOME/.local/bin:$HOME/bin

export PATH

export DM_HOME=/home/dmdba/dmdbms
export ORACLE_HOME=/opt/dblink/instantclient/instantclient_19_31
export ODBCINI=/etc/odbc.ini
export ODBCSYSINI=/etc
export LD_LIBRARY_PATH=$DM_HOME/bin:$ORACLE_HOME:/usr/lib64
export PATH=$DM_HOME/bin:$ORACLE_HOME:$PATH

export TNS_ADMIN=$ORACLE_HOME/network/admin
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
source ~/.bash_profile
4.6 创建DM-MySQL LINK

现在环境已经具备创建DBLINK前提:

DM8
 |
 | DBLINK
 |
ODBC DSN(MYSQL_DBLINK)
 |
MySQL
# 切换dmdba
su - dmdba
# 登录DM
cd /home/dmdba/dmdbms/bin
./disql SYSDBA/Tristan4304@localhost:5237

-- 创建dblink 
SQL> CREATE PUBLIC LINK MYSQL_LINK
2   CONNECT 'ODBC'
3   WITH "dm_test_mysql" IDENTIFIED BY "Tristan4304."
4   USING 'MYSQL_DBLINK'
5   OPTION(
6       DB_TYPE='MYSQL',
7       CASE_OPT='SENSITIVE'
8   );

-- 创建成功后测试
-- 查询MySQL
SELECT * FROM TEST_MYSQL@MYSQL_LINK;
INSERT INTO TEST_MYSQL@MYSQL_LINK VALUES (2,'insert from DM8');
COMMIT;
SELECT * FROM TEST_MYSQL;

严重注意!!!!!!!! MySQL 用户名大小写问题

WITH dm_test_mysql

被达梦转换成了大写用户名;改为:

WITH "dm_test_mysql"

后保留小写,DBLink 查询成功。

image.png

二、达梦dts数据迁移

1 DTS简述

DTS是DM数据库配套的数据迁移工具,支持Oracle、SQLServer、MySQL等主流数据库与DM之间的双向迁移,也支持文本、CSV等格式文件导入导出。其对象迁移通过查询源库系统表拼接目标库SQL语句实现,数据迁移则通过JDBC标准接口读写数据。工具提供桌面版、Web版、作业调度和命令行四种运行方式,均基于统一执行引擎调度。

2 Oracle-DM

打开DTS迁移工具的主界面,在导航栏中点击新建工程按钮:工程名填写为dts

image.png 展开dts项目,在迁移子目录上右击选择新建迁移

image.png

迁移名称填写为Oracle-dm

image.png

选择迁移方式为Oracle==> DM,并点击下一步

image.png

数据源页面中填写Oracle的源数据库信息

image.png

目的页面中填写DM数据库的连接信息

image.png

配置迁移选项,仅自己测试时可以直接按照默认

image.png

指定模式页面中,勾选需要迁移的DM_TEST库

image.png

指定对象页面中勾选所有对象

image.png

执行方式按照默认,直接下一步

image.png

审阅迁移任务,对迁移任务有个整体展示,点击完成即可开始迁移任务

image.png

迁移完成后,会输出一个迁移汇总信息,展示每个迁移任务对应的多个维度信息

image.png

在dm8验证查询

image.png

3 MySQL-DM

操作与Oracle-DM一致:

打开DTS迁移工具的主界面,在导航栏中点击新建工程按钮:工程名填写为dts、展开dts项目,在迁移子目录上右击选择新建迁移、迁移名称填写为MySQL-dm、选择迁移方式为MySQL==> DM,并点击下一步、数据源页面中填写MySQL的源数据库信息

image.png

修改自定义URL:否则会触发MySQL 8.0 的“安全锁”

jdbc:mysql://192.168.137.136:3306/testmysqldblink?tinyInt1isBit=false&transformedBitsBoolean=false&useSSL=false&allowPublicKeyRetrieval=true

目的页面中填写DM数据库的连接信息、配置迁移选项,仅自己测试时可以直接按照默认、指定模式页面中,勾选需要迁移的库

image.png

image.png

image.png

dm8中验证是否迁移成功

image.png

4 SQL server-DM

打开DTS迁移工具的主界面,在导航栏中点击新建工程按钮:工程名填写为dts、展开dts项目,在迁移子目录上右击选择新建迁移、迁移名称填写为SQL server-dm、选择迁移方式为SQL server==> DM,并点击下一步、数据源页面中填写SQL server的源数据库信息

image.png

image.png

image.png

image.png

image.png eco.dameng.com/