Logo Oracle Deutschland DBA Community - Mai 2014
Oracle 12c: RMAN Backups mit dem DBMS_SCHEDULER revisited
von Ralf Lange, ORACLE Deutschland B.V. & Co. KG

Die Situation vor Oracle 12c

Möchte man allein mit Bordmitteln der Oracle Datenbank und des Betriebssystems RMAN Backups automatisieren, so führt kein Weg an einem Skript im Filesystem vorbei. Da die Skriptsprachen von Windows und Unix/Linux unterschiedlich sind, müssen verschiedene Skripte für Windows und Unix/Linux gepflegt werden.

Soll das Skript zu bestimmten Zeitpunkten automatisch ausgeführt werden, hat man die Wahl zwischen at auf Windows, cron auf Unix/Linux oder dem Oracle Scheduler. Alle Möglichkeiten haben ihre Tücken, sprich potentielle Fehlerquellen. So können sich Umgebungsvariablen bei dem Aufruf eines Skriptes durch den Scheduler und von der Kommandozeile unterscheiden. Handelt es sich um eine Real Application Cluster (RAC) Installation, muß das Skript auf allen Knoten unter dem gleichen Pfad ansprechbar sein, wenn es vom Oracle Scheduler gestartet wird. Nutzt man den Betriebssystem Scheduler, stellt sich die Frage, wie man mit ihm eine RAC Datenbank sichert: Auf welchem Knoten soll der Scheduler aktiv sein? Was passiert, wenn dieser Knoten ausfällt? Will man alle Eventualitäten beachten, wird es sehr schnell sehr komplex.

Neu in Oracle 12c

Unter den vielen Neuerungen von Oracle 12c habe ich die folgenden drei neuen Job Typen des DBMS_SCHEDULER zuerst übersehen:
  • SHELL_SCRIPT
  • SQL_SCRIPT
  • BACKUP_SCRIPT
Bei näherer Betrachtung entpuppen sie sich aber als kleine Revolution in der Automatisierung von RMAN Backups. Erstmals können RMAN Backups allein mit Mitteln der Datenbank eingerichtet werden. Der nun mögliche Verzicht auf ein Skriptfile im Filesystem schließt nicht nur mögliche Fehlerquellen aus, sondern bedeutet auch Unabhängigkeit vom verwendeten Betriebssystem. Ein einfaches Beispiel in der nächsten Codebox zeigt, wie ein tägliches Backup von SQL*Plus aus eingerichtet werden kann.

begin
  -- create the credential for operating system access
  dbms_credential.create_credential(credential_name => 'OS_CREDENTIAL',
                                    username        => 'oracle',
                                    password        => 'oracle',
                                    enabled         => true,
                                    comments        => 'OS credentials for backup jobs');

  -- create credential to provide RMAN with database access
  dbms_credential.create_credential(credential_name => 'DB_CREDENTIAL',
                                    username        => 'sys',
                                    password        => 'oracle',
                                    database_role   => 'sysdba',
                                    enabled         => true,
                                    comments        => 'DB credentials for backup jobs');
  
  dbms_scheduler.create_job(job_name        => 'DAILY_BACKUP_JOB',
                            job_type        => 'BACKUP_SCRIPT',
                            job_action      => 
    'run { backup check logical incremental level 1 for recover of copy with tag ''daily incr'' database;' ||
          'recover copy of database with tag ''daily incr'' until time ''sysdate-3'';' ||
          'backup as compressed backupset archivelog all not backed up delete all input;' ||
          'delete noprompt obsolete; }',
                            start_date      => trunc(sysdate),
                            repeat_interval => 'freq=daily;byhour=5;byminute=10;bysecond=0',
                            credential_name => 'OS_CREDENTIAL',
                            enabled         => false,
                            auto_drop       => false,
                            comments        => 'backup job (daily execution)');
  -- add the db credential to the job.
  -- this can't be done in the create_job call
  dbms_scheduler.set_attribute(name=>'DAILY_BACKUP_JOB',
                               attribute=>'CONNECT_CREDENTIAL_NAME',
                               value=>'DB_CREDENTIAL');
  -- after enabling the job, backups are made according to the schedule
  dbms_scheduler.enable(name=>'DAILY_BACKUP_JOB');
end;
/

Nach der Ausführung der Kommandos in der obigen Codebox wird RMAN jeden Tag um 05:10 (freq=daily;byhour=5;byminute=10;bysecond=0) einen inkrementellen Backup ausführen und einen incremenentally updateable Backup aktualisieren. Skript im Filesystem ? Nicht benötigt. Was müßte nach einer Migration dieser Datenbank auf ein anderes Betriebssystem angepaßt werden? Gar nichts!

Diese in Oracle 12c mögliche Art der RMAN Automatisierung macht nicht nur keinen Unterschied zwischen verschiedenen Betriebssystemen, sie funktioniert auch gleichermaßen in Single Instance und Real Application Cluster Datenbanken. Solange es eine aktive Instanz für eine Datenbank gibt, werden Jobs durch den Scheduler gestartet.

