بهبودهای DBMS_SCHEDULER در اوراکل 12c

زمانی که  DBMS_SCHEDULER در اوراکل 10g ارائه شد، تنها سه نوع جاب PLSQL_BLOCK، STORED_PROCEDURE و EXECUTABLE را پشتیانی می کرد در اوراکل 11g هم تغییر قابل توجهی در این مسئله رخ نداد تا اینکه در نسخه 12c اوراکل job_typeهای جدیدی را به این مجموعه اضافه کرد تا تنظیم بعضی از جابها به شکل ساده تر و با وابستگی کمتری به محیط سیستم عامل قابل انجام باشد:

 SHELL_SCRIPTSQL_SCRIPT –  BACKUP_SCRIPT

در این متن با هر کدام از این نوع جابها آشنا خواهیم شد.

BACKUP_SCRIPT

با کمک این نوع از جاب می توان عملیاتی نظیر تنظیم جاب برای بکاپ RMAN و تهیه دامپ با کمک Data Pump را بدون ایجاد فایلی در محیط سیستم عامل انجام داد. در مثال زیر، نحوه تنظیم جاب برای بکاپ RMAN توضیح داده شده است.

تنظیم جاب برای بکاپ RMAN: برای تنظیم جاب مربوط به بکاپ RMAN، ابتدا credentialای را ایجاد می کنیم که در آن پسورد کاربر سیستم عاملی oracle تنظیم شده است:

begin

  dbms_credential.create_credential(credential_name => ‘OS_CREDENTIAL‘,

                                    username        => ‘oracle’,

                                    password        => ‘p’,

                                    enabled         => true,

                                    comments        => ‘password for oracle user’);

end;

/

سپس CREDENTIAL دیگری را برای تعیین پسورد کاربر sys ایجاد می کنیم:

 begin

 dbms_credential.create_credential(credential_name => ‘DB_CREDENTIAL‘,

                                    username        => ‘sys’,

                                    password        => ‘p’,

                                    database_role   => ‘sysdba’,

                                    enabled         => true,

                                    comments        => ‘password for sys user’);

end;

/

نهایتا با کمک دو CREDENTIAL ایجاد شده، جابی را ایجاد می کنیم که در آن، اسکریپت تهیه بکاپ RMAN به عنوان action_job تعیین شده است:

begin

  dbms_scheduler.create_job(job_name        => ‘RMAN_BACKUP_JOB‘,

                            job_type        => ‘BACKUP_SCRIPT’,

                            job_action      =>

     ‘connect target /

    run {

    CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO ”/12c/bkp/con_%F”;

    crosscheck archivelog all;

    alter system archive log current;

   BACKUP as COMPRESSED BACKUPSET database format ”/12c/bkp/%U”;

     alter system archive log current;

     backup archivelog all not backed up 1 times;

     }‘, 

                            start_date      => trunc(sysdate),

                            repeat_interval => ‘freq=daily;byhour=3;byminute=00;bysecond=0’,

                            credential_name => ‘OS_CREDENTIAL‘,

                            enabled         => false,

                            auto_drop       => false,

                            comments        => ‘rman backup job’);

  dbms_scheduler.set_attribute(name=>’RMAN_BACKUP_JOB‘,

                               attribute=>’CONNECT_CREDENTIAL_NAME‘,

                               value=>’DB_CREDENTIAL‘);

end;

/

در صورت اجرای این job، می توان logهای مربوط به عملیات RMAN را در ویوی ALL_SCHEDULER_JOB_RUN_DETAILS مشاهده کرد:

SQL>  exec dbms_scheduler.run_job(‘RMAN_BACKUP_JOB’,use_current_session => false);

PL/SQL procedure successfully completed

SQL> select p.binary_output from ALL_SCHEDULER_JOB_RUN_DETAILS p where p.job_name=’RMAN_BACKUP_JOB’ order by p.log_id desc;

Recovery Manager: Release 12.2.0.1.0 – Production on Mon Oct 7 13:22:16 2019

Copyright (c) 1982, 2017, Oracle and/or its affiliates.  All rights reserved.

RMAN>

connected to target database: SINK (DBID=229696930)

CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO ‘/12c/bkp/con_%F’;

new RMAN configuration parameters:

CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO ‘/12c/bkp/con_%F’;

new RMAN configuration parameters are successfully stored

allocated channel: ORA_DISK_1

channel ORA_DISK_1: SID=509 device type=DISK

validation succeeded for archived log

archived log file name=/12c/home/dbs/arch1_430_985431394.dbf RECID=7 STAMP=1021029523

validation succeeded for archived log

archived log file name=/12c/home/dbs/arch1_431_985431394.dbf RECID=8 STAMP=1021029526

validation succeeded for archived log

archived log file name=/12c/home/dbs/arch1_432_985431394.dbf RECID=9 STAMP=1021029529

channel ORA_DISK_1: starting compressed full datafile backup set

channel ORA_DISK_1: specifying datafile(s) in backup set

input datafile file number=00006 name=/12c/base/oradata/sink/mgmt.dbf

input datafile file number=00002 name=/12c/base/oradata/sink/sysaux01.dbf

input datafile file number=00001 name=/12c/base/oradata/sink/system01.dbf

input datafile file number=00003 name=/12c/base/oradata/sink/undotbs01.dbf

input datafile file number=00007 name=/12c/base/oradata/sink/mgmt_ad4j.dbf

