How to resolve ORA-19706 error when select from dblink

本文探讨了通过databaselink进行远程数据库数据读取时出现ORA-19706错误的原因及解决方案。错误源于SCN与headroom间的差距过大,通过调整_external_scn_rejection_threshold_hours参数或更新PSU可以解决。


由于通过database link进行远程数据库的数据读取时,会自动同步当前库和远程库的SCN,老杨在文章中做过描述,并且提到:

而对于实际环境中,SCN的增加可能是几倍、几十倍甚至是上百倍,从而引发一些其他的bug。

下面就来看一个问题。该错误会在应用了2012年1月份CPU的Oracle数据库中出现,而在原始版本中,比如10.2.0.5.0之中不会出现此错误。

--通过dblink进行简单的查询报ORA-19706错误
SQL> SELECT sysdate FROM dual@AIX12;
 
SELECT sysdate FROM dual@AIX12
 
ORA-19706: invalid SCN
 
--登录远程库,检查SCN,很大的一个数字
SQL> SELECT current_scn FROM v$database; 
 
CURRENT_SCN
-----------
12763142641
 
--而当前库,由于新创建,所以SCN并不大,与远程库想比相差几个数量级
SQL> SELECT current_scn FROM v$database;
 
CURRENT_SCN
-----------
    5017684


看一下ORA-19706错误的解释。可以看到too large是产生该问题的原因之一。

$oerr ora 19706
19706, 00000, "invalid SCN"
// *Cause:  The input SCN is either not a positive integer or too large.
// *Action: Check the input SCN and make sure it is a valid SCN.


SCN是一个可以容纳很长时间的数字,为什么会出现too large的情况呢?这是由于SCN有headroom限制的原因,headroom是一个固定值,从1988年开始计算,以每秒16K的速度递增。当突然请求的SCN超过跟SCN headroom之间允许的差值时,则会出现ORA-19706错误。

详细的解释可以参看MOS Note – System Change Number (SCN), Headroom, Security and Patch Information [ID 1376995.1]。


解决方法:
1. 设置隐含参数_external_scn_rejection_threshold_hours,具体解释可以参看:
MOS Note – Installing, Executing and Interpreting output from the “scnhealthcheck.sql” script [ID 1393363.1]。

该参数在10.2.0.5中默认是744,设置为24通常可以解决问题(表示允许跟headroom之间的差距相差24小时)。

SQL> ALTER system SET "_external_scn_rejection_threshold_hours"=24 scope=spfile;

也就是如果远端数据库的SCN由于某些bug导致异常增长,那么这个SCN跟headroom之间的差距将会低于默认值744小时(31天),当本地数据库(打了2012年1月份CPU补丁后的)通过dblink查询远端数据,由于SCN同步机制,本地数据库尝试将SCN同步为跟远端一样大小,但是这个值超过了跟SCN headroom之间允许的差值,因此报错。

实际上具体设置的值应该根据上面MOS文档中scnhealthcheck.sql的结果,该SQL应该在远端数据库中运行(或者说在具有最大的SCN的数据库中运行),假设运行结果显示:

SCN Headroom: 14.55

那么则表示目前SCN距离headroom只有14.55天的空间,此时我们将_external_scn_rejection_threshold_hours参数设置为13*24=312,即可解决问题。但是要注意,远端数据库SCN仍在不停异常增长,等到某一天远端数据库的SCN Headroom降低为小于13天的时候,ORA-19706错误又会再次出现。


2. 回滚打上的2012年1月份CPU。当然这并不是推荐的方法。

3. 最终极的解决方案,将环境中所有通过dblink互相连接的数据库全部打上最新的PSU,比如目前10205的最新PSU是10.2.0.5.7,这将会解决所有SCN异常增长的问题,只要数据库每秒增长的SCN不会超过16K,那么就会离headroom越来越远。


原文地址:http://www.dbform.com/html/2012/1846.html


### ### Oracle ORA-12154 错误:TNS 无法解析连接标识符的解决方法 当用户尝试通过 SQL*Plus 或其他 Oracle 客户端工具连接数据库时,如果遇到 **ORA-12154: TNS:could not resolve the connect identifier specified** 错误,通常表示客户端无法解析 `tnsnames.ora` 文件中定义的连接标识符,或连接字符串格式不正确 [^1]。 #### 检查连接字符串格式 如果使用 Easy Connect 命名方法(即不依赖 `tnsnames.ora` 文件),请确保连接字符串格式正确: ```bash sqlplus username/password@//hostname:port/service_name ``` 例如: ```bash sqlplus scott/tiger@//localhost:1521/orcl ``` 如果使用 `tnsnames.ora`,确保连接标识符存在于 `tnsnames.ora` 文件中,并且格式正确。例如: ```ini ORCL = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) ) ``` #### 验证 TNS_ADMIN 环境变量 如果 `tnsnames.ora` 文件不在默认位置(如 `$ORACLE_HOME/network/admin`),应设置 `TNS_ADMIN` 环境变量指向包含该文件的目录: ```bash export TNS_ADMIN=/u01/app/oracle/network/admin ``` 在 Windows 系统中: ```cmd set TNS_ADMIN=C:\oracle\network\admin ``` #### 检查 SQL*Net 配置文件 确保 `sqlnet.ora` 中的 `NAMES.DIRECTORY_PATH` 包含 `TNSNAMES`,以启用对 `tnsnames.ora` 的解析: ```ini NAMES.DIRECTORY_PATH=(TNSNAMES, EZCONNECT) ``` #### 使用 tnsping 验证连接标识符 使用 `tnsping` 工具测试连接标识符是否可解析: ```bash tnsping orcl ``` 如果返回 `OK`,说明连接标识符解析正常;否则需检查 `tnsnames.ora` 文件路径和内容。 #### 检查环境变量 ORACLE_HOME 和 PATH 确保 `ORACLE_HOME` 设置正确,并且 `$ORACLE_HOME/bin`(或 `%ORACLE_HOME%\bin`)包含在 `PATH` 环境变量中,以确保 SQL*Plus 和其他工具能正确加载 Oracle 网络库 [^1]。 #### 检查远程数据库监听状态 虽然 ORA-12154 通常与本地配置有关,但仍需确认远程数据库监听器正在运行,并可通过网络访问: ```bash lsnrctl status ``` 如果监听器未运行,启动监听器: ```bash lsnrctl start ``` #### 检查主机名和 DNS 解析 如果使用主机名连接数据库,确保主机名可解析为 IP 地址。可以通过 `ping` 或 `nslookup` 验证: ```bash ping localhost nslookup localhost ``` 如果使用 IP 地址,确保 `tnsnames.ora` 或连接字符串中的地址正确无误。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值