RMAN - Aufruf und Connect
das Folgende wurde durch Hermann Brunner für unseren Oracle DBA-Kurs zusammengefasst:
Aufruf / Connect
$ rman RMAN> connect target / RMAN> connect catalog user/password@catdb
oder direkt beim Aufruf
$ rman target / $ rman target / catalog user/password@catdb $ rman target / log='/pfad/zum/log.log' [append] (mit Angabe einer Logdatei)
Einstellungen
RMAN> show all; RMAN> configure [...]
Syntax wie in der SHOW Anzeige. Beispiele:
RMAN> configure retention policy to redundancy 3; RMAN> configure controlfile autobackup on;
komplexere Beispiele:
RMAN> configure device type disk parallelism 3 backup type backupset; RMAN> configure datafile backup copies for device type sbt to 2;
Channels vorkonfigurieren:
RMAN> configure channel device type disk format '/pfad/%U'; RMAN> configure channel n device type disk format '/home/backup_m/%d_%t_%s.bck'
Einstellungen auf default zurücksetzen:
RMAN> configure retention policy clean; RMAN> configure controlfile autobackup clear;
Recovery Catalog
Recovery Catalog einrichten:
auf dem Katalog-Server: SQL> create tablespace ts_rman datafile '/pfad/rman01.dbf' size 100m; ## Richtgröße 100MB pro Zieldatenbank) SQL> create user rman identified by 'passwd' default tablespace ts_rman; SQL> grant connect, resource, recovery_catalog_owner to rman; SQL> grant select any dictionary to rman; auf dem Ursprungs-Server: $ rman target / catalog rman/rman@catdb ## (evtl. tnsnames.ora anpassen) RMAN> create catalog; RMAN> register database; RMAN> report schema; RMAN> report schema at time 'sysdate -3' ## (wie war die DB-Struktur vor 3 Tagen?)
Maintenance commands für den Katalog:
SQL> connect rman/rman@catdb; SQL> select * from cat; RMAN> resync catalog; RMAN> unregister database; RMAN> upgrade catalog; ## Katalog auf den Stand des rman-Clients bringen RMAN> drop catalog; RMAN> catalog backuppiece 'filename'; RMAN> catalog controlfilecopy 'filename'; RMAN> catalog datafilecopy 'filename'; RMAN> catalog archivelog 'filename'; RMAN> catalog recovery area noprompt; RMAN> catalog start with '/u01/fra/archive' ## Start-Pfad, ab dem gesucht werden soll
Backups erstellen
RMAN> backup database; RMAN> backup tablespace ts_name; RMAN> backup datafile n; RMAN> backup datafile df_name; RMAN> backup current controlfile; RMAN> backup spfile; RMAN> backup archivelog [from sequence=nnn] [delete {ALL} input]; RMAN> backup as backupset [...]; RMAN> backup as compressed backupset [...]; RMAN> backup as copy [...]; RMAN> backup validate [...]; ## füllt die v$database_block_corruption Liste RMAN> backup check logical [...]; RMAN> backup [...] plus archivelog; RMAN> backup [...] include controlfile; RMAN> backup [...] format '/pfad/zum/backup'; RMAN> backup [...] tag='freier Text'; RMAN> backup [...] not backed up nnn times; RMAN> backup [...] duration hh:mm minimize load; RMAN> backup [...] delete [ALL] input;
Alte Version 8i/9i Syntax:
RMAN> run { ALLOCATE CHANNEL c1 DEVICE TYPE disk FORMAT='/home/oracle/backup1/datafile_5.bck'; BACKUP DATAFILE 5; RELEASE CHANNEL c1; } ## nur in rman8 nötig
Sinnvolle Technik für Full Backup mit anschließender Sicherung der Archive-Logs:
RMAN> backup database; RMAN> sql 'alter system archive log current'; RMAN> backup archivelog all;
Seit Oracle 9i gehts einfacher:
RMAN> backup database plus archivelog; ## alternativ mit Option: delete [all] input
Zweistufiges Backup - z.B. Sicherung aller DISK Backups auf Band - Variante 1:
RMAN> backup device type disk as backupset database; Optional: RMAN> [...] plus archivelog; RMAN> [...] delete input;
Zweistufiges Backup - z.B. Sicherung aller DISK Backups auf Band - weitere Varianten:
RMAN> backup backupset completed before 'sysdate -1'; RMAN> backup copy of database;
Trickreichere rman Commands:
RMAN> configure device type disk parallelism 4 backup type to copy; RMAN> backup database; ## erzeugt einzelne Datafiles in fra/datafile...
Incrementelles Backup:
RMAN> backup [as backupset] incremental level 0 [database|tablespace|datafile]; RMAN> backup [as backupset] incremental level n [cumulative] [database|tablespace|datafile];
Incrementelles Updating einer Copy die mit <> gekennzeichneten Optionen sind nur in Oracle 9 nötig!
RMAN> backup as copy <incremental level 0> [database|tablespace|datafile] <format='somewhere/somefile' tag='TEST'>; RMAN> backup incremental level 1 <for recover of copy with tag='TEST'> [database|tablespace|datafile]; RMAN> recover copy of [database|tablespace|datafile] <with tag='TEST'>;
Restore / Recover Commands
RMAN> restore [database|tablespace|datafile]; RMAN> restore [...] from tag 'xxx'; RMAN> restore [...] to '/somewhere/somefile'; RMAN> restore validate [database|tablespace|datafile]; ## prüft ob korrekte Backups vorhanden sind RMAN> recover database; RMAN> recover [tablespace|datafile]; ## database muss open, tablespace oder datafile muss offline sein
Weitere Recovery-Optionen Für Recovery ist nur beschränkter Platz für Archivelogs vorhanden:
RMAN> recover [...] delete archivelog maxsize 100M; ## braucht nur max. 100MB
Recovery an einen anderen Ort, weil Original-Location nicht erreichbar (z.B. weil neue Disk):
RMAN> set newname for datafile n to '/pfad/file.dbf'; RMAN> restore datafile n; RMAN> switch datafile all; ## führt das SET NEWNAME im Katalog durch, Datenbank wird auf die neuen Datafile umgestellt RMAN> recover datafile n; RMAN> sql 'alter database datafile n online';
Unvollständiges Recovery Prinzip im rman: „UNTIL“-Klausel muss VOR dem RESTORE gesetzt werden!
RMAN> run { set until time 'time'; ## oder: set until change 'scn' | until sequence 'seq#' thread 1 restore database; recover database; alter database open resetlogs; }
Alles Futsch? --> komplettes Recovery einer Datenbank
Alle zur Datenbank gehörenden Dateien sind verloren…<br /> Prinzip:<br />
RMAN> recover spfile from autobackup; ## nomount Phase RMAN> recover controlfile from autobackup; ## nomount Phase RMAN> restore database; ## mount Phase RMAN> recover database; ## mount Phase RMAN> alter database open resetlogs; ## Datenbank sollte jetzt wieder laufen
im Detail:
RMAN> startup nomount force; ## startup mit default-Parametern. Geht nur im RMAN! RMAN> restore spfile from autobackup; ## funktioniert nur, wenn an default-locations zu finden) oder: RMAN> set dbid=1234567890 RMAN> restore spfile from 'location_of_autobackups'; dann weiter: RMAN> shutdown abort; RMAN> startup nomount; ## Datenbank startet wieder mit eigenem spfile RMAN> restore controlfile from autobackup; RMAN> alter database mount; ab hier sind viele LIST-Commands möglich: RMAN> list incarnation; RMAN> list backup of database; ## etc.. also einfach den Rest restoren und recovern: RMAN> restore database; RMAN> recover database; ## führt zu Fehler bei letzter Log-Seq#, da das online Redo-Log ja futsch ist daher am einfachsten/besten: SQL> recover database until cancel using backup controlfile; ## bis zum Schluss, falls zufällig eine Kopie des online Redo-Logs vorhanden ist kann das auch noch gefüttert werden SQL> alter database open resetlogs; Fertig! An dieser Stelle sollte dann natürlich, wegen der neuen Datenbank-Incarnation, nochmal ein neues Backup erstellt werden: RMAN> backup database;
Umgang mit RMAN-Scripts
RMAN> create [global] script name {backup database;}; RMAN> create [global] script name from file 'file mit rman-commands'; RMAN> print script name; RMAN> print script name to file 'filename'; RMAN> list [global] script names; RMAN> replace script name { new script commands; } RMAN> run { execute script name; }
Report, List und Maintenance Commands
RMAN> report schema; RMAN> report obsolete; RMAN> report obsolete orphan; ## aus der vorletzten incarnation oder älter RMAN> report need backup [redundancy nn | days nn]; RMAN> report unrecoverable [...]; RMAN> list backup of [database|tablespace|datafile]; RMAN> list backup of [archivelog|controlfile|spfile]; RMAN> list backup of [...] summary; ## zeigt übersichtliches Kurzformat RMAN> list copy of [database|tablespace|datafile]; RMAN> list incarnation [of database]; RMAN> crosscheck [backup of database|archivelog]; ## setzt nicht vorhandene Backupsets|Archivelogs auf "expired" RMAN> delete [noprompt] expired backupset; ## löscht expired Eintragungen aus dem Katalog RMAN> delete expired archivelog; RMAN> delete [noprompt] obsolete; RMAN> delete obsolete [redundancy n]; RMAN> delete obsolete [orphan]; RMAN> delete backupset nnn;
Weitere Tips und Tricks mit RMAN
Direkte SQL-Commands, die RMAN selbst 'kann':
RMAN> startup; RMAN> shutdown [...]; RMAN> alter database open [resetlogs];
Alle SQL Commands, die keinen Output benötigen, können über die SQL-Klausel gestartet werden
RMAN> sql 'alter system switch logfile'; RMAN> sql 'alter system archive log all';
Wenn man NLS_DATE_FORMAT außerhalb von RMAN setzt, kann man innerhalb von RMAN bessere Anzeigen von Backup-Zeitpunkten bekommen (z.B. in LIST Kommandos):
$ export NLS_LANG=german_germany ## für RMAN in 10g nicht mehr nötig $ export NLS_DATE_FORMAT=yyy-mm-dd:hh24:mi:ss RMAN> list backup of database;
Wenn man mit Hausmitteln die CTL-Files ausgetauscht hat und RMAN nicht durchblickt, weil die restaurierte CTL-File aus einer alten Incarnation stammt:
RMAN> reset incarnation to 2; ## ohne catalog DB RMAN> reset database to incarnation 2; ## mit catalog DB