DM8搭建同构(dm-dm)及异构数据库(dm-oracle,dm-mysql)的dblink

文章目录

大家想学习达梦数据库或者解决报错问题,可以去 达梦数据库社区https://eco.dameng.com

一、DBlink介绍

DM 中的一种特殊的数据库实体对象,它记录了远程数据库的连接和路径信息,用于建立与远程数据的联系。

这个链接可以是公用的(数据库中所有用户使用),也可以是私有的(只能被某个用户使用)。

用户可以通过外部链接对远程数据库的表进行查询和增删改操作,以及本地调用远程的存储过程。

使用限制外部链接的使用主要有以下限制:

  1. DM-DM 的同构外部链接不支持 MPP 环境,DM 与异构数据库的外部链接支持 MPP 环境;
  2. 增删改不支持 INTO 语句;
  3. 不支持使用游标进行增删改操作;
  4. 不支持操作远程表的复合类型列;
  5. DBLINK 理论上不支持 LOB 类型列的操作,但支持简单的增删改语句中使用常量来对 LOB 类型列进行操作;
  6. DBLINK 的本地库和远程库的大小写敏感参数 CASE_SENSITIVE 应保持一致,若不一致,应用需要保证 SQL 语句书写符合远程库的规范;
  7. DBLINK 的本地库和远程库的字符集编码应一致,否则可能导致字符串操作出错;
  8. 禁止将源数据库作为 DBLINK 的目标数据库,若检测到源数据库实例与目标库实例一致,服务器将拒绝建立连接。

另外,DM 连接异构数据库的外部链接还有如下使用限制:

  1. 数据类型以 DM 为基础,不支持 DM 没有的数据类型;
  2. 语法以 DM 的语法为标准,不支持 DM 不兼容的语法;
  3. 主键更新,如果是涉及到多个服务器的语句,不能保证更新操作一定成功;
  4. 使用 CREATE VIEW view_name(view_col_name) AS SELECT ITEM FROM T@LINK 方式创建的查询远程对象的本地视图,对于异构库,不能保证操作一定成功。对于查询异构库远程对象的本地视图,最好采用 CREATE VIEW AS SELECT ITEM AS alias_name FROM T@LINK 方式创建。

大部分业务只是使用这个业务做查询操作,给第三方业务提供数据分析基础。

二、dm-Oracle数据库

2.1 Oracle数据库

oracle11g安装部署参考链接Linux系统安装Oracle 11g数据库 - 寻找五叶草 - 博客园

oracle19c安装部署参考链接新手傻瓜式Linux 7上快速安装Oracle 19c数据库步骤参考 - 知乎

oracle数据库基本用法

bash 复制代码
# 启动数据库实例
[oracle@localhost ~]$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on 星期四 5月 7 17:35:12 2026
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.

已连接到空闲例程。

SQL> startup
ORACLE 例程已经启动。

Total System Global Area 3137336136 bytes
Fixed Size                  8901448 bytes
Variable Size             671088640 bytes
Database Buffers         2449473536 bytes
Redo Buffers                7872512 bytes
数据库装载完毕。
数据库已经打开。
SQL> select status from v$instance;

STATUS
------------
OPEN

# 启动监听
[oracle@localhost ~]$ lsnrctl status

LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 07-5月 -2026 17:36:00

Copyright (c) 1991, 2019, Oracle.  All rights reserved.

正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.157.135)(PORT=1521)))
LISTENER 的 STATUS
------------------------
别名                      LISTENER
版本                      TNSLSNR for Linux: Version 19.0.0.0.0 - Production
启动日期                  07-5月 -2026 17:35:56
正常运行时间              0 天 0 小时 0 分 3 秒
跟踪级别                  off
安全性                    ON: Local OS Authentication
SNMP                      OFF
监听程序参数文件          /u01/app/oracle/product/19.0.0/dbhome_1/network/admin/listener.ora
监听程序日志文件          /u01/app/oracle/diag/tnslsnr/localhost/listener/alert/log.xml
监听端点概要...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.157.135)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
监听程序不支持服务
命令执行成功

# 查看端口
[oracle@localhost ~]$ netstat -ntpl | grep 1521
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      0 192.168.157.135:1521    0.0.0.0:*               LISTEN      5058/tnslsnr
[oracle@localhost ~]$

# 查看数据库中有哪些模式(或者用户)
SELECT username, created FROM dba_users ORDER BY created DESC FETCH FIRST 10 ROWS ONLY;

SELECT username FROM dba_users ORDER BY created DESC FETCH FIRST 10 ROWS ONLY;

