重建控制文件--alter database backup controlfile to trace

Oracle提供两种方式备份控制文件:
1.生成可以重建控制文件的脚本
2.备份二进制的控制文件
我们看一下如何获得可以重建控制文件的脚本.
Oracle提供如下命令:
alter database backup controlfile to trace;

实际操作:
[oracle@standby tools]$ sqlplus "/ as sysdba"
SQL> alter database backup controlfile to trace;
Database altered.
SQL> select d.value||b.bias||lower(rtrim(i.instance, chr(0)))||'_ora_'||p.spid||'.trc' trace_file_name from ( select p.spid from sys.v$mystat m,sys.v$session s,sys.v$process p where m.statistic# = 1 and s.sid = m.sid and p.addr = s.paddr) p, ( select t.instance from sys.v$thread t,sys.v$parameter v where v.name = 'thread' and (v.value = 0 or t.thread# = to_number(v.value))) i, ( select value from sys.v$parameter where name = 'user_dump_dest') d,(select DECODE(count(BANNER),0,'/','\') bias from v$version where upper(banner) like '%WINDOWS%') b;
TRACE_FILE_NAME
--------------------------------------------------------------------------------
/opt/oracle/admin/primary/udump/primary_ora_2135.trc
       
trace文件内容:
[oracle@standby tools]$ more /opt/oracle/admin/primary/udump/primary_ora_2135.trc
/opt/oracle/admin/primary/udump/primary_ora_2135.trc
Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
With the Partitioning option
JServer Release 9.2.0.4.0 - Production
ORACLE_HOME = /opt/oracle/product/9.2.0
System name:     Linux
Node name:       standby
Release:         2.4.21-4.EL
Version:         #1 Fri Oct 3 18:13:58 EDT 2003
Machine:         i686
Instance name: primary
Redo thread mounted by this instance: 1
Oracle process number: 12
Unix process pid: 2135, image: oracle@standby (TNS V1-V3)
*** SESSION ID:(11.6) 2004-10-16 09:00:03.830
*** 2004-10-16 09:00:03.830
# The following are current System-scope REDO Log Archival related
# parameters and can be included in the database initialization file.
#
# LOG_ARCHIVE_DEST=''
# LOG_ARCHIVE_DUPLEX_DEST=''
#
# LOG_ARCHIVE_FORMAT=%t_%s.dbf
# REMOTE_ARCHIVE_ENABLE=TRUE
# LOG_ARCHIVE_START=TRUE
# LOG_ARCHIVE_MAX_PROCESSES=2
# STANDBY_FILE_MANAGEMENT=MANUAL
# STANDBY_ARCHIVE_DEST=?/dbs/arch
# FAL_CLIENT=''
# FAL_SERVER=''
#
# LOG_ARCHIVE_DEST_1='LOCATION=/opt/oracle/oradata/primary/archive'
# LOG_ARCHIVE_DEST_1='OPTIONAL REOPEN=300 NODELAY'
# LOG_ARCHIVE_DEST_1='ARCH NOAFFIRM SYNC'
# LOG_ARCHIVE_DEST_1='REGISTER NOALTERNATE NODEPENDENCY'
# LOG_ARCHIVE_DEST_1='NOMAX_FAILURE NOQUOTA_SIZE NOQUOTA_USED'
# LOG_ARCHIVE_DEST_STATE_1=ENABLE
#
# Below are two sets of SQL statements, each of which creates a new
# control file and uses it to open the database. The first set opens
# the database with the NORESETLOGS option and should be used only if
# the current versions of all online logs are available. The second
# set opens the database with the RESETLOGS option and should be used
# if online logs are unavailable.
# The appropriate set of statements can be copied from the trace into
# a script file, edited as necessary, and executed when there is a
# need to re-create the control file.
#
#      Set #1. NORESETLOGS case
#
# The following commands will create a new control file and use it
# to open the database.
# Data used by the recovery manager will be lost. Additional logs may
# be required for media recovery of offline data files. Use this
# only if the current version of all online logs are available.
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "PRIMARY" NORESETLOGS   ARCHIVELOG
--   SET STANDBY TO MAXIMIZE PERFORMANCE
     MAXLOGFILES 5
     MAXLOGMEMBERS 3
     MAXDATAFILES 100
     MAXINSTANCES 1
     MAXLOGHISTORY 226
LOGFILE
   GROUP 1 '/opt/oracle/oradata/primary/redo01.log'   SIZE 10M,
   GROUP 2 '/opt/oracle/oradata/primary/redo02.log'   SIZE 10M,
   GROUP 3 '/opt/oracle/oradata/primary/redo03.log'   SIZE 10M
-- STANDBY LOGFILE
DATAFILE
   '/opt/oracle/oradata/primary/system01.dbf',
   '/opt/oracle/oradata/primary/undotbs01.dbf',
   '/opt/oracle/oradata/primary/users01.dbf'
CHARACTER SET ZHS16GBK
;
# Recovery is required if any of the datafiles are restored backups,
# or if the last shutdown was not normal or immediate.
RECOVER DATABASE
# All logs need archiving and a log switch is needed.
ALTER SYSTEM ARCHIVE LOG ALL;
# Database can now be opened normally.
ALTER DATABASE OPEN;
# Commands to add tempfiles to temporary tablespaces.
# Online tempfiles have complete space information.
# Other tempfiles may require adjustment.
ALTER TABLESPACE TEMP ADD TEMPFILE '/opt/oracle/oradata/primary/temp01.dbf'
      SIZE 41943040   REUSE AUTOEXTEND ON NEXT 655360   MAXSIZE 32767M;
# End of tempfile additions.
#
#      Set #2. RESETLOGS case
#
# The following commands will create a new control file and use it
# to open the database.
# The contents of online logs will be lost and all backups will
# be invalidated. Use this only if online logs are damaged.
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "PRIMARY" RESETLOGS   ARCHIVELOG
--   SET STANDBY TO MAXIMIZE PERFORMANCE
     MAXLOGFILES 5
     MAXLOGMEMBERS 3
     MAXDATAFILES 100
     MAXINSTANCES 1
     MAXLOGHISTORY 226
LOGFILE
   GROUP 1 '/opt/oracle/oradata/primary/redo01.log'   SIZE 10M,
   GROUP 2 '/opt/oracle/oradata/primary/redo02.log'   SIZE 10M,
   GROUP 3 '/opt/oracle/oradata/primary/redo03.log'   SIZE 10M
-- STANDBY LOGFILE
DATAFILE
   '/opt/oracle/oradata/primary/system01.dbf',
   '/opt/oracle/oradata/primary/undotbs01.dbf',
   '/opt/oracle/oradata/primary/users01.dbf'
CHARACTER SET ZHS16GBK
;
# Recovery is required if any of the datafiles are restored backups,
# or if the last shutdown was not normal or immediate.
RECOVER DATABASE USING BACKUP CONTROLFILE
# Database can now be opened zeroing the online logs.
ALTER DATABASE OPEN RESETLOGS;
# Commands to add tempfiles to temporary tablespaces.
# Online tempfiles have complete space information.
# Other tempfiles may require adjustment.
ALTER TABLESPACE TEMP ADD TEMPFILE '/opt/oracle/oradata/primary/temp01.dbf'
      SIZE 41943040   REUSE AUTOEXTEND ON NEXT 655360   MAXSIZE 32767M;
# End of tempfile additions.
#
      
编辑这个trace文件,我们就可以获得创建控制文件的脚本.
根据数据库不同状况,你可以选择是使用RESETLOGS/NORESETLOGS来重建控制文件.
我们获得以下脚本:
[oracle@standby tools]$ cat createctlf.sql
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "PRIMARY" NORESETLOGS   ARCHIVELOG
--   SET STANDBY TO MAXIMIZE PERFORMANCE
     MAXLOGFILES 5
     MAXLOGMEMBERS 3
     MAXDATAFILES 100
     MAXINSTANCES 1
     MAXLOGHISTORY 226
LOGFILE
   GROUP 1 '/opt/oracle/oradata/primary/redo01.log'   SIZE 10M,
   GROUP 2 '/opt/oracle/oradata/primary/redo02.log'   SIZE 10M,
   GROUP 3 '/opt/oracle/oradata/primary/redo03.log'   SIZE 10M
-- STANDBY LOGFILE
DATAFILE
   '/opt/oracle/oradata/primary/system01.dbf',
   '/opt/oracle/oradata/primary/undotbs01.dbf',
   '/opt/oracle/oradata/primary/users01.dbf'
CHARACTER SET ZHS16GBK
;
RECOVER DATABASE
ALTER SYSTEM ARCHIVE LOG ALL;
ALTER DATABASE OPEN;
ALTER TABLESPACE TEMP ADD TEMPFILE '/opt/oracle/oradata/primary/temp01.dbf'
      SIZE 41943040   REUSE AUTOEXTEND ON NEXT 655360   MAXSIZE 32767M;      
                      
运行这个脚本即可重建控制文件:
[oracle@standby tools]$ sqlplus "/ as sysdba"
SQL*Plus: Release 9.2.0.4.0 - Production on Sat Oct 16 09:20:24 2004
Copyright (c) 1982, 2002, Oracle Corporation.   All rights reserved.
Connected to an idle instance.
SQL> set echo on
SQL> @createctlf
SQL> STARTUP NOMOUNT
ORACLE instance started.
Total System Global Area   135337420 bytes
Fixed Size                    452044 bytes
Variable Size              109051904 bytes
Database Buffers            25165824 bytes
Redo Buffers                  667648 bytes
SQL> CREATE CONTROLFILE REUSE DATABASE "PRIMARY" NORESETLOGS   ARCHIVELOG
   2   --   SET STANDBY TO MAXIMIZE PERFORMANCE
   3       MAXLOGFILES 5
   4       MAXLOGMEMBERS 3
   5       MAXDATAFILES 100
   6       MAXINSTANCES 1
   7       MAXLOGHISTORY 226
   8   LOGFILE
   9     GROUP 1 '/opt/oracle/oradata/primary/redo01.log'   SIZE 10M,
10     GROUP 2 '/opt/oracle/oradata/primary/redo02.log'   SIZE 10M,
11     GROUP 3 '/opt/oracle/oradata/primary/redo03.log'   SIZE 10M
12   -- STANDBY LOGFILE
13   DATAFILE
14     '/opt/oracle/oradata/primary/system01.dbf',
15     '/opt/oracle/oradata/primary/undotbs01.dbf',
16     '/opt/oracle/oradata/primary/users01.dbf'
17   CHARACTER SET ZHS16GBK
18   ;
Control file created.
SQL> RECOVER DATABASE
ORA-00283: recovery session canceled due to errors
ORA-00264: no recovery required
SQL> ALTER SYSTEM ARCHIVE LOG ALL;
System altered.
SQL> ALTER DATABASE OPEN;
Database altered.
SQL> ALTER TABLESPACE TEMP ADD TEMPFILE '/opt/oracle/oradata/primary/temp01.dbf'
   2        SIZE 41943040   REUSE AUTOEXTEND ON NEXT 655360   MAXSIZE 32767M;

<think>好的,我现在需要处理用户关于在Oracle数据库中执行ALTER DATABASE MOUNT时遇到ORA-00659错误的问题。首先,我需要回忆一下ORA-00659错误的常见原因。这个错误通常与控制文件相关,比如控制文件无法访问、损坏或者配置不正确。 用户之前已经询问过在创建SPFILE后无法挂载数据库的问题,现在又遇到了具体的错误代码,所以我应该结合之前的回答,进一步细化解决方案。首先,我需要确认用户是否按照之前的步骤检查过警报日志,因为警报日志中的详细信息是诊断问题的关键。 接下来,用户提到错误发生在执行ALTER DATABASE MOUNT时,这可能意味着实例已经启动到NOMOUNT状态,但挂载数据库时失败。这时候控制文件的问题可能性最大。我需要考虑控制文件的路径是否正确,权限是否足够,文件是否存在,或者是否损坏。 另外,用户之前执行了CREATE SPFILE FROM MEMORY,可能导致参数文件中的控制文件路径不正确,或者内存中的参数与控制文件的实际位置不匹配。因此,可能需要检查SPFILE中的control_files参数是否正确,是否指向了有效的控制文件。 还可能存在的情况是控制文件本身损坏,或者存储控制文件的磁盘空间不足,或者权限问题导致Oracle进程无法访问这些文件。此外,如果控制文件是镜像的,可能部分副本损坏,而Oracle尝试访问这些损坏的副本。 我需要建议用户检查警报日志,确认具体的错误信息,然后根据日志中的提示进行相应的处理。比如,如果日志显示无法找到控制文件,则需要验证control_files参数的值,并确保文件存在。如果文件存在但权限不对,需要调整权限。如果是控制文件损坏,可能需要从备份恢复,或者重建控制文件。 此外,用户可能需要使用PFILE启动实例,绕过SPFILE,以排除参数文件的问题。如果通过PFILE能够成功挂载数据库,那么问题可能出在SPFILE的参数配置上,需要重新生成SPFILE。 如果控制文件全部丢失且没有备份,用户可能需要通过CREATE CONTROLFILE命令重建控制文件,这需要用户了解数据库的结构,如数据文件、日志文件的位置等信息,因此在操作前需要确保这些信息是可用的。 最后,需要提醒用户在进行任何修复操作前备份现有文件,避免数据丢失,并建议在操作困难时联系Oracle支持。</think>以下是针对 **ORA-00659** 错误(在执行 `ALTER DATABASE MOUNT` 时触发)的逐步解决方案: --- ### **1. 错误背景分析** - **ORA-00659** 表示数据库无法找到或访问控制文件(Control File)。常见原因包括: - 控制文件路径配置错误(`control_files` 参数不正确)。 - 控制文件被删除、损坏或权限不足。 - 存储控制文件的磁盘空间不足或I/O故障。 --- ### **2. 检查警报日志 (Alert Log)** - **步骤**: 1. 定位警报日志路径: ```sql SELECT value FROM v$diag_info WHERE name = 'Diag Trace'; ``` 文件名为 `alert_<SID>.log`。 2. 搜索 `ORA-00659` 相关条目,确认具体错误描述(例如找不到文件、权限拒绝等)。 --- ### **3. 验证控制文件路径** - **关键操作**: 1. 检查当前参数 `control_files` 配置: ```sql SHOW PARAMETER control_files; ``` 2. 确认操作系统路径是否存在且权限正确: ```bash # 示例:检查控制文件是否存在及权限 ls -l /u01/app/oracle/oradata/ORCL/control01.ctl ``` 3. **权限修复**(如有必要): ```bash chown oracle:dba /path/to/controlfile.ctl chmod 660 /path/to/controlfile.ctl ``` --- ### **4. 尝试通过PFILE启动** - **适用场景**:SPFILE参数错误导致路径配置异常。 - **步骤**: 1. 创建PFILE(若已有SPFILE): ```sql CREATE PFILE='/tmp/init_temp.ora' FROM SPFILE; ``` 2. 手动编辑PFILE,修正 `control_files` 路径为实际有效路径。 3. 使用PFILE启动到 `NOMOUNT` 状态: ```sql STARTUP NOMOUNT PFILE='/tmp/init_temp.ora'; ``` 4. 尝试挂载数据库: ```sql ALTER DATABASE MOUNT; ``` --- ### **5. 恢复控制文件** - **场景**:控制文件丢失或损坏。 - **情况1:存在有效备份** 从RMAN备份恢复控制文件: ```sql RMAN> RESTORE CONTROLFILE FROM '/backup/controlfile.bkp'; RMAN> ALTER DATABASE MOUNT; ``` - **情况2:无备份但数据库未崩溃** 通过其他副本恢复(若配置了多路复用): ```bash cp /path/to/controlfile_copy.ctl /path/to/missing_controlfile.ctl ``` - **情况3:无备份且所有控制文件丢失** 必须重建控制文件(需提前记录数据库结构): ```sql CREATE CONTROLFILE REUSE DATABASE "ORCL" RESETLOGS MAXLOGFILES 16 MAXLOGMEMBERS 3 MAXDATAFILES 100 MAXINSTANCES 8 MAXLOGHISTORY 292 LOGFILE GROUP 1 '/u01/app/oracle/oradata/ORCL/redo01.log' SIZE 50M, GROUP 2 '/u01/app/oracle/oradata/ORCL/redo02.log' SIZE 50M DATAFILE '/u01/app/oracle/oradata/ORCL/system01.dbf', '/u01/app/oracle/oradata/ORCL/sysaux01.dbf' CHARACTER SET AL32UTF8; ``` --- ### **6. 检查存储状态** - **可能问题**:磁盘空间不足或硬件故障。 - 检查控制文件所在磁盘空间: ```bash df -h /path/to/controlfile_directory ``` - 检查I/O错误日志(操作系统级): ```bash dmesg | grep -i error ``` --- ### **7. 重建SPFILE(若参数修正有效)** - **步骤**: 1. 若通过PFILE成功挂载数据库,重新生成SPFILE: ```sql CREATE SPFILE FROM PFILE='/tmp/init_temp.ora'; ``` 2. 重启数据库验证: ```sql SHUTDOWN IMMEDIATE; STARTUP; ``` --- ### **注意事项** - **备份优先**:操作前备份所有控制文件及参数文件- **多路复用控制文件**:建议至少配置2个控制文件副本,避免单点故障。 - **日志分析**:警报日志中的时间戳和错误链是诊断关键。 若仍无法解决,请提供警报日志中的完整错误上下文或联系Oracle支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值