达梦の外部链接(dblink)


DM技术交流QQ群:940124259

达梦の外部链接(dblink)

1.1 概述

外部链接对象(LINK)是达梦中一种’特殊’的数据库实体对象,记录着远程数据库的连接和路径信息,用于建立与远程数据的连接。
如果多台数据库主库间要相互通讯,透明地操作远程数据库中的数据,就应用程序角度视作在一个大型数据库当中。
用户远程请求数据库的数据,都会被自动转换为网络请求,并在相应节点上实现相应的操作。
建立一个数据库链接(实质是指定一个对远程数据库的访问路径)。
外部链接可以是公用的"数据库中所有用户使用",也可以是私有的"只能被某个用户使用"
用户可以通过外部链接对远程数据库的表进行查询和增删改操作,以及本地调用远程的存储过程。

外部链接限制:

  1. DM-DM的同构外部链接不支持MPP环境,DM与异构数据库的外部链接支持MPP环境;
  2. 增删改不支持INTO语句;
  3. 不支持使用游标进行增删改操作;
  4. 不支持操作远程表的复合类型列;
  5. DBLINK 理论上不支持 LOB 类型列的操作,但支持简单的增删改语句中使用常量来对 LOB 类型列进行操作。

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方式创建。

删除外部链接:

DROP [PUBLIC] LINK [<模式名>.]<外部链接名>;

查询外部链接视图:

  v$dblink
  dba_db_links

1.2 语法讲解

CREATE [OR REPLACE] [PUBLIC] LINK <外部链接名> 
 CONNECT ['<连接库类型>'] WITH <登录用户名> IDENTIFIED BY <登录口令> USING '<外部连接串>';

连接库类型: <DAMENG | ORACLE | ODBC>
外部链接串:
[连接类型;] <达梦外部链接串 | Oracle外部链接串> | odbc外部链接串>
连接类型:
[PRIMARY FIRST | STANDBY FIRST | PRIMARY ONLY |
STANDBY ONLY ;] 服务器列表: <服务器地址1 [, 服务器地址2 [, …]]>
服务器地址:> <mal_host/mal_port | mal_inst_host/mal_inst_port > mal_inst_name>
Oracle外部链接串:<TNSNAME配置 | DESCRIPTION描述符 | IP地址/服务名>
odbc外部链接串: <ODBC 数据源 DSN>

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
使用说明:

1. 创建达梦数据的外部链接须先配置dmmal.ini文件,dm.ini打开MAL_INI=12. 达梦数据库的外部链接中提及的连接串有两种使用形式:远程数据库的实例名和IP地址/端口号。
3. 创建到Oracle数据库的外部链接,可以使用TNSNAME本地别名或连接描述字符串(description或ip地址/服务名)4. 创建到Oracle数据库的外部链接,需在发起请求连接的一端安装ORACLE OCI接口,并且保证OCI接口与达梦版本在32/64位一致。
5. 只支持普通用户,不支持SSL和Kerberos认证。
6. 达梦不支持连接自身实例的外部链接(LINK)。 
7. 通过LINK对远程服务器所作的修改,由用户在本地服务器通过commit提交或rollback回滚。
8. 只有在具有DBA和Create LINK权限的用户才能创建外部链接。
9. 当DBLINK外部链接到多机系统(服务器地址列表),若正在所连接的服务器发生宕机等意外情况导致无法对外提供服务时,DBLINK会根据之前设定连接类型,在剩余的服务器列表中挑选舒适的服务器进行连接。
10.支持在CREATE SCHEMA子句中CREATE LINK,但是不支持CREATE PUBLIC LINK。

1.3 案例演示

1.3.1 同构数据库:DM -> DM之间LINK

# 本机有两个达梦数据库实例5236/5238
#### 步骤1. 打通MAL通信链路:本地端/远程端:配置mal本地实例和远程实例,配置内容项须保持一致
### dmmal.ini
## 注意:源库与目标库的MAL配置项要一致
MAL_LOGIN_TIMEOUT = 10   #MPP/DBLINK等实例之间登录超时的检测间隔时间。
[MAL_INST1]
MAL_INST_NAME = DEM
MAL_HOST      = 192.168.0.120
MAL_PORT      = 15238
MAL_INST_HOST = 192.168.0.120
MAL_INST_PORT = 5238


#### 步骤2. 本地端/远程端: dm.ini 打开MAL通信子系统
#配置项
MAL_INI = 1
# 函数执行修改
SQL> SF_SET_SYSTEM_PARA_VALUE('MAL_INI',1,0,2);
# 由于MAL_INI属于静态参数需重启数据库生效。
SQL> select SF_GET_PARA_VALUE(1,'MAL_INI'),SF_GET_PARA_VALUE(2,'MAL_INI');
行号     SF_GET_PARA_VALUE(1,'MAL_INI') SF_GET_PARA_VALUE(2,'MAL_INI')
---------- ------------------------------ ------------------------------
1          1(文件值)                              1 (内存值)
已用时间: 12.165(毫秒). 执行号:232.

SQL> select * from v$parameter where name like 'MAL_INI';
SQL> select * from v$dm_mal_ini;

