dg环境连接ORA-00604,ORA-16000: database open for read-only access

本文探讨了Oracle数据库中审计功能的配置与影响,以及触发器导致的读写权限问题。通过实测,揭示了审计功能对连接的影响,并详细记录了解决由触发器引发的错误ORA-00604和ORA-16000的过程。

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

报错信息

根据客户提供的报错信息,

ORA-00604: error occurred at recursive SQL level 1
ORA-16000: database open for read-only access

怀疑是触发器导致的问题,自己的测试环境进行测试。

 

测试一、dg环境开启审计参数是否影响

[oracle@adg1 dbs]$ sqlplus tt/tt@adgtns
SQL*Plus: Release 11.2.0.4.0 Production on Sat May 4 16:56:55 2019
SQL> 
audit_trail string OS

SQL> alter system set audit_trail=db scope=spfile;
System altered.
SQL> startup force;
DG环境,备库如果开启审计功能,配置db将自动转换为OS

 

SQL> audit select,insert,update,delete on scott.emp by access;
Audit succeeded

SQL> conn tt/tt
Connected.
SQL> select * from scott.emp where rownum=1;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- --------------------
7369 SMITH CLERK 7902 17-DEC-80 800 20
SQL> conn / as sysdba
Connected.
SQL> show parameter audit
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
audit_file_dest string /u01/app/oracle/admin/tt/adump

测试发现,备库开启审计功能,并不会导致无法连接。
Sat May 4 17:31:00 2019 +08:00
LENGTH: "267"
SESSIONID:[10] "4294967295" ENTRYID:[1] "1" STATEMENT:[1] "1" USERID:[2] "TT" USERHOST:[4] "adg1" TERMINAL:[5]
"pts/1" ACTION:[3] "100" RETURNCODE:[1] "0" COMMENT$TEXT:[26] "Authenticated by: DATABASE" OS$USERID:[6]
"oracle" DBID:[10] "1969706720" PRIV$USED:[1] "5"
Sat May 4 17:31:40 2019 +08:00
LENGTH: "263"
SESSIONID:[10] "4294967295" ENTRYID:[1] "2" STATEMENT:[2] "10" USERID:[2] "TT" USERHOST:[4] "adg1" TERMINAL:[5]
"pts/1" ACTION:[1] "3" RETURNCODE:[1] "0" OBJ$CREATOR:[5] "SCOTT" OBJ$NAME:[3] "EMP" OS$USERID:[6]
"oracle" DBID:[10] "1969706720" PRIV$USED:[2] "47"
经过测试,备库开启审计,不会影响连接。

 

测试二、手工创建登录触发器

主库创建触发器
create table UC_LOGON_OFF ( user_id VARCHAR2(
30), session_id NUMBER(8), host VARCHAR2(30), last_program VARCHAR2(48), last_action VARCHAR2(32), last_module VARCHAR2(32), logon_day DATE, logon_time VARCHAR2(10), logoff_day DATE, logoff_time VARCHAR2(10), elapsed_minutes NUMBER(8), sid NUMBER(8), serial NUMBER(8) ) tablespace USERS pctfree 10 initrans 1 maxtrans 255; CREATE OR REPLACE TRIGGER TRIG_LOGON_AUDIT AFTER LOGON ON DATABASE BEGIN INSERT INTO sys.uc_logon_off select USER, SYS_CONTEXT ('USERENV', 'SESSIONID'), SYS_CONTEXT ('USERENV', 'HOST'), NULL, NULL, NULL, SYSDATE, TO_CHAR (SYSDATE, 'yyyy-mm-dd hh24:mi:ss'), NULL, NULL, NULL, NULL, null from dual; END; alter table uc_logon_off modify logon_time varchar2(30); SQL> alter system switch logfile;

 

--备库开启MRP同步应用,测试前tt可以连接
recover managed standby database disconnect from session;
SQL> conn tt/tt
ERROR:
ORA-00604: error occurred at recursive SQL level 1
ORA-16000: database open for read-only access
ORA-06512: at line 2
Warning: You are no longer connected to ORACLE.

alert.log 
Sat May 04 17:10:33 2019
Errors in file /u01/app/oracle/diag/rdbms/tt/tt/trace/tt_ora_16392.trc:
ORA-00604: error occurred at recursive SQL level 1
ORA-16000: database open for read-only access
ORA-06512: at line 2

 

