PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Tổng quan về các công cụ lập lịch công việc cho PostgreSQL

Không giống như các hệ thống quản lý cơ sở dữ liệu khác có bộ lập lịch tích hợp riêng (như Oracle, MSSQL hoặc MySQL), PostgreSQL vẫn không có loại tính năng này.

Để cung cấp chức năng lập lịch trong PostgreSQL, bạn sẽ cần sử dụng một công cụ bên ngoài như ...

  • Linux crontab
  • Đặc vụ pgAgent
  • Phần mở rộng pg_cron

Trong blog này, chúng ta sẽ khám phá những công cụ này và làm nổi bật cách vận hành chúng cũng như các tính năng chính của chúng.

Linux crontab

Tuy nhiên,

Đây là cách lâu đời nhất, một cách hiệu quả và hữu ích để thực hiện các tác vụ lập lịch. Chương trình này dựa trên daemon (cron) cho phép các tác vụ tự động chạy trong nền định kỳ và thường xuyên xác minh các tệp cấu hình (được gọi là tệp crontab), trên đó được xác định tập lệnh / lệnh sẽ được thực thi và lập lịch của nó.

Mỗi người dùng có thể có tệp crontab của riêng mình và đối với các bản phát hành Ubuntu mới nhất được đặt tại:

/var/spool/cron/crontabs (for other linux distributions the location could be different):

[email protected]:/var/spool/cron/crontabs# ls -ltr

total 12

-rw------- 1 dbmaster crontab 1128 Jan 12 12:18 dbmaster

-rw------- 1 slonik   crontab 1126 Jan 12 12:22 slonik

-rw------- 1 nines    crontab 1125 Jan 12 12:23 nines

Cú pháp của tệp cấu hình như sau:

mm hh dd mm day <<command or script to execute>>



mm: Minute(0-59)

hh: Hour(0-23)

dd: Day(1-31)

mm: Month(1-12)

day: Day of the week(0-7 [7 or 0 == Sunday])

Có thể sử dụng một số toán tử với cú pháp này để hợp lý hóa định nghĩa lập lịch và các ký hiệu này cho phép chỉ định nhiều giá trị trong một trường:

Dấu hoa thị (*) - nó có nghĩa là tất cả các giá trị có thể có cho một trường

Dấu phẩy (,) - được sử dụng để xác định danh sách các giá trị

Dấu gạch ngang (-) - được sử dụng để xác định một dải giá trị

Dấu phân cách (/) - chỉ định giá trị bước

Tập lệnh all_db_backup.sh sẽ được thực thi theo từng biểu thức lập lịch:

0 6 * * * /home/backup/all_db_backup.sh

Vào lúc 6 giờ sáng hàng ngày

20 22 * ​​* Thứ Hai, Thứ Ba, Thứ Tư, Thứ Sáu, Thứ Sáu /home/backup/all_db_backup.sh

Lúc 10:20 tối, mọi ngày trong tuần

0 23 * * 1-5 /home/backup/all_db_backup.sh

11 giờ đêm trong tuần

0 0/5 14 * * /home/backup/all_db_backup.sh

Năm giờ một lần bắt đầu từ 2:00 chiều và kết thúc lúc 2:55 chiều, hàng ngày

Mặc dù không quá khó nhưng cú pháp này có thể được tạo tự động trên nhiều trang web.

Nếu tệp crontab không tồn tại cho người dùng, bạn có thể tạo cú pháp này bằng lệnh sau:

[email protected]:~$ crontab -e

hoặc trình bày bằng tham số -l:

[email protected]:~$ crontab -l

Nếu cần xóa tệp này, tham số thích hợp là -r:

[email protected]:~$ crontab -r

Trạng thái cron daemon được hiển thị bằng cách thực thi lệnh sau:

Đặc vụ pgAgent

pgAgent là một tác nhân lập lịch công việc có sẵn cho PostgreSQL cho phép thực thi các thủ tục được lưu trữ, câu lệnh SQL và tập lệnh shell. Cấu hình của nó được lưu trữ trên cơ sở dữ liệu postgres trong cụm.