行号     MAL_NAME  MAL_INST_NAME MAL_HOST      MAL_PORT    MAL_INST_HOST MAL_INST_PORT MAL_DW_PORT MAL_LINK_MAGIC MAL_INST_DW_PORT
---------- --------- ------------- ------------- ----------- ------------- ------------- ----------- -------------- ----------------
1          MAL_INST1 DEM           192.168.0.120 15238       192.168.0.120 5238          0           0              0
2          MAL_INST2 DCA           192.168.0.120 15236       192.168.0.120 5236          0           0              0



#### 步骤3. 确认MAL子系统通信端口已开启
[dmdba@dca01 ~]$ ss -lnp |grep dmserver 
tcp    LISTEN     0      128    192.168.0.120:15238                 *:*                   users:(("dmserver",pid=18613,fd=7))
tcp    LISTEN     0      128    192.168.0.120:15236                 *:*                   users:(("dmserver",pid=18311,fd=7))
tcp    LISTEN     0      128    [::]:5236               [::]:*                   users:(("dmserver",pid=18311,fd=4))
tcp    LISTEN     0      128    [::]:5238               [::]:*                   users:(("dmserver",pid=18613,fd=4))


#### 步骤4. 创建外部链接link
## 连接串形式1:mal_inst_host/mal_inst_port
SQL> CREATE LINK demlink CONNECT 'DAMENG' WITH "SYSDBA" IDENTIFIED BY "SYSDBA" USING '192.168.0.120/5238';

# 查看当前数据库已经存在的dblink
SQL> select * from dba_db_links;
行号     OWNER  DB_LINK USERNAME HOST              
---------- ------ ------- -------- ------------------
           CREATED                                                                                             
           ----------------------------------------------------------------
1          SYSDBA DEMLINK SYSDBA   192.168.0.120/5238
           2021-04-08 22:46:02.650610
已用时间: 4.427(毫秒). 执行号:211.


# 尝试访问远端数据库DEM 模式SYSDBA下T1表
SQL> select * from t1@demlink;
行号     A          
---------- -----------
1          1
2          2
3          3
4          4
5          5
已用时间: 21.952(毫秒). 执行号:213.

# 远程访问数据库后,缓存dblink链接信息
SQL> select * from v$dblink;
行号     LINK_CONN            LINK_ID     LINK_NAME SCH_ID      OWNER_ID    IS_PUBLIC LOGIN_NAME HOST_NAME     PORT_NUM    LOGGED_ON
---------- -------------------- ----------- --------- ----------- ----------- --------- ---------- ------------- ----------- ---------
           HETEROGENEOUS PROTOCOL IN_USE
           ------------- -------- ------
1          111381824            201326595   DEMLINK   150994945   50331649    NO        SYSDBA     192.168.0.120 5238        YES
           YES           TCP/IP   YES
已用时间: 1.473(毫秒). 执行号:214.
SQL> 


## 连接串形式2:实例名instance_name->mal_inst_name
SQL> CREATE LINK demlink2 CONNECT 'DAMENG' WITH "SYSDBA" IDENTIFIED BY "SYSDBA" USING 'DEM';
操作已执行
已用时间: 10.784(毫秒). 执行号:215.
SQL> select * from t1@demlink2;
行号     A          
---------- -----------
1          1
2          2
3          3
4          4
5          5

已用时间: 32.419(毫秒). 执行号:216.
SQL> 

## 连接串形式3:mal_host/mal_port
SQL> CREATE LINK demlink3 CONNECT 'DAMENG' WITH "SYSDBA" IDENTIFIED BY "SYSDBA" USING '192.168.0.120/15238';
操作已执行
已用时间: 17.793(毫秒). 执行号:217.
SQL> select * from t1@demlink3;
行号     A          
---------- -----------
1          1
2          2
3          3
4          4
5          5

已用时间: 16.746(毫秒). 执行号:218.
SQL> 

#### 步骤5. 建议使用同义词(隐藏细节:可选)
SQL> CREATE SYNONYM dem_t1 FOR t1@demlink3;

# 查询含dblink的同义词
SQL> SELECT * FROM DBA_SYNONYMS WHERE DB_LINK='DEMLINK3';
行号     OWNER  SYNONYM_NAME TABLE_OWNER TABLE_NAME DB_LINK 
---------- ------ ------------ ----------- ---------- --------
1          SYSDBA DEM_T1                   T1         DEMLINK3

已用时间: 8.655(毫秒). 执行号:223.
SQL> select * from DEM_T1;                                                
行号     A          
---------- -----------
1          1
2          2
3          3
4          4
5          5

已用时间: 11.394(毫秒). 执行号:224.


///////////////////////////////////////////////////////////
### 验证在本地数据库内部创建自身的link  ###
SQL> drop table cqsoft;
操作已执行
已用时间: 60.191(毫秒). 执行号:227.
SQL> create table cqsoft (id int);
操作已执行
已用时间: 10.302(毫秒). 执行号:228.
SQL> insert into cqsoft values(1),(2),(3),(4);
影响行数 4
已用时间: 5.788(毫秒). 执行号:229.
SQL> commit;
操作已执行
已用时间: 5.671(毫秒). 执行号:230.
SQL> select * from cqsoft;
行号     ID         
---------- -----------
1          1
2          2
3          3
4          4
已用时间: 6.054(毫秒). 执行号:231.

SQL> create link testlink connect 'DAMENG' with "SYSDBA" identified by "SYSDBA" using '192.168.0.120/5236';
create link testlink connect 'DAMENG' with "SYSDBA" identified by "SYSDBA" using '192.168.0.120/5236';1 行附近出现错误[-2235]:不支持DBLINK连接自身实例.
已用时间: 0.657(毫秒). 执行号:0.
SQL> 

