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ć.
Łukasz Goszczyński goszczu.pl