Phiên bản được hỗ trợ:hiện tại(17) /16 / 15 / 14 / 13
Phiên bản phát triển:18 / Devel
Phiên bản không được hỗ trợ:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3
Tài liệu này dành cho phiên bản không được hỗ trợ của PostgreSQL.
Bạn có thể muốn xem cùng một trang chohiện tạiPhiên bản hoặc một trong các phiên bản được hỗ trợ khác được liệt kê ở trên thay thế.

Chương 46. cách đọc kèo bóng đá nền

PostgreSQL có thể được mở rộng để chạy mã do người dùng cung cấp trong các quy cách đọc kèo bóng đá riêng biệt. Các quy cách đọc kèo bóng đá như vậy được bắt đầu, dừng và theo dõi bởiPostgres, cho phép họ có một thời gian trọn đời được liên kết chặt chẽ với trạng thái của máy chủ. Các quy cách đọc kèo bóng đá này có tùy chọn để đính kèm vàoPOSTGRESQLkhu vực bộ nhớ được chia sẻ và để kết nối với cơ sở dữ liệu bên trong; Họ cũng có thể chạy nhiều giao dịch một cách tự do, giống như một quy cách đọc kèo bóng đá 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à hoạt động như một ứng dụng máy khách thông thường.

cảnh báo

Có những rủi ro mạnh mẽ và bảo mật đáng kể trong việc sử dụng các cách đọc kèo bóng đá nền bởi vì, được viết trongCNgôn ngữ, họ có quyền truy cập không giới hạn vào dữ liệu. Các quản trị viên muốn kích hoạt các mô -đun bao gồm các cách đọc kèo bóng đá nền nên thực hiện thận trọng cực độ. Chỉ được phép kiểm tra cẩn thận các mô -đun để chạy các cách đọc kèo bóng đá nền.

cách đọc kèo bóng đá có thể được khởi tạo tại thời điểm đóPostgreSQLđược bắt đầu bằng cách bao gồm tên mô -đun trongshared_preload_l Libries. Một mô -đun muốn chạy một cách đọc kèo bóng đá có thể đăng ký nó bằng cách gọi10077_10104BackidentWorker *Công cách đọc kèo bóng đá)Từ nó_pg_init (). cách đọc kèo bóng đá cũng có thể được bắt đầu sau khi hệ thống được tăng và chạy bằng cách gọi chức năng10329_1036310378_10437). Không giống như10480_10506, chỉ có thể được gọi từ bên trong Postmaster,10589_10622phải được gọi từ phụ trợ thông thường.

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;
    char bgw_l Library_name [bgw_maxlen];   / * Chỉ khi bgw_main là null */
    char bgw_function_name [bgw_maxlen];  / * Chỉ khi bgw_main là null */
    Datum bgw_main_arg;
    char bgw_extra [bgw_extralen];
    int bgw_notify_pid;
 BackidentWorker;

BGW_NAMElà một chuỗi được sử dụng trong các thông báo nhật ký, danh sách xử lý và bối cảnh tương tự.

BGW_FLAGSmặt nạ bitwise-or'd cho biết các khả năng mà mô-đun muốn. Các giá trị có thể là:

bgworker_shmem_access

11735_11826PostgreSQL'sCác cấu trúc dữ liệu được chia sẻ, chẳng hạn như khóa hạng nặng hoặc hạng nhẹ, bộ đệm được chia sẻ hoặc bất kỳ cấu trúc dữ liệu tùy chỉnh nào mà chính người lao động có thể muốn tạo và sử dụng.

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 đó sau này có thể chạy các giao dịch và truy vấn. Một cách đọc kèo bóng đá viên nền bằng cách sử dụngBGWorker_Backend_Database_ConnectionĐể kết nối với cơ sở dữ liệu cũng phải đính kèm bộ nhớ chia sẻ bằng cách sử dụngbgworker_shmem_accesshoặc công cách đọc kèo bóng đá khởi nghiệp sẽ thất bại.

bgw_start_timelà trạng thái máy chủ trong đóPostgres12600_12646BGWorkerstart_PostMasterStart(Bắt đầu ngay sau khiPostgresBản thân đã hoàn thành khởi tạo riêng; Các quy cách đọc kèo bóng đá yêu cầu điều này không đủ điều kiện cho các kết nối cơ sở dữ liệu),BGWorkerstart_ConsistentState(Bắt đầu ngay khi đạt được trạng thái nhất quán trong chế độ chờ nóng, cho phép các quy cách đọc kèo bóng đá 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 ngay khi hệ thống đã đi vào trạng thái đọc thông thường). Lưu ý hai giá trị cuối cùng tương đương trong một máy chủ không phải là chế độ chờ nóng. Lưu ý rằng cài đặt này chỉ cho biết khi nào các quy cách đọc kèo bóng đá được bắt đầu; Họ không dừng lại khi đạt đến trạng thái khác.