1.3.2 异构数据库: DM -> Oracle之间的LINK

方法一:odbc驱动连接
##安装和配置odbc(略) 参考我其他博客
#### 步骤1:达梦本地端安装odbc客户端连接工具
安装过程参考链接:  (略)
[dmdba@dca01 ~]$ odbcinst -j
unixODBC 2.3.1
DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
FILE DATA SOURCES..: /etc/ODBCDataSources
USER DATA SOURCES..: /dm8/dmdba/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8
[dmdba@dca01 ~]$ 

#### 步骤2:达梦本地端安装odbc驱动
[root@dca01 ~]# unzip instantclient-odbc-linuxx64.zip 
[root@dca01 instantclient_21_1]# ls -l
总用量 1084
drwxr-xr-x. 4 root root      26 1031 17:34 help
-rwxr-xr-x. 1 root root 1082576 1031 17:34 libsqora.so.21.1
-rw-r--r--. 1 root root    5780 1031 17:34 ODBC_LICENSE
-rw-r--r--. 1 root root    7648 1031 17:34 ODBC_README
-rwxr-xr-x. 1 root root    5011 1031 17:34 odbc_update_ini.sh

# 拷贝libsqora.so.21.1到达梦安装主目录bin下
[root@dca01 instantclient_21_1]# cp -v libsqora.so.21.1 /dm8/dmdba/dmdbms/bin
"libsqora.so.21.1" -> "/dm8/dmdba/dmdbms/bin/libsqora.so.21.1"
[root@dca01 instantclient_21_1]# chown -v dmdba:dinstall /dm8/dmdba/dmdbms/bin/libsqora.so.21.1
changed ownership of "/dm8/dmdba/dmdbms/bin/libsqora.so.21.1" from root:root to dmdba:dinstall
[root@dca01 instantclient_21_1]# 


#### 步骤3:达梦本地端配置Oracle odbc驱动加载
# 配置驱动加载位置
[root@dca01 ~]# vim /etc/odbcinst.ini
[Oracle ODBC Driver]
Description=ODBC driver for Oracle
Driver=/dm8/dmdba/dmdbms/bin/libsqora.so.21.1

[dmdba@dca01 ~]$ isql ora -v
[01000][unixODBC][Driver Manager]Can't open lib '/dm8/dmdba/dmdbms/bin/libsqora.so.21.1' : file not found
[ISQL]ERROR: Could not SQLConnect
[dmdba@dca01 ~]$ ldd /dm8/dmdba/dmdbms/bin/libsqora.so.21.1
        linux-vdso.so.1 =>  (0x00007ffe4b6bd000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007fa1e2323000)
        libm.so.6 => /lib64/libm.so.6 (0x00007fa1e2021000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fa1e1e05000)
        librt.so.1 => /lib64/librt.so.1 (0x00007fa1e1bfd000)
        libaio.so.1 => /lib64/libaio.so.1 (0x00007fa1e19fb000)
        libresolv.so.2 => /lib64/libresolv.so.2 (0x00007fa1e17e1000)
        libclntsh.so.21.1 => not found     ****** 缺什么补什么
        libclntshcore.so.21.1 => not found  ****** 缺什么补什么
        libodbcinst.so.2 => /lib64/libodbcinst.so.2 (0x00007fa1e15cf000)
        libc.so.6 => /lib64/libc.so.6 (0x00007fa1e1201000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fa1e27e2000)
        libltdl.so.7 => /lib64/libltdl.so.7 (0x00007fa1e0ff7000)
[dmdba@dca01 ~]$ 

# 申明:以上思路是对的,但驱动太新,后改用Oracle 11.2.0.4服务器版本安装目录$ORACLE_HOME/lib/libsqora.so.11.1
# 处理过程如下:
[root@dca01 bin]# export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/dm8/dmdba/dmdbms/bin:/usr/local/unixODBC/lib
[root@dca01 bin]# isql ora -v
[01000][unixODBC][Driver Manager]Can't open lib '/dm8/dmdba/dmdbms/bin/libsqora.so.11.1' : file not found
[ISQL]ERROR: Could not SQLConnect
[root@dca01 bin]# ldd /dm8/dmdba/dmdbms/bin/libsqora.so.11.1
ldd: 警告: 你没有执行权限  `/dm8/dmdba/dmdbms/bin/libsqora.so.11.1'
        linux-vdso.so.1 =>  (0x00007fff4d7f0000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007fe932d48000)
        libm.so.6 => /lib64/libm.so.6 (0x00007fe932a46000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fe93282a000)
        libnsl.so.1 => /lib64/libnsl.so.1 (0x00007fe932610000)
        libclntsh.so.11.1 (0x00007fe92fca1000)
        libodbcinst.so.1 => not found   -- 缺什么补什么
        libc.so.6 => /lib64/libc.so.6 (0x00007fe92f8d3000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fe932f4c000)
        libnnz11.so (0x00007fe92f506000)
        libaio.so.1 => /lib64/libaio.so.1 (0x00007fe92f304000)
[root@dca01 bin]# find / -name libodbcinst.so*
/usr/lib64/libodbcinst.so
/usr/lib64/libodbcinst.so.2
/usr/lib64/libodbcinst.so.2.0.0
/usr/local/unixODBC/lib/libodbcinst.so.2.0.0
/usr/local/unixODBC/lib/libodbcinst.so.2
/usr/local/unixODBC/lib/libodbcinst.so     
# 符号链接文件
[root@dca01 bin]# ln -sfv /usr/lib64/libodbcinst.so /usr/lib64/libodbcinst.so.1
"/usr/lib64/libodbcinst.so.1" -> "/usr/lib64/libodbcinst.so"

[root@dca01 bin]# ldd /dm8/dmdba/dmdbms/bin/libsqora.so.11.1
ldd: 警告: 你没有执行权限  `/dm8/dmdba/dmdbms/bin/libsqora.so.11.1'
        linux-vdso.so.1 =>  (0x00007fff431e4000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f61d28cf000)
        libm.so.6 => /lib64/libm.so.6 (0x00007f61d25cd000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f61d23b1000)
        libnsl.so.1 => /lib64/libnsl.so.1 (0x00007f61d2197000)
        libclntsh.so.11.1 (0x00007f61cf828000)
        libodbcinst.so.1 => /lib64/libodbcinst.so.1 (0x00007f61cf616000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f61cf248000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f61d2ad3000)
        libnnz11.so (0x00007f61cee7b000)
        libaio.so.1 => /lib64/libaio.so.1 (0x00007f61cec79000)
        libltdl.so.7 => /lib64/libltdl.so.7 (0x00007f61cea6f000)