Mục đích là để tác nhân này chạy dưới dạng daemon trên hệ thống Linux và định kỳ thực hiện kết nối với cơ sở dữ liệu để kiểm tra xem có bất kỳ công việc nào cần thực thi hay không.

PgAdmin 4 dễ dàng quản lý việc lập lịch này, nhưng nó không được cài đặt theo mặc định sau khi pgAdmin được cài đặt, bạn cần phải tải xuống và cài đặt nó.

Dưới đây là mô tả tất cả các bước cần thiết để pgAgent hoạt động bình thường:

Bước một

Cài đặt pgAdmin 4

$ sudo apt install pgadmin4 pgadmin4-apache

Bước hai

Tạo ngôn ngữ thủ tục plpgsql nếu không được định nghĩa

CREATE TRUSTED PROCEDURAL LANGUAGE ‘plpgsql’

     HANDLER plpgsql_call_handler

          HANDLER plpgsql_validator;

Bước ba

Cài đặt pgAgent

$ sudo apt-get install pgagent

Bước bốn

Tạo tiện ích mở rộng pgagent

CREATE EXTENSION pageant 

Tiện ích mở rộng này sẽ tạo tất cả các bảng và hàm cho hoạt động pgAgent và sau đó sẽ hiển thị mô hình dữ liệu được tiện ích mở rộng này sử dụng:

Bây giờ giao diện pgAdmin đã có tùy chọn “pgAgent Jobs” để quản lý pgAgent:

Để xác định công việc mới, bạn chỉ cần chọn "Tạo" bằng cách sử dụng nút bên phải trên “pgAgent Jobs” và nó sẽ chèn một chỉ định cho công việc này và xác định các bước để thực hiện nó:

Trong tab "Lịch biểu", bạn phải xác định lịch trình cho công việc mới này :

Cuối cùng, để tác nhân chạy trong nền, bạn cần phải khởi chạy quy trình sau theo cách thủ công:

/usr/bin/pgagent host=localhost dbname=postgres user=postgres port=5432 -l 1

Tuy nhiên, tùy chọn tốt nhất cho tác nhân này là tạo một daemon bằng lệnh trước đó.

Phần mở rộng pg_cron

pg_cron là bộ lập lịch công việc dựa trên cron cho PostgreSQL chạy bên trong cơ sở dữ liệu dưới dạng phần mở rộng (tương tự như DBMS_SCHEDULER trong Oracle) và cho phép thực hiện các tác vụ cơ sở dữ liệu trực tiếp từ cơ sở dữ liệu, do nhân viên nền tảng.

Các tác vụ cần thực hiện có thể là bất kỳ tác vụ nào sau đây:

  • các thủ tục được lưu trữ
  • Câu lệnh SQL
  • Các lệnh PostgreSQL (dưới dạng VACUUM, hoặc VACUUM ANALYZE)

pg_cron có thể chạy một số công việc song song, nhưng mỗi lần chỉ có thể chạy một phiên bản của chương trình.

Nếu lần chạy thứ hai phải được bắt đầu trước khi lần chạy đầu tiên kết thúc, thì lần chạy đó sẽ được xếp vào hàng đợi và sẽ bắt đầu ngay khi lần chạy đầu tiên hoàn thành.

Phần mở rộng này được xác định cho phiên bản 9.5 trở lên của PostgreSQL.

Cài đặt pg_cron

Việc cài đặt tiện ích mở rộng này chỉ yêu cầu lệnh sau:

[email protected]:~$ sudo apt-get -y install postgresql-10-cron

Cập nhật Tệp Cấu hình

Để khởi động trình làm việc nền pg_cron sau khi máy chủ PostgreSQL khởi động, bạn cần đặt pg_cron thành tham số shared_preload_libraries trong postgresql.conf:

shared_preload_libraries = ‘pg_cron’

Cũng cần xác định trong tệp này, cơ sở dữ liệu mà phần mở rộng pg_cron sẽ được tạo, bằng cách thêm tham số sau:

cron.database_name= ‘postgres’

Mặt khác, trong tệp pg_hba.conf quản lý xác thực, cần xác định thông tin đăng nhập postgres làm độ tin cậy cho các kết nối IPV4, vì pg_cron yêu cầu người dùng đó có thể kết nối với cơ sở dữ liệu mà không cần cung cấp bất kỳ mật khẩu nào, vì vậy cần thêm dòng sau vào tệp này:

