本章节主要介绍达梦数据库 DBLINK 相关常见问题,为用户提供 DBLINK 相关问题的分析和解决思路。除此之外,用户还可前往达梦技术社区参与更多问题讨论。
目录
- 创建 dm8-oracle11G 的 dblink,进行查询时报错:[-6010]:Error in line:1 Connection lost.
- DBLINK 报错信息在实例日志中不显示
- dm8-dm7 的 odbc 方式 dblink 连接报错:“[-2245]:DBLINK 加载库文件失败”
- DM 到 DM 的 DBLINK 报错问题
- 通过 dblink 向 oracle 端表插入 BLOB 字段数据时报错:"字符不完整“
- oracle 到 dm 的 dblink 使用报错:ORA-28500
- dm 到 oracle 的 dblink 环境中,在 dm 上调用 oracle 包中的存储过程提示:获取对象失败
- dblink 访问远程库中的大字段表数据时报错:字符串截断
- 使用 dblink 批量插入远程表时报错:“超出保存点上限”
- DBLINK 查询报错:“DBLINK 大字段缓存空间不足”
正文
创建 dm8-oracle11G 的 dblink,进行查询时报错:[-6010]:Error in line:1 Connection lost.
【问题描述】
dm8 通过 oci 接口创建到 oracle 的 dblink 连接,已配置 oracle_client 客户端及环境变量,已配置 tnsnames.ora 文件,tnsnames.ora 参考配置如下:
[dmdba@dmdsc01 log]$ cat /soft/dsc/dmdbms/bin/instantclient_19_18/network/admin/tnsnames.ora
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = xxx.xxx.xxx.xxx)(PORT = 1522))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ORCLPDB)
)
)
在通过网络服务名创建 dblink 后进行 dblink 链接查询时提示报错:"-6010:连接丢失"。
【问题分析】
通过查看数据库 log 日志文件发现报错如下:
2023-03-13 14:06:20.894 [ERROR] database P0000055023 T0000000000000078148 Oracle connect error:[12154]ORA-12154: TNS:could not resolve the connect identifier specified
根据该日志报错可以推断主要原因为 tnsnames.ora 未被识别,定位在环境变量存在问题。
【问题解决】
- 排查 dmdba 环境变量中是否配置了 TNS_ADMIN,若未配置需要先配置该变量,具体配置方法如下:
[dmdba@dmdsc01 log]$ cat ~/.bash_profile | grep TNS_ADMIN
export TNS_ADMIN=/soft/dsc/dmdbms/bin/instantclient_19_18/
- 重启数据库服务,确保数据库服务能够识别该新配置的环境变量,再次发送 dblink 请求。
- 用户名和密码需要正确,如果查看到 dm_DMSERVER_202109.log 日志有如下报错,则说明用户名和密码错误:
注意检查大小写,如果密码为小写,请注意用双引号引起来。
DBLINK 报错信息在实例日志中不显示
【问题解决】
若需在实例日志中打印 DBLINK 报错信息,则要提前修改 DBLINK 打印日志参数 ELOG_REPORT_LINK_SQL。方法如下:
- 执行以下命令开启 DBLINK 打印日志;
alter system set 'ELOG_REPORT_LINK_SQL' = 1;
- 同样的窗口运行报错的 DBLINK 语句;
- 数据库实例日志查看报错。
参数解释:
参数名 | 默认值 | 属性 | 说明 |
---|---|---|---|
ELOG_REPORT_LINK_SQL | 0 | 动态,会话级 | 是否记录 DBLINK 执行的 SQL 到服务器日志文件中。 0:不记录;1:记录 |
dm8-dm7 的 odbc 方式 dblink 连接报错:“[-2245]:DBLINK 加载库文件失败”
【问题描述】
配置 dm8-dm7 的 odbc 方式 dblink 连接,测试时报错:[-2245]:DBLINK 加载库文件失败。
【问题解决】
将解压后的 ODBC 目录下的所有 .so 文件复制到数据库安装目录 bin 下,然后再修改属主和属组。
[root@dsc1 bin]# chown dmdba:dinstall libodbccr.so libodbcinst.so libodbc.so
再次通过 dblink 查看 dm7 数据库中的表,可以成功查看。
DM 到 DM 的 DBLINK 报错问题
问题一:
【问题描述】
DBLINK 连接时报错:“self instance(DMSERVER) not found in d:\dmdbms\data\DAMENG\dmmal.ini
dmserver startup failed, code = -9501 [MAL sys has not configured or serveris not enterprise version]."。
【问题解决】
- 通过以下 SQL 检查数据库是否为企业版:
select SERVER_SERIES from v$license; --E代表企业版
- 检查 dmmal.ini 是否配置正确,注意文件扩展名要正确:
问题二:
【问题描述】
DBLINK 连接时报错:
nsvr_ini_file_read failed, [code: -9501]
MAL_INST_NAME:[DMSERVER] is duplicated in [d:\dmdbms\data\DAMENG\dmmal.ini]!
dmserver startup failed, code = -801 [Duplicate ini config option]
nsvr_ini_file_read failed, [code: -801]
【问题解决】
该问题是 dmmal.ini 配置文件中存在两个相同实例名的数据库导致,需修改其中一个数据库的实例名,即两个 MAL_INST_NAME = DMSERVER 名字不能一样。
[MAL_INST1]
MAL_INST_NAME = DMWIN
MAL_HOST = 10.10.10.3
MAL_PORT = 5251
MAL_INST_HOST = 10.10.10.3
MAL_INST_PORT = 5236
[MAL_INST2]
MAL_INST_NAME = DMSERVER
MAL_HOST = 10.10.10.4
MAL_PORT = 5250
MAL_INST_HOST = 10.10.10.14
MAL_INST_PORT = 5236
补充 DM 到 DM 的 DBLINK 的三种创建方式如下:
--方式1 —mal_inst_host/mal_inst_port
create link “链接名” connect ‘DAMENG’ with “用户名” identified by “密码” using ‘实例IP地址/实例端口号’;
--方式2 —mal_host/mal_port
create link “链接名” connect ‘DAMENG’ with “用户名” identified by “密码” using ‘MAL IP地址/MAL 端口号’;
--方式3 —mal_inst_name
create link “链接名” connect ‘DAMENG’ with “用户名” identified by “密码” using ‘实例名’;
通过 dblink 向 oracle 端表插入 BLOB 字段数据时报错:"字符不完整“
【问题描述】
源端为 DM(DSC+DW),目的端为 ORACEL,创建从 DM 到 ORACLE 的 dblink,通过 dblink 向 oracle 端表插入 BLOB 字段数据时报错"字符不完整”该如何解决。
【问题解决】
可通过创建 dblink 时添加 local_code 参数绕过此问题。
例如:如下使用如下创建的 dblink 向 oracle 端表插入 BLOB 字段数据时报错"字符不完整”。
create or replace link dm_ora connect 'ORACLE' with stu identified by 123456789 using '10.15.1.20:1521/orcl' ;
通过创建 dblink 时添加 local_code 参数绕过此问题。
create or replace link dm_ora connect 'ORACLE' with stu identified by 123456789 using '10.15.1.20:1521/orcl' option (local_code='GBK');
参数说明:
local_code:接口(DPI、OCI、JDBC 等接口)的字符集。若与服务器的字符集不一致,则需要进行转换。可取值为 UTF-8,GBK 或 GB18030。
oracle 到 dm 的 dblink 使用报错:ORA-28500
【问题描述】
创建 oracle 到 dm 的 dblink,配置透明网管、监听、tnsname 后,使用时报错:ORA-28500。
【问题分析】
排查发现透明网管配置不正确,缺少配置 HS_NLS_NCHAR=UCS2。
【问题解决】
检查透明网管配置,增加 HS_NLS_NCHAR=UCS2。
修改配置后重启监听,dblink 恢复正常。
dm 到 oracle 的 dblink 环境中,在 dm 上调用 oracle 包中的存储过程提示:获取对象失败
【问题描述】:
在 DM 上调用 oracle 数据库中的 ceshi_pkg 包的 showMessage 存储过程,出现如下报错:
【问题解决】:
远程调用 oracle 包里的存储过程需要加上用户名,将 SQL 语句改为如下即可:
call scott.ceshi_pkg.showMessage@link1();
dblink 访问远程库中的大字段表数据时报错:字符串截断
【问题描述】
本地库通过 dpi 方式访问远程库中的大字段表数据时报错:字符串截断
【问题解决】
调整参数 DBLINK_LOB_LEN 的值大于表中 BLOB 大字段数据长度,例如:
- 修改库 1 和库 2 :DBLINK_LOB_LEN=512。
SP_SET_PARA_VALUE(1,DBLINK_LOB_LEN,512);
- 库 1 创建 BLOB 表,并插入 6 张大小为 276K 的图片(512>276)。
- 库 2 通过 dblink 成功查询库 1 大字段表。
使用 dblink 批量插入远程表时报错:“超出保存点上限”
【问题描述】
通过 DPI 方式创建的 DBLINK,在使用 dblink 批量插入远程表时报错:“超出保存点上限”。
【问题分析】
DPI 方式创建 dblink 插入远程表批量提交受到参数 SAVEPOINT_LIMIT 限制,最高 10000。
SAVEPOINT_LIMIT 参数含义:单个事务中最大可创建的保存点个数。取值范围 0~10000,默认值 512。
【问题解决】
一下提供两种解决方法:
- 降低同一事务内的批量提交语句数量。
- 使用 odbc 方式创建 DBLINK。
示例如下:
- DPI 方式创建 dblink。
create or replace link "SYSDBA"."LINK_DPI" connect 'DPI' with "SYSDBA" identified by " *****" using '10.15.1.25:5236';
降低批量提交语句,由 555 行减少到 512 行,批量提交成功。
- ODBC 方式创建 DBLINK。
create or replace link "SYSDBA"."LINK_ODBC" connect 'ODBC' with "SYSDBA" identified by "*****" using 'dm8';
批量提交不减少,批量提交成功。
DBLINK 查询报错:“DBLINK 大字段缓存空间不足”
【问题描述】
使用 DBLINK 查询远端大字段类型数据时报错:DBLINK 大字段缓存空间不足。
【问题分析】
使用 DBLINK 访问大字段类型时,大字段的长度存在限制。
【问题解决】
- 通过如下语句查询当前版本支持的最大长度。
select * from v$dm_ini where para_name='DBLINK_LOB_LEN';
- 可以看到当前版本支持大字段长度最大为 2G,可以根据需要,执行如下语句,将此参数调大。该参数为动态参数,执行后即可生效,不需要重启数据库。
sp_set_para_value(1,'DBLINK_LOB_LEN',2097152);