客户要求国产化,数据库由原来的oracle变更到达梦数据库,服务器由centos变更麒麟v10 x86;由于系统的定时任务数据拉去ERP数据原来采用的是Oracle到Oracle的dblink,所以考虑采用达梦到Oracle的DBLINK。
参考达梦数据库配置dblink_咀个栗子的博客-CSDN博客_达梦dblink
以下是我的在此之上做的总结和遇到的问题;和参考文档的不同之处是我的服务器也是国产的麒麟
最大的问题是创建dblink进行使用时会提示库文件缺失;
1.达梦本地端安装oracle客户端(必须)
oracle官网上下载对应数据库版本的intantclient包(11.2.0.4.0 版),版本跟目标端Oracle版本一致即可,将intantclient的三个压缩包basic、sdk、sqlplus解压:解压后将linstantclient包里的所有lib拷贝到$DM_HOME/bin目录下(主要是libclntsh.so.11.1和libnnz11.so这两个动态库,可以ldd查看一下这两个动态库的依赖包有哪些,为了方便起见,建议将instantclient包里的全部lib库cp到达梦bin目录下,顺便将libclntsh.so.11.1建立软连接名为libclntsh.so)
[root@qiqi223 ~]# mkdir -p /opt/dblink/instantclient
[root@qiqi223 opt]# unzip instantclient-basic-linux.x64-11.2.0.4.0 && unzip instantclient-sdk-linux.x64-11.2.0.4.0 && unzip instantclient-sqlplus-linux.x64-11.2.0.4.0
[root@qiqi223 instantclient]# cp lib* /opt/dmdbms/bin
[root@qiqi223 bin]# ln -s libclntsh.so.11.1 libclntsh.so
这里跟参照的一样,intantclient包的basic、sdk、sqlplus三个压缩包可以现在本地解压何必到一个文件夹下面,再压缩传到服务器进行解压,并且可以提前创建 network/admin/snames.ora 达梦Oracle客户端监听远端服务端配置文件,或者在部署的服务器上后创建。
2.远程Oracle端静态注册监听:
进入到$ORACLE_HOME/network/admin目录下,添加或修改listener.ora监听文件内容(如果原本在创建Oracle数据库时已经注册,则不需要改动):
文件内容:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = CLRExtProc)
(ORACLE_HOME = D:\app\Administrator\product\11.2.0\dbhome_1)
(PROGRAM = extproc)
(ENVS = "EXTPROC_DLLS=ONLY:D:\app\Administrator\product\11.2.0\dbhome_1\bin\oraclr11.dll")
)
)
3.达梦本地端配置服务名:
这里一定要对照远端Oracle监听snames.ora进行配置;我这里的远端Oracle是windows服务器
单独存放到一个目录下/opt/dblink/instantclient/network/admin/ tnsnames.ora),并修改成以下内容:
相关指令:vim /home/dblink/instantclient/network/admin/tnsnames.ora
修改完成后ESC :WQ进行保存
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = CLRExtProc)
(ORACLE_HOME = D:\app\Administrator\product\11.2.0\dbhome_1)
(PROGRAM = extproc)
(ENVS = "EXTPROC_DLLS=ONLY:D:\app\Administrator\product\11.2.0\dbhome_1\bin\oraclr11.dll")
)
)
4.达梦本地端修改环境变量:
dmdba用户环境变量添加一下内容:
[dmdba@qiqi221 ~]$ vim .bash_profile
## 添加以下内容:
export ORACLE_HOME=/u02/app/oracle11g ## 远程Oracle端的$ORACLE_HOME;
export ORACLE_SID=orcl11g ## 远程Oracle端的SID;
export TNS_ADMIN=/opt/dblink/network/admin ## 服务名文件所在目录;
export NLS_LANG=AMERICAN_AMERICA.ZHS32GB18030 ## 远程Oracle端的字符集;
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME:/opt/dmhs/bin
export PATH=$PATH:$ORACLE_HOME:$DM_HOME/bin
export LANG=zh_CN.UTF8
unset USERNAME
文件生效
[dmdba@qiqi221 ~]$ source .bash_profile
权限配置: 把instantclient下的文件和 达梦bin下的文件 把权限交给dmdba用户
chown -R dmdba:dinstall /home/dblink/instantclient/
以下是问题的关键!!!!!!!!!
上面基本配置已经完成,但是创建dblink进行使用时会提示库文件缺失;
执行 ldd libclntsh.so
现在安装确实依赖;但是但是现在的问题是如果安装依赖重启达梦服务会报错,需要把达梦相关的配置都配置好!!!
rpm包下载地址:RPM resource cloud-utils
执行
rpm -Uvh libnsl-2.28-208.el8.x86_64.rpm --nodeps –force
1. -U:升级软件,若未软件尚未安装,则安装软件。
2. -v:表示显示详细信息。
3. -h:以"#"号显示安装进度。
4. --force:强制安装
5. --nodeps:不考虑相依属性的关系
按照上边的执行,然后就可以使用dblink了
创建dblink;
create or replace link EDWLINK connect 'ORACLE' with 账号 identified by "密码" using '(DESCRIPTION =(ADDRESS_LIST =(ADDRESS =(PROTOCOL = TCP)(HOST = xxx.xxx.xx.xxx)(PORT = 1522)))(CONNECT_DATA =(SERVICE_NAME = orcl)))';
这里连接地址 后面的SERVICE_NAME = orcl 就是数据库url后面的一般都是orcl
跟远端Oracle监听文件里的SERVICE_NAME无关;
现在dblink可以使用了
但是如果重启dm服务会出现:
这时候卸载安装的依赖在重启就又成功了,然后再重新安装步骤再进行安排依赖又可以使用dblink了
我们的客户买了达梦的服务,这个问题请教了他们的技术专家,他们表示不知道为什么,给的回应是在解决,不知道是不是真的专家,我让他连我的电脑进行问题处理,但是鼓弄一天给我服务干坏了,得亏留了快照,他们怀疑是麒麟系统的问题,麒麟系统本身没问题,但是他们没遇到过用麒麟系统又用DBLINK的,可能下载BDLINK缺失的依赖包和系统兼容的问题。后期我会把微信交流记录发出来。
包括上边的说的安装依赖前要把配置都配置好就是为了暂时解决这个问题的。等达梦售后给我们回复有具体解决办法的我会后续发出来。