Neue Job Typen in 12c

20.
Oktober
2013
Veröffentlicht von: Marco Patzwahl

Die Version 12c verfügt über drei neue Job Typen:


Die Version 12c verfügt über drei neue Job Typen:

  • EXTERNAL_SCRIPT
  • SQL_SCRIPT
  • BACKUP_SCRIPT

Damit können Sie jetzt einfacher Skripte im Betriebsystem starten. Der Benutzer, der den Job ausführt, benötigt das CREATE EXTERNAL JOB Recht zum Ausführen eines Jobs im Betriebssystem.

Nachdem im Internet derzeit (30.9.2013) kein Beispiel zu diesem Thema existiert, müssen wir uns selbst eines erstellen ...

Bei der Gelegenheit können wir gleich noch ein weiteres, neues Package vorstellen: DBMS_CREDENTIAL.

Dieses Package wird verwendet, um den Namen und das Passwort eines Betriebssystem-Benutzers abzuspeichern.

Für Unix also z. B.:

BEGIN 
  DBMS_CREDENTIAL.CREATE_CREDENTIAL ( 
   credential_name  => 'oracle_cred', 
   username         => 'oracle', 
   password         => 'oracle', -- Hier bitte Ihr Passwort eintragen
   enabled          => TRUE);
END;
/

Nun wollen wir einen Job anlegen, der SOFORT ein Verzeichnis im Betriebssystem anlegt:

BEGIN
  DBMS_SCHEDULER.CREATE_JOB (
   job_name           => 'EXT_JOB1',
   job_type           => 'EXTERNAL_SCRIPT',
   job_action         => 'mkdir /u01/xxx', -- Unix
   -- job_action      => 'mkdir c:\temp\xxx', -- Windows
   enabled            => TRUE,
   credential_name    => 'oracle_cred');
END;
/

Hinweis

Das Skript /u01/app/oracle/product/12.1.0.1/dbhome_1/root.sh musste bei uns unter Unix nochmals ausgeführt werden, da der Job mit der folgenden Fehlermeldung abbrach:

"EXTERNAL_LOG_ID="job_92849_34326",
ORA-27369: job of type EXECUTABLE failed with exit code: Input/output error"

Für Windows muss zuerst noch der Dienst OracleJobScheduler<sid> von deaktiviert auf manuell (oder automatisch) gesetzt und gestartet werden:

BEGIN 
  DBMS_CREDENTIAL.CREATE_CREDENTIAL ( 
   credential_name     => 'oracle_cred', 
   username            => 'mpatzwahl', 
   password            => 'password',
   windows_domain      => 'muniqsoft.de', -- optional
   enabled             => TRUE);
END;
/

Wenn jetzt ein SQL*Plus Skript gestartet werden soll, kann folgende Syntax verwendet werden:

BEGIN
  DBMS_SCHEDULER.CREATE_JOB (
   job_name                => 'EXT_JOB1',
   job_type                => 'SQL_SCRIPT',
   -- job_action           => '@c:\temp\test_job.sql', -- Windows
   job_action              => '@/u01/test_job.sql', -- Unix
   enabled                 => TRUE,
   credential_name         => 'oracle_cred');
END;
/

Das Skript mit dem Namen test_job.sql besteht dann beispielsweise aus folgenden Zeilen:

connect system/sys
INSERT INTO scott.test_job_tab VALUES(sysdate);
COMMIT;
exit

Legen Sie zuvor noch eine Tabelle an:

CREATE TABLE scott.test_job_tab (datum date);

Jetzt ist im Connect des Skripts das Passwort zu lesen. Das ist aus Sicherheitsgründen nicht immer gewünscht. Sie können hierfür ein eigenes Credential anlegen, dieses wird verschlüsselt in der DB abgelegt.

BEGIN 
  DBMS_CREDENTIAL.CREATE_CREDENTIAL ( 
   credential_name  => 'db_cred', 
   username         => 'system', 
   password         => 'sys',
   enabled          => TRUE);
END;
/

Die Syntax für den Job lautet dann:

BEGIN
  DBMS_SCHEDULER.CREATE_JOB (
   job_name                => 'EXT_JOB1',
   job_type                => 'SQL_SCRIPT',
   -- job_action           => '@c:\temp\test_job.sql', -- Windows
   job_action              => '@/u01/test_job.sql', -- Windows
   enabled                 => FALSE,
   credential_name         => 'oracle_cred');
  DBMS_SCHEDULER.SET_ATTRIBUTE( 
   name                    => 'EXT_JOB1', 
   attribute               => 'connect_credential_name', 
   value                   => 'db_cred');
  DBMS_SCHEDULER.ENABLE ('EXT_JOB1');
END;
/

Das Gleiche funktioniert mit RMAN Skripten. Mittels eines external Jobs kann die DB ihre eigenen RMAN Skripten starten.

Wir legen eine Backupdatei (c:\temp\backup_job.rman) an:

connect target sys/sys
backup tablespace users;

Dann starten wir unseren Job sofort wieder:

BEGIN
  DBMS_SCHEDULER.CREATE_JOB (
   job_name                => 'RMAN_JOB1',
   job_type                => 'BACKUP_SCRIPT',
   -- job_action           => '@c:\temp\backup_job.rman', -- Windows
   job_action              => '@/home/oracle/backup.rman', -- Unix
   enabled                 => TRUE,
   credential_name         => 'oracle_cred');
END;
/

Praktischerweise werden sowohl die SQL*Plus Ausgabe als auch die RMAN Logs in einer Tabelle (Spalte output) als CLOB gespeichert.

SELECT log_date, job_name, status, errors, output, additional_info
  FROM dba_scheduler_job_run_details 
 ORDER BY log_date desc;

Nun viel Spaß mit dem Starten von Skripten via DBMS_SCHEDULER!

Und wenn Sie noch weitere 299 Neuerungen zu Oracle 12c kennen lernen möchten, kommen Sie doch in unsere Opens internal link in current windowOracle 12c New Features Schulung, oder lassen Sie sich von unserem Consulting Team beraten.

Jede Menge Know-how für Sie!

In unserer Know-How Datenbank finden Sie mehr als 300 ausführliche Beiträge zu den Oracle-Themen wie DBA, SQL, PL/SQL, APEX und vielem mehr.
Hier erhalten Sie Antworten auf Ihre Fragen.