RMAN - tutorial

Do czego służy RMAN

RMAN (Recovery Manager) to aplikacja Oraclowa umożliwiająca:
-dokonywanie backupów bazy,
-zarządzanie nimi,
-dokonywanie odtwarzania bazy danych.

W poniższym tutorialu nie będziemy zajmowali się kopiami przyrostowymi (incremental backups). Poświęcę temu oddzielny artykuł.

Uruchamianie RMANa

Logujemy się do RMANa korzystając z autentykacji systemowej. Korzystamy z bazy ustawionej w zmiennej systemowej ORACLE_SID:

>/ora9/product/9.2.0/bin/rman

Recovery Manager: Release 9.2.0.7.0 - Production
Copyright (c) 1995, 2002, Oracle Corporation.  All rights reserved.

RMAN> connect target

connected to target database: TEST(DBID=55552233)

Czy mamy już jakieś backupy?

RMAN> list backup


BS Key  Type LV Size       Device Type Elapsed Time Completion Time
------- ---- -- ---------- ----------- ------------ ---------------
1       Full    7G         DISK        00:32:33     19-NOV-08
        BP Key: 1   Status: AVAILABLE   Tag: TAG20081119T141126
        Piece Name: /var/opt/oracle/TEST/RMAN/TEST_01k03ise_1
  SPFILE Included: Modification time: 18-NOV-08
  List of Datafiles in backup set 1
  File LV Type Ckp SCN    Ckp Time  Name
  ---- -- ---- ---------- --------- ----
  1       Full 844937098  19-NOV-08 /var/opt/oracle/TEST/oradata/system01.dbf
  2       Full 844937098  19-NOV-08 /var/opt/oracle/TEST/oradata/rbs01.dbf
  3       Full 844937098  19-NOV-08 /var/opt/oracle/TEST/oradata/users01.dbf
  ...     ...             ...       ...  

BS Key  Size       Device Type Elapsed Time Completion Time
------- ---------- ----------- ------------ ---------------
2       37M        DISK        00:00:10     19-NOV-08
        BP Key: 2   Status: AVAILABLE   Tag: TAG20081119T144806
        Piece Name: /var/opt/oracle/TEST/RMAN/redo_log _TEST_02k03l17_2

  List of Archived Logs in backup set 2
  Thrd Seq     Low SCN    Low Time  Next SCN   Next Time
  ---- ------- ---------- --------- ---------- ---------
  1    1       844888769  18-NOV-08 844912526  19-NOV-08
  1    2       844912526  19-NOV-08 844918488  19-NOV-08
  1    3       844918488  19-NOV-08 844923723  19-NOV-08
  1    4       844923723  19-NOV-08 844929248  19-NOV-08
  1    5       844929248  19-NOV-08 844937837  19-NOV-08

Pełny backup bazy

RUN {
  ALLOCATE CHANNEL d1 DEVICE TYPE DISK;
  BACKUP DATABASE;
}

Polecenie ALLOCATE CHANNEL otwiera połączenie między RMANem a instancją bazy danych. Możemy też wyspecyfikować ścieżkę i format nazwy backupu:

RMAN>RUN {
     ALLOCATE CHANNEL disk1 DEVICE TYPE DISK;
     BACKUP DATABASE format '/var/opt/oracle/TEST/RMAN/%U';
     }

Zasady formatowania nazwy są następujące:
%d nazwa bazy
%u 
%c numer kopii backupu
%s unikalny numer backupu ('BS key').Jest to liczba porządkowa, począwszy od 1. Uwaga - po nowej inkarnacji pliku kontrolnego numeracja jest rozpoczynana od początku.
%p numer części backupu (jeśli backup posiada kilka części)
%U standardowy format, jest to sklejenie '%u_%p_%c' gwarantujące unikatowość nazwy. Jest to domyślny format!
%t timestamp
%Y %M %D rok, dzień i miesiąc

