一看就會一做就廢系列:說說 RECOVER DATABASE(下)


這里是:一看就會,一做就廢系列

數據庫演示版本為 19.3 (12.2.0.3

該系列涉及恢復過程中使用的 5 個語句:

1. recover database

2. recover database until cancel

3. recover database using backup controlfile

4. recover database until cancel using backup controlfile

5. recover database using backup controlfile until cancel

繼續之前,你得知道什么叫還原 ?什么叫恢復 ?以及備份與恢復的基礎 點我查看己亥清爽系列

恢復級別一共三個:recover database > recover tablespace > recover datafile 本系列目的是為了演示上面 5 條命令的區別與聯系,所以不探討恢復級別以及數據庫狀態對應所使用的恢復級別問題。最高級別 database 已經包含了 tablespace 和 datafile 兩個級別。

版權聲明:博客園 AskScuti 版權所有,未經允許,禁止轉載!

 目錄

1. 概念解釋

2. 情況說明

3. 實驗過程

  3.1 備份 CDB

  3.2 PDB1 創建測試數據

  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 PDB1 創建測試數據

查看 PDB1 當前表空間及對應數據文件

RMAN> report schema;

Report of database schema for database with db_unique_name CDB1

List of Permanent Datafiles
===========================
File Size(MB) Tablespace RB segs Datafile Name
---- -------- ----------- ------- ---------------------------------------------
9    280      SYSTEM     NO      /u01/app/oracle/oradata/CDB1/pdb1/system01.dbf
10   350      SYSAUX     NO      /u01/app/oracle/oradata/CDB1/pdb1/sysaux01.dbf
11   100      UNDOTBS1   NO      /u01/app/oracle/oradata/CDB1/pdb1/undotbs01.dbf
12   5        USERS      NO      /u01/app/oracle/oradata/CDB1/pdb1/users01.dbf
13   5        HENRY      NO      /u01/app/oracle/oradata/CDB1/pdb1/henry01.dbf

List of Temporary Files
=======================
File Size(MB) Tablespace Maxsize(MB) Tempfile Name
---- -------- ----------- ----------- -------------------------------------------
3    36       TEMP       32767       /u01/app/oracle/oradata/CDB1/pdb1/temp01.dbf

創建新的表空間 recover_rman

SQL> create tablespace recover_rman datafile '/u01/app/oracle/oradata/CDB1/pdb1/recover_rman01.dbf' size 5m;

Tablespace created.

注意:新的表空間結構,沒有在備份的數據文件和控制文件里面。

3.3 刪除 CDB 控制文件

SQL> conn / as sysdba
Connected.
SQL> select name from v$controlfile;

NAME
--------------------------------------------------
/u01/app/oracle/oradata/CDB1/control01.ctl
/u01/app/oracle/oradata/CDB1/control02.ctl

SQL> !rm -rf /u01/app/oracle/oradata/CDB1/control*

重啟 CDB ,報錯

SQL> startup force;
ORACLE instance started.

Total System Global Area 1241510120 bytes
Fixed Size            9134312 bytes
Variable Size          889192448 bytes
Database Buffers      335544320 bytes
Redo Buffers            7639040 bytes
ORA-00205: error in identifying control file, check alert log for more info

3.4 還原 CDB 控制文件

[oracle@henry ~]$ rman target /

Recovery Manager: Release 19.0.0.0.0 - Production on Sat Jun 8 18:14:49 2019
Version 19.3.0.0.0

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

connected to target database: CDB1 (not mounted)

RMAN> restore controlfile from '/u02/backup/c-983951798-20190608-02.CTL';

Starting restore at 08-JUN-19
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=390 device type=DISK

channel ORA_DISK_1: restoring control file
channel ORA_DISK_1: restore complete, elapsed time: 00:00:03
output file name=/u01/app/oracle/oradata/CDB1/control01.ctl
output file name=/u01/app/oracle/oradata/CDB1/control02.ctl
Finished restore at 08-JUN-19

將數據庫啟動到 MOUNT

RMAN> alter database mount;

released channel: ORA_DISK_1
Statement processed

這時查控制文件中記錄的數據文件(v$datafile 動態性能視圖數據來自控制文件

SQL> set pagesize 50
SQL> select name from v$datafile;

NAME
--------------------------------------------------
/u01/app/oracle/oradata/CDB1/system01.dbf
/u01/app/oracle/oradata/CDB1/sysaux01.dbf
/u01/app/oracle/oradata/CDB1/undotbs01.dbf
/u01/app/oracle/oradata/CDB1/pdbseed/system01.dbf
/u01/app/oracle/oradata/CDB1/pdbseed/sysaux01.dbf
/u01/app/oracle/oradata/CDB1/users01.dbf
/u01/app/oracle/oradata/CDB1/pdbseed/undotbs01.dbf
/u01/app/oracle/oradata/CDB1/pdb1/system01.dbf
/u01/app/oracle/oradata/CDB1/pdb1/sysaux01.dbf
/u01/app/oracle/oradata/CDB1/pdb1/undotbs01.dbf
/u01/app/oracle/oradata/CDB1/pdb1/users01.dbf
/u01/app/oracle/oradata/CDB1/pdb1/henry01.dbf

恢復出來的控制文件中,是沒有記錄表空間 recover_rman

3.5 恢復 CDB 控制文件

使用 recover database 恢復數據庫

RMAN> recover database;

Starting recover at 08-JUN-19
Starting implicit crosscheck backup at 08-JUN-19
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=134 device type=DISK
Crosschecked 3 objects
Finished implicit crosscheck backup at 08-JUN-19

Starting implicit crosscheck copy at 08-JUN-19
using channel ORA_DISK_1
Finished implicit crosscheck copy at 08-JUN-19

searching for all files in the recovery area
cataloging files...
no files cataloged

using channel ORA_DISK_1

starting media recovery

archived log for thread 1 with sequence 9 is already on disk as file /u01/app/oracle/oradata/CDB1/redo03.log
archived log file name=/u01/app/oracle/oradata/CDB1/redo03.log thread=1 sequence=9 creating datafile file number=14 name=/u01/app/oracle/oradata/CDB1/pdb1/recover_rman01.dbf
archived log file name=/u01/app/oracle/oradata/CDB1/redo03.log thread=1 sequence=9
media recovery complete, elapsed time: 00:00:01
Finished recover at 08-JUN-19

請注意倒數第 4 行:creating datafile file number=14 name=/u01/app/oracle/oradata/CDB1/pdb1/recover_rman01.dbf

完全恢復命令自動在控制文件中創建添加了 recover_rman 數據文件

再次查控制文件中記錄的數據文件

SQL> select name from v$datafile;

NAME
----------------------------------------------------
/u01/app/oracle/oradata/CDB1/system01.dbf
/u01/app/oracle/oradata/CDB1/sysaux01.dbf
/u01/app/oracle/oradata/CDB1/undotbs01.dbf
/u01/app/oracle/oradata/CDB1/pdbseed/system01.dbf
/u01/app/oracle/oradata/CDB1/pdbseed/sysaux01.dbf
/u01/app/oracle/oradata/CDB1/users01.dbf
/u01/app/oracle/oradata/CDB1/pdbseed/undotbs01.dbf
/u01/app/oracle/oradata/CDB1/pdb1/system01.dbf
/u01/app/oracle/oradata/CDB1/pdb1/sysaux01.dbf
/u01/app/oracle/oradata/CDB1/pdb1/undotbs01.dbf
/u01/app/oracle/oradata/CDB1/pdb1/users01.dbf
/u01/app/oracle/oradata/CDB1/pdb1/henry01.dbf
/u01/app/oracle/oradata/CDB1/pdb1/recover_rman01.dbf

3.6 開啟 CDB 

因為動了“控制文件”,所以,必須得以 resetlogs 方式打開,為啥?勿問,愛過!撫摸我查看官方文檔

你想直接打開?too young, too simple, sometimes naive.- 來自於莎士比亞的蔑視。

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

Database altered.

你的疑問在於:recover database 語句明明是個完全恢復的動作,為何成功之后,依然需要 resetlogs ?因為 recover database 命令只能修復控制文件中數據文件的物理結構信息,無法修改控制文件中的日志序列號,無法像數據文件一樣,應用歸檔和聯機日志前滾,所以控制文件中的序列號依然是老舊的,因此,只能通過重置序列號來打開數據庫。

以 resetlogs 打開之后,日志組序列號重置為 1,新的版本化身 incarnation 出現

RMAN> list incarnation;

using target database control file instead of recovery catalog

List of Database Incarnations
DB Key  Inc Key DB Name  DB ID      STATUS  Reset SCN  Reset Time
------- ------- -------- ---------- ------- ---------- ----------
1       1       CDB1     983951798  PARENT  1          17-APR-19
2       2       CDB1     983951798  PARENT  1920977    06-JUN-19
3       3       CDB1     983951798  CURRENT 2455443    08-JUN-19

INCARNATION 是個啥?請參考:

Oracle 中的 Incarnation 到底是個什么?概念理解篇

Oracle 中的 Incarnation 到底是個什么?實驗操作篇


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM