本文主要介绍DM8与ORACLE11g之间如何相互创建dblink。包括DM8连接ORACLE11g(OCI方式、ODBC方式),ORACLE11g连接DM8(ODBC方式)。
在库1建立到库2的DBLINK。
在DM服务器上安装ORACLE11g客户端。
注:根据实际情况安装系统依赖包。如libaio,glibc等。
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服务器上。(过程略)
[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/
注:解压目录自己定义、创建。
[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 --创建链接也可以
[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 ‘服务名’;
[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。
[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 --加载环境变量
重启DM数据库过程略。。。
注:我用的是root用户重启服务的方式,发现进程的环境变量没有改变,建议使用前端启动的方式测一下。
解压了instantclient-sqlplus-linux.x64-11.2.0.4.0.zip的可以使用oracle的sqlplus命令工具进行远程连接测试,
[dmdba@dmtest ~]$ sqlplus TEST/TEST@prod
注:TEST/TEST是连接的用户名与密码,prod是tnsnames.ora里配置的别名。
打开DM管理工具,连接库1,选择外部链接,配置如下,点击确定。
名称:LN_ORA(dblink名,写大写就是大写的,写小写就是小写的)
连接源类型:ORACLE
用户名:库2的用户名
口令:库2用户名的密码
链接字符串:192.168.111.140:1521/test或者PROD
注:勾选了公共,即创建的公共DBLINK。
选择创建的dblink名,然后右键测试,
显示测试成功。
配置了tnsnames.ora的可以使用下面语句创建DBLINK,
SQL> create public link ln_ora_01 connect ‘ORACLE’ with TEST identified by “TEST” using ‘PROD’;
注:如果没有配置tnsnames.ora就无法使用这种创建方式。注意用户及密码的大小写。
SQL> create public link ln_ora_02 connect ‘ORACLE’ with TEST identified by “TEST” using ‘192.168.111.140:1521/test’;
注:如果没有配置tnsname.ora,也可以使用这种方式。
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,也可以使用这种方式。
在DM服务器上安装ORACLE11g客户端。
注:根据实际情况安装系统依赖包。如libaio,glibc等。
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服务器上。(过程略)
[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/
注:解压目录自己定义、创建。
unixODBC版本:unixODBC-2.3.9.tar.gz
下载、上传、解压过程略。。。
配置,
[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
[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的目录
[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客户端就是为了获得相关驱动。
[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和下面的几行可以不写。
[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命令。
[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 --加载环境变量
重启DM数据库过程略。。。
注:我用的是root用户重启服务的方式,发现进程的环境变量没有改变,建议使用前端启动的方式测一下。
SQL> create or replace public link ln_ora_01 connect ‘ODBC’ with TEST identified by “TEST” using ‘TESTODBC’;
使用tnsnames.ora的服务名方式代替odbc.ini中的ServerName中的oracle连接串。
[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
[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)
)
)
采用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.5相同。
在库2建立到库1的DBLINK。
在ORACLE服务器上安装DM8客户端(安装版本与库1的版本一致)
过程略…
[root@ora11g ~]# mount -o loop dm8_20211222_x86_rh6_64_sec_8.4.2.98.iso /media
创建安装目录,(目录自己根据实际决定)
[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
过程略。。。
注:没有执行最后的注册服务脚本。
安装过程略(ORACLE服务器使用的是RPM方式安装的unixODBC)
[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目录
[root@ora11g ~]# vim /etc/odbcinst.ini
[DM8 ODBC DRIVER] --自定义驱动名,这个名字后面会用到
Description = ODBC DRIVER FOR DM8 --描述,自己随意设定
Driver = /opt/dmdbms/bin/libdodbc.so --这就是安装dm客户端的原因
threading = 0
[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中设置的相同
[root@ora11g bin]# isql -v dm8 sysdba SYSDBA
±--------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
±--------------------------------------+
SQL>
注:连接成功说明odbc配置没有问题。
[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数据库编码保持一致
[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
进入ORACLE数据库创建DBLINK,
SQL> create database link dmlink connect to “SYSDBA” identified by SYSDBA using ‘DM’;
SQL> select * from test01@dmlink;
C1
ok
SQL>
注:test01已在dm数据库提前创建。
问题描述,
在进行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
问题描述,
当使用isql或sqlplus测试远程连接ORACLE成功后,在DM数据库创建dblink,查询远程ORACLE的表时报错,如下,
查看日志,报错如下,报ODBC error:[01000][0][unixODBC][Driver Manager]Can’t open lib ‘/opt/oracle_client/instantclient_11_2/libsqora.so.11.1’ : file not found
处理方式,
原因是数据库没有加载到libsqora.so.11.1,说明库文件目录没有识别到。
首先确认.bash_profile的环境变量中是否有设置LD_LIBRARY_PATH,如果有的话,重启DM数据库。(DM数据库启动方法有多种,建议用前端启动方式测一下。我的环境用过root用户通过服务启动,但是环境变量没有加载)
问题描述,
当使用isql测试远程连接ORACLE成功后,在DM数据库创建dblink(ODBC方式),查询远程ORACLE的表时报错,如下,
DBLINK load library fail.
处理方式,
原因是unixODBC的库文件没有加载到,一般是环境变量的问题。将unixODBC的lib目录添加到环境变量LD_LIBRARY_PATH中。(添加后重启下DM数据库)
问题描述,
配置ORACLE到DM的dbLink,使用isql远程连接数据库时报错,如下,
处理方式,
测试使用oracle用户可以,如下,
原因是root用户下的环境变量LD_LIBRARY_PATH中没有DM的bin目录导致,在root的.bash_profile中可以添加export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/opt/dmdbms/bin"即可。
文章
阅读量
获赞