Oracle 11G Physical Standby Database Active Data Guard - 数据文件路径错误问题

本文详细解析了在Oracle数据库环境中,当主从库部署在同一主机上且试图创建同名数据文件时引发的问题,并提供了从库数据库关闭、恢复、重建数据文件、调整db_file_name_convert参数以及重启Dataguard等解决步骤。

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

问题描述
主库DGDB:在非指定的目录创建表空间。
从库DGDBST:则从库报错,MRP进程死掉。

主库操作:
create tablespace DGTSDATA datafile '/prod/oracle/oradata/DGDB/DGTSDATA.ora' size 10M autoextend on next 2M maxsize 100M;    --成功
create tablespace DGTSINDX datafile '/prod/oracle/temp/DGTSINDX.ora' size 10M autoextend on next 2M maxsize 100M;            --成功
create user DGSYSTEM identified by amaxgs default tablespace DGTSDATA;                                                       --成功
从库错误:
create tablespace DGTSINDX datafile '/prod/oracle/temp/DGTSINDX.ora' size 10M autoextend on next 2M maxsize 100M;            --失败,报错如下
DGDBST> select facility,to_char(timestamp,'dd-mon-yyyy hh24:mi') time,message from v$dataguard_status;
Log Apply Services       06-sep-2013 17:32          MRP0: Background Media Recovery terminated with error 1274
Log Apply Services       06-sep-2013 17:32          Managed Standby Recovery not using Real Time Apply
Log Apply Services       06-sep-2013 17:32          MRP0: Background Media Recovery process shutdown


备库alert日志
Fri Sep 06 17:32:43 2013
WARNING: File being created with same name as in Primary
Existing file may be overwritten
Errors in file /prod/oracle/diag/rdbms/dgdbst/DGDBST/trace/DGDBST_pr00_5748.trc:
ORA-01119: error in creating database file '/prod/oracle/temp/DGTSINDX.ora'
ORA-27086: unable to lock file - already in use
Linux-x86_64 Error: 11: Resource temporarily unavailable
Additional information: 8
Additional information: 6109
File #7 added to control file as 'UNNAMED00007'.
Originally created as:
'/prod/oracle/temp/DGTSINDX.ora'
Recovery was unable to create the file as:
'/prod/oracle/temp/DGTSINDX.ora'
MRP0: Background Media Recovery terminated with error 1274
Errors in file /prod/oracle/diag/rdbms/dgdbst/DGDBST/trace/DGDBST_pr00_5748.trc:
ORA-01274: cannot add datafile '/prod/oracle/temp/DGTSINDX.ora' - file could not be created
Managed Standby Recovery not using Real Time Apply
Recovery interrupted!
Recovered data files to a consistent state at change 1374026
Fri Sep 06 17:32:43 2013
MRP0: Background Media Recovery process shutdown (DGDBST)


#######
原因分析:
1,主从库在同一台主机,同一目录不能创建同名的数据文件,导致这个问题;但如果主从库在不同主机,同名目录可以创建同名数据文件。
2,db_file_name_convert='/prod/oracle/oradata/DGDBST','/prod/oracle/oradata/DGDB'没有对/prod/oracle/temp进行转换。
#######

#######
解决方法
参考:http://www.eygle.com/archives/2009/07/dataguard_ora_01111.html
该解决方案,也可以用于将备库数据文件移动位置。
#######
1,从库在MRP进程停掉之后,数据库为open read only状态。
尝试手动关闭后恢复,失败。
DGDBST> shutdown immediate;
DGDBST> startup mount standby database;
DGDBST> alter database open read only;
alter database open read only
*
ERROR at line 1:
ORA-10458: standby database requires recovery
ORA-01157: cannot identify/lock data file 7 - see DBWR trace file
ORA-01111: name for data file 7 is unknown - rename to correct file
ORA-01110: data file 7: '/prod/oracle/product/11.2.0/db_1/dbs/UNNAMED00007'

DGDBST> RECOVER STANDBY DATABASE;
ORA-00283: recovery session canceled due to errors
ORA-01111: name for data file 7 is unknown - rename to correct file
ORA-01110: data file 7: '/prod/oracle/product/11.2.0/db_1/dbs/UNNAMED00007'
ORA-01157: cannot identify/lock data file 7 - see DBWR trace file
ORA-01111: name for data file 7 is unknown - rename to correct file
ORA-01110: data file 7: '/prod/oracle/product/11.2.0/db_1/dbs/UNNAMED00007'

