注册
DM8与ORACLE11g之间相互创建dblink
培训园地/ 文章详情 /

DM8与ORACLE11g之间相互创建dblink

www_heql 2023/03/30 1850 0 1

1 内容介绍

本文主要介绍DM8与ORACLE11g之间如何相互创建dblink。包括DM8连接ORACLE11g(OCI方式、ODBC方式),ORACLE11g连接DM8(ODBC方式)。

2 环境介绍

image.png

3 DM8连接ORACLE11g

在库1建立到库2的DBLINK。

3.1 ORACLE OCI接口方式(建议)

3.1.1 安装ORACLE11g客户端并配置

在DM服务器上安装ORACLE11g客户端。
注:根据实际情况安装系统依赖包。如libaio,glibc等。

3.1.1.1 下载上传

ORACLE官网下载安装包,根据系统类型、数据库版本下载合适的客户端版本,
https://www.oracle.com/database/technologies/instant-client/downloads.html
下载instantclient-basic-linux.x64-11.2.0.4.0.zip(必须),
instantclient-sqlplus-linux.x64-11.2.0.4.0.zip(不必须,用于测试连接),
上传至DM服务器上。(过程略)

3.1.1.2 解压安装包并授权

[root@dmtest ~]# unzip instantclient-basic-linux.x64-11.2.0.4.0.zip -d /opt/oracle_client/
[root@dmtest ~]# unzip instantclient-sqlplus-linux.x64-11.2.0.4.0.zip -d /opt/oracle_client/
[root@dmtest ~]# cd /opt/
[root@dmtest opt]# chown -R dmdba:dinstall oracle_client/
注:解压目录自己定义、创建。

3.1.1.3 创建libclntsh.so

[root@dmtest bin]# su - dmdba
Last login: Mon May 16 09:52:09 CST 2022 on pts/0
[dmdba@dmtest ~]$ cd /opt/oracle_client/instantclient_11_2/
[dmdba@dmtest instantclient_11_2]$ cp libclntsh.so.11.1 libclntsh.so --创建链接也可以

3.1.1.4 创建tnsnames.ora

[root@dmtest bin]# su - dmdba
Last login: Mon May 16 09:52:09 CST 2022 on pts/0
[dmdba@dmtest ~]$ cd /opt/oracle_client/instantclient_11_2/
[dmdba@dmtest instantclient_11_2]$ mkdir -p network/admin/
[dmdba@dmtest instantclient_11_2]$ cd network/admin/
[dmdba@dmtest admin]$ touch tnsnames.ora
注:创建tnsnames.ora的目的是在创建DBLINK直接使用using ‘服务名’;

3.1.1.5 配置tnsnames.ora

[dmdba@dmtest admin]$ pwd
/opt/oracle_client/instantclient_11_2/network/admin
[dmdba@dmtest admin]$ vim tnsnames.ora

PROD=
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST =192.168.111.140)(PORT = 1521))
    (CONNECT_DATA =
       (SERVER = DEDICATED)
       (SID = test)
    )
  )

注:创建tnsnames.ora的目的是在创建DBLINK直接使用using ‘服务名’,这里服务名指的是PROD。

3.1.1.6 配置环境变量

[dmdba@dmtest ~]$ pwd
/home/dmdba
[dmdba@dmtest ~]$ vim .bash_profile --添加如下,

export ORACLE_HOME=/opt/oracle_client/instantclient_11_2
export TNS_ADMIN=$ORACLE_HOME/network/admin
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8          --根据数据库编码调整
export DM_HOME="/dm/dmdbms"
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/dm/dmdbms/bin:$ORACLE_HOME"
export PATH="$DM_HOME/bin:$ORACLE_HOME:$PATH"

[dmdba@dmtest ~]$ source .bash_profile --加载环境变量

3.1.1.7 重启数据库

重启DM数据库过程略。。。
注:我用的是root用户重启服务的方式,发现进程的环境变量没有改变,建议使用前端启动的方式测一下。

