MENU

ORACAL数据库恢复备忘

February 12, 2026 • 默认分类,学习

0. 确认基础环境

opatch lspatches

配置库SID的环境变量 ORACLE_SID,并确认好所有ORACLE相关的环境变量是否完备。

1. 查看备份集信息

/usr/openv/netbackup/bin/bplist -C ${NB_ORA_CLIENT} -t 4 -l -R / | more

大概的输出是这样的

-rw-rw---- oracle    asmadmin    57591552K Mar 23 08:20 /al_93480_1_1067934020
-rw-rw---- oracle    asmadmin    373293056 Mar 22 17:37 /c-827387878-20210322-03
-rw-rw---- oracle    asmadmin    373293056 Mar 22 17:36 /cntrl_93478_1_1067880993

其中

c-开头:包含控制文件,spfile文件;cntrl_开头:控制文件的备份集,一般以最新的备份集为准

2. 启动参数文件

  • 从源库拷一份pfile,用作后续步骤的启动参数,必要时可与生产库的pfile对比,确认关键配置,如:
*.db_name='XXXXDB'
*.db_unique_name='XXXXDB_1'
*.enable_pluggable_database=TRUE
*.dispatchers='(PROTOCOL=TCP) (SERVICE=XXXXDB)'
  • 若没有能拷贝的pfile,也可以从备份恢复,在RMAN执行。(没操作过,不是很推荐)

RMAN执行

run {
  allocate channel ch01 TYPE 'SBT_TAPE';
  SEND 'NB_ORA_CLIENT={客户端名}, NB_ORA_SERV={服务器名}';
  restore spfile to pfile '/home/oracle/xxxxxx.ora' from '/c-827387878-20210322-03';
  release channel ch01;
}
exit;

4. 测试到备份机的连接

测试到备份库的链接,进rman操作 rman target /,可指定操作日志输出到rman target / log=xxxxxx

---测试连接
run {
  allocate channel ch01 TYPE 'SBT_TAPE';
  SEND 'NB_ORA_CLIENT={客户端名}, NB_ORA_SERV={服务器名}';
  release channel ch01;
}
exit;

5. 启动到 NOMOUNT 状态

有了pfile,数据库可以进nomount模式。这步操作前,再次检查ORACLE_SID,避免操作错误的数据库。

进到 SqlPlus sqlplus / as sysdba

  startup nomount pfile='/home/oracle/xxxxxx'
  -- 启动成功后,可以立刻创建spfile,便于后续启动
  create spfile from memory;

6. 恢复控制文件

回RMAN继续恢复控制文件,控制文件路径要根据pfile里的内容进行调整,执行多次。

run {
allocate channel ch01 type 'sbt_tape';
    SEND 'NB_ORA_CLIENT={客户端名}, NB_ORA_SERV={服务器名}';
    restore controlfile to '/data/CORIS/controlfile/control01.ctl' from '/cntrl_296329_1_1223116563';
    sql "alter database mount";
release channel ch01;
}

请注意,如果这一步pfile中未指定 *.enable_pluggable_database=TRUE ,启动时会出现报错。虽然数据库会切换到mount模式,但这是不正确的。

此时数据库进mount模式

alter database mount; 

7. restore+recover脚本

#!/bin/bash

set -e

ORACLE_SID=XXCDBECC_OMS
TIMESTAMP=$(date '+%Y.%m.%d.%H.%M%S')
NB_ORA_CLIENT=XXXXXX
NB_ORA_SERV=XXXXX

file_path=`readlink -f $0`
dir_path=`dirname $file_path`

rman target /  log=${dir_path}/${ORACLE_SID}_restore_${TIMESTAMP}.log << EOF
run {
allocate channel ch01 type 'sbt_tape';
allocate channel ch02 type 'sbt_tape';
allocate channel ch03 type 'sbt_tape';
allocate channel ch04 type 'sbt_tape';

SEND 'NB_ORA_CLIENT=${NB_ORA_CLIENT}, NB_ORA_SERV=${NB_ORA_SERV}';

# 使用ASM管理的机器不需要这一步
SET NEWNAME FOR DATABASE TO '/database/${ORACLE_SID}/datafile/%b';

# 改为这一步
SET NEWNAME FOR DATABASE TO NEW;
# 这一步其实依赖数据库参数 db_create_file_dest 可以在数据库mount后用SQL设置: 
# alter system set db_create_file_dest='+DATA01' scope=both;

restore database;

release channel ch01;
release channel ch02;
release channel ch03;
release channel ch04;
}
exit;
EOF

rman target /  log=${dir_path}/${ORACLE_SID}_recover_${TIMESTAMP}.log << EOF
run {
allocate channel ch01 type 'sbt_tape';
allocate channel ch02 type 'sbt_tape';
allocate channel ch03 type 'sbt_tape';
allocate channel ch04 type 'sbt_tape';

SEND 'NB_ORA_CLIENT=${NB_ORA_CLIENT}, NB_ORA_SERV=${NB_ORA_SERV}';
       
recover database;

release channel ch01;
release channel ch02;
release channel ch03;
release channel ch04;
}
exit;
EOF

8. 打开数据库

确认SCN,并以resetlogs方式打开数据库,在SQLPLUS操作

select file#,to_char(checkpoint_change#) from v$datafile where rownum<2;

select file#, to_char(checkpoint_change#) from v$datafile_header where status ='ONLINE';

alter database open resetlogs;

8. 确认状态

查看tempfile、logfile,SQL操作

select name from v$tempfile;
select member from v$logfile;    

9. RAC备份到单机恢复的一些问题

由于RAC机架模式会有多个节点在运行,控制文件记录了其他节点的信息。所以在开库的时候会出现