input datafile file number=00008 name=/12c/base/oradata/SINK/datafile/o1_mf_mtbs_gsort80c_.dbf

input datafile file number=00005 name=/12c/base/oradata/sink/mgmt_depot.dbf

piece handle=/12c/bkp/11udnicc_1_1 tag=TAG20191007T132220 comment=NONE

channel ORA_DISK_1: backup set complete, elapsed time: 00:07:06

Starting Control File and SPFILE Autobackup at 07-OCT-19

piece handle=/12c/bkp/con_c-229696930-20191007-09 comment=NONE

Finished Control File and SPFILE Autobackup at 07-OCT-19

piece handle=/12c/home/dbs/13udnipn_1_1 tag=TAG20191007T132927 comment=NONE

channel ORA_DISK_1: backup set complete, elapsed time: 00:00:03

RMAN>

Recovery Manager complete.

نکته: در صورت رخ دادن خطای ORA-27369، اسکریپت root.sh را اجرا کنید:

SQL> exec dbms_scheduler.run_job(‘RMAN_BACKUP_JOB’);

ORA-27369: job of type EXECUTABLE failed with exit code: Login executable not setuid-root

[root@ol7 ~]# /18c/home/root.sh

EXTERNAL_SCRIPT

همانطور که می دانید که با کمک جابهای از نوع external می توانستیم اسکریپتی که در سیستم عامل موجود است را در محیط دیتابیس صدا زده و اجرا کنیم. نوع دیگری از جاب که در اوراکل 12c اضافه شد، EXTERNAL_SCRIPT می باشد که می توان با کمک ان دستوراتی را در سطح سیستم عامل اجرا نمود با این تفاوت که متن اسکریپت و دستورات مورد نظر را می توان در زمان تعریف جاب و در قسمت job_action قرار داد.

مثال: در تکه کد زیر، با ایجاد جابی با نام  MY_EXTERNAL_JOB، دستوراتی چون touch، ls و df را در محیط سیستم عامل اجرا می کنیم.

BEGIN

  dbms_credential.create_credential(credential_name => ‘OS_CREDENTIAL‘,

                                    username        => ‘oracle’,

                                    password        => ‘p’,

                                    enabled         => true,

                                    comments        => ‘oracle password’);

 DBMS_SCHEDULER.create_job(

    job_name        => ‘MY_EXTERNAL_JOB’,

    job_type        => ‘EXTERNAL_SCRIPT’,

    job_action      => ‘

    #!/bin/bash

    echo my name is usef>>myfile.txt

    ls -l /home/oracle/myfile.txt

    rm -rf /home/oracle/myfile.txt

    df -h‘,

    credential_name => ‘OS_CREDENTIAL‘,

    enabled         => TRUE

  );

END;

با اجرای جاب MY_EXTERNAL_JOB، لاگ ثبت شده برای این جاب را می توان در ویوی ALL_SCHEDULER_JOB_RUN_DETAILS مشاهده کرد:

SQL> select output from ALL_SCHEDULER_JOB_RUN_DETAILS where job_name=’MY_EXTERNAL_JOB’;

-rw-rw-rw-. 1 oracle oinstall 0 Oct  7 13:45 /home/oracle/myfile.txt

Filesystem      Size  Used Avail Use% Mounted on

/dev/sda3       181G  151G   21G  88% /

tmpfs           7.8G   72K  7.8G   1% /dev/shm

/dev/sda1       488M  438M   15M  97% /boot

SQL_SCRIPT

با کمک این نوع از جاب، می توان دستوراتی را در محیط sqlplus اجرا کرد:

BEGIN

  dbms_credential.create_credential(credential_name => ‘OS_CREDENTIAL‘,

                                    username        => ‘oracle’,

                                    password        => ‘p’,

                                    enabled         => true,

                                    comments        => ‘oracle pass’);

 DBMS_SCHEDULER.create_job(

    job_name        => ‘MY_SQL_JOB’,

    job_type        => ‘SQL_SCRIPT‘,

    job_action      => ‘

  conn sys/poojhgyvvtO_8 AS SYSDBA

  desc mytbl;

  SPOOL /home/oracle/datafile.txt;

  select file#,ts#,status from v$datafile;

  SPOOL OFF;‘,

    credential_name => ‘OS_CREDENTIAL‘,

    enabled         => TRUE

  );

END;

/

با اجرای این جاب، خروجی به صورت زیر خواهد بود:

SQL> select p.binary_output from ALL_SCHEDULER_JOB_RUN_DETAILS p where p.job_name=’MY_SQL_JOB’ order by p.log_id desc;

SQL*Plus: Release 12.2.0.1.0 Production on Mon Oct 7 14:52:58 2019

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

SQL> SQL> Connected.

SQL>  Name              Null?    Type

 ————- ——– ———–

 ID                                                        NUMBER

 NAME                                                VARCHAR2(10)

SQL> SQL>

     FILE#   TS# STATUS

———- ———- ———————

                1                0 SYSTEM

                2                1 ONLINE

                3                2 ONLINE

                5                5 ONLINE

                6                6 ONLINE

                7                7 ONLINE

                8               14 ONLINE

7 rows selected.

SQL> Disconnected from Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 – 64bit Production

ارتباط با نویسنده مطلب:vahidusefzadeh@ کانال تخصصی اوراکل و لینوکس: OracleDB@ www.linkedin.com/in/vahid-usefzadeh-918bb289

Comments (2)

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد.