oracle database recover database (下篇)

1. recover database

恢复级别一共三个:recover database > recover tablespace > recover datafile ,最高级别 database 已经包含了 tablespace 和 datafile 两个级别。

 

 目录

1. 概念解释

2. 情况说明

3. 实验过程

  3.1 备份 CDB

  3.2 PDBPROD1 创建测试数据

  3.3 删除 CDB 控制文件

  3.4 还原 CDB 控制文件

  3.5 恢复 CDB 控制文件

  3.6 开启 CDB

 

1. 概念解释

  首先你得知道,recover database 这个命令是用作对所有数据文件进行恢复的,而且是完全恢复

  有个细节注意下,这个命令分为两种,一种用在 SQL 命令行一种用在 RMAN

  SQL > recover database 仅对所有数据文件进行完全恢复,前提是控制文件为当前最新状态不可以是还原过来的老版本或是手工重建,否则 SQL 命令行执行将返回错误

  RMAN > recover database 对所有数据文件和控制文件进行完全恢复

  本例中演示对控制文件的恢复将(数据文件、归档日志、联机日志完好无损的情况下

 

2. 情况说明

  当前系统中,数据文件、归档日志、联机日志都完好无损,删除 CDB 级别所有控制文件,并采用 RMAN 对控制文件进行单独还原,使用 recover database 进行完全恢复。

 

3. 实验过程

3.1 备份 CDB

略,参考上篇

3.2 PDBPROD1 创建测试数据

查看 PDBPROD1 当前表空间及对应数据文件

[oracle@host01 trace]$ rman target sys/oracle@pdbprod1

Recovery Manager: Release 12.1.0.2.0 - Production on Fri Dec 1 14:37:15 2023

Copyright (c) 1982, 2014, Oracle and/or its affiliates.  All rights reserved.

connected to target database: PRODCDB (DBID=2891862819)

RMAN> report schema;

using target database control file instead of recovery catalog
Report of database schema for database with db_unique_name PRODCDB

List of Permanent Datafiles
===========================
File Size(MB) Tablespace           RB segs Datafile Name
---- -------- -------------------- ------- ------------------------
7    280      SYSTEM               NO      /u01/app/oracle/oradata/PRODCDB/PDBPROD1/system01.dbf
8    615      SYSAUX               NO      /u01/app/oracle/oradata/PRODCDB/PDBPROD1/sysaux01.dbf
9    5        USERS                NO      /u01/app/oracle/oradata/PRODCDB/PDBPROD1/PDBPROD1_users01.dbf
13   321      EXAMPLE              NO      /u01/app/oracle/oradata/PRODCDB/PDBPROD1/example01.dbf
14   1        GAO                  NO      /u01/app/oracle/oradata/PRODCDB/PDBPROD1/gao.dbf
List of Temporary Files
======================= File Size(MB) Tablespace Maxsize(MB) Tempfile Name ---- -------- -------------------- ----------- -------------------- 3 20 TEMP 32767 /u01/app/oracle/oradata/PRODCDB/PDBPROD1/temp01.dbf RMAN>

创建新的表空间recover_rman

SYS@pdbprod1> create tablespace recover_rman datafile '/u01/app/oracle/oradata/PRODCDB/PDBPROD1/recover_rman.dbf' size 1m;

Tablespace created.

 

注意:新的表空间结构,没有在备份的数据文件和控制文件里面。

3.3 删除 CDB 控制文件

[oracle@host01 PRODCDB]$ cdb
[oracle@host01 PRODCDB]$ sql

SQL*Plus: Release 12.1.0.2.0 Production on Fri Dec 1 16:53:33 2023

Copyright (c) 1982, 2014, Oracle.  All rights reserved.


Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, Oracle Label Security, OLAP, Advanced Analytics
and Real Application Testing options

SYS@PRODCDB> select name from v$controlfile;

NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/PRODCDB/control01.ctl
/u01/app/oracle/fast_recovery_area/PRODCDB/control02.ctl

SYS@PRODCDB> !rm -rf /u01/app/oracle/oradata/PRODCDB/control01.ctl

SYS@PRODCDB> !rm -rf /u01/app/oracle/fast_recovery_area/PRODCDB/control02.ctl

SYS@PRODCDB> 

重启 CDB ,报错

SYS@PRODCDB> shut immediate;
ORA-00210: cannot open the specified control file
ORA-00202: control file: '/u01/app/oracle/oradata/PRODCDB/control01.ctl'
ORA-27041: unable to open file
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3
SYS@PRODCDB> shut abort;
ORACLE instance shut down.
SYS@PRODCDB> 
SYS@PRODCDB> startup force;
ORACLE instance started.

Total System Global Area  838860800 bytes
Fixed Size            2929936 bytes
Variable Size          570428144 bytes
Database Buffers      260046848 bytes
Redo Buffers            5455872 bytes
ORA-00205: error in identifying control file, check alert log for more info

3.4 还原 CDB 控制文件

[oracle@host01 PRODCDB]$ rman target /

Recovery Manager: Release 12.1.0.2.0 - Production on Fri Dec 1 16:58:36 2023

Copyright (c) 1982, 2014, Oracle and/or its affiliates.  All rights reserved.

connected to target database: PRODCDB (not mounted)


RMAN> restore controlfile from tag='full_backup';

Starting restore at 01-DEC-23
using channel ORA_DISK_1

RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of restore command at 12/01/2023 17:00:55
RMAN-06563: control file or SPFILE must be restored using FROM AUTOBACKUP

RMAN> restore controlfile from '/u01/app/oracle/fast_recovery_area/PRODCDB/autobackup/2023_12_01/o1_mf_s_1154433616_lplpljkm_.bkp';

Starting restore at 01-DEC-23
using channel ORA_DISK_1

channel ORA_DISK_1: restoring control file
channel ORA_DISK_1: restore complete, elapsed time: 00:00:01
output file name=/u01/app/oracle/oradata/PRODCDB/control01.ctl
output file name=/u01/app/oracle/fast_recovery_area/PRODCDB/control02.ctl
Finished restore at 01-DEC-23

RMAN> alter database mount;

Statement processed
released channel: ORA_DISK_1

RMAN> 

这时查控制文件中记录的数据文件(v$datafile 动态性能视图数据来自控制文件

SYS@PRODCDB> set pagesize 50;
SYS@PRODCDB>  select name from v$datafile;

NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/PRODCDB/system01.dbf
/u01/app/oracle/oradata/PRODCDB/pdbseed/system01.dbf
/u01/app/oracle/oradata/PRODCDB/sysaux01.dbf
/u01/app/oracle/oradata/PRODCDB/pdbseed/sysaux01.dbf
/u01/app/oracle/oradata/PRODCDB/undotbs01.dbf
/u01/app/oracle/oradata/PRODCDB/users01.dbf
/u01/app/oracle/oradata/PRODCDB/PDBPROD1/system01.dbf
/u01/app/oracle/oradata/PRODCDB/PDBPROD1/sysaux01.dbf
/u01/app/oracle/oradata/PRODCDB/PDBPROD1/PDBPROD1_users01.dbf
/u01/app/oracle/oradata/PRODCDB/PDBPROD2/system01.dbf
/u01/app/oracle/oradata/PRODCDB/PDBPROD2/sysaux01.dbf
/u01/app/oracle/oradata/PRODCDB/PDBPROD2/PDBPROD2_users01.dbf
/u01/app/oracle/oradata/PRODCDB/PDBPROD1/example01.dbf
/u01/app/oracle/oradata/PRODCDB/PDBPROD1/gao.dbf

14 rows selected.

恢复出来的控制文件中,是没有记录表空间 recover_rman

3.5 恢复 CDB 控制文件

使用 recover database 恢复数据库

RMAN> recover database;

Starting recover at 01-DEC-23
Starting implicit crosscheck backup at 01-DEC-23
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=12 device type=DISK
Crosschecked 4 objects
Finished implicit crosscheck backup at 01-DEC-23

Starting implicit crosscheck copy at 01-DEC-23
using channel ORA_DISK_1
Finished implicit crosscheck copy at 01-DEC-23

searching for all files in the recovery area
cataloging files...
cataloging done

List of Cataloged Files
=======================
File Name: /u01/app/oracle/fast_recovery_area/PRODCDB/archivelog/2023_12_01/o1_mf_1_162_lplt479s_.arc
File Name: /u01/app/oracle/fast_recovery_area/PRODCDB/autobackup/2023_12_01/o1_mf_s_1154433616_lplpljkm_.bkp

using channel ORA_DISK_1

starting media recovery

archived log for thread 1 with sequence 162 is already on disk as file /u01/app/oracle/fast_recovery_area/PRODCDB/archivelog/2023_12_01/o1_mf_1_162_lplt479s_.arc
archived log for thread 1 with sequence 163 is already on disk as file /u01/app/oracle/oradata/PRODCDB/redo01.log
archived log file name=/u01/app/oracle/fast_recovery_area/PRODCDB/archivelog/2023_12_01/o1_mf_1_162_lplt479s_.arc thread=1 sequence=162
archived log file name=/u01/app/oracle/oradata/PRODCDB/redo01.log thread=1 sequence=163
creating datafile file number=15 name=/u01/app/oracle/oradata/PRODCDB/PDBPROD1/recover_rman.dbf
archived log file name=/u01/app/oracle/oradata/PRODCDB/redo01.log thread=1 sequence=163
media recovery complete, elapsed time: 00:00:01
Finished recover at 01-DEC-23

RMAN> 

请注意倒数第6 行:creating datafile file number=14 name=/u01/app/oracle/oradata/PRODCDB/PDBPROD1/recover_rman01.dbf

完全恢复命令自动在控制文件中创建添加了 recover_rman 数据文件

再次查控制文件中记录的数据文件

SYS@PRODCDB>  select name from v$datafile;

NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/PRODCDB/system01.dbf
/u01/app/oracle/oradata/PRODCDB/pdbseed/system01.dbf
/u01/app/oracle/oradata/PRODCDB/sysaux01.dbf
/u01/app/oracle/oradata/PRODCDB/pdbseed/sysaux01.dbf
/u01/app/oracle/oradata/PRODCDB/undotbs01.dbf
/u01/app/oracle/oradata/PRODCDB/users01.dbf
/u01/app/oracle/oradata/PRODCDB/PDBPROD1/system01.dbf
/u01/app/oracle/oradata/PRODCDB/PDBPROD1/sysaux01.dbf
/u01/app/oracle/oradata/PRODCDB/PDBPROD1/PDBPROD1_users01.dbf
/u01/app/oracle/oradata/PRODCDB/PDBPROD2/system01.dbf
/u01/app/oracle/oradata/PRODCDB/PDBPROD2/sysaux01.dbf
/u01/app/oracle/oradata/PRODCDB/PDBPROD2/PDBPROD2_users01.dbf
/u01/app/oracle/oradata/PRODCDB/PDBPROD1/example01.dbf
/u01/app/oracle/oradata/PRODCDB/PDBPROD1/gao.dbf
/u01/app/oracle/oradata/PRODCDB/PDBPROD1/recover_rman.dbf

15 rows selected.

3.6 开启 CDB 

因为动了“控制文件”,所以,必须得以 resetlogs 方式打开,为啥?

SYS@PRODCDB> alter database open; 
alter database open
*
ERROR at line 1:
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open

SYS@PRODCDB> alter database open resetlogs;
Database altered.

你的疑问在于:recover database 语句明明是个完全恢复的动作,为何成功之后,依然需要 resetlogs ?因为 recover database 命令只能修复控制文件中数据文件的物理结构信息,无法修改控制文件中的日志序列号,无法像数据文件一样,应用归档和联机日志前滚,所以控制文件中的序列号依然是老旧的,因此,只能通过重置序列号来打开数据库。

以 resetlogs 打开之后,日志组序列号重置为 1,新的版本化身 incarnation 出现

RMAN> list incarnation;


List of Database Incarnations
DB Key  Inc Key DB Name  DB ID            STATUS  Reset SCN  Reset Time
------- ------- -------- ---------------- --- ---------- ----------
1       1       PRODCDB  2891862819       PARENT  1          22-OCT-15
2       2       PRODCDB  2891862819       CURRENT 2302159    01-DEC-23
incarnation是什么,请参考官方文档。
posted @ 2023-12-11 14:19  kfgby  阅读(64)  评论(0编辑  收藏  举报