# 配置DSN
[root@dca01 bin]# vim /etc/odbc.ini
[ora]
Description=Oracle ODBC DSN
Driver=Oracle ODBC Driver
Database=erpdb
ServerName=192.168.0.207:1521/erpdb
USER_ID=SCOTT
Password=scott
Port=1521


# 测试odbc连接
[dmdba@dca01 ~]$ isql ora scott scott
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL> select * from v$version;
+---------------------------------------------------------------------------------+
| BANNER                                                                          |
+---------------------------------------------------------------------------------+
| Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production    |
| PL/SQL Release 11.2.0.4.0 - Production                                          |
| CORE  11.2.0.4.0      Production                                                      |
| TNS for Linux: Version 11.2.0.4.0 - Production                                  |
| NLSRTL Version 11.2.0.4.0 - Production                                          |
+---------------------------------------------------------------------------------+
SQLRowCount returns -1
5 rows fetched


#### 步骤4:创建dblink
# 连接串:DSN源名
SQL>  CREATE OR REPLACE LINK odbc1 CONNECT 'ODBC' WITH SCOTT IDENTIFIED BY "scott" USING 'ora'; 
SQL> select * from emp@ODBC1;
EMPNO	ENAME	JOB	MGR	HIREDATE	SAL	COMM	DEPTNO
7369	SMITH	CLERK	7902	1980-12-17 00:00:00	800.00	NULL	20
7499	ALLEN	SALESMAN	7698	1981-02-20 00:00:00	1600.00	300.00	30
7521	WARD	SALESMAN	7698	1981-02-22 00:00:00	1250.00	500.00	30
7566	JONES	MANAGER	7839	1981-04-02 00:00:00	2975.00	NULL	20
7654	MARTIN	SALESMAN	7698	1981-09-28 00:00:00	1250.00	1400.00	30
7698	BLAKE	MANAGER	7839	1981-05-01 00:00:00	2850.00	NULL	30
7782	CLARK	MANAGER	7839	1981-06-09 00:00:00	2450.00	NULL	10
7788	SCOTT	ANALYST	7566	1987-04-19 00:00:00	3000.00	NULL	20
7839	KING	PRESIDENT	NULL	1981-11-17 00:00:00	5000.00	NULL	10
7844	TURNER	SALESMAN	7698	1981-09-08 00:00:00	1500.00	0	30
7876	ADAMS	CLERK	7788	1987-05-23 00:00:00	1100.00	NULL	20
7900	JAMES	CLERK	7698	1981-12-03 00:00:00	950.00	NULL	30
7902	FORD	ANALYST	7566	1981-12-03 00:00:00	3000.00	NULL	20
7934	MILLER	CLERK	7782	1982-01-23 00:00:00	1300.00	NULL	10



SQL> select * from v$dblink;
行号     LINK_CONN            LINK_ID     LINK_NAME SCH_ID      OWNER_ID    IS_PUBLIC LOGIN_NAME HOST_NAME PORT_NUM    LOGGED_ON
---------- -------------------- ----------- --------- ----------- ----------- --------- ---------- --------- ----------- ---------
           HETEROGENEOUS PROTOCOL IN_USE
           ------------- -------- ------
1          117787968            201326603   ODBC1     150994945   50331649    NO        SCOTT      ora       NULL        YES
           YES           TCP/IP   YES

已用时间: 3.753(毫秒). 执行号:105.
SQL> 
方法二:oracle客户端oci接口
#### 步骤1. Oracle官网下载OCI客户端
下载链接:
https://www.oracle.com/database/technologies/instant-client.html
https://www.oracle.com/database/technologies/instant-client/downloads.html

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