3.1.2 测试ORACLE11g连通性

解压了instantclient-sqlplus-linux.x64-11.2.0.4.0.zip的可以使用oracle的sqlplus命令工具进行远程连接测试,
[dmdba@dmtest ~]$ sqlplus TEST/TEST@prod
注:TEST/TEST是连接的用户名与密码,prod是tnsnames.ora里配置的别名。

3.1.3 创建DBLINK

3.1.3.1 使用DM管理工具创建

打开DM管理工具,连接库1,选择外部链接,配置如下,点击确定。
名称:LN_ORA(dblink名,写大写就是大写的,写小写就是小写的)
连接源类型:ORACLE
用户名:库2的用户名
口令:库2用户名的密码
链接字符串:192.168.111.140:1521/test或者PROD
image.png

注:勾选了公共,即创建的公共DBLINK。

选择创建的dblink名,然后右键测试,
image.png
显示测试成功。
image.png

3.1.3.2 使用SQL语句创建

3.1.3.2.1 方式1

配置了tnsnames.ora的可以使用下面语句创建DBLINK,
SQL> create public link ln_ora_01 connect ‘ORACLE’ with TEST identified by “TEST” using ‘PROD’;
注:如果没有配置tnsnames.ora就无法使用这种创建方式。注意用户及密码的大小写。

3.1.3.2.2 方式2

SQL> create public link ln_ora_02 connect ‘ORACLE’ with TEST identified by “TEST” using ‘192.168.111.140:1521/test’;
注:如果没有配置tnsname.ora,也可以使用这种方式。

3.1.3.2.3 方式3
SQL> create public link ln_ora_03 connect 'ORACLE' with TEST identified by "TEST" using '(DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.111.140)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SID = test )   
    )
  )';

注:如果没有配置tnsname.ora,也可以使用这种方式。

3.2 ODBC数据源方式

3.2.1 安装ORACLE11g客户端

在DM服务器上安装ORACLE11g客户端。
注:根据实际情况安装系统依赖包。如libaio,glibc等。

3.2.1.1 下载上传

ORACLE官网下载安装包,根据系统类型、数据库版本下载合适的客户端版本,
https://www.oracle.com/database/technologies/instant-client/downloads.html
下载instantclient-basic-linux.x64-11.2.0.4.0.zip(必须),
instantclient-odbc-linux.x64-11.2.0.4.0.zip(必须),
上传至DM服务器上。(过程略)

3.2.1.2 解压安装包并修改权限

[root@dmtest ~]# unzip instantclient-basic-linux.x64-11.2.0.4.0.zip -d /opt/oracle_client/
[root@dmtest ~]# unzip instantclient-odbc-linux.x64-11.2.0.4.0.zip -d /opt/oracle_client/
[root@dmtest ~]# cd /opt/
[root@dmtest opt]# chown -R dmdba:dinstall oracle_client/
注:解压目录自己定义、创建。

3.2.2 安装ODBC

3.2.2.1 下载与上传

unixODBC版本:unixODBC-2.3.9.tar.gz
下载、上传、解压过程略。。。

3.2.2.2 安装

配置,
[root@dmtest unixODBC-2.3.9]# ./configure --prefix=/usr/local/unixodbc
注:prefix表示指定安装路径。缺什么系统包就安装什么包后再执行configure,如gcc等。

编译,
[root@dmtest unixODBC-2.3.9]# make

安装,
[root@dmtest unixODBC-2.3.9]# make insall

3.2.3 配置ODBC

3.2.3.1 查看odbc信息

[root@dmtest ~]# cd /usr/local/unixodbc/bin/
[root@dmtest bin]# ./odbcinst -j --源码安装,使用这个命令需要到unixODBC的bin目录下
unixODBC 2.3.9
DRIVERS…: /usr/local/unixodbc/etc/odbcinst.ini
SYSTEM DATA SOURCES: /usr/local/unixodbc/etc/odbc.ini
FILE DATA SOURCES…: /usr/local/unixodbc/etc/ODBCDataSources
USER DATA SOURCES…: /root/.odbc.ini
SQLULEN Size…: 8
SQLLEN Size…: 8
SQLSETPOSIROW Size.: 8
[root@dmtest bin]#
注:确认odbc.ini与odbcinst.ini的目录