2,保持备库在mount状态下进行如下操作,将未创建成功的数据文件创建出来。
DGDBST> select name from v$datafile;    --列出数据文件,发现控制文件里,有一个存在的数据文件。
NAME
------------------------------------------------------------------------------------------------------------------------------------
/prod/oracle/oradata/DGDBST/system01.dbf
/prod/oracle/oradata/DGDBST/sysaux01.dbf
/prod/oracle/oradata/DGDBST/undotbs01.dbf
/prod/oracle/oradata/DGDBST/users01.dbf
/prod/oracle/oradata/DGDBST/example01.dbf
/prod/oracle/oradata/DGDBST/DGTSDATA.ora

/prod/oracle/product/11.2.0/db_1/dbs/UNNAMED00007  /* 当备库执行create tablespace DGTSINDX datafile '/prod/oracle/temp/DGTSINDX.ora' size 10M autoextend on next 2M maxsize 100M;出现这个不存在数据文件UNNAMED00007,下面手动重新创建DGTSINDX.ora数据文件。*/


操作步骤
DGDBST> select staus from v$instance;--这里需要在mount状态下。
DGDBST> alter system set standby_file_management=manual;
DGDBST> alter database create datafile '/prod/oracle/product/11.2.0/db_1/dbs/UNNAMED00007' as '/prod/oracle/oradata/DGDBST/DGTSINDX.ora';
DGDBST> alter system set standby_file_management=auto;
DGDBST> alter database recover managed standby database using current logfile disconnect from session;    --启动MRP
DGDBST> alter database recover managed standby database cancel;                                           --关闭MRP
DGDBST> shutdown immediate;
DGDBST> startup mount;
DGDBST> alter database open read only;                                                                   --注意read only与MRP的顺序,是在启动MRP,完成恢复,关闭MRP后再重新打开。
DGDBST> alter database recover managed standby database using current logfile disconnect from session;    --启动MRP
DGDBST> select NAME,DB_UNIQUE_NAME,OPEN_MODE,DATABASE_ROLE,PROTECTION_MODE,PROTECTION_LEVEL,SWITCHOVER_STATUS from v$database;--查看备库状态及角色
DGDBST> select process,pid,status,thread#,group#,sequence#,delay_mins from v$managed_standby;             --查看进程状态

3,修改备库的db_file_name_convert='/prod/oracle/oradata/DGDB','/prod/oracle/oradata/DGDBST','/prod/oracle/temp','/prod/oracle/oradata/DGDBST',注意路径的前后顺序。
DGDBST> alter system set db_file_name_convert='/prod/oracle/oradata/DGDB','/prod/oracle/oradata/DGDBST','/prod/oracle/temp','/prod/oracle/oradata/DGDBST' scope=spfile;

5,重启data guard
DGDBST> alter database recover managed standby database cancel;    --关闭MRP
DGDBST> shutdown immediate;
DGDBST> startup mount;
DGDBST> alter database open read only;
DGDBST> alter database recover managed standby database using current logfile disconnect from session;    --启动MRP