### 步骤1:解压zip包
[root@dca01 ~]# ls
anaconda-ks.cfg  dm6C039119.key                                percent.sh  test2.sh  traffic_mon.sh   模板  文档  桌面
a.sed            initial-setup-ks.cfg                          perl5       test.log  ystemctl status  视频  下载
b.sed            instantclient-basic-linux.x64-11.2.0.4.0.zip  rpmbuild    test.sh   公共             图片  音乐
[root@dca01 ~]# unzip -q instantclient-basic-linux.x64-11.2.0.4.0.zip 
[root@dca01 ~]# ls -l
总用量 59340
-rw-------. 1 root root     2200 111 14:17 anaconda-ks.cfg
-rw-r--r--. 1 root root       47 221 09:51 a.sed
-rw-r--r--. 1 root root      433 221 09:53 b.sed
-rw-r--r--. 1 root root      648 923 2020 dm6C039119.key
-rw-r--r--. 1 root root     2231 111 14:25 initial-setup-ks.cfg
drwxr-xr-x. 2 root root      233 412 09:40 instantclient_11_2
-rw-r--r--. 1 root root 60704657 412 09:28 instantclient-basic-linux.x64-11.2.0.4.0.zip
-rw-r--r--. 1 root root      239 21 15:50 percent.sh
drwxr-xr-x. 2 root root        6 111 17:51 perl5
drwxr-xr-x. 7 root root       72 220 12:10 rpmbuild
-rw-r--r--. 1 root root      202 21 12:40 test2.sh
-rw-r--r--. 1 root root     2718 21 15:30 test.log
-rw-r--r--. 1 root root      177 21 15:15 test.sh
-rwxr-xr-x. 1 root root     1451 35 22:06 traffic_mon.sh
-rw-r--r--. 1 root root    16279 220 17:01 ystemctl status
drwxr-xr-x. 2 root root        6 126 09:22 公共
drwxr-xr-x. 2 root root        6 126 09:22 模板
drwxr-xr-x. 2 root root        6 126 09:22 视频
drwxr-xr-x. 2 root root        6 126 09:22 图片
drwxr-xr-x. 2 root root        6 126 09:22 文档
drwxr-xr-x. 2 root root        6 126 09:22 下载
drwxr-xr-x. 2 root root        6 126 09:22 音乐
drwxr-xr-x. 2 root root        6 126 09:22 桌面
[root@dca01 ~]# cd instantclient_11_2/
## 可观察到带so关键字眼的文件
[root@dca01 instantclient_11_2]# ls -l
总用量 183520
-rwxrwxr-x. 1 root root     25420 825 2013 adrci
-rw-rw-r--. 1 root root       439 825 2013 BASIC_README
-rwxrwxr-x. 1 root root     47860 825 2013 genezi
-rwxrwxr-x. 1 root root  53865194 825 2013 libclntsh.so.11.1
-r-xr-xr-x. 1 root root   7996693 825 2013 libnnz11.so
-rwxrwxr-x. 1 root root   1973074 825 2013 libocci.so.11.1
-rwxrwxr-x. 1 root root 118738042 825 2013 libociei.so
-r-xr-xr-x. 1 root root    164942 825 2013 libocijdbc11.so
-r--r--r--. 1 root root   2091135 825 2013 ojdbc5.jar
-r--r--r--. 1 root root   2739616 825 2013 ojdbc6.jar
-rwxrwxr-x. 1 root root    192365 825 2013 uidrvci
-rw-rw-r--. 1 root root     66779 825 2013 xstreams.jar

### 步骤2: 拷贝so文件到达梦安装目录bin路径下
[root@dca01 instantclient_11_2]# cp -v *.so* /dm8/dmdba/dmdbms/bin
"libclntsh.so.11.1" -> "/dm8/dmdba/dmdbms/bin/libclntsh.so.11.1"
"libnnz11.so" -> "/dm8/dmdba/dmdbms/bin/libnnz11.so"
"libocci.so.11.1" -> "/dm8/dmdba/dmdbms/bin/libocci.so.11.1"
"libociei.so" -> "/dm8/dmdba/dmdbms/bin/libociei.so"
"libocijdbc11.so" -> "/dm8/dmdba/dmdbms/bin/libocijdbc11.so"
[root@dca01 instantclient_11_2]# chown dmdba:dinstall /dm8/dmdba/dmdbms/bin/*
[root@dca01 instantclient_11_2]# ls -ltr /dm8/dmdba/dmdbms/bin/ | head 
总用量 444040
-rwxr-xr-x. 1 dmdba dinstall   3057257 131 20:17 SYSWORD.UTF8.LIB
drwxr-xr-x. 8 dmdba dinstall        93 131 20:17 client_ssl
-rwxr-xr-x. 1 dmdba dinstall   3371068 131 20:17 libcrypto.so
-rwxr-xr-x. 1 dmdba dinstall     38172 131 20:17 libacdct.so
-rwxr-xr-x. 1 dmdba dinstall     91087 131 20:17 libcyt_java.so
-rwxr-xr-x. 1 dmdba dinstall    310687 131 20:17 libdisql_dll.so
-rwxr-xr-x. 1 dmdba dinstall     73084 131 20:17 libdmamon.so
-rwxr-xr-x. 1 dmdba dinstall    191778 131 20:17 libdmasm.so
-rwxr-xr-x. 1 dmdba dinstall     92310 131 20:17 libdmapx.so

### 步骤3:建立符号链接
[root@dca01 instantclient_11_2]# ln -sfv libclntsh.so.11.1 libclntsh.so
"libclntsh.so" -> "libclntsh.so.11.1"