3.2.3.2 修改odbcinst.ini

[root@dmtest etc]# pwd
/usr/local/unixodbc/etc
[root@dmtest etc]# vim odbcinst.ini
[Oracle ODBC] --设定驱动名称
Description = Oracle ODBC Driver
Driver = /opt/oracle_client/instantclient_11_2/libsqora.so.11.1 --驱动地址
注:安装ORACLE11g客户端就是为了获得相关驱动。

3.2.3.3 修改odbc.ini

[root@dmtest etc]# pwd
/usr/local/unixodbc/etc
[root@dmtest etc]# vim odbc.ini

[TESTODBC]                                   --自己定义的数据源名称
Driver       = Oracle ODBC                     --odbcinst.ini中设定的驱动名称
Description   = Data Source to Oracle
ServerName   = 192.168.189.140:1521/test        --ORACLE的连接串
UserId         = TEST                          --要连接的用户
Password     = TEST                           --要连接的用户的密码
OPTION       =
SOCKET       =

注:UserId和下面的几行可以不写。

3.2.3.4 测试连接ORACLE

[dmdba@dmtest ~]$ cd /usr/local/unixodbc/bin/
[dmdba@dmtest bin]$ isql -v TESTODBC TEST TEST
±--------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
±--------------------------------------+
SQL> select * from test01;
±------------------------------+
| C1 |
±------------------------------+
| ok |
±------------------------------+
SQLRowCount returns -1
1 rows fetched
SQL> quit
注:可以把isql的目录加入到环境变量PATH中,或者直接在isql的目录下执行isql命令。

3.2.4 配置环境变量

[dmdba@dmtest ~]$ pwd
/home/dmdba
[dmdba@dmtest ~]$ vim .bash_profile

# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
	. ~/.bashrc
fi

# User specific environment and startup programs

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

export ORACLE_HOME=/opt/oracle_client/instantclient_11_2
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8             --跟数据库编码匹配
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/dm/dmdbms/bin:/usr/local/unixodbc/lib:$ORACLE_HOME"
export DM_HOME="/dm/dmdbms"

[dmdba@dmtest ~]$ source .bash_profile --加载环境变量

3.2.5 重启数据库

重启DM数据库过程略。。。
注:我用的是root用户重启服务的方式,发现进程的环境变量没有改变,建议使用前端启动的方式测一下。

3.2.6 创建DBLINK

SQL> create or replace public link ln_ora_01 connect ‘ODBC’ with TEST identified by “TEST” using ‘TESTODBC’;

3.2.7 其他配置方式

使用tnsnames.ora的服务名方式代替odbc.ini中的ServerName中的oracle连接串。

3.2.7.1 创建tnsnames.ora

[root@dmtest bin]# su - dmdba
Last login: Mon May 16 09:52:09 CST 2022 on pts/0
[dmdba@dmtest ~]$ cd /opt/oracle_client/instantclient_11_2/
[dmdba@dmtest instantclient_11_2]$ mkdir -p network/admin/
[dmdba@dmtest instantclient_11_2]$ cd network/admin/
[dmdba@dmtest admin]$ touch tnsnames.ora

3.2.7.2 配置tnsnames.ora

[dmdba@dmtest admin]$ pwd
/opt/oracle_client/instantclient_11_2/network/admin
[dmdba@dmtest admin]$ vim tnsnames.ora

PROD=
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST =192.168.111.140)(PORT = 1521))
    (CONNECT_DATA =
       (SERVER = DEDICATED)
       (SID = test)
    )
  )

3.2.7.3 修改odbc.ini

采用tnsname.ora的方式,需要修改odbc.ini,如下
[root@dmtest etc]# pwd
/usr/local/unixodbc/etc
[root@dmtest etc]# vim odbc.ini

