使用 oci 连接 oracle rac 报错 ORA-25408: can not safely replay call

本文探讨了在Oracle RAC环境中遇到ORA-25408错误的情况,详细分析了错误产生的原因及应对策略,特别是针对PL/SQL程序单元、DML和DDL操作在故障转移后的处理方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

os: centos 7.6
db: oracle 19.3

oracle 19.3 rac 环境,连接实例执行sql时提示 ORA-25408: can not safely replay call

rac taf service

$ srvctl add service -db orclp -pdb pdb1  -service srv_workload_pdb1_taf   -preferred orclp1,orclp2 -role PRIMARY  -notification true -tafpolicy BASIC -failovertype SESSION -failovermethod BASIC -failoverdelay 10 -failoverretry 150 ;
$ srvctl add service -db orclp -pdb pdb2  -service srv_workload_pdb2_taf   -preferred orclp1,orclp2 -role PRIMARY  -notification true -tafpolicy BASIC -failovertype SESSION -failovermethod BASIC -failoverdelay 10 -failoverretry 150 ;

$ srvctl start service -db orclp -service srv_workload_pdb1_taf ;
$ srvctl start service -db orclp -service srv_workload_pdb2_taf ;

rac 信息

$ cat /etc/hosts

#################################
192.168.56.101       nodea1
192.168.56.201       nodea1-vip
192.168.156.101      nodea1-priv

192.168.56.102   	 nodea2
192.168.56.202       nodea2-vip
192.168.156.102      nodea2-priv

#scan ip
192.168.56.221   	 clustera-scan
192.168.56.222   	 clustera-scan
192.168.56.223   	 clustera-scan

$ srvctl config scan
SCAN name: uatpayclustera-scan, Network: 1
Subnet IPv4: 192.168.56.0/255.255.255.0/eth0, static
Subnet IPv6: 
SCAN 1 IPv4 VIP: 192.168.56.221
SCAN VIP is enabled.
SCAN 2 IPv4 VIP: 192.168.56.222
SCAN VIP is enabled.
SCAN 3 IPv4 VIP: 192.168.56.223
SCAN VIP is enabled.

$ sqlplus / as sysdba;

SQL> set lines 500;
set pages 500;
show parameter listener;

NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
forward_listener		     string
listener_networks		     string
local_listener			     string	 (ADDRESS=(PROTOCOL=TCP)(HOST=192.168.56.201)(PORT=1521))
remote_listener 		     string	 clustera-scan:1521

$ srvctl add service -db orcl -pdb pdb1 -service srv_pdb1 -preferred orcl1,orcl2 \
-role PRIMARY  -notification true \
-tafpolicy BASIC -failovertype SESSION -failovermethod BASIC -failoverdelay 10 -failoverretry 150 ;

$ srvctl start service -db orcl -service srv_pdb1

$ cat $ORACLE_HOME/network/admin/tnsnames.ora

tns_orcl =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = clustera-scan)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = srv_pdb1)
    )
  )
  

出错提示

使用 sqlplus 登录后,执行 plsql 匿名块一段时间后,报错 ORA-25408: can not safely replay call,排查后发现是执行sql的那台oracle实例发成了重启.
重启的原因另外分析,这里主要是描述下 ORA-25408: can not safely replay call 错误.

$ sqlplus peiyb/peiybpeiyb@tns_orcl

SQL> DECLARE 
   
  lv_begin_date_str varchar2(10):='2019-07-23';-- 2018-07-11 2019-01-01 2019-05-01
  lv_end_date_str   varchar2(10):='2019-07-23';-- 2018-12-31 2019-04-30 2019-07-20
  
BEGIN
  for c_i in (
      select level as le,
            to_char(to_date(lv_begin_date_str,'yyyy-mm-dd')+ level -1,'yyyy-mm-dd') as date_str
       from dual
    connect by level <= to_date(lv_end_date_str,'yyyy-mm-dd')- to_date(lv_begin_date_str,'yyyy-mm-dd')+1 
       
   )
   loop
      INSERT INTO tmp_t1 (
          id,
		  name,
          CREATION_DATE
         )
      select
             tmp_t1.nextval,
             name,
             po.creation_date,--8
        from tmp_t0 po
       where 1=1
         and po.creation_date between to_date(c_i.date_str||' 00:00:00','yyyy-mm-dd hh24:mi:ss')
                                  and to_date(c_i.date_str||' 23:59:59','yyyy-mm-dd hh24:mi:ss')
        ;
        
       commit;
   end loop;   