一些测试SQL
create index EBST01_ID_IDX on EBST01(ID) tablespace DGTSINDX;
create index EBST02_ID_IDX on EBST02(ID) tablespace DGTSINDX;
alter tablespace DGTSINDX add datafile '/prod/oracle/temp/DGTSINDX02.ora' size 10M autoextend on next 2M maxsize 100M
<think>好的,我现在需要解决用户提出的Oracle数据库中的ORA-00604和ORA-03180错误,特别是涉及Active DataGuard备用库序列值分配的问题。首先,我需要回忆这两个错误代码的含义。ORA-00604通常表示在递归SQL层发生了错误,可能由多种原因引起,比如权限问题、对象不存在或内部错误。而ORA-03180则指出在备用数据库上无法分配序列号,这可能是因为备用库处于只读状态,无法生成新的序列值。用户提到使用的是Active DataGuard,所以备用库应该是只读的,但可能应用了实时查询功能。接下来,我需要分析问题的根源。在DataGuard环境中,备用库通常是只读的,无法执行DML操作,包括序列的递增。当应用程序错误地尝试在备用库上获取序列值时,就会触发这些错误。这可能是因为连接配置错误,导致应用连接到了备用库而不是主库,或者在主备切换后未正确调整应用配置。 解决方案方面,首先需要确保应用程序始终连接到主库执行写操作,包括序列的获取。可以通过配置TNSNAMES.ora文件,将写操作定向到主库,读操作定向到备用库。另外,检查序列的配置,确认是否使用了ORDER或NOORDER选项。在RAC环境中,NOORDER可能更高效,但在Data Guard中可能需要调整。 此外,可能需要修改应用程序逻辑,在获取序列值时显式指定连接到主库。如果问题发生在主备切换后,应验证序列的当前值是否在切换后保持一致,必要时手动同步序列。如果使用12c及以上版本,可以考虑使用Identity列代替序列,简化管理。最后,需要预防措施,比如在应用层添加检查,确保只在主库执行写操作,并定期监控序列的使用情况。如果问题持续,可能需要查看详细的日志文件,如alert.log和跟踪文件,以获取更具体的错误信息,或者联系Oracle支持。生成相关问题的时候,需要考虑用户可能的后续疑问,比如如何配置TNSNAMES实现读写分离,如何检查序列的当前值,或者在主备切换后如何避免此类问题。还要涵盖更广泛的DataGuard配置问题Oracle错误处理的一般方法。</think>### ORA-00604 和 ORA-03180 错误解决方案 #### 问题根源分析 在Oracle Active Data Guard环境中,备用库(Standby)默认处于只读模式。当应用程序尝试在备用库上执行序列(Sequence)的`NEXTVAL`操作时,会触发ORA-03180错误,并可能级联引发ORA-00604错误[^1][^2]。 #### 分步解决方案 1. **验证数据库角色** ```sql SELECT DATABASE_ROLE FROM V$DATABASE; ``` - 确保应用程序连接的是主库(PRIMARY)而非备用库(PHYSICAL STANDBY) 2. **配置连接隔离** - 在`TNSNAMES.ORA`中为读写操作单独配置主库连接别名: ``` PRIMARY_DB = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = primary_host)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = primary_service) ) ) ``` 3. **修改序列属性** - 对于需要跨节点同步的序列,添加`ORDER`属性: ```sql ALTER SEQUENCE your_sequence ORDER CACHE 20; ``` - 检查现有序列属性: ```sql SELECT SEQUENCE_NAME, ORDER_FLAG, CACHE_SIZE FROM DBA_SEQUENCES WHERE SEQUENCE_OWNER='YOUR_SCHEMA'; ``` 4. **应用层改造** ```java // 示例:Java应用中强制从主库获取序列值 @Transactional(readOnly = false) public Long getNextSequence() { return jdbcTemplate.queryForObject( "SELECT your_sequence.NEXTVAL FROM DUAL", Long.class); } ``` 5. **数据同步验证** - 在主库执行: ```sql SELECT your_sequence.CURRVAL FROM DUAL; ``` - 在备用库验证是否同步: ```sql SELECT your_sequence.CURRVAL FROM DUAL; ``` #### 高级配置方案 - **使用服务重定向**(12c+) ```sql ALTER DATABASE ADD SERVICE 'write_svc' AVAILABILITY_MAX = PERFORMANCE FAILOVER_TYPE = TRANSACTION REPLAY_INIT_TIME = 300 ROLE = PRIMARY; ``` - **启用序列代理**(18c+) ```sql ALTER SEQUENCE your_sequence PROXY FOR your_proxy_user@primary_db; ``` #### 预防措施 1. 在备用库创建触发器拦截序列操作: ```sql CREATE OR REPLACE TRIGGER block_sequence_dml BEFORE SELECT ON your_sequence DECLARE BEGIN IF SYS_CONTEXT('USERENV','DATABASE_ROLE') = 'PHYSICAL STANDBY' THEN RAISE_APPLICATION_ERROR(-20001, 'Sequence operations not allowed on standby'); END IF; END; ``` 2. 定期检查序列同步状态: ```sql SELECT DI.sequence_name, DI.current_value - SI.current_value AS diff FROM dba_sequences@primary_db DI JOIN dba_sequences SI ON DI.sequence_name = SI.sequence_name WHERE DI.sequence_owner = 'YOUR_SCHEMA'; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值