host postgres postgres 192.168.100.53/32 trust

Phương thức xác thực tin cậy cho phép bất kỳ ai kết nối với (các) cơ sở dữ liệu được chỉ định trong tệp pg_hba.conf, trong trường hợp này là cơ sở dữ liệu postgres. Đây là một phương pháp được sử dụng thường xuyên để cho phép kết nối bằng ổ cắm miền Unix trên một máy người dùng duy nhất để truy cập cơ sở dữ liệu và chỉ nên được sử dụng khi có đủ bảo vệ cấp hệ điều hành đối với các kết nối đến máy chủ.

Cả hai thay đổi đều yêu cầu khởi động lại dịch vụ PostgreSQL:

[email protected]:~$ sudo system restart postgresql.service

Điều quan trọng cần lưu ý là pg_cron không chạy bất kỳ công việc nào miễn là máy chủ ở chế độ chờ nóng, nhưng nó sẽ tự động khởi động khi máy chủ được thúc đẩy.

Tạo tiện ích mở rộng pg_cron

Phần mở rộng này sẽ tạo siêu dữ liệu và các thủ tục để quản lý nó, vì vậy lệnh sau sẽ được thực thi trên psql:

postgres=#CREATE EXTENSION pg_cron;

CREATE EXTENSION

Bây giờ, các đối tượng cần thiết để lập lịch công việc đã được xác định trên lược đồ cron :

Phần mở rộng này rất đơn giản, chỉ cần bảng công việc là đủ để quản lý tất cả chức năng này:

Định nghĩa Công việc Mới

Cú pháp lập lịch để xác định công việc trên pg_cron giống với cú pháp được sử dụng trên công cụ cron và định nghĩa công việc mới rất đơn giản, chỉ cần gọi hàm cron.schedule:

select cron.schedule('*/5 * * * *','CALL reporting.p_compute_client_data(12356,''DAILY_DATA'');')

select cron.schedule('*/5 * * * *','CALL reporting.p_compute_client_data(998934,''WEEKLY_DATA'');')

select cron.schedule('*/5 * * * *','CALL reporting.p_compute_client_data(45678,''DAILY_DATA'');')

select cron.schedule('*/5 * * * *','CALL reporting.p_compute_client_data(1010,''WEEKLY_DATA'');')

select cron.schedule('*/5 * * * *','CALL reporting.p_compute_client_data(1001,''MONTHLY_DATA'');')

select cron.schedule('*/5 * * * *','select reporting.f_reset_client_data(0,''DATA'')')

select cron.schedule('*/5 * * * *','VACUUM')

select cron.schedule('*/5 * * * *','$$DELETE FROM reporting.rep_request WHERE create_dt<now()- interval '60 DAYS'$$)

Thiết lập công việc được lưu trữ trên bảng công việc:

Một cách khác để xác định công việc là chèn dữ liệu trực tiếp trên cron bảng. công việc:

INSERT INTO cron.job (schedule, command, nodename, nodeport, database, username)

VALUES ('0 11 * * *','call loader.load_data();','postgresql-pgcron',5442,'staging', 'loader');

và sử dụng các giá trị tùy chỉnh cho tên nút và nút bấm để kết nối với một máy khác (cũng như các cơ sở dữ liệu khác).

Hủy kích hoạt Công việc

Mặt khác, để hủy kích hoạt một công việc, bạn chỉ cần thực thi chức năng sau:

select cron.schedule(8)

Ghi nhật ký Công việc

Có thể tìm thấy nhật ký của những công việc này trên tệp nhật ký PostgreSQL /var/log/postgresql/postgresql-12-main.log:


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL:ERROR:42601:cần có danh sách định nghĩa cột cho các hàm trả về bản ghi

  2. PostgreSQL CASE ... KẾT THÚC với nhiều điều kiện

  3. Làm cách nào tôi có thể kiểm tra xem một cột tồn tại trong bảng bằng câu lệnh SQL

  4. Tạo dữ liệu và chất lượng phần cứng

  5. Cách hiển thị giá trị rỗng khi chạy truy vấn trong psql (PostgreSQL)