END ;
/

*
ERROR at line 1:
ORA-25408: can not safely replay call

分析

$ oerr ora 25408
25408, 00000, "can not safely replay call"
// *Cause:  The connection was lost while doing this call. It may not be
//          safe to replay it after failover.
// *Action: Check to see if the results of the call have taken place, and then
//          replay it if desired.
//

ORA-25408
One may receive ORA-25408: can not safely replay call when using failover. This will depend on the failover type and on what you are executing.

AF only works for idle sessions and SELECT statements. The following operations will give an error (user program must restart the operation after fail-over):

  • PL/SQL program units - stored procedures, functions, packages
  • DML - INSERT, UPDATE, DELETE, SELECT … FOR UPDATE
  • DDL - CREATE, ALTER, DROP, TRUNCATE, GRANT, REVOKE, etc.

For example if you are doing an insert and the database goes down and failover occurs, “ORA-25408 can not safely replay call” is expected and the application should handle this exception and re-execute the insert.

If you are in a transaction and failover occurs you will also receive an error message and you have to handle this and issue a rollback.

In case you have configured failover to be of type SESSION, you will not able able to recover your selects either and you will need to replay them.

参考:
http://www.orafaq.com/wiki/ORA-25408

### Navicat 连接 Oracle 数据库 ORA-01031 insufficient privileges 的解决方案 ORA-01031 错误通常表示当前用户缺乏足够的权限来执行某些操作。以下是针对此问题的详细分析和解决方法: #### 1. 权限不足的原因 该错误可能源于以下几个方面: - 当前登录用户的权限不足以创建对象或访问特定功能[^2]。 - 用户尝试以 `SYSDBA` 或其他高权限角色运行命令,但未被授予相应的特权[^3]。 #### 2. 检查并授予权限 如果确认用户确实缺少必要的权限,则可以通过以下 SQL 命令为用户提供所需的权限: ```sql GRANT CREATE SESSION TO username; GRANT CONNECT, RESOURCE TO username; ``` 上述语句中的 `username` 应替换为目标用户的实际名称。通过这些授权,可以确保目标用户能够正常连接到数据库并拥有基本的操作能力[^5]。 #### 3. 配置文件权限调整 有时,即使用户已获得适当权限,仍可能出现此类错误。这可能是由于 `$ORACLE_HOME/network/admin/` 下的相关配置文件(如 `sqlnet.ora`, `tnsnames.ora`, 和 `listener.ora`)的文件权限设置不当所致。建议按照如下方式修改其权限: ```bash chmod 644 sqlnet.ora tnsnames.ora listener.ora ls -l sqlnet.ora tnsnames.ora listener.ora ``` 验证文件权限是否正确分配给合适的组成员。 #### 4. 更新 OCI 版本 Navicat 使用 OCI (Oracle Call Interface) 实现与 Oracle 数据库之间的通信。如果使用OCI 版本过旧或者与服务器端版本不符,也可能引发兼容性问题以及类似的错误消息。因此,推荐下载最新版的 OCI 文件包,并将其适配至所连接的目标数据库的具体版本需求上[^4]。 #### 5. 测试连接稳定性 完成以上更改之后,重新启动客户端工具和服务进程,再试一次新的连接请求。注意观察是否有任何改善迹象;如果没有解决问题,请进一步排查网络路径上的潜在障碍物或其他环境因素的影响。 --- ### 总结 综上所述,要彻底消除 Navicat 中遇到的 ORA-01031 insufficient privileges 报错现象,需从多个角度入手处理:一是核查账户本身是否存在缺失必要许可的情况;二是审查涉及的关键配置文档读写属性设定得当与否;三是考虑升级驱动程序组件使之匹配双方软硬件平台特性差异等方面综合施策才能达到预期效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据库人生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值