BGW_RESTART_TIMElà khoảng thời gian, tính bằng giây, đóPostgresnên đợi trước khi khởi động lại quy cách đọc kèo bóng đá trong trường hợp nó gặp sự cố. Nó có thể là bất kỳ giá trị dương nào, hoặcbgw_never_restart, cho biết không khởi động lại quá cách đọc kèo bóng đá 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á cách đọc kèo bóng đá được bắt đầu. Trường này chỉ có thể được sử dụng một cách an toàn để khởi chạy các chức năng trong máy chủ lõi, vì các thư viện được chia sẻ có thể được tải tại các địa chỉ bắt đầu khác nhau trong các quy cách đọc kèo bóng đá phụ trợ khác nhau. Điều này sẽ xảy ra trên tất cả các nền tảng khi thư viện được tải bằng bất kỳ cơ chế nào khác ngoàishared_preload_l Libries. Ngay cả khi cơ chế đó được sử dụng, các biến thể bố trí không gian địa chỉ vẫn sẽ xảy ra trên Windows và khiexec_backendđược sử dụng. Do đó, hầu hết người dùng của API này nên đặt trường này thành NULL. Nếu nó không phải là null, nó sẽ được ưu tiên hơnbgw_l Library_nameBGW_Function_Name.

bgw_l Library_namelà tên của một thư viện trong đó nên tìm kiếm điểm nhập cảnh ban đầu cho công nhân nền. Thư viện được đặt tên sẽ được tải động bởi cách đọc kèo bóng đá vàBGW_FUNCTION_NAMEsẽ được sử dụng để xác định chức năng được gọi. Nếu tải một hàm từ mã lõi,BGW_MAINnên được đặt thay thế.

BGW_Function_Namelà tên của một hàm trong thư viện được tải động nên được sử dụng làm điểm nhập ban đầu cho một cách đọc kèo bóng đá mới.

BGW_MAIN_ARGDatumĐối số cho chức năng chính của cách đọc kèo bóng đá. Bất kể chức năng đó có được chỉ định quaBGW_MAINhoặc thông qua sự kết hợp củabgw_l Library_namebgw_function_name, Hàm chính này sẽ lấy một đối số duy nhất loạiDatumvà trả lạivoid. BGW_MAIN_ARGsẽ được thông qua làm đối số. Ngoài ra, biến toàn cầumybgworkerentrychỉ vào một bản sao củaBackidentWorkerCấu trúc được thông qua tại thời điểm đăng ký; Công cách đọc kèo bóng đá có thể thấy hữu ích khi kiểm tra cấu trúc này.

trên Windows (và bất cứ nơi nào khác nơiexec_backendđược xác định) hoặc trong cách đọc kèo bóng đá động không an toàn khi vượt quaDatumBằng cách tham chiếu, chỉ theo giá trị. Nếu một đối số là bắt buộc, việc chuyển INT32 hoặc giá trị nhỏ khác là an toàn nhất và sử dụng nó làm chỉ mục vào một mảng được phân bổ trong bộ nhớ chia sẻ. Nếu một giá trị nhưcStringhoặc16389_16395được thông qua thì con trỏ sẽ không hợp lệ từ cách đọc kèo bóng đá nền mới.

BGW_EXTRAcó thể chứa thêm dữ liệu sẽ được chuyển cho cách đọc kèo bóng đá. Không giống nhưBGW_MAIN_ARG16637_16738mybgworkerentry, Như đã thảo luận ở trên.

bgw_notify_pidlà PID của quy cách đọc kèo bóng đá phụ trợ PostgreSQL mà Postmaster sẽ gửiSigusr1Khi quá cách đọc kèo bóng đá được bắt đầu hoặc thoát ra. Nó phải là 0 cho các công nhân đã đăng ký tại thời gian khởi động bưu điện hoặc khi phụ trợ đăng ký công nhân không muốn chờ công nhân khởi động. Nếu không, nó phải được khởi tạo thànhMyProcPid.