[root@dca01 bin]# ls -ltr
......
-rw-r--r--. 1 dmdba dinstall   1003582 49 10:15 libsqora.so.11.1
-rwxr-xr-x. 1 dmdba dinstall  53865194 422 20:23 libclntsh.so.11.1
-r-xr-xr-x. 1 dmdba dinstall   7996693 422 20:23 libnnz11.so
-rwxr-xr-x. 1 dmdba dinstall   1973074 422 20:23 libocci.so.11.1
-rwxr-xr-x. 1 dmdba dinstall 118738042 422 20:23 libociei.so
-r-xr-xr-x. 1 dmdba dinstall    164942 422 20:23 libocijdbc11.so
lrwxrwxrwx. 1 root  root            17 422 20:28 libclntsh.so -> libclntsh.so.11.1

### 步骤4:重启数据库,重新自动加载so文件
[dmdba@dca01 bin]$ service DmServiceDEM restart

### 步骤5:创建外部链接
# 连接串形式1:DESCRIPTION描述符信息
SQL> CREATE OR REPLACE PUBLIC LINK dm2ora CONNECT 'ORACLE' WITH SCOTT IDENTIFIED BY "scott" 
     USING '(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.0.207)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SID=erpdb)))'; 

# 连接串形式2IP地址:端口号/服务名
SQL> CREATE OR REPLACE LINK DM2ORA2 CONNECT 'ORACLE' WITH SCOTT IDENTIFIED BY "scott" USING '192.168.0.207:1521/erpdb';    

SQL>  select * from dept@DM2ORA; 

行号     DEPTNO DNAME      LOC     
---------- ------ ---------- --------
1          10     ACCOUNTING NEW YORK
2          20     RESEARCH   DALLAS
3          30     SALES      CHICAGO
4          40     OPERATIONS BOSTON

已用时间: 78.746(毫秒). 执行号:504.

SQL> select * from v$version@dm2ora;
     BANNER                                                                      
---------- ----------------------------------------------------------------------------
1          Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
2          PL/SQL Release 11.2.0.4.0 - Production
3          CORE 11.2.0.4.0 Production
4          TNS for Linux: Version 11.2.0.4.0 - Production
5          NLSRTL Version 11.2.0.4.0 - Production

已用时间: 10.801(毫秒). 执行号:505.
SQL> 

1.3.3 异构数据库:Oracle -> DM之间的DBLINK

# odbc连接方式
#### 步骤1:oracle本地端安装odbc
[root@erp207 ~]# tar -zxvf unixODBC-2.3.0.tar.gz
[root@erp207 ~]# cd unixODBC-2.3.0
[root@erp207 unixODBC-2.3.0]# ./configure --prefix=/usr/local/unixODBC-2.3.0 --includedir=/usr/include --libdir=/usr/lib --bindir=/usr/bin --sysconfdir=/etc
[root@erp207 unixODBC-2.3.0]# make && make install
参考链接: ()

#### 步骤2:上传达梦odbc驱动链接文件
# ** 注意:最简单方式直接将达梦bin目录拷贝过来 **
## 先在达梦数据库服务器端,查找libdodbc.so所依赖的库
## 切记:最后从适配相应操作系统的达梦版本中拷贝而来。
[root@dca01 bin]# ldd libdodbc.so | awk '/\.\//{print $1}'
libdmdpi.so
libdmfldr.so
libdmelog.so
libdmutl.so
libdmclientlex.so
libdmos.so
libdmcvt.so
libdmstrt.so
libdmmem.so
libdmcalc.so

## Oracle数据库端建立专用文件夹存放达梦so文件
[root@erp207 ld.so.conf.d]# mkdir -p /usr/lib64/dm8
[root@erp207 ld.so.conf.d]# echo "/usr/lib64/dm8" >> /etc/ld.so.conf.d/dmdb-x86_64.conf

## 达梦数据库端开始依赖so拷贝
#scp 192.168.0.120:/dm8/dmdba/dmdbms/bin/{`ldd /lib64/libdodbc.so | grep 'not found' | awk '{print $1}' | sed ':a;$!N;s/\n/,/;ta'`} /lib64/
[root@dca01 bin]#  scp `ldd libdodbc.so | awk '/\.\//{print $1}' | sed ':a;$!N;s/\n/ /;ta'` libdodbc.so  root@192.168.0.207:/usr/lib64/dm8/
root@192.168.0.207's password: 
libdmdpi.so                                                                                         100% 9366KB  38.1MB/s   00:00    
libdmfldr.so                                                                                        100% 9160KB  42.5MB/s   00:00    
libdmelog.so                                                                                        100%   28KB   9.1MB/s   00:00    
libdmutl.so                                                                                         100%   79KB  12.8MB/s   00:00    
libdmclientlex.so                                                                                   100%  336KB  29.6MB/s   00:00    
libdmos.so                                                                                          100%  198KB  21.9MB/s   00:00    
libdmcvt.so                                                                                         100% 4995KB  43.6MB/s   00:00    
libdmstrt.so                                                                                        100%   91KB  14.5MB/s   00:00    
libdmmem.so                                                                                         100%   56KB   7.1MB/s   00:00    
libdmcalc.so                                                                                        100%  482KB  28.2MB/s   00:00    
libdodbc.so                                                                                         100%  186KB  18.3MB/s   00:00    
[root@dca01 bin]# 