# 切换模式
ALTER SESSION SET CURRENT_SCHEMA = TEST_EXBASE;
select OWNER,table_name from all_tables where OWNER like 'TEST_EXBAS%';

select * from STUDENT fetch first 3 rows only;

#创建用户

-- 创建管理员用户 DBA_ADMIN
CREATE USER DBA_ADMIN IDENTIFIED BY "Admin@123";

-- 授予DBA管理员权限、数据泵权限
GRANT DBA, EXP_FULL_DATABASE, IMP_FULL_DATABASE TO DBA_ADMIN;

-- 创建用户(密码:Oracle_123)
CREATE USER USER01 IDENTIFIED BY Oracle_123;

-- 授予基本权限(必须)
GRANT CONNECT, RESOURCE TO USER01;

# 把TEST_EXBAS用户下的所有对象导入到USER01用户下
--先查询导出的文件存放位置
SELECT directory_name,directory_path FROM dba_directories WHERE directory_name='DATA_PUMP_DIR';

--导出数据库对象
expdp 'DBA_ADMIN/"Admin@123"@//192.168.157.135:1521/orcl' schemas=TEST_EXBASE dumpfile=TEST_EXBASE_full.dmp logfile=TEST_EXBASE_exp.log directory=DATA_PUMP_DIR

--导入数据库对象
impdp 'DBA_ADMIN/"Admin@123"@//192.168.157.135:1521/orcl' dumpfile=TEST_EXBASE_full.dmp logfile=TEST_EXBASE_imp.log directory=DATA_PUMP_DIR remap_schema=TEST_EXBASE:USER01

# 切换模式
ALTER SESSION SET CURRENT_SCHEMA = USER01;
select OWNER,table_name from all_tables where OWNER like 'USER01%';

select * from STUDENT fetch first 3 rows only;

2.2 DM数据库

bash 复制代码
# 初始化实例,簇大小32页,页大小32k,redo日志大小2048MB,字符集UTF-8,大小写敏感。
./dminit PATH=/dmdata/data5237 EXTENT_SIZE=32 PAGE_SIZE=32 LOG_SIZE=2048 CHARSET=1 CASE_SENSITIVE=Y SYSDBA_PWD='Linux123!@#' SYSAUDITOR_PWD='Linux123!@#'

# 注册服务(root用户执行)
cd /home/dmdba/dmdbms/script/root/
./dm_service_installer.sh -t dmserver -dm_ini /dmdata/data5237/DAMENG/dm.ini -p DMTEST5237

# 启动实例使用dmdba用户执行
/home/dmdba/dmdbms/bin/DmServiceDMTEST5237 start
/home/dmdba/dmdbms/bin/disql SYSDBA/'"Linux123!@#"'@127.0.0.1:5237
select INSTANCE_NAME,STATUS$,MODE$   from v$instance;
SQL>

行号       INSTANCE_NAME STATUS$ MODE$
---------- ------------- ------- ------
1          DMSERVER      OPEN    NORMAL

# 查看有哪些用户
select USERNAME from all_users;

# 可以查看有哪些模式
select VIEW_NAME from dba_views where VIEW_NAME like '%OBJECT%';
select distinct OWNER from DBA_OBJECTS;

# 创建用户
CREATE USER USER01 IDENTIFIED BY "Linux123!@#";
GRANT PUBLIC,RESOURCE TO USER01;

# 查看用户权限
SELECT * FROM USER_ROLE_PRIVS;
SET SCHEMA USER01;
SELECT * FROM USER_SYS_PRIVS;

# 查看当前模式
SELECT SYS_CONTEXT('USERENV','CURRENT_SCHEMA') FROM DUAL;


# 查看模式所属的用户是什么
SELECT
  USER_OBJ.NAME AS USER_NAME,
  SCH_OBJ.NAME  AS SCHEMA_NAME
FROM
  SYS.SYSOBJECTS SCH_OBJ,
  SYS.SYSOBJECTS USER_OBJ
WHERE
  SCH_OBJ.TYPE$ = 'SCH'        -- 模式对象
  AND USER_OBJ.TYPE$ = 'UR'    -- 用户对象
  AND USER_OBJ.SUBTYPE$ = 'USER'
  AND SCH_OBJ.PID = USER_OBJ.ID
ORDER BY
  USER_OBJ.NAME, SCH_OBJ.NAME;

使用oci接口调用oracle数据库

参考文章DBLINK加载库文件失败 | 达梦技术社区

参考文章达梦访问oracle数据库创建DBLINK 查询时报错 DBLINK加载库文件失败. | 达梦技术社区