主库处理,禁用触发器
SQL> select OWNER,TRIGGER_NAME,TRIGGERING_EVENT,TABLE_OWNER,TABLE_NAME,STATUS,ACTION_TYPE from dba_triggers where TRIGGER_NAME='TRIG_LOGON_AUDIT' OWNER TRIGGER_NAME TRIGGERING_EVENT TABLE_OWNER TABLE_NAME STATUS ACTION_TYPE ---------- ------------------------------ -------------------- ------------------------------ ------------------------------ -------- ----------- SYS TRIG_LOGON_AUDIT LOGON SYS ENABLED PL/SQL ALTER TRIGGER "SYS"."TRIG_LOGON_AUDIT" DISABLE; --备库OK SQL> conn tt/tt Connected.

  

 

转载于:https://www.cnblogs.com/lvcha001/p/10858305.html

<think>好的,我现在需要解决用户在Oracle中修改sys用户密码时遇到的ORA-00604ORA-16000错误的问题。首先,我得理清楚这些错误的原因和可能的解决方案。 首先,ORA-16000错误表明数据库处于只读模式。这通常发生在备用数据库(如Data Guard的物理备库)中,因为备库通常以只读模式打开以提供查询服务,同时应用主库传来的归档日志。当用户尝试在这种模式下进行写操作,比如修改sys用户的密码,就会触发这个错误。而ORA-00604则是递归SQL错误,可能在执行某些系统级操作时出现,特别是在只读环境下无法完成内部操作。 接下来,用户提到的问题是在修改sys密码时遇到的这些错误。sys用户的密码修改通常需要写权限,而只读数据库不允许这种操作。因此,核心问题是如何在只读模式下修改sys密码,或者是否需要先将数据库切换到可写状态。 根据参考信息,引用[1]和[2]都提到ORA-16000是因为数据库处于只读访问状态。引用[4]提到了递归SQL错误,可能是在执行某些需要内部写操作的系统函数时出现的。因此,解决方案可能需要检查数据库的模式,并确保在可写状态下进行操作。 可能的解决步骤包括: 1. 确认数据库当前是否处于只读模式。可以通过查询v$databaseopen_mode字段来验证。 2. 如果数据库是物理备库,可能需要暂时停止日志应用,以read write模式打开数据库,进行密码修改后再切换回只读模式。 3. 如果是RAC环境,需要注意实例的状态和服务的配置,确保操作在正确的节点上进行。 4. 修改密码后,需要重启数据库或重新应用日志,以保持备库与主库的同步。 另外,需要注意修改sys用户的密码可能会影响数据库的同步,尤其是在Data Guard环境中,主库和备库的sys密码是否需要同步,或者是否有其他配置需要注意。如果主库修改了sys密码,备库可能需要相应的处理,否则可能导致同步错误。 可能还需要检查是否有其他因素导致递归SQL错误,比如权限问题、系统包损坏等,但结合错误信息和引用内容,主要问题还是数据库的只读状态。因此,重点应放在调整数据库的打开模式上。 总结来说,解决方案的关键步骤是确认数据库模式,暂时切换到可写模式进行密码修改,然后再恢复只读状态,确保Data Guard的正常运作。</think>### 分步解决方案 #### **1. 确认数据库运行模式** 首先需要确认数据库当前是否为物理备库(Standby Database)且处于只读模式: ```sql SELECT open_mode FROM v$database; ``` 若结果为 `READ ONLY`,则表明数据库处于只读模式[^1][^2]。 --- #### **2. 停止日志应用服务(仅限Data Guard备库)** 如果是Data Guard物理备库,需**暂停日志应用**以允许数据库切换为读写模式: ```sql ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL; ``` --- #### **3. 以读写模式重启数据库** 将备库临时切换为读写模式: ```sql ALTER DATABASE OPEN READ WRITE; ``` 此操作允许执行写操作(如修改密码)。 --- #### **4. 修改sys用户密码** 在读写模式下执行密码修改: ```sql ALTER USER sys IDENTIFIED BY <新密码>; ``` --- #### **5. 恢复备库为只读模式** 完成修改后,恢复备库为只读模式并重新启动日志应用: ```sql ALTER DATABASE CLOSE; ALTER DATABASE OPEN READ ONLY; ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION; ``` --- #### **6. 主库同步处理(如需)** 若主库也需要同步修改sys密码,需在主库执行相同操作,并确保备库重新同步。 --- ### **注意事项** 1. **RAC环境**:若为Oracle RAC,需在所有节点确认实例状态,并确保服务配置正确。 2. **权限验证**:确保操作账户具有`SYSDBA`权限。 3. **密码复杂性**:Oracle可能要求密码符合复杂度规则,避免触发其他错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值