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. Neu in Oracle 12c Unter den vielen Neuerungen von Oracle 12c habe ich die folgenden drei neuen Job Typen des DBMS_SCHEDULER zuerst übersehen:
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! 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. Nützliche Links und Referenzen
Zurück zur Community-Seite |