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_01 | 192.168.137.129 | 5237 | PRIMARY | /dmdata/data/DMTEST |
| 备库 | GRP1_RT_02 | 192.168.137.129 | 5238 | STANDBY | /dmdata/data/DMTEST_S/DMTEST |
- DM-DM 同构 dblink 使用DPI 驱动,无需安装 OCI/ODBC 组件,开箱即用;
- 集群约束:备库默认 STANDBY 只读,dblink 只能查询备库,不能通过 dblink 向备库写入;主库可双向查询;
- 核心前提:两个实例
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;
通过系统视图鉴别法验证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链路通畅,成功访问远程备库实例。
-- 步骤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;
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博客
| 环境分类 | 配置详情 |
|---|---|
| 宿主机 | 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
# 生效检查
source ~/.bash_profile
echo $ORACLE_HOME
echo $LD_LIBRARY_PATH
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;
3.5 Oracle Client连接测试
使用 dmdba 用户:
# 使用 dmdba 用户
sqlplus dm_test/"Tristan4304"@localhost:1521/orcl
成功说明:
DM服务器用户环境
|
|
Oracle Instant Client
|
|
Oracle19c
连接正常。
3.6 重启达梦数据库,加载 OCI 驱动
dmdba 用户执行:
# 进入达梦bin目录
cd /home/dmdba/dmdbms/bin
# 重启数据库服务
./DmServiceDBLINK_TEST restart
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
);
验证结果:
-- 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;
4 异构 DBLINK 搭建(DM-Mysql)
4.1 环境准备
Mysql安装部署参考[【MySQL】在CentOS7环境下----手把手教你安装MySQL详细教程(附带图例详解!!)_centos7安装mysql教程-CSDN博客](
| 环境分类 | 配置详情 |
|---|---|
| 宿主机 | 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;
创建测试数据库:
-- 创建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;
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
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
配置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
ODBC链路成功完成,表明整个 ODBC 环境已经正常。
DM8后续访问MySQL
|
|
↓
unixODBC
|
|
↓
MySQL ODBC Driver 9.5
|
|
↓
MySQL 8.0.46
验证 ODBC 是否能访问 MySQL 表:
-- 在isql中执行
show tables;
SELECT * FROM TEST_MYSQL;
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 查询成功。
二、达梦dts数据迁移
1 DTS简述
DTS是DM数据库配套的数据迁移工具,支持Oracle、SQLServer、MySQL等主流数据库与DM之间的双向迁移,也支持文本、CSV等格式文件导入导出。其对象迁移通过查询源库系统表拼接目标库SQL语句实现,数据迁移则通过JDBC标准接口读写数据。工具提供桌面版、Web版、作业调度和命令行四种运行方式,均基于统一执行引擎调度。
2 Oracle-DM
打开DTS迁移工具的主界面,在导航栏中点击新建工程按钮:工程名填写为dts
展开dts项目,在迁移子目录上右击选择新建迁移
迁移名称填写为Oracle-dm
选择迁移方式为Oracle==> DM,并点击下一步
数据源页面中填写Oracle的源数据库信息
目的页面中填写DM数据库的连接信息
配置迁移选项,仅自己测试时可以直接按照默认
指定模式页面中,勾选需要迁移的DM_TEST库
指定对象页面中勾选所有对象
执行方式按照默认,直接下一步
审阅迁移任务,对迁移任务有个整体展示,点击完成即可开始迁移任务
迁移完成后,会输出一个迁移汇总信息,展示每个迁移任务对应的多个维度信息
在dm8验证查询
3 MySQL-DM
操作与Oracle-DM一致:
打开DTS迁移工具的主界面,在导航栏中点击新建工程按钮:工程名填写为dts、展开dts项目,在迁移子目录上右击选择新建迁移、迁移名称填写为MySQL-dm、选择迁移方式为MySQL==> DM,并点击下一步、数据源页面中填写MySQL的源数据库信息
修改自定义URL:否则会触发MySQL 8.0 的“安全锁”
jdbc:mysql://192.168.137.136:3306/testmysqldblink?tinyInt1isBit=false&transformedBitsBoolean=false&useSSL=false&allowPublicKeyRetrieval=true
目的页面中填写DM数据库的连接信息、配置迁移选项,仅自己测试时可以直接按照默认、指定模式页面中,勾选需要迁移的库
dm8中验证是否迁移成功
4 SQL server-DM
打开DTS迁移工具的主界面,在导航栏中点击新建工程按钮:工程名填写为dts、展开dts项目,在迁移子目录上右击选择新建迁移、迁移名称填写为SQL server-dm、选择迁移方式为SQL server==> DM,并点击下一步、数据源页面中填写SQL server的源数据库信息