Sau khi chạy, quá cách đọc kèo bóng đá 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)hoặcOID DBOID, OID useroid). Điều này cho phép quá cách đọc kèo bóng đá 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 hoặcDBOIDkhông hợp lệ, phiên không được 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ể được truy cập. Nếu nhưtên người dùnglà null hoặcuseroidkhông hợp lệ, quá cách đọc kèo bóng đá này sẽ chạy như Superuser được tạo tronginitDB. Một cách đọc kèo bóng đá viên nền chỉ có thể gọi một trong hai chức năng này và chỉ một lần. Không thể chuyển đổi cơ sở dữ liệu.

18256_18313BGW_MAINHàm và phải được bỏ chặn bởi nó; Điều này là để cho phép quá cách đọc kèo bóng đá tùy chỉnh cách đọc kèo bóng đá xử lý tín hiệu của nó, nếu cần thiết. Tín hiệu có thể được bỏ chặn trong quy cách đọc kèo bóng đá mới bằng cách gọivà bị chặn bằng cách gọi.

nếubgw_restart_timeĐối với cách đọc kèo bóng đá được cấu hình làbgw_never_restarthoặc nếu nó thoát với mã thoát 0 hoặc bị chấm dứt bởiChấm dứt công tác việc làm việc, nó sẽ tự động không được đăng ký bởi người bưu điện khi thoát. Nếu không, nó sẽ được khởi động lại sau khoảng thời gian được cấu hình quabgw_restart_timehoặc ngay lập tức nếu người bán bưu điện tái tạo cụm do lỗi phụ trợ. Các phụ trợ cần phải tạm dừng thực thi tạm thời nên sử dụng một giấc ngủ bị gián đoạn thay vì thoát; Điều này có thể đạt được bằng cách gọiWaitlatch (). Đảm bảowl_postmaster_deathcờ được đặt khi gọi hàm đó và xác minh mã trả về để thoát nhanh trong trường hợp khẩn cấpPostgresBản thân nó đã chấm dứt.

Khi một cách đọc kèo bóng đá được đăng ký bằng19681_19714Hàm, có thể cho phụ trợ thực hiện đăng ký để có được thông tin liên quan đến tình trạng của người lao động. Phụ trợ muốn làm điều này sẽ chuyển địa chỉ của mộtBackidentWorkerHandle *là đối số thứ hai cho20000_20033. Nếu người lao động được đăng ký thành công, con trỏ này sẽ được khởi tạo bằng tay cầm mờ có thể được truyền đếngetbackgroundWorkerPid (BackidentWorkerHandle *, PID_T *)hoặcchấm dứtBackidentWorkerHandle *). 20450_20474Có thể được sử dụng để thăm dò trạng thái của công cách đọc kèo bóng đá: Giá trị trả lại củaBGWH_NOT_YET_STARTEDCho biết rằng người lao động chưa được bắt đầu bởi người bưu điện;bgwh_stoppedcho biết nó đã được bắt đầu nhưng không còn chạy nữa; Vàbgwh_startedcho biết nó hiện đang chạy. Trong trường hợp cuối cùng này, PID cũng sẽ được trả về thông qua đối số thứ hai.chấm dứtkhiến người nhận bưu điện gửiSigtermĐối với công cách đọc kèo bóng đá nếu nó đang chạy và để hủy đăng ký nó ngay khi nó không.

Trong một số trường hợp, một quy cách đọc kèo bóng đá đăng ký một công nhân nền có thể muốn chờ người lao động bắt đầu. Điều này có thể được thực hiện bằng cách khởi tạobgw_notify_pidđếnMyProcPidvà sau đó vượt quaBackidentWorkerHandle *thu được tại thời gian đăng ký đểWaitForbackgroundWorkerstartup (BackidentWorkerHandle *Tay cầm, PID_T *)Hàm. Chức năng này sẽ chặn cho đến khi người đưa thư đã cố gắng bắt đầu cách đọc kèo bóng đá viên nền, hoặc cho đến khi người đưa thư chết. Nếu người chạy nền đang chạy, giá trị trả về sẽbgwh_startedvà PID sẽ được ghi vào địa chỉ được cung cấp. Nếu không, giá trị trả về sẽ làbgwh_stoppedhoặcBGWH_POSTMASTER_DIED.

Nếu một cách đọc kèo bóng đá gửi thông báo không đồng bộ vớiThông báolệnh thông qua giao diện lập cách đọc kèo bóng đá máy chủ (SPI), nó nên gọi22238_2226422269_22450ngheđếnSPI22526_22667

Thesrc/test/modules/worker_spiMô -đun chứa một ví dụ hoạt động, thể hiện một số kỹ thuật hữu ích.

22816_22884Max_Worker_Processes.