bash 复制代码
# 在ORACLE官网中下载OCI
http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html

cd /home/dmdba/soft
[dmdba@node1 soft]$ ll
总用量 77556
-rw-r--r-- 1 dmdba dmdba 60704657  5月  7 13:01 instantclient-basic-linux.x64-11.2.0.4.0.zip
-rw-r--r-- 1 dmdba dmdba   643089  5月  7 13:01 instantclient-sdk-linux.x64-11.2.0.4.0.zip
-rw-r--r-- 1 dmdba dmdba   834491  5月  7 13:01 instantclient-sqlplus-linux.x64-11.2.0.4.0.zip

# 添加软连接
cd /home/dmdba/soft/instantclient_11_2
ln -s libclntsh.so.11.1 libclntsh.so
ln -s libocci.so.11.1 libocci.so

# 包含三个文件,上传到DM数据库的bin目录
cp -r *.so /home/dmdba/dmdbms/bin

通过 <IP 地址 >/< 服务名 > 创建

bash 复制代码
# 使用 DM 数据库,创建一个连接到实例名为 ORCL 的外部链接,登录到此站点使用的用户名为 USER01,设置登录口令为 Oracle_123,设置使用本地字符集为 UTF-8,字符集转换模式为 1,返回给达梦的字符集utf8。
CREATE LINK DM_TO_ORACLE CONNECT 'ORACLE' WITH USER01 IDENTIFIED BY Oracle_123 USING '192.168.157.135/ORCL' OPTION (LOCAL_CODE='UTF-8', CONVERT_MODE=1,DATA_CHARSET='UTF-8');

# 创建dblink外部链接
SQL> CREATE LINK DM_TO_ORACLE CONNECT 'ORACLE' WITH USER01 IDENTIFIED BY Oracle_123 USING '192.168.157.135/ORCL' OPTION (LOCAL_CODE='UTF-8', CONVERT_MODE=1,DATA_CHARSET='UTF-8');
操作已执行
已用时间: 3.686(毫秒). 执行号:65239.


SQL> select *from DBA_DB_LINKS;

行号       OWNER  DB_LINK      USERNAME HOST                 CREATED
---------- ------ ------------ -------- -------------------- --------------------------
1          USER01 DM_TO_ORACLE USER01   192.168.157.135/ORCL 2026-05-07 11:30:22.766646


# 使用dblink

select * from STUDENT@DM_TO_ORACLE;
select * from STUDENT@DM_TO_ORACLE2;
select * from STUDENT@DM_TO_ORACLE fetch first 3 rows only;

SQL> select * from STUDENT@DM_TO_ORACLE;

行号       ID NAME   AGE GENDER
---------- -- ------ --- ------
1          1  张三   18  男
2          2  李四   19  女
3          3  王五   20  男
4          5  张三   18  男
5          6  张三   18  男

已用时间: 123.849(毫秒). 执行号:601.

SQL> select * from STUDENT@DM_TO_ORACLE fetch first 3 rows only;

行号       ID NAME   AGE GENDER
---------- -- ------ --- ------
1          1  张三   18  男
2          2  李四   19  女
3          3  王五   20  男

已用时间: 4.868(毫秒). 执行号:602.

依赖有缺失

bash 复制代码
[dmdba@localhost instantclient_19_30]$ ldd libclntsh.so
        linux-vdso.so.1 (0x00007ffe9e764000)
        libnnz19.so (0x00007fda77af2000)
        libdl.so.2 => /usr/lib64/libdl.so.2 (0x00007fda77ad0000)
        libm.so.6 => /usr/lib64/libm.so.6 (0x00007fda7794d000)
        libpthread.so.0 => /usr/lib64/libpthread.so.0 (0x00007fda7792c000)
        libnsl.so.1 => not found
        librt.so.1 => /usr/lib64/librt.so.1 (0x00007fda77921000)
        libaio.so.1 => /usr/lib64/libaio.so.1 (0x00007fda7791a000)
        libresolv.so.2 => /usr/lib64/libresolv.so.2 (0x00007fda77901000)
        libc.so.6 => /usr/lib64/libc.so.6 (0x00007fda77749000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fda7c468000)
        libclntshcore.so.19.1 (0x00007fda771b5000)
        libnsl.so.1 => not found

[dmdba@localhost instantclient_19_30]$ ll /usr/lib64/ | grep libnsl^C
[dmdba@localhost instantclient_19_30]$ 注销
[root@localhost ~]# ln -s ^C
[root@localhost ~]# cd /usr/lib64/
[root@localhost lib64]# ln -s libnsl.so.2 libnsl.so.1