Wohin schreibt RMAN die Backups? Wenn im Backup Skript nichts anderes angegeben ist und sofern sie konfiguriert ist, in die Fast Recovery Area (FRA). Ist keine Fast Recovery Area konfiguriert, wird in $ORACLE_HOME/dbs auf Linux/Unix Systemen oder $ORACLE_HOME/database auf Windows Systemen geschrieben.

Möchte man die RMAN Kommandos außerhalb der Reihe ausführen, kann man den Scheduler Job so starten:

exec dbms_scheduler.run_job('DAILY_BACKUP_JOB');

Das nachfolgende SQL-Skript löscht alle durch das obige Skript erzeugten Datenbank Objekte wieder. Danach finden natürlich keine Backups mehr statt.

begin
  dbms_scheduler.drop_job('DAILY_BACKUP_JOB');
  dbms_scheduler.drop_credential('DB_CREDENTIAL');
  dbms_scheduler.drop_credential('OS_CREDENTIAL');
end;
/

Das Konzept des DBMS_SCHEDULER Package

Zentrales Datenbank Objekt des Schedulers ist der Job. Ein Job enthält die Informationen, wann (Schedule) was (Program) ausgeführt werden soll. Soll der Scheduler ein Programm außerhalb der Datenbank ausführen, wird es von einem anzugebenden Benutzerkonto aus gestartet. Das Benutzerkonto und das dazugehörige Passwort wird über ein Credential spezifiziert. Ein Nutzer, dem die Nutzung eines Credentials gestattet wurde, kann Programme im zugehörigen Benutzerkonto ausführen, ohne das Passwort zu kennen. Das ist sicherer als zum Beispiel die Hinterlegung eines Passwortes in einem Skript und der Versuch, es vor neugierigen Blicken zu schützen. Allerdings sollte man sich bewußt sein, dass sich in der Oracle Datenbank ausgeführte Kommandos aus GV$SQL auslesen lassen. Je nach Umgebung wird man daher die Skripte zur Erstellung von Scheduler Objekten im restricted Mode ausführen und die Instanz danach durchstarten.

Nun wird das obige Skript verständlich. Da RMAN ausgeführt wird, muß definiert werden, als welcher Betriebssystem Benutzer RMAN ausgeführt werden soll. Dafür und für den Verbindungsaufbau von RMAN zur Datenbank wird je ein Credential erzeugt. Dem Job DAILY_BACKUP_JOB wird der Zeitplan, die Art des Jobs (BACKUP_SCRIPT), die RMAN Kommandos und das Credential für den Benutzeraccount des Betriebssystems mitgegeben. Da das Credential für den Zugang zur Datenbank nicht bei der Erzeugung des Jobs angegeben werden kann, erhält es der Job nach seiner Erzeugung als Attribut (dbms_scheduler.set_attribute). Nachdem der Job alle Informationen hat, um erfolgreich ausgeführt werden zu können, wird er zur Ausführung durch den Scheduler freigegeben (dbms_scheduler.enable).

Vom Konzept zu einer Betriebsumgebung

Eine vollständige Betriebsumgebung für automatisierte RMAN Backups benötigt mehr als ein paar Scheduler Objekte. Sie sollte die Möglichkeit bieten, die Ausführung der Backup Jobs zeitweilig zu unterbinden oder Credentials, Zeitpläne und RMAN Kommandos ändern zu können. Die Namen der erzeugten Scheduler Objekte sollten einfach zu ändern sein, um sie an vielleicht bestehende Konventionen zur Namensgebung anzupassen. Besser, als sich allein auf tägliche inkrementelle Backups zu verlassen, wäre ein zusätzlicher wöchentlicher Backup.

Das PL/SQL Package SCHEDULER_BACKUP

Ich habe das PL/SQL Package SCHEDULER_BACKUP entwickelt, mit dem sich die Einrichtung einer Backup Strategie bestehend aus täglichen und wöchentlichen RMAN Backups allein mit Mitteln der Datenbank einfach und unabhängig vom Betriebssystem des Datenbank Servers einrichten läßt. Das Package SCHEDULER_BACKUP erhebt nicht den Anspruch, eine für alle Anforderungen passende Lösung darzustellen, kann aber als Ausgangspunkt für eigene Entwicklungen nützlich sein. Eine ausführliche Beschreibung würde den Rahmen dieses Artikels sprengen, daher stelle ich das Paket selbst und ein zweites Skript, daß die Verwendung von SCHEDULER_BACKUP erklärt und zeigt, wie die Ausführung der Jobs überwacht werden kann, unten als Link zur Verfügung.

Nach der Installation des Skripts können RMAN Kommandos oder Zeitpläne leicht zum Beispiel mit dem SQL Developer angepaßt werden. Falls Sie Fragen oder Anregungen zum PL/SQL Package SCHEDULER_PACKAGE haben, können Sie mich gerne unter ralf.lange@oracle.com kontaktieren.

Nützliche Links und Referenzen

Zurück zur Community-Seite

(OracleBUDB)