搭建同构(dm-dm)及异构数据库(dm-oracle,dm-mysql)的dblink
文章目录
- 搭建同构(dm-dm)及异构数据库(dm-oracle,dm-mysql)的dblink
- 一、DBlink介绍
- 二、dm-Oracle数据库
-
- [2.1 Oracle数据库](#2.1 Oracle数据库)
- [2.2 DM数据库](#2.2 DM数据库)
- 2.3创建dblink
- 三、dm-mysql数据库
-
- [3.1 MySQL数据库](#3.1 MySQL数据库)
- [3.2 DM数据库](#3.2 DM数据库)
- [3.3 创建dblink](#3.3 创建dblink)
- 四、dm-dm数据库
大家想学习达梦数据库或者解决报错问题,可以去 达梦数据库社区( https://eco.dameng.com)
一、DBlink介绍
DM 中的一种特殊的数据库实体对象,它记录了远程数据库的连接和路径信息,用于建立与远程数据的联系。
这个链接可以是公用的(数据库中所有用户使用),也可以是私有的(只能被某个用户使用)。
用户可以通过外部链接对远程数据库的表进行查询和增删改操作,以及本地调用远程的存储过程。
使用限制外部链接的使用主要有以下限制:
- DM-DM 的同构外部链接不支持 MPP 环境,DM 与异构数据库的外部链接支持 MPP 环境;
- 增删改不支持 INTO 语句;
- 不支持使用游标进行增删改操作;
- 不支持操作远程表的复合类型列;
- DBLINK 理论上不支持 LOB 类型列的操作,但支持简单的增删改语句中使用常量来对 LOB 类型列进行操作;
- DBLINK 的本地库和远程库的大小写敏感参数 CASE_SENSITIVE 应保持一致,若不一致,应用需要保证 SQL 语句书写符合远程库的规范;
- DBLINK 的本地库和远程库的字符集编码应一致,否则可能导致字符串操作出错;
- 禁止将源数据库作为 DBLINK 的目标数据库,若检测到源数据库实例与目标库实例一致,服务器将拒绝建立连接。
另外,DM 连接异构数据库的外部链接还有如下使用限制:
- 数据类型以 DM 为基础,不支持 DM 没有的数据类型;
- 语法以 DM 的语法为标准,不支持 DM 不兼容的语法;
- 主键更新,如果是涉及到多个服务器的语句,不能保证更新操作一定成功;
- 使用 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;
2.3创建dblink
使用oci接口调用oracle数据库
参考文章达梦访问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
3.3 创建dblink
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.