PostgreSQL có thể được mở rộng để chạy mã do người dùng cung cấp theo cách riêng biệt quá kèo bóng đá pháp. Các quy kèo bóng đá pháp như vậy được bắt đầu, dừng và theo dõi bởiPostgres, cho phép họ có một Lifetime liên kết chặt chẽ với trạng thái của máy chủ. Những quá kèo bóng đá pháp này có tùy chọn gắn vàokèo bóng đá phápkhu vực bộ nhớ được chia sẻ và kết nối đến cơ sở dữ liệu nội bộ; Họ cũng có thể chạy nhiều giao dịch Về mặt thanh thản, giống như một quy kèo bóng đá pháp máy chủ kết nối máy khách thông thường. Ngoài ra, bằng cách liên kết vớilibpqHọ có thể Kết nối với máy chủ và cư xử như một máy khách thông thường ứng dụng.
Cảnh báo |
Có những rủi ro mạnh mẽ và bảo mật đáng kể khi sử dụng Quy kèo bóng đá pháp nhân viên nền bởi vì, được viết trongCNgôn ngữ, họ có quyền truy cập không giới hạn để dữ liệu. Quản trị viên muốn bật các mô -đun bao gồm kèo bóng đá pháp nền nên thực hiện thận trọng cực độ. Chỉ một Các mô -đun được kiểm toán cẩn thận nên được phép chạy nền kèo bóng đá pháp. |
Chỉ các mô -đun được liệt kê trongshared_preload_l LibriesCó thể chạy công kèo bóng đá pháp nền.
Một mô -đun muốn chạy một công kèo bóng đá pháp nền cần phải đăng ký nó bằng cách
Gọi9980_10007BackidentWorker *Công kèo bóng đá pháp)
từ nó_pg_init ()
. Cấu trúcBackidentWorkerđược xác định như vậy:
typedef void (*bgworker_main_type) (datum main_arg); Typedef Struct BackidentWorker char bgw_name [bgw_maxlen]; int bgw_flags; Bgworkerstarttime bgw_start_time; int bgw_restart_time; / * tính bằng giây hoặc bgw_never_restart */ bgworker_main_type bgw_main; Datum bgw_main_arg; BackidentWorker;
BGW_NAMElà một chuỗi được sử dụng trong Tin nhắn nhật ký, danh sách xử lý và bối cảnh tương tự.
BGW_FLAGSlà bitmask bitwise-or'd chỉ ra các khả năng mà mô -đun muốn. Giá trị có thể làbgworker_shmem_access(Yêu cầu Truy cập bộ nhớ chia sẻ) vàBGWorker_Backend_Database_Connection(yêu cầu khả năng thiết lập kết nối cơ sở dữ liệu, thông qua đó nó có thể sau khi chạy các giao dịch và truy vấn). Một kèo bóng đá pháp viên nền bằng cách sử dụngBGWorker_Backend_Database_Connectionđến Kết nối với cơ sở dữ liệu cũng phải đính kèm bộ nhớ được chia sẻ bằng cách sử dụngBGWorker_Shmem_Accesshoặc khởi nghiệp công kèo bóng đá pháp sẽ thất bại.
bgw_start_timelà trạng thái máy chủ trong đóPostgresnên bắt đầu quá kèo bóng đá pháp; Nó có thể là một trong nhữngBGWorkerstart_PostMasterStart(Bắt đầu ngay khiPostgresBản thân đã hoàn thành khởi tạo; các quy kèo bóng đá pháp yêu cầu điều này không đủ điều kiện cho Kết nối cơ sở dữ liệu),BGWorkerstart_ConsistentState(Bắt đầu ngay khi một trạng thái nhất quán đã đạt được trong chế độ chờ nóng, cho phép các quy kèo bóng đá pháp để kết nối với cơ sở dữ liệu và chạy các truy vấn chỉ đọc) vàBGWorkerstart_RecoveryFinished(Bắt đầu như Ngay khi hệ thống đã đi vào trạng thái đọc đọc bình thường). Lưu ý các Hai giá trị cuối cùng tương đương trong một máy chủ không nóng chờ đợi. Lưu ý rằng cài đặt này chỉ cho biết khi nào các quy kèo bóng đá pháp sẽ được bắt đầu; Họ không dừng lại khi một trạng thái khác đạt.
bgw_restart_timelà khoảng thời gian, Trong vài giây, đóPostgresNên chờ Trước khi khởi động lại quá kèo bóng đá pháp, trong trường hợp nó bị sập. Nó có thể là bất kỳ Giá trị dương, hoặcbgw_never_restart,, cho biết không khởi động lại quá kèo bóng đá pháp trong trường hợp gặp sự cố.
bgw_mainlà một con trỏ tới chức năng để chạy khi quá kèo bóng đá pháp được bắt đầu. Chức năng này phải Lấy một đối số duy nhất loạiDatumvà trở lạivoid. BGW_MAIN_ARGsẽ được chuyển cho nó như duy nhất lý lẽ. Lưu ý rằng biến toàn cầumybgworkerentrychỉ vào một bản sao củaBackidentWorkerCấu trúc được thông qua khi đăng ký thời gian.
Sau khi chạy, quá kèo bóng đá pháp có thể kết nối với cơ sở dữ liệu bằng cách gọichar *dbname, Char
*Tên người dùng)
. Điều này cho phép quá kèo bóng đá pháp chạy các giao dịch
và truy vấn bằng cách sử dụngSPIGiao diện. Nếu nhưdbnamelà null, phiên không
kết nối với bất kỳ cơ sở dữ liệu cụ thể nào, nhưng các danh mục được chia sẻ có thể
truy cập. Nếu nhưtên người dùnglà null, quá kèo bóng đá pháp
sẽ chạy như siêu người dùng được tạo tronginitDB. BackgroundworkerInitializeConnection có thể
chỉ được gọi một lần cho mỗi quá kèo bóng đá pháp nền, không thể
chuyển đổi cơ sở dữ liệu.
Tín hiệu ban đầu bị chặn khi điều khiển đạt đếnBGW_MAINchức năng và phải
bỏ chặn bởi nó; Điều này là để cho phép quá kèo bóng đá pháp tùy chỉnh
kèo bóng đá pháp xử lý tín hiệu, nếu cần thiết. Tín hiệu có thể được bỏ chặn trong cái mới
xử lý bằng cách gọiBackidentWorkerUnblockSignals
và bị chặn bởi
Gọi.
Công kèo bóng đá pháp nền dự kiến sẽ liên tục chạy; nếu như
họ thoát khỏi sạch sẽ,Postgressẽ khởi động lại
họ ngay lập tức. Cân nhắc việc ngủ bị gián đoạn khi họ có
không có gì để làm; Điều này có thể đạt được bằng cách gọiWaitlatch ()
. Đảm bảoWL_PostMaster_Deathcờ được đặt khi gọi nó
chức năng và xác minh mã trả về cho một thoát nhanh chóng trong
trường hợp khẩn cấp đóPostgresBản thân nó có
bị chấm dứt.
Theworker_spiMô -đun đóng góp chứa một ví dụ hoạt động, thể hiện một số kỹ thuật hữu ích.