[dmdba@localhost instantclient_19_30]$ ldd libclntsh.so
        linux-vdso.so.1 (0x00007ffc3df3b000)
        libnnz19.so (0x00007fcf24bd9000)
        libdl.so.2 => /usr/lib64/libdl.so.2 (0x00007fcf24bb7000)
        libm.so.6 => /usr/lib64/libm.so.6 (0x00007fcf24a34000)
        libpthread.so.0 => /usr/lib64/libpthread.so.0 (0x00007fcf24a13000)
        libnsl.so.1 => /lib64/libnsl.so.1 (0x00007fcf249f8000)
        librt.so.1 => /usr/lib64/librt.so.1 (0x00007fcf249ed000)
        libaio.so.1 => /usr/lib64/libaio.so.1 (0x00007fcf249e6000)
        libresolv.so.2 => /usr/lib64/libresolv.so.2 (0x00007fcf249cd000)
        libc.so.6 => /usr/lib64/libc.so.6 (0x00007fcf24815000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fcf2954f000)
        libclntshcore.so.19.1 (0x00007fcf24281000)
        libtirpc.so.3 => /usr/lib64/libtirpc.so.3 (0x00007fcf24251000)
        libgssapi_krb5.so.2 => /usr/lib64/libgssapi_krb5.so.2 (0x00007fcf241f9000)
        libkrb5.so.3 => /usr/lib64/libkrb5.so.3 (0x00007fcf24113000)
        libk5crypto.so.3 => /usr/lib64/libk5crypto.so.3 (0x00007fcf240fa000)
        libcom_err.so.2 => /usr/lib64/libcom_err.so.2 (0x00007fcf240f4000)
        libkrb5support.so.0 => /usr/lib64/libkrb5support.so.0 (0x00007fcf240e2000)
        libkeyutils.so.1 => /usr/lib64/libkeyutils.so.1 (0x00007fcf240db000)
        libcrypto.so.1.1 => /usr/lib64/libcrypto.so.1.1 (0x00007fcf23de4000)
        libselinux.so.1 => /usr/lib64/libselinux.so.1 (0x00007fcf23db8000)
        libz.so.1 => /usr/lib64/libz.so.1 (0x00007fcf23d9e000)
        libsecurity.so.0 => /usr/lib64/libsecurity.so.0 (0x00007fcf23d99000)
        libpcre2-8.so.0 => /usr/lib64/libpcre2-8.so.0 (0x00007fcf23d04000)

三、dm-mysql数据库

dm数据库使用dblink去连接mysql只能使用odbc的方式去访问,odbc这种方式暂时只支持SQLSERVER、MYSQL、PI、ORACLE、DAMENG、OCEANBASE_ORACLE

3.1 MySQL数据库

安装部署参考文档如何用yum源安装MySQL5.7_yum安装mysql5.7-CSDN博客

sql 复制代码
mysql -uroot -p'%CBZ&Vim=1!k'

ALTER USER USER() IDENTIFIED BY 'Linux123!@#';
 
flush privileges;
 
(立即刷新配置)
 
grant all privileges on *.* to 'root'@'%' identified by 'Linux123!@#' with grant option; 

flush privileges;

-- 登录数据库
mysql -uroot -p'Linux123!@#' -h 127.0.0.1 -P 3306

-- 查看所有的数据库
 SHOW DATABASES;
-- 切换数据库
USE testdb;

-- 查看所在的数据库
SELECT DATABASE();

-- 看表 
mysql> show tables;
Empty set (0.00 sec)

mysql> desc 表名;
ERROR 1146 (42S02): Table 'test_db.表名' doesn't exist

-- 看建表语句
show create table 表名;

-- 建表
CREATE TABLE user (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL,
    age INT,
    phone VARCHAR(20),
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP
);

-- 写入一些数据
INSERT INTO user (name, age, phone) 
VALUES 
('张三', 25, '13800138000'),
('李四', 28, '13900139000'),
('王五', 30, '13700137000');

SELECT * FROM user;


# MySQL数据库对象的导出导入
mysqldump -uroot -p'Linux123!@#' -h127.0.0.1 -P3306 test_db > test_db_backup.sql

mysql -uroot -p'Linux123!@#' -h127.0.0.1 -P3306 test_db2 < test_db_backup.sql

mysql -uroot -p'Linux123!@#' -h127.0.0.1 -P3306 test_db2

show tables;

3.2 DM数据库

bash 复制代码
# 安装odbc中间件
yum install -y unixODBC unixODBC-devel

