达梦DBLINK之DM访问Oracle问题处理
达梦DBLINK之DM访问Oracle配置步骤
下面所有的问题基本上都是在使用ODBC的方式创建DBLINK时遇到,所以强烈建议DM访问Oracle的DBLINK创建时采用Oracle OCI来进行访问。
强烈建议使用Oracle OCI的方式创建DBLINK
强烈建议使用Oracle OCI的方式创建DBLINK
强烈建议使用Oracle OCI的方式创建DBLINK
问题1:DBLINK加载动态库失败
使用DBLINK访问Oracle目的端报错"DBLINK加载库文件失败"
SQL> select * from t1@link1;
select * from t1@link1;
[-2245]:Error in line: 1
DBLINK load library fail.
原因
(1)第一种情况:DM DBLINK使用的是ODBC方式创建,一般是由于Oracle odbc驱动包缺少依赖库文件导致。
(2)第二种情况:DM DBLINK使用的是Oracle OCI方式创建,一般是由于DM数据库未加载Oracle OCI驱动,需要重启DM数据库。(前提是LD_LIBRARY_PATH或者ldconfig配置正确)
解决办法
(1)第一种情况的解决办法
首先,使用ldd命令检查Oracle odbc驱动包是否缺少依赖库文件。如下:
[root@localhost instantclient_19_13]# ldd libsqora.so.19.1 linux-vdso.so.1 => (0x00007ffeef3cd000)libdl.so.2 => /lib64/libdl.so.2 (0x00007ffafac45000)libm.so.6 => /lib64/libm.so.6 (0x00007ffafa943000)libpthread.so.0 => /lib64/libpthread.so.0 (0x00007ffafa727000)libnsl.so.1 => /lib64/libnsl.so.1 (0x00007ffafa50d000)librt.so.1 => /lib64/librt.so.1 (0x00007ffafa305000)libaio.so.1 => /lib64/libaio.so.1 (0x00007ffafa103000)libresolv.so.2 => /lib64/libresolv.so.2 (0x00007ffaf9ee9000)libclntsh.so.19.1 => /opt/oracle/instantclient_19_13/libclntsh.so.19.1 (0x00007ffaf5d76000)libclntshcore.so.19.1 => /opt/oracle/instantclient_19_13/libclntshcore.so.19.1 (0x00007ffaf57d2000)libodbcinst.so.2 => not found ###这里缺少依赖libc.so.6 => /lib64/libc.so.6 (0x00007ffaf5404000)/lib64/ld-linux-x86-64.so.2 (0x00007ffafb103000)libnnz19.so => /opt/oracle/instantclient_19_13/libnnz19.so (0x00007ffaf4d92000)
然后,使用find命令查找系统上对应的动态库文件,查找到之后加入到LD_LIBRARY_PATH系统环境变量,或者添加到 /etc/ld.so.conf.d目录下指定的配置文件中。如下:
[root@localhost ~]# echo /usr/local/lib > /etc/ld.so.conf.d/libodbc.conf
[root@localhost ~]# ldconfig
(2)第二种情况的解决办法
需要重启DM数据库服务,重启服务后数据库会加载Oracle OCI驱动,然后可以正常使用DBLINK访问Oracle数据库。
问题2:查询的表为非DBLINK用户下的表
DBLINK使用odbc方式在某些版本中存在查询目的表并非指定用户下的表,需要在查询语句中指定用户名或者模式名前缀。
现象如下:
原因:
不加用户名或者模式名前缀,实际查询的是sys用户下的对象。
解决办法
方法1:数据库升级到更高版本(比如2-70版本)
方法2:在访问的对象前面加上目的表的用户名或者模式名
方法3(推荐):DBLINK创建不使用ODBC的方式,使用Oracle OCI进行访问。如果数据库启动时未加载Oracle OCI驱动,需要重启数据库加载Oracle OCI驱动。
问题3:查询公共同义词等公共对象失败
在高版本上(1-2-70版本),DBLINK使用ODBC方式查询公共同义词等,包括动态性能视图等,会直接报错。报错信息如下:
在低版本中是可以正常访问,原因见问题2。
原因:
初步判断可能是为了解决低版本下使用DBLINK访问时不加目的表的用户名或者模式名前缀无法访问DBLINK用户下的表的问题,即问题2。而在高版本中为了解决问题2,使用DBLINK访问时会自动给SQL语句访问对象添加一个DBLINK用户名前缀,所以导致在该版本中操作非DBLINK用户下的对象时报错。
解决办法
方法1(推荐):DBLINK创建不使用ODBC的方式,使用Oracle OCI进行访问。如果数据库启动时未加载Oracle OCI驱动,需要重启数据库加载Oracle OCI驱动。
方法2:在Oracle数据库中对应用户下创建有权限访问的非本用户下的对象同义词
类似操作如下:
Oracle数据库:
SQL> conn scott/oracle
已连接。
SQL> show user
USER 为 "SCOTT"SQL> create or replace synonym v$version for sys.v_$version;同义词已创建。SQL> select *from scott.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 - ProductionSQL>
达梦数据库中查询:
SQL> select * from v$version@linkodbc1;行号 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已用时间: 512.946(毫秒). 执行号:2301.
问题4:查询中文数据显示为问号
DBLINK使用ODBC方式访问目的表时,中文显示为问号。
isql直接访问:
可以看到上面,isql直接访问Oracle和达梦通过ODBC数据源访问创建DBLINK访问Oracle时,中文会显示乱码,一般是与客户端字符集环境有关,可以通过设置NLS_LANG环境变量指定客户端字符集。如下:
##配置与Oracle数据库相同的NLS环境
SQL> select * from v$nls_parameters;PARAMETER VALUE
---------------------------------------------------------------- ----------------------------------------------------------------
NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_CURRENCY $
NLS_ISO_CURRENCY AMERICA
NLS_NUMERIC_CHARACTERS .,
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD-MON-RR
NLS_DATE_LANGUAGE AMERICAN
NLS_CHARACTERSET ZHS16GBK
NLS_SORT BINARY
NLS_TIME_FORMAT HH.MI.SSXFF AMPARAMETER VALUE
---------------------------------------------------------------- ----------------------------------------------------------------
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY $
NLS_NCHAR_CHARACTERSET AL16UTF16
NLS_COMP BINARY
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE##配置NLS_LANG环境变量,添加到.bash_profile中
[dmdba@localhost bin]$ vim ~/.bash_profile ---添加下面内容
export NLS_LANG="AMERICAN_AMERICA.ZHS16GBK"[dmdba@localhost bin]$ source ~/.bash_profile
[dmdba@localhost bin]$ env|grep NLS_LANG
NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
生效后,再次使用isql进行查询正常
[dmdba@localhost bin]$ isql -v ORA11 scott oracle
+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+
SQL> select * from t1;
+---------------------+-----------------------------------------+----+-----------------------------------------+
| NAME | AGE | SEX| GRADE |
+---------------------+-----------------------------------------+----+-----------------------------------------+
| 丽丽 | 18 | 女| 1000 |
+---------------------+-----------------------------------------+----+-----------------------------------------+
SQLRowCount returns -1
1 rows fetched
SQL> quit
但是DBLINK中还是乱码
原因
由于DM数据库启动时未将NLS_LANG环境变量加载导致。
如果在DM数据库启动时未加载到NLS_LANG环境变量,即使是disql窗口配置了NLS_LANG环境变量并生效也是无法正常显示中文的,所以在配置NLS_LANG环境变量生效后,需要在当前会话窗口重启DM数据库后才能正常显示中文。
如下:
情况1:配置NLS_LANG生效后启动DM数据库,然后disql窗口未配置NLS_LANG,查询正常正常
情况2:DM数据库启动会话窗口未配置NLS_LANG,disql窗口配置了NLS_LANG之后,查询中文显示问号
解决办法
方法一:使用Oracle OCI的方式创建DBLINK。如果数据库启动时未加载Oracle OCI驱动,需要重启数据库加载Oracle OCI驱动。
方法二:配置好NLS_LANG环境变量并生效后,在当前窗口重启DM数据库服务
问题5:查询报错“字符串不完整”
DBLINK使用ODBC方式创建,重启数据库之后,访问目的端表报错 “[-70037]:字符串不完整”。
原因
同问题4:“查询中文数据显示为问号”
解决办法
同问题4:“查询中文数据显示为问号”
问题六:使用select count()报错
DBLINK使用ODBC数据源方式创建,无法使用count,直接报错。
现象:
使用OCI方式创建DBLINK,可以正常执行。
使用isql直接访问Oracle数据库执行正常。
解决办法
第一种办法:升级数据库版本到2021年12月之后的版本。
第二种办法:使用Oracle OCI的方式创建DBLINK。
如果数据库启动时未加载Oracle OCI驱动,需要重启数据库加载Oracle OCI驱动。
该问题以在后面版本中修复解决。
更多资讯请上达梦技术社区了解:https://eco.dameng.com
达梦DBLINK之DM访问Oracle问题处理相关推荐
- 达梦(DM)4、SpringBoot集成MyBatisPlus+达梦数据库(DM)
最近在做一个政府项目,由于项目之前使用的 MySQL 数据库,为了适配国产化,需要将 MySQL 换成 达梦数据库(DM),本次我选择了达梦数据库8(DM8),以下是切换过程 写在前面 关于Sprin ...
- 达梦数据库(DM)——配置达梦数据库外部链接——DM到DM的外部链接创建
目录 一.关于外部链接 二.环境准备工作 三.DM到DM的外部链接创建 3.1配置dm.ini 3.2配置dmmal.ini 3.3重启数据库服务 3.4创建外部链接 3.4.1在源端上建立到目的端的 ...
- 达梦数据库(DM)——表空间管理命令大全
达梦数据库表空间管理中几乎可以说与oracle基本一致,最近梳理了常见的表空间管理的SQL命令,当然在oracle中执行也是可以的,主要是因为DM 还兼容 Oracle 11g 的部分语言特性. 表空 ...
- 【达梦数据库】DM 集群简介
文章目录 前言 一.数据守护 (Data Watch) 1.1 概念介绍 1.2 实现原理 1.3 组成构件 1.4 配置文件 1.5 系统特性 1.6 术语定义 1.7 解决方案 二.实时主备集群 ...
- 【达梦数据库】DM 查询优化
文章目录 前言 一.思路与目标 1.1 优化基本思路 1.2 查询优化步骤 1.3 查询优化目的 二.查询优化器 2.1 查询转换 2.2 估算代价 2.3 生成计划 2.4 数据访问路径 2.5 连 ...
- DSN 建立达梦7(DM)连接
(DSN)Data Source Name 数据源名称 "ODBC数据源管理器"提供了三种DSN,分别为用户DSN.系统DSN和文件DSN. 其中: 用户DSN会把相应 ...
- 国产达梦数据库(DM)安装教程及使用
一.软件环境安装要求 二.安装前准备工作 2.1 检查Linux(Unix)系统信息 2.2 创建安装用户组 1.创建安装用户组 groupadd dinstall 2.创建安装用户 useradd ...
- 达梦数据库(DM)——命令方式开启达梦数据库本地归档的具体方法
达梦数据库初始安装后,归档是默认不开启的,开启需要手动进行设置,下面具体介绍如何通过命令的方式设置并开启本地归档. 前提已经成功创建数据库实例服务,数据库运行正常. [dmdba@localhost ...
- 达梦数据库(DM)——manage工具如何开启SQL编写智能提示功能
达梦数据库的manage客户端工具,提供了SQL编写智能提示的功能,可以实现SQL编写语法智能检查.对象定义智能提示.待输入命令智能补充的功能.该功能默认是关闭的,需要的话可以手动设置开启. 打开达梦 ...
最新文章
- 对装饰器@wraps的解释(一看就懂)-- 并对装饰器详解
- PHP 权威代码风格规范
- CentOS 6.8 安装最新版 Git
- 绩效考核如何才能突破上司的主观偏见局限?
- BZOJ4373: 算术天才⑨与等差数列
- CentOS下MySQL的彻底卸载
- buu-[RoarCTF2019]polyre(控制流平坦化,虚假控制流程)
- Python学习之迭代器协议
- 【数据结构】线性表的链式表示-循环单链表、循环双链表、静态链表
- python中运算符号怎样表示_Python中的运算符与表达式
- 计算机网络数据链路层 --- 选择重传协议(SR)
- 向量封包处理器(VPP)如何运作
- Mybatis核心配置文件SqlMapConfig.xml
- celery 实例进阶
- 解读IBM存储虚拟化的两大法宝
- 使用Android Studio开发/调试Android源码
- 一个简单的网页设计HTML5作业
- 计算机excel试题各科学员,计算机Excel练习题一及答案.doc
- 抖音短视频的营销模式
- 彻底删除oracle数据库