alter database open resetlogs 
* 
ERROR at line 1: ORA-00392: log 23 of thread 3 is being cleared, operation not allowed 
ORA-00312: online log 23 thread 3: '+DATAC1' 
ORA-00312: online log 23 thread 3: '+RECOC1'

--- 开库时还会出现一种情况

> alter database open resetlogs;
ORA-01139: RESETLOGS option only valid after an incomplete database recovery
--- 进而使用 
> alter database open;

ORA-19751: could not create the change tracking file
ORA-19750: change tracking file: '+DATAC1/XXXXX/CHANGETRACKING/ctf.4393.1083626395'
ORA-17502: ksfdcre:1 Failed to create file +DATAC1/XXXXX/CHANGETRACKING/ctf.4393.1083626395
ORA-17501: logical block size 4294967295 is invalid
ORA-29701: unable to connect to Cluster Synchronization Service
ORA-17503: ksfdopn:2 Failed to open file +DATAC1/XXXXX/CHANGETRACKING/ctf.4393.1083626395
ORA-15001: diskgroup "DATAC1" does not exist or is not mounted
ORA-15374: invalid cluster configuration

显而易见也是因为RAC环境到单机的问题。切换一下位置

ALTER DATABASE DISABLE BLOCK CHANGE TRACKING;
ALTER DATABASE ENABLE BLOCK CHANGE TRACKING USING FILE '/database/XXXXX/ctf.ora';

9. RAC备份到单机恢复logfile的占用问题

但一般来说我们恢复时不考虑redo日志,所以首先查看redo日志记录情况。

select * from v$logfile;

    GROUP# TYPE                  MEMBER                                            
---------- --------------------- --------------------------------------------------
         1 ONLINE                /database/XXXXX/onlinelog/o1_mf_1_nrxfog0x_.log   
         2 ONLINE                /database/XXXXX/onlinelog/o1_mf_2_nrxfokbk_.log   
         3 ONLINE                /database/XXXXX/onlinelog/o1_mf_3_nrxfonh3_.log   
         4 ONLINE                /database/XXXXX/onlinelog/o1_mf_4_nrxfoqjp_.log   
         5 ONLINE                /database/XXXXX/onlinelog/o1_mf_5_nrxfotjk_.log   
         6 ONLINE                /database/XXXXX/onlinelog/o1_mf_6_nrxfoxg7_.log   
         7 ONLINE                /database/XXXXX/onlinelog/o1_mf_7_nrxfp0fq_.log   
        21 ONLINE                /database/XXXXX/onlinelog/o1_mf_21_nrxgo7z2_.log  
        22 ONLINE                /database/XXXXX/onlinelog/o1_mf_22_nrxgog1q_.log  
        32 ONLINE                /database/XXXXX/onlinelog/o1_mf_32_nrxgs4kw_.log  
        23 ONLINE                /database/XXXXX/onlinelog/o1_mf_23_nrxh71f5_.log  
        31 ONLINE                /database/XXXXX/onlinelog/o1_mf_31_nrxh78gn_.log  
        34 ONLINE                /database/XXXXX/onlinelog/o1_mf_34_nrxh83kl_.log  


select * from v$log;


    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARCHIVED  STATUS         
---------- ---------- ---------- ---------- ---------- ---------- --------- ---------------
         1          1          1 4294967296        512          1 YES       INACTIVE       
         2          1          2 4294967296        512          1 YES       INACTIVE       
         3          1          3 4294967296        512          1 NO        CURRENT        
         4          1          0 4294967296        512          1 YES       UNUSED         
         5          1          0 4294967296        512          1 YES       UNUSED         
         6          1          0 4294967296        512          1 YES       UNUSED         
         7          1          0 4294967296        512          1 YES       UNUSED         
        21          2          0 4294967296        512          1 YES       UNUSED         
        22          2          0 4294967296        512          1 YES       UNUSED         
        23          3          0 4294967296       4096          1 YES       UNUSED         
        31          4          0 4294967296       4096          1 YES       UNUSED         
        32          3          0 4294967296        512          1 YES       UNUSED         
        34          4          0 4294967296       4096          1 YES       UNUSED         

这里的示例是已经是做了一些操作了:如果log位置还在ASM位置上的,需要做重建。
状态在CLEANING、CLEARING_CURRENT的,需要做处理。
最终目标是,只留Thread = 1的,其他要删掉。
部分操作是在open状态下执行的


alter database clear unarchived logfile group 21; -- 将 CLEANING、CLEARING_CURRENT 打回 UNUSED
alter database drop logfile group 1;  -- 一般来说至少一个线程要有2个Group。所以删掉最后肯定删不掉。

--- 重建logfile到指定位置 RAC的blocksize为4K,单节点VM环境使用512.
--- 这一步也可以不指定位置,那么会自动根据parameter中的参数做创建。
alter database add logfile thread 1 group 4 ('/database') size 4096M blocksize 512;

alter system switch logfile; -- 切换CURRENT logfile

--- 禁用Thread,便于后续drop
alter database disable thread 2;

10. 锁用户

--- 把查出来拼接好的语句再执行一次。
SELECT 'alter user ' || U.USERNAME || ' account lock;'
  FROM DBA_USERS U
WHERE U.ACCOUNT_STATUS != 'LOCKED'
   AND U.DEFAULT_TABLESPACE NOT IN
       ('SYSAUX', 'SYSTEM', 'USERS', 'MONITOR', 'SPA')
   AND U.USERNAME NOT IN ('SPA')
ORDER BY 1;

即日起视情况关闭全站评论区,您可以通过关于页面的电邮地址和我取得联系,谢谢

Last Modified: February 13, 2026
Archives QR Code
QR Code for this page
Tipping QR Code