[TESTODBC]                  --设定数据源名称
DSN = TESTODBC              ---设定数据源名称
Driver = Oracle ODBC          ---与odbcinst.ini中的驱动配置名称一致 
ServerName = PROD           ---与tnsnames.ora网络服务名一致
UserID = TEST

3.2.7.4 创建DBLINK

创建方式与3.2.5相同。

4 ORACLE11g连接DM8

在库2建立到库1的DBLINK。

4.1 安装DM8客户端

在ORACLE服务器上安装DM8客户端(安装版本与库1的版本一致)

4.1.1 下载并上传DM8安装包

过程略…

4.1.2 挂载ISO文件

[root@ora11g ~]# mount -o loop dm8_20211222_x86_rh6_64_sec_8.4.2.98.iso /media

4.1.3 安装DM8客户端

创建安装目录,(目录自己根据实际决定)
[root@ora11g opt]# pwd
/opt
[root@ora11g opt]# mkdir dmdbms
[root@ora11g opt]# chown oracle:oinstall dmdbms --修改目录权限

安装DM8客户端,(使用oracle用户安装)
[root@ora11g ~]# su - oracle
[oracle@ora11g media]$ ./DMInstall.bin -i
过程略。。。
注:没有执行最后的注册服务脚本。

4.2 配置ODBC

安装过程略(ORACLE服务器使用的是RPM方式安装的unixODBC)

4.2.1 查看odbc信息

[root@ora11g ~]# odbcinst -j --如果是源码装的,需要到安装的bin目录下执行
unixODBC 2.2.14
DRIVERS…: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
FILE DATA SOURCES…: /etc/ODBCDataSources
USER DATA SOURCES…: /root/.odbc.ini
SQLULEN Size…: 8
SQLLEN Size…: 8
SQLSETPOSIROW Size.: 8
[root@ora11g ~]#
注:找到odbc.ini与odbcinst.ini目录

4.2.2 修改odbcinst.ini

[root@ora11g ~]# vim /etc/odbcinst.ini

[DM8 ODBC DRIVER]                         --自定义驱动名,这个名字后面会用到
Description = ODBC DRIVER FOR DM8           --描述,自己随意设定
Driver = /opt/dmdbms/bin/libdodbc.so          --这就是安装dm客户端的原因
threading     = 0

4.2.3 修改odbc.ini

[root@ora11g ~]# vim /etc/odbc.ini

[dm8]
Driver       = DM8 ODBC DRIVER             --odbcinst.ini中定义的驱动名
Description  = DM ODBC DSND                --描述,自己随意设定
SERVER  = 192.168.111.150
UID         = sysdba
PWD     = SYSDBA
TCP_PORT     = 5236

注:Driver的名称与odbcinst.ini中设置的相同

4.2.4 测试连接DM

[root@ora11g bin]# isql -v dm8 sysdba SYSDBA
±--------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
±--------------------------------------+
SQL>
注:连接成功说明odbc配置没有问题。

4.3 配置透明网关

[root@ora11g ~]# find / -name libodbc.so --因为是rpm方式装的,所以搜一下
/usr/lib64/libodbc.so
[root@ora11g ~]# su - oracle
[oracle@ora11g ~]$ cd /u01/app/oracle/product/11.2.0.1/db_1/hs/admin --根据自己的ORACLE的安装目录切换
[oracle@ora11g admin]$ vim initdmlnk.ora --创建initdmlnk.ora文件,dmlnk为自己定义的名称,与后面listener.ora里配置一致。

HS_FDS_CONNECT_INFO = DM8                       --odbc.ini中数据源的名称
HS_FDS_TRACE_LEVEL = off
set ODBCINI=/etc/odbc.ini                            --odbc.ini配置文件
HS_FDS_SHAREABLE_NAME =/usr/lib64/libodbc.so        --unixodbc的文件
HS_NLS_NCHAR=UCS2
HS_LANGUAGE=AMERICAN_AMERICA.AL32UTF8         --与DM数据库编码保持一致

