PolarDB menyediakan paket DBMS_JOB untuk menjadwalkan dan mengelola job terjadwal. Topik ini menjelaskan cara membuat, mengelola, dan menghapusnya.
Prasyarat
-
Kluster PolarDB Anda menjalankan kernel versi V1.1.7 atau yang lebih baru.
CatatanUntuk memeriksa versi kernel kluster PolarDB for PostgreSQL (Compatible with Oracle) Anda, jalankan pernyataan berikut:
SHOW polar_version; -
Karena alasan keamanan, ekstensi DBMS_JOB tidak dapat dibuat secara manual. Jika Anda memerlukan ekstensi ini, hubungi kami untuk mengaktifkannya.
Catatan penggunaan
-
Hanya akun istimewa yang dapat menggunakan DBMS_JOB. Untuk informasi tentang cara membuat akun istimewa, lihat Buat akun database.
-
Ekstensi DBMS_JOB hanya dapat dibuat di database
postgres. Untuk menggunakan job terjadwal di database lain, Anda dapat mengonfigurasi job lintas database di databasepostgres. Untuk informasi selengkapnya, lihat Jalankan job lintas database.
Persiapkan data uji
Data uji ini hanya berlaku untuk contoh dalam topik ini.
Buat tabel bernama jobrun untuk pengujian:
CREATE TABLE jobrun (
id serial NOT NULL PRIMARY KEY,
runtime VARCHAR2(40)
);
Buat prosedur tersimpan bernama job_proc:
CREATE PROCEDURE job_proc
IS
BEGIN
INSERT INTO jobrun(runtime) VALUES ('job_proc run at ' || TO_CHAR(SYSDATE, 'yyyy-mm-dd hh24:mi:ss'));
END;
Hapus ekstensi
Menghapus ekstensi akan menghapus semua job pengguna yang ada.
Untuk menghapus ekstensi, gunakan sintaks berikut:
DROP EXTENSION dbms_job CASCADE;
Buat job terjadwal
Sintaksis
SUBMIT(job OUT BINARY_INTEGER, what VARCHAR2
[, next_date DATE [, interval VARCHAR2 ]])
Tabel 1. Parameter
|
Parameter |
Deskripsi |
|
|
|
|
|
Nama prosedur tersimpan yang akan dipanggil. Parameter ini wajib diisi. Contoh ini menggunakan prosedur tersimpan |
|
|
Waktu eksekusi berikutnya dari job terjadwal. Jika Anda tidak menentukan parameter ini, job akan dijalankan segera setelah dikirimkan. |
|
|
Interval pengulangan untuk job terjadwal. Untuk informasi selengkapnya, lihat Referensi INTERVAL. |
Tabel 2. Referensi INTERVAL
|
Interval pengulangan |
Contoh |
|
Dijalankan setiap menit. |
|
|
Setiap hari pada waktu tertentu. |
Dijalankan pukul 01.00 setiap hari:
|
|
Setiap minggu pada waktu tertentu. |
Dijalankan pukul 01.00 setiap Senin:
|
|
Setiap bulan pada waktu tertentu. |
Dijalankan pukul 01.00 pada hari pertama setiap bulan:
|
|
Setiap kuartal pada waktu tertentu. |
Dijalankan pukul 01.00 pada hari pertama setiap kuartal:
|
|
Setiap tahun pada waktu tertentu. |
Dijalankan pukul 01.00 pada 1 Januari setiap tahun:
|
|
Dijalankan pada titik waktu tetap. |
Dijalankan pukul 08.10 setiap hari:
|
|
Dijalankan pada interval tetap. |
Dijalankan pada menit ke-15 setiap jam, seperti 08.15, 09.15, dan 10.15.
|
Panggil prosedur tersimpan job_proc untuk membuat job terjadwal. Berikut contohnya:
DECLARE
jobid INTEGER;
BEGIN
DBMS_JOB.SUBMIT(jobid,'job_proc;', SYSDATE, 'SYSDATE + 1/(24 * 60)');
END;
Jika ekspresi waktu berisi tanda petik tunggal, penumpukan tanda petik tersebut dapat menyebabkan error sintaks. Berikut contoh yang salah:
DBMS_JOB.SUBMIT(jobid,'job_proc;', SYSDATE, 'TRUNC(sysdate,'mi') + 1/(24*60)');
Untuk mencegah error ini, gunakan $$ dollar-quoting untuk parameter yang bersangkutan. Berikut contoh yang benar:
DBMS_JOB.SUBMIT(jobid,'job_proc;', SYSDATE, $$TRUNC(sysdate,'mi') + 1/(24*60)$$);
Lihat job terjadwal
Untuk melihat job terjadwal yang dibuat oleh pengguna saat ini, jalankan pernyataan berikut:
SELECT * FROM sys.user_jobs;
Ubah job terjadwal
Sintaks
CHANGE(job BINARY_INTEGER what VARCHAR2, next_date DATE,interval VARCHAR2)
Tabel 3. Parameter
|
Parameter |
Deskripsi |
|
|
ID job. Untuk menemukan ID job, lihat Lihat job terjadwal. |
|
|
Nama prosedur tersimpan yang akan dipanggil. Catatan
Untuk mempertahankan nilai saat ini, atur parameter ini ke |
|
|
Waktu eksekusi berikutnya dari job terjadwal. Catatan
Untuk mempertahankan nilai saat ini, atur parameter ini ke |
|
|
Interval pengulangan job terjadwal. Untuk informasi selengkapnya, lihat Referensi INTERVAL. Catatan
Untuk mempertahankan nilai saat ini, atur parameter ini ke |
Contoh ini mengubah job 1 agar dijalankan pada menit ke-15 setiap jam, dengan eksekusi berikutnya pada 29 Desember 2020. Prosedur tersimpan tidak diubah (NULL).
BEGIN
DBMS_JOB.CHANGE(1,NULL,TO_DATE('29-DEC-20','DD-MON-YY'),$$Trunc(sysdate,'hh') + (60+15)/(24*60)$$);
END;
Ubah interval pengulangan
Sintaks
INTERVAL(job BINARY_INTEGER, interval VARCHAR2)
Tabel 4. Parameter
|
Parameter |
Deskripsi |
|
|
ID job. Untuk menemukan ID job, lihat Lihat job terjadwal. |
|
|
Interval pengulangan job terjadwal. Untuk informasi selengkapnya, lihat Referensi INTERVAL. |
Contoh ini mengubah interval pengulangan job 1 menjadi pukul 01.00 setiap hari:
BEGIN
DBMS_JOB.INTERVAL(1,'TRUNC(sysdate) + 1 + 1/(24)');
END;
Ubah waktu eksekusi berikutnya
Sintaks
NEXT_DATE(job BINARY_INTEGER, next_date DATE)
Tabel 5. Parameter
|
Parameter |
Deskripsi |
|
|
ID job. Untuk menemukan ID job, lihat Lihat job terjadwal. |
|
|
Waktu eksekusi berikutnya dari job terjadwal. |
Contoh ini mengubah waktu eksekusi berikutnya untuk job 1 menjadi 30 Desember 2020:
BEGIN
DBMS_JOB.NEXT_DATE(1, TO_DATE('30-DEC-20','DD-MON-YY'));
END;
Ubah konten job
Sintaks
WHAT(job BINARY_INTEGER, what VARCHAR2)
Tabel 6. Parameter
|
Parameter |
Deskripsi |
|
|
ID job. Untuk menemukan ID job, lihat Lihat job terjadwal. |
|
|
Nama prosedur tersimpan yang akan dipanggil. |
Contoh ini mengubah prosedur tersimpan untuk job 1 menjadi job_proc2:
BEGIN
DBMS_JOB.WHAT(1,'job_proc2');
END;
Hentikan dan lanjutkan job terjadwal
Sintaks
BROKEN(job BINARY_INTEGER, broken BOOLEAN [, next_date DATE ])
Tabel 7. Parameter
|
Parameter |
Deskripsi |
|
|
ID job. Untuk menemukan ID job, lihat Lihat job terjadwal. |
|
|
Status job terjadwal. Nilai yang valid:
|
|
|
Waktu eksekusi berikutnya dari job terjadwal. Jika Anda tidak menentukan parameter ini, waktu saat ini digunakan secara default. |
Contoh ini menandai job 1 sebagai rusak:
BEGIN
DBMS_JOB.BROKEN(1,true);
END;
Contoh ini menandai job 1 sebagai tidak rusak:
BEGIN
DBMS_JOB.BROKEN(1,false);
END;
Jalankan paksa job terjadwal
Sintaks
RUN(job BINARY_INTEGER)
Tabel 8. Parameter
|
Parameter |
Deskripsi |
|
|
ID job. Untuk menemukan ID job, lihat Lihat job terjadwal. |
Contoh ini menjalankan paksa job 1 segera:
BEGIN
DBMS_JOB.RUN(1);
END;
Jika Anda mengalami error serupa berikut saat menjalankan pernyataan di atas menggunakan tool client, tool client Anda tidak kompatibel. Untuk mengatasinya, beralihlah ke tool client lain, seperti PolarDB-Tools.
ERROR: syntax error at end of input
CONTEXT:polar-spl function dbms_job._run_job(integer,boolean) line 151 at RAISE line 547 of package body
Hapus job terjadwal
Sintaks
REMOVE(job BINARY_INTEGER)
Tabel 9. Parameter
|
Parameter |
Deskripsi |
|
|
ID job. Untuk menemukan ID job, lihat Lihat job terjadwal. |
Contoh ini menghapus job 1:
BEGIN
DBMS_JOB.REMOVE(1);
END;
Lihat catatan eksekusi
Untuk melihat catatan eksekusi, jalankan pernyataan berikut:
SELECT * FROM dbmsjob.pga_joblog;
Jalankan job lintas database
Ekstensi DBMS_JOB hanya dapat dibuat di database postgres. Untuk menjalankan job terjadwal di database lain, Anda harus mengonfigurasi job lintas database.
Contoh berikut mengonfigurasi job di database postgres yang dijalankan di database test. Job tersebut menyisipkan satu baris data per menit ke dalam tabel di database test. Untuk informasi selengkapnya tentang cara membuat database, lihat Manajemen database.
-
Di database
test, buat tabel bernamajobrundan prosedur tersimpan bernamajob_proc.-
Buat tabel
jobrun:CREATE TABLE public.jobrun ( id serial NOT NULL PRIMARY KEY, runtime VARCHAR2(40) ); -
Buat prosedur tersimpan
job_proc:CREATE PROCEDURE public.job_proc IS BEGIN INSERT INTO jobrun(runtime) VALUES ('job_proc run at ' || TO_CHAR(SYSDATE, 'yyyy-mm-dd hh24:mi:ss')); END;
-
-
Beralih ke database
postgresdan buat job terjadwal.Dalam prosedur
DBMS_JOB.SUBMIT(), Anda harus menentukan database target. Dalam contoh ini, database target adalahtest. Untuk informasi tentang parameter lainnya, lihat Buat job terjadwal.Berikut contohnya:
DECLARE jobid INTEGER; BEGIN DBMS_JOB.SUBMIT(jobid,'job_proc;', SYSDATE, 'SYSDATE + 1/(24 * 60)','test'); END; -
Di database
postgres, periksa status dan catatan eksekusi job terjadwal.-
Lihat pekerjaan terjadwal:
SELECT * FROM sys.user_jobs;Berikut contoh output-nya:
job | jobloguser | job_user | database | job_created | job_changed | last_date | last_sec | next_date | next_sec | total_time | broken | interval | failures | what | instance -----+------------+----------+----------+----------------------------------+----------------------------------+----------------------------------+----------+---------------------------+----------+-----------------+--------+------------------------------------------+----------+-----------------------------------------------------------------------------------------------------------------+---------- 1 | DBUSER | dbuser | postgres | 29-OCT-20 02:38:49.478494 +00:00 | 29-OCT-20 02:38:49.478494 +00:00 | 29-OCT-20 02:51:12.025001 +00:00 | 02:51:12 | 29-OCT-20 02:53:12 +00:00 | 02:53:12 | 00:00:00.243224 | N | BEGIN return SYSDATE + 1/(24 * 30); END; | 0 | BEGIN EXECUTE IMMEDIATE 'SELECT dbmsjob.dbms_job_internal_job_link(''BEGIN job_proc; END;'', ''test'');' ; END | 0 -
Lihat catatan eksekusi:
SELECT * FROM dbmsjob.pga_joblog;Berikut contoh output-nya:
jlgid | jlgjobid | jlgstatus | jlgstart | jlgduration -------+----------+-----------+----------------------------------+----------------- 1 | 1 | s | 29-OCT-20 02:38:49.762995 +00:00 | 00:00:00.017495 2 | 1 | s | 29-OCT-20 02:39:50.061113 +00:00 | 00:00:00.016463 3 | 1 | s | 29-OCT-20 02:40:50.062331 +00:00 | 00:00:00.016244
-
-
Beralih ke database
testdan lihat data di dalam tabel.Jalankan kueri berikut:
SELECT * FROM jobrun;Berikut contoh output-nya:
id | runtime ----+------------------------------------- 1 | job_proc run at 2020-10-29 02:38:50 2 | job_proc run at 2020-10-29 02:39:50 3 | job_proc run at 2020-10-29 02:40:50
Untuk mengubah job lintas database, jalankan prosedur modifikasi dari database postgres dan tentukan nama database target. Misalnya, untuk mengubah jadwal job dari setiap menit menjadi setiap dua menit, jalankan perintah berikut:
BEGIN
DBMS_JOB.CHANGE(1,NULL,SYSDATE,'SYSDATE + 1/(24 * 30)','test');
END;