## Oracle数据库端手工加载动态链接库
[root@erp207 ~]# ls -l /usr/lib64/dm8 
total 25000
-rwxr-xr-x 1 root root  493768 Apr 23 21:27 libdmcalc.so
-rwxr-xr-x 1 root root  344083 Apr 23 21:27 libdmclientlex.so
-rwxr-xr-x 1 root root 5114569 Apr 23 21:27 libdmcvt.so
-rwxr-xr-x 1 root root 9590746 Apr 23 21:27 libdmdpi.so
-rwxr-xr-x 1 root root   28897 Apr 23 21:27 libdmelog.so
-rwxr-xr-x 1 root root 9380242 Apr 23 21:27 libdmfldr.so
-rwxr-xr-x 1 root root   56968 Apr 23 21:27 libdmmem.so
-rwxr-xr-x 1 root root  203240 Apr 23 21:27 libdmos.so
-rwxr-xr-x 1 root root   92922 Apr 23 21:27 libdmstrt.so
-rwxr-xr-x 1 root root   81200 Apr 23 21:27 libdmutl.so
-rwxr-xr-x 1 root root  190045 Apr 23 21:27 libdodbc.so
[root@erp207 ~]# 
[root@erp207 ~]# ls -l /usr/lib64/dm8 
total 25000
-rwxr-xr-x 1 root root  493768 Apr 23 21:27 libdmcalc.so
-rwxr-xr-x 1 root root  344083 Apr 23 21:27 libdmclientlex.so
-rwxr-xr-x 1 root root 5114569 Apr 23 21:27 libdmcvt.so
-rwxr-xr-x 1 root root 9590746 Apr 23 21:27 libdmdpi.so
-rwxr-xr-x 1 root root   28897 Apr 23 21:27 libdmelog.so
-rwxr-xr-x 1 root root 9380242 Apr 23 21:27 libdmfldr.so
-rwxr-xr-x 1 root root   56968 Apr 23 21:27 libdmmem.so
-rwxr-xr-x 1 root root  203240 Apr 23 21:27 libdmos.so
-rwxr-xr-x 1 root root   92922 Apr 23 21:27 libdmstrt.so
-rwxr-xr-x 1 root root   81200 Apr 23 21:27 libdmutl.so
-rwxr-xr-x 1 root root  190045 Apr 23 21:27 libdodbc.so
[root@erp207 ~]# ldconfig 
[root@erp207 ~]# ldd /usr/lib64/dm8/libdodbc.so     
        linux-vdso.so.1 =>  (0x00007ffda6dd5000)
        libdmdpi.so => /usr/lib64/dm8/libdmdpi.so (0x00007f46eb1b6000)
        libdmfldr.so => /usr/lib64/dm8/libdmfldr.so (0x00007f46ea59e000)
        libdmelog.so => /usr/lib64/dm8/libdmelog.so (0x00007f46ea398000)
        libdmutl.so => /usr/lib64/dm8/libdmutl.so (0x00007f46ea186000)
        libdmclientlex.so => /usr/lib64/dm8/libdmclientlex.so (0x00007f46e9f33000)
        libdmos.so => /usr/lib64/dm8/libdmos.so (0x00007f46e9d07000)
        libdmcvt.so => /usr/lib64/dm8/libdmcvt.so (0x00007f46e9627000)
        libdmstrt.so => /usr/lib64/dm8/libdmstrt.so (0x00007f46e9413000)
        librt.so.1 => /lib64/librt.so.1 (0x00007f46e920b000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f46e8fef000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f46e8deb000)
        libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f46e8ae4000)
        libm.so.6 => /lib64/libm.so.6 (0x00007f46e87e2000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f46e8415000)
        libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f46e81ff000)
        libdmmem.so => /usr/lib64/dm8/libdmmem.so (0x00007f46e7ff3000)
        libdmcalc.so => /usr/lib64/dm8/libdmcalc.so (0x00007f46e7d82000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f46ec02d000)
[root@erp207 ~]# 


#### 步骤3:配置odbc
[root@erp207 ~]# cat /etc/odbcinst.ini
[DM8 ODBC DRIVER] 
Description     = ODBC for DM8
Driver          = /usr/lib64/dm8/libdodbc.so

[root@erp207 ~]# cat /etc/odbc.ini
[DM8]
Driver       = DM8 ODBC DRIVER
Description  = DM8 ODBC DSN
SERVER       = 192.168.0.120
UID          = SYSDBA
PWD          = SYSDBA
TCP_PORT     = 5238


#### 步骤4:测试连接 
[root@erp207 bin]# isql dm8 -v
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL> select name from v$instance;
+---------------------------------------------------------------------------------------------------------------------------------+
| NAME                                                                                                                            |
+---------------------------------------------------------------------------------------------------------------------------------+
| DEM                                                                                                                             |
+---------------------------------------------------------------------------------------------------------------------------------+
SQLRowCount returns 1
1 rows fetched
SQL> select sf_get_para_value(1,'PORT_NUM');
+--------------------------------+
| SF_GET_PARA_VALUE(1,'PORT_NUM')|
+--------------------------------+
| 5238                           |
+--------------------------------+
SQLRowCount returns 1
1 rows fetched
SQL> select id_code();
+---------------------------------------------------------------------------------------------------------------------------------+
| ID_CODE()                                                                                                                       |
+---------------------------------------------------------------------------------------------------------------------------------+
| 1-1-126-20.09.04-126608-ENT                                                                                                     |
+---------------------------------------------------------------------------------------------------------------------------------+
SQLRowCount returns 1
1 rows fetched
SQL> 

