Manchmal kann es zweckmäßig sein, dass man neben der regulären RMAN Sicherung auf Tape (SBT), eine extra RMAN Sicherung auf Disk erzeugen möchte. Dafür kann es verschiedene Gründe geben. Vielleicht möchte man das Backup auf einen anderen Server kopieren, um dort einen Klon via RMAN DUPLICATE aus dem Backup zu erstellen (duplicate … backup location..). Vorstellbar ist auch, dass man ein Datenbankbackup für eine Langzeitarchivierung erzeugen und diese, abweichend von der eingestellten RMAN Retention Policy, auf einem anderen Datenträger aufbewahren möchte.
Eine Herausforderung ist dabei, RMAN das Backup auf Disk schreiben zu lassen, ohne, dass die bestehende RMAN Konfiguration verändert wird. Außerdem muss man dafür Sorge tragen, dass der Sicherungseintrag anschließend aus dem RMAN Catalog gelöscht wird, damit die Sicherung nicht versehentlich über die eingestellte RMAN Retention Policy durch nachfolgende Jobs wieder gelöscht oder sie für die Wiederherstellung der Datenbank genutzt wird.
Im diesem Artikel möchte ich zeigen, wie man dies mit einem geeigneten RMAN Script erreichen kann. In meinem angenommenen Szenario wird taglich eine Onlinesicherung auf Tape durchgeführt. Dazu wurde eine entsprechende persistente RMAN Channel Konfigurationen angelegt. Es wird keine RMAN Catalog Datenbank verwendet. Es soll eine zusätzliche RMAN Sicherung auf die lokale Platte in das Verzeichnis /u01/rman_backp geschrieben werden, um sie später zu Erstellung einer physikalischen Datenbankkopie auf einem zweiten Server nutzen zu können.
Beispiel RMAN Backup-Script
Die folgenden Befehle erzeugen eine zusätzliche und autonome Sicherung einer Oracle Datenbank auf Disk.
RMAN Aufruf:
rman target / cmdfile=rman_full_backup_disk.rman log=/u01/rman_bkp/rman_full_backup_disk_`date +"%d.%m.%Y"`.log
Anmerkung: Das RMAN Logfile sollte ebenfalls in das Sicherungsverzeichnis geschrieben und mit der Sicherung aufbewahrt werden, da es essentielle Informationen über die Sicherung enthält. Dies kann bei der Wiederherstellung nützlich sein, falls man z.B. das Controlfile oder Spfile aus einem konkreten Backuppiece wiederherstellen möchte.
RMAN Commandfile: rman_full_backup_disk.rman
run { allocate channel c1 device type disk format="/u01/rman_bkp/DB_FULL_%d_%T_%U"; backup as compressed backupset tag=DB_FULL_DISK database current controlfile spfile plus archivelog; } list backup tag DB_FULL_DISK; change backuppiece tag DB_FULL_DISK uncatalog;
Anmerkung: Für den Fall, dass neben den regulären Backups auch noch regelmäßig Archivelogsicherungen zwischenzeitlich eingeplant sind, so muss sichergestellt sein, dass diese nicht während der Disksicherung parallel laufen. Ansonsten kann es passieren, dass die Archivelogs, die man sichern möchte, bereits durch einen anderen Sicherungsjob gelöscht worden sind.
Tipp: Ich empfehle vor der Sicherung auf Disk noch eine reguläre Sicherung der Archivelogs auf Tape durchzuführen (mit anschließender Löschung der gesicherten Archive), um die Anzahl der Archivelogs im Disk-Backup auf das notwendige Minimum zu begrenzen. Archivelogs, die vor dem Disk-Backup erzeugt wurden, sind nicht relevant für die automome Sicherung.
Erläuterungen zum RMAN-Script
allocate channel c1 device type disk format="/u01/rman_bkp/DB_FULL_%d_%T_%U";
Hiermit wird festgelegt, dass die Sicherung, unabhängig von der bisherigen RMAN Konfiguration, auf Disk geschrieben wird. Außerdem wird ein Backupdateiformat gewählt, welches den Datenbanknamen und einen Zeitstempel enthält (%d, %T).
...as compressed backupset...
Die RMAN Basic Compression wird genutzt, folglich belegen die Sicherungsdateien wesentlich weniger Platz. Falls die Sicherung zuviel Last auf dem System erzeugt, sollte diese Option weggelassen werden.
tag=DB_FULL_DISK
Durch das Setzen eines Tags lässt sich die Sicherung eindeutig identifizieren. Dies vereinfacht das anschließende Deregistrieren der Sicherung.
... current controlfile spfile plus archivelogs;
Damit sich die Datenbank aus der Sicherung auch auf einem fremden Server wiederherstellen lässt, muß das Controlfile und das Spfile ebenfalls gesichert werden. Und da dies eine Onlinesicherung ist, müssen die Archivelogs ebenfalls Bestandteil der Sicherung sein.
list backup tag DB_FULL_DISK;
In das RMAN Logfile wird am Anschluß an die Sicherung eine Backupübersicht protokolliert.
change backuppiece tag DB_FULL_DISK uncatalog;
Der Befehl sorgt dafür, dass die Informationen zu der zuvor erstellen Sicherung aus dem RMAN Catalog (hier Controlfile) wieder gelöscht werden.
Hi,
es ist witzig, wie lange sich das mit dem Alter system switch… für die online redo logs hält. Das ist seit Ewigkeiten nicht mehr notwendig:
When taking a backup of archived redo logs that includes the most recent log (that is, a BACKUP … ARCHIVELOG command is run without the UNTIL or SEQUENCE option) if the database is open, then before beginning the backup, RMAN will switch out of the current online redo log group, and all online redo logs that have not yet been archived, up to and including the redo log group that was current when the command was issued. This ensures that the backup contains all redo that was generated prior to the start of the command.
Viele Grüsse
Jörg Sobottka
Hallo Herr Sabottka,
Sie haben natürlich Recht. Seit dem 11er Release ist kein explizites archivieren des aktuelles Redologs mehr notwndig, da es implizit vor dem Backup durchgeführt wird. Sprich, ein „alter system switch“ ist überflüssig. Ich hatte es beim Schreiben des Artikels nicht mehr auf dem Schirm. Vielen Dank für den Hinweis! Ich werde den Artikel überarbeiten.
Viele Grüße
Frank Gerasch