4.4 配置ORACLE监听

[oracle@ora11g admin]$ pwd
/u01/app/oracle/product/11.2.0.1/db_1/network/admin
[oracle@ora11g admin]$ vim listener.ora --修改前记得备份!

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (PROGRAM = dg4odbc)
      (ORACLE_HOME = /u01/app/oracle/product/11.2.0.1/db_1)
      (SID_NAME = dmlnk)      --这个名字是initdmlnk.ora中的dmlnk
    )
    (SID_DESC =
      (GLOBAL_DBNAME = test)
      (ORACLE_HOME = /u01/app/oracle/product/11.2.0.1/db_1)
      (SID_NAME = test)
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.111.140)(PORT = 1521))
    )
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

ADR_BASE_LISTENER = /u01/app/oracle

[oracle@ora11g admin]$ vim tnsnames.ora --添加如下部分,

dm=                                     --这是自己起的服务名
  (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.111.140)(PORT = 1521))
         (CONNECT_DATA =
          (SERVICE_NAME = dmlnk)          --这个名字是initdmlnk.ora中的dmlnk
         )
         (HS = OK)
  )

重启监听,测试
[oracle@ora11g admin]$ lsnrctl stop
[oracle@ora11g admin]$ lsnrctl start
[oracle@ora11g admin]$ tnsping dm

4.5 创建DBLINK

进入ORACLE数据库创建DBLINK,
SQL> create database link dmlink connect to “SYSDBA” identified by SYSDBA using ‘DM’;

4.6 测试DBLINK

SQL> select * from test01@dmlink;
C1
ok
SQL>
注:test01已在dm数据库提前创建。

5 报错记录

5.1 ORA-28500

问题描述,
在进行ORACLE到DM的dblink搭建后,创建了testlink,执行查询测试,报错如下,
SQL> create database link dmlink connect to “SYSDBA” identified by SYSDBA using ‘DM8’;
Database link created.

SQL> select * from test01@dmlink;
select * from test01@dmlink *
ERROR at line 1:
ORA-28500: connection from ORACLE to a non-Oracle system returned this message:
[
SQL>

处理方式,
这个问题是由字符和语言设置的问题引起的。在透明网关的initdm8.ora中添加如下,
HS_NLS_NCHAR=UCS2
HS_LANGUAGE=AMERICAN_AMERICA.AL32UTF8

5.2 -6010

问题描述,
当使用isql或sqlplus测试远程连接ORACLE成功后,在DM数据库创建dblink,查询远程ORACLE的表时报错,如下,
image.png
查看日志,报错如下,报ODBC error:[01000][0][unixODBC][Driver Manager]Can’t open lib ‘/opt/oracle_client/instantclient_11_2/libsqora.so.11.1’ : file not found
image.png
处理方式,
原因是数据库没有加载到libsqora.so.11.1,说明库文件目录没有识别到。
首先确认.bash_profile的环境变量中是否有设置LD_LIBRARY_PATH,如果有的话,重启DM数据库。(DM数据库启动方法有多种,建议用前端启动方式测一下。我的环境用过root用户通过服务启动,但是环境变量没有加载)

5.3 -2245

问题描述,
当使用isql测试远程连接ORACLE成功后,在DM数据库创建dblink(ODBC方式),查询远程ORACLE的表时报错,如下,
DBLINK load library fail.
image.png
image.png
处理方式,
原因是unixODBC的库文件没有加载到,一般是环境变量的问题。将unixODBC的lib目录添加到环境变量LD_LIBRARY_PATH中。(添加后重启下DM数据库)

5.4 [01000] isql连接报错

问题描述,
配置ORACLE到DM的dbLink,使用isql远程连接数据库时报错,如下,
image.png
处理方式,
测试使用oracle用户可以,如下,
image.png
原因是root用户下的环境变量LD_LIBRARY_PATH中没有DM的bin目录导致,在root的.bash_profile中可以添加export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/opt/dmdbms/bin"即可。
image.png

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服