#### 步骤5:Oracle数据库端配置透明网关
# 参考链接:https://www.cnblogs.com/xqzt/p/5688659.html
[oracle@erp207 admin]$ cd $ORACLE_HOME/hs/admin
[oracle@erp207 admin]$ ls
extproc.ora  initdg4odbc.ora  listener.ora.sample  tnsnames.ora.sample
[oracle@erp207 admin]$ cp -v initdg4odbc.ora initdm8.ora
‘initdg4odbc.ora’ -> ‘initDMLINK.ora’

## init<SID>.ora
[oracle@erp207 admin]$ cat initDMLINK.ora    
# This is a sample agent init file that contains the HS parameters that are
# needed for the Database Gateway for ODBC
#
# HS init parameters
#
HS_FDS_CONNECT_INFO = DM8  #达梦数据库源DSN,关键参数
HS_FDS_TRACE_LEVEL = OFF  #debug等级,OFF为关闭
HS_FDS_SHAREABLE_NAME = /usr/lib64/libodbc.so  #unixODBC驱动
HS_LANGUAGE = American_America.ZHS16GBK  #unixODBC数据源配置文件
#
# ODBC specific environment variables
#
set ODBCINI=/etc/odbc.ini
[oracle@erp207 admin]$ 


#### 步骤6:配置监听服务和网络服务名
[oracle@erp207 admin]$ cd $ORACLE_HOME/network/admin
[oracle@erp207 admin]$ ls
samples  shrept.lst
[oracle@erp207 admin]$ cp samples/listener.ora .
[oracle@erp207 admin]$ cp samples/tnsnames.ora .            
[oracle@erp207 admin]$ ls
listener.ora  samples  shrept.lst  tnsnames.ora
[oracle@erp207 admin]$ cat listener.ora    
LISTENER =
 (ADDRESS_LIST=
       (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.0.207)(PORT=1521))
       (ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521))
  )

SID_LIST_LISTENER=
  (SID_LIST=
       (SID_DESC=
         (PROGRAM = dg4odbc)
         (SID_NAME = DMLINK)   # DSN
         (ORACLE_HOME=/oracle/app/oracle/product/11.2.0/db_1)
        )
   )

ADR_BASE_HOME = =/oracle/app/oracle

[oracle@erp207 admin]$ cat tnsnames.ora 
dm8link = 
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL=TCP)(HOST=192.168.0.207)(PORT=1521))
    (CONNECT_DATA = (SERVICE_NAME = DMLINK))
    (HS = ok)
  )


#### 步骤7:测试网络链接
[oracle@erp207 admin]$ lsnrctl reload
LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 23-APR-2021 22:39:42
Copyright (c) 1991, 2013, Oracle.  All rights reserved.
Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.0.207)(PORT=1521))
The command completed successfully
[oracle@erp207 admin]$ lsnrctl status
LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 23-APR-2021 22:39:49
Copyright (c) 1991, 2013, Oracle.  All rights reserved.
Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.0.207)(PORT=1521))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 11.2.0.4.0 - Production
Start Date                23-APR-2021 22:26:29
Uptime                    0 days 0 hr. 13 min. 19 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /oracle/app/oracle/product/11.2.0/db_1/network/admin/listener.ora
Listener Log File         /oracle/app/oracle/diag/tnslsnr/erp207/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.0.207)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
Services Summary...
Service "DMLINK" has 1 instance(s).
  Instance "DMLINK", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
[oracle@erp207 admin]$ tnsping dm8link  
TNS Ping Utility for Linux: Version 11.2.0.4.0 - Production on 23-APR-2021 22:39:51
Copyright (c) 1997, 2013, Oracle.  All rights reserved.
Used parameter files:
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL=TCP)(HOST=192.168.0.207)(PORT=1521)) (CONNECT_DATA = (SERVICE_NAME = DMLINK)) (HS = ok))
OK (10 msec)
[oracle@erp207 admin]$ 


#### 8. Oracle端创建dblink到达梦数据库
[oracle@erp207 admin]$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.4.0 Production on Fri Apr 23 22:40:54 2021
Copyright (c) 1982, 2013, Oracle.  All rights reserved.
Connected to an idle instance.
SQL> startup
ORACLE instance started.
Total System Global Area 1043886080 bytes
Fixed Size                  2259840 bytes
Variable Size             331351168 bytes
Database Buffers          704643072 bytes
Redo Buffers                5632000 bytes
Database mounted.
Database opened.
SQL> select status from v$instance;
STATUS
------------
OPEN

SQL> create database link ora2dm connect to "SYSDBA" identified by "SYSDBA" using 'dm8link';
Database link created.

SQL> select * from v$version@ora2dm;
BANNER
--------------------------------------------------------------------------------
DM Database Server 64 V8
DB Version: 0x7000b

SQL> select * from test@ora2dm;
C1
--------------------------------------------------------------------------------
a
B
c
A

SQL>  insert into test@ora2dm values ('X');
1 row created.
SQL> insert into test@ora2dm(c1) values ('Y');
1 row created.
SQL> commit;
Commit complete.

SQL> select * from test@ora2dm;
C1
--------------------------------------------------------------------------------
a
B
c
A
X
Y
6 rows selected.

SQL> 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值