Archiwizowanie plików kontrolnych

RMAN>BACKUP CURRENT CONTROLFILE FORMAT '/var/opt/oracle/TEST/RMAN/rman_controlfile';

Starting backup at 01-DEC-08
using channel ORA_DISK_1
channel ORA_DISK_1: starting full datafile backupset
channel ORA_DISK_1: specifying datafile(s) in backupset
including current controlfile in backupset
channel ORA_DISK_1: starting piece 1 at 01-DEC-08
channel ORA_DISK_1: finished piece 1 at 01-DEC-08
piece handle=/var/opt/oracle/PAT/RMAN/rman_controlfile comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:04
Finished backup at 01-DEC-08

Archiwizowanie pliku spfile

Archiwizowanie plików bazodanowych

Archiwizowanie logów REDO

RMAN> run{
2> allocate channel dev1 type disk;
3> backup format '/var/opt/oracle/TEST/RMAN/%d_%T_%s.rmanlog'
4> (archivelog all delete input);
5> release channel dev1;
6> }

released channel: ORA_DISK_1
allocated channel: dev1
channel dev1: sid=15 devtype=DISK

Starting backup at 21-NOV-08
current log archived
channel dev1: starting archive log backupset
channel dev1: specifying archive log(s) in backup set
input archive log thread=1 sequence=5 recid=96 stamp=671288872
input archive log thread=1 sequence=6 recid=97 stamp=671288883
input archive log thread=1 sequence=7 recid=98 stamp=671288885
input archive log thread=1 sequence=8 recid=99 stamp=671370191
channel dev1: starting piece 1 at 21-NOV-08
channel dev1: finished piece 1 at 21-NOV-08
piece handle=/var/opt/oracle/TEST/RMAN/TEST_20081121_7.rmanlog comment=NONE
channel dev1: backup set complete, elapsed time: 00:00:04
channel dev1: deleting archive log(s)
archive log filename=/var/opt/oracle/TEST/REDO/1_5.dbf recid=96 stamp=671288872
archive log filename=/var/opt/oracle/TEST/REDO/1_6.dbf recid=97 stamp=671288883
archive log filename=/var/opt/oracle/TEST/REDO/1_7.dbf recid=98 stamp=671288885
archive log filename=/var/opt/oracle/TEST/REDO/1_8.dbf recid=99 stamp=671370191
Finished backup at 21-NOV-08

released channel: dev1

Zrobiliśmy backup logów. Logi zostały wykasowane. Chcielibyśmy zobaczyć co się zrobiło:

RMAN>list backup

...
BS Key  Size       Device Type Elapsed Time Completion Time
------- ---------- ----------- ------------ ---------------
7       6M         DISK        00:00:02     21-NOV-08
        BP Key: 7   Status: AVAILABLE   Tag: TAG20081121T114311
        Piece Name: /var/opt/oracle/TEST/RMAN/TEST_20081121_7.rmanlog

  List of Archived Logs in backup set 7
  Thrd Seq     Low SCN    Low Time  Next SCN   Next Time
  ---- ------- ---------- --------- ---------- ---------
  1    5       844929248  19-NOV-08 844937837  19-NOV-08
  1    6       844937837  19-NOV-08 844937943  19-NOV-08
  1    7       844937943  19-NOV-08 844959234  20-NOV-08
  1    8       844959234  20-NOV-08 844991164  21-NOV-08

Full recovery

Rman odtworzy bazą na podstawie pełnego backupu. Następnie zaaplikuje kolejne logi żeby odtworzyć bazę na jak najpóźniejszy moment czasowy.


run {
  shutdown immediate; # use abort if this fails
  startup mount;
  restore database;
  recover database;
  alter database open;
}

Datafile recovery

Załóżmy że utraciliśmy jeden z plików bazodanowych. Najpierw zapuszczamy database restore

RMAN> restore database;

Starting restore at 10-DEC-08