# 在dm数据库节点上安装mysql的odbc
yum -y install mysql-connector-odbc --nogpgcheck --nogpgcheck #不校验数字签名

# 查看驱动文件所在的位置
[root@localhost yum.repos.d]# ls /usr/lib64/libmyodbc*
/usr/lib64/libmyodbc9a.so  /usr/lib64/libmyodbc9w.so

# 驱动配置
vi /etc/odbcinst.ini
[MySQL]
Description     = ODBC for MySQL
Driver64        = /usr/lib64/libmyodbc9w.so
FileUsage       = 1

[DM8 ODBC DRIVER]
Description=DM ODBC DRIVER FOR DM8
Driver=/home/dmdba/dmdbms/drivers/odbc/libdodbc.so


# 数据源配置
vi /etc/odbc.ini
[DM8]
DRIVER=DM8 ODBC DRIVER
SERVER=192.168.157.140
UID=SYSDBA
PWD='Linux123!@#'
TCP_PORT=5236

[mysql8]
Driver = MySQL
SERVER = 192.168.157.140
PORT = 3306
USER = root
PASSWORD ='Linux123!@#'
charset=UTF8
DATABASE= test_db
TRACE = OFF
sql 复制代码
DROP PUBLIC LINK MYLINK1;

CREATE OR REPLACE PUBLIC LINK MYLINK1 CONNECT 'ODBC' WITH "root" IDENTIFIED BY "Linux123!@#" USING 'mysql8' OPTION(DB_TYPE='MYSQL');


select * from DBA_DB_LINKS;

SQL> select * from "user"@MYLINK1;

行号       id          name   age         phone       create_time
---------- ----------- ------ ----------- ----------- -------------------
1          1           张三   25          13800138000 2026-05-07 15:57:32
2          2           李四   28          13900139000 2026-05-07 15:57:32
3          3           王五   30          13700137000 2026-05-07 15:57:32

已用时间: 65.985(毫秒). 执行号:1007.

四、dm-dm数据库

如果使用DPI访问达梦数据库,不需要进行任何配置,直接就能使用。

sql 复制代码
CREATE PUBLIC LINK LINK_DM_TO_DM CONNECT 'DPI' WITH SYSDBA IDENTIFIED BY "Linux123!@#" USING '192.168.157.141:5237';

select * from DBA_DB_LINKS;
SQL> select * from DBA_DB_LINKS;

行号       OWNER  DB_LINK       USERNAME HOST                 CREATED
---------- ------ ------------- -------- -------------------- --------------------------
1          PUBLIC LINK_DM_TO_DM SYSDBA   192.168.157.141:5237 2026-05-07 17:09:02.452829
2          PUBLIC MYLINK1       root     mysql8               2026-05-07 16:49:48.294696
3          SYSDBA DM_TO_ORACLE  USER01   192.168.157.135/ORCL 2026-05-07 13:55:05.229030
4          SYSDBA DM_TO_ORACLE2 USER01   192.168.157.135/ORCL 2026-05-07 14:01:34.376458
5          SYSDBA DM_TO_ORACLE3 USER01   192.168.157.135/orcl 2026-05-07 14:29:31.657231



select STATUS$,DB_VERSION from v$instance@LINK_DM_TO_DM;

SQL> select STATUS$,DB_VERSION from v$instance@LINK_DM_TO_DM;

行号       STATUS$ DB_VERSION
---------- ------- -------------------
1          OPEN    DB Version: 0x7000d

已用时间: 6.391(毫秒). 执行号:1204.
相关推荐
凭X而动1 小时前
postgresql18.1部署
数据库·postgresql
万邦科技Lafite1 小时前
京东商品详情 API 接口全面讲解
java·数据库·redis·api·电商开放平台
无风听海1 小时前
MongoDB GridFS 一些处理细节解析
数据库·mongodb
青云计划1 小时前
Mysql
数据库·mysql
海棠Flower未眠1 小时前
Spring Boot 3 + JPA多模块系统对MySQL和DORIS进行多数据源集成实战(荣耀典藏版)
spring boot·后端·mysql
SelectDB2 小时前
Agent 应用范式下,企业数据基础设施如何演进?
大数据·数据库·数据分析
杜子不疼.2 小时前
【C++ AI 大模型接入 SDK】 - 环境搭建
开发语言·数据库·c++
qq_283720052 小时前
Milvus 向量数据库全链路优化实战教程
数据库·milvus
m0_702036532 小时前
CSS如何兼容新旧方案结合响应式容器查询
jvm·数据库·python