using target database controlfile instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=13 devtype=DISK
channel ORA_DISK_1: starting datafile backupset restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
restoring datafile 00001 to /var/opt/oracle/TEST/system01.dbf
restoring datafile 00002 to /var/opt/oracle/TEST/rbs01.dbf
restoring datafile 00003 to /var/opt/oracle/TEST/users01.dbf
restoring datafile 00004 to /var/opt/oracle/TEST/indx01.dbf
channel ORA_DISK_1: restored backup piece 1
piece handle=/var/opt/oracle/dbs/05k1qvpf_1_1 tag=TAG20081209T142903 params=NULL
channel ORA_DISK_1: restore complete
Finished restore at 10-DEC-08

Odzyskanie pliku zakończone. Próbujemy uruchomić bazę:

SQL> startup
ORACLE instance started.

Total System Global Area  369857440 bytes
Fixed Size                   451488 bytes
Variable Size             100663296 bytes
Database Buffers          268435456 bytes
Redo Buffers                 307200 bytes
Database mounted.
ORA-01113: file 1 needs media recovery
ORA-01110: data file 1:
'/var/opt/oracle/TEST/system01.dbf'

Musimy przeprowadzić jeszcze database recovery

RMAN> RECOVER DATABASE;

Starting recover at 10-DEC-08
using target database controlfile instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=12 devtype=DISK

starting media recovery

archive log thread 1 sequence 40 is already on disk as file
/var/opt/oracle/TEST/RMAN/1_40.arc
archive log thread 1 sequence 41 is already on disk as file
/var/opt/oracle/TEST/RMAN/1_41.arc
archive log filename=/var/opt/oracle/TEST/RMAN/1_40.arc thread=1 sequence=40
archive log filename=/var/opt/oracle/TEST/RMAN/1_41.arc thread=1 sequence=41
media recovery complete
Finished recover at 10-DEC-08

Kasowanie backupów

Czasem mamy duzo niepotrzebnych backupów i chcemy je wykasować. Ja przykładowo miałem dwa pełne backupy bazy. Chciałem wykasować starszy z nich. Najpierw, poleceniem 'LIST BACKUP', znalazłem jego unikalny identyfikator BS(backupset).

RMAN> DELETE BACKUPSET 10;

using target database controlfile instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=13 devtype=DISK

List of Backup Pieces
BP Key  BS Key Pc# Cp# Status    Device Type Piece Name
------- ------ --- --- --------- ----------- ----------
10      10     1   1   AVAILABLE DISK        /var/opt/oracle/TEST/RMAN/FULL_DUMP_2

Do you really want to delete the above objects (enter YES or NO)? y

RMAN-06207: WARNING: 1 objects could not be deleted for DISK channel(s) due
RMAN-06208:          to mismatched status.  Use CROSSCHECK command to fix status
List of Mismatched objects
==========================
  Object Type   Filename/Handle
--------------- ---------------------------------------------------
Backup Piece    /var/opt/oracle/TEST/RMAN/FULL_DUMP_2

Jak widać wykasowanie backupu nie powiodło się. To że wpisy w RMANIe na temat backupów istnieją nie oznacza że istnieją pliki odpowiadające tym backupom. Sprawdzamy czy pliki backupów istnieją. Ja zrobiłem to dla pełnych backupów:

RMAN> CROSSCHECK backup of database;

using channel ORA_DISK_1
crosschecked backup piece: found to be 'AVAILABLE'
backup piece handle=/var/opt/oracle/TEST/RMAN/FULL_DUMP_1 recid=1 stamp=671206291
crosschecked backup piece: found to be 'EXPIRED'
backup piece handle=/var/opt/oracle/TEST/RMAN/FULL_DUMP_2 recid=10 stamp=672412225
Crosschecked 2 objects

Drugi z backupów ma status EXPIRED. Teraz możemy już go wykasować.