이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
당신은 다음과 같은 페이지를 보고 싶을 수도 있습니다.PostgreSQL : 문서 : 17 : 46 장. 배경 스포츠 토토 결과 프로세스버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

45장. 백그라운드 작업자 토토 꽁 머니

PostgreSQL은 별도의 프로세스에서 사용자 제공 코드를 실행하도록 확장될 수 있습니다. 이러한 프로세스는 다음에 의해 시작, 중지 및 모니터링됩니다.포스트그레, 이는 서버 상태와 긴밀하게 연결된 수명을 허용합니다. 이러한 프로세스에는 다음에 연결할 수 있는 옵션이 있습니다.포스트그레SQL의 공유 메모리 영역과 내부적으로 데이터베이스에 연결합니다. 또한 일반 클라이언트 연결 서버 프로세스처럼 여러 트랜잭션을 직렬로 실행할 수도 있습니다. 또한, 다음으로 연결하여libpq서버에 연결하여 일반 클라이언트 애플리케이션처럼 작동할 수 있습니다.

경고

백그라운드 작업자 프로세스를 사용하면 상당한 견고성과 보안 위험이 있습니다. 왜냐하면 다음에서 작성되기 때문입니다.C언어를 사용하면 데이터에 무제한으로 접근할 수 있습니다. 백그라운드 작업자 토토 꽁 머니가 포함된 모듈을 활성화하려는 관리자는 매우 주의해야 합니다. 신중하게 감사된 모듈만 백그라운드 작업자 토토 꽁 머니를 실행하도록 허용되어야 합니다.

백그라운드 작업자는 해당 시점에 초기화될 수 있습니다.포스트그레SQL다음에 모듈 이름을 포함하여 시작됩니다.shared_preload_libraries. 백그라운드 작업자를 실행하려는 모듈은 호출하여 등록할 수 있습니다.RegisterBackgroundWorker(BackgroundWorker *작업자)그것으로부터_PG_init(). 함수를 호출하여 시스템이 가동되고 실행된 후에 백그라운드 작업자를 시작할 수도 있습니다.DynamicBackgroundWorker 등록(BackgroundWorker *작업자, BackgroundWorkerHandle **핸들). 달리BackgroundWorker 등록, 포스트마스터 내에서만 호출할 수 있습니다.DynamicBackgroundWorker 등록일반 백엔드에서 호출해야 합니다.

구조BackgroundWorker다음과 같이 정의됩니다.

typedef void (*bgworker_main_type)(Datum main_arg);
typedef 구조체 BackgroundWorker

    char bgw_name[BGW_MAXLEN];
    int bgw_flags;
    BgWorkerStartTime bgw_start_time;
    int bgw_restart_time;       /* 초 단위 또는 BGW_NEVER_RESTART */
    bgworker_main_type bgw_main;
    char bgw_library_name[BGW_MAXLEN];   /* bgw_main이 NULL인 경우에만 */
    char bgw_function_name[BGW_MAXLEN];  /* bgw_main이 NULL인 경우에만 */
    데이텀 bgw_main_arg;
    char bgw_extra[BGW_EXTRALEN];
    int bgw_notify_pid;
 BackgroundWorker;

bgw_name로그 메시지, 토토 꽁 머니 목록 및 유사한 컨텍스트에 사용되는 문자열입니다.

bgw_flags은 모듈이 원하는 기능을 나타내는 비트별 비트 마스크입니다. 가능한 값은 다음과 같습니다.BGWORKER_SHMEM_ACCESS(공유 메모리 액세스 요청) 및BGWORKER_BACKEND_DATABASE_CONNECTION(나중에 트랜잭션과 쿼리를 실행할 수 있도록 데이터베이스 연결을 설정하는 기능을 요청합니다). 다음을 사용하는 백그라운드 작업자BGWORKER_BACKEND_DATABASE_CONNECTION데이터베이스에 연결하려면 다음을 사용하여 공유 메모리도 연결해야 합니다.BGWORKER_SHMEM_ACCESS, 그렇지 않으면 작업자 시작이 실패합니다.

bgw_start_time이동하는 동안의 서버 상태입니다포스트그레스프로세스를 시작해야 합니다. 다음 중 하나일 수 있습니다.BgWorkerStart_PostmasterStart(즉시 시작포스트그레스자체 초기화가 완료되었습니다. 이를 요청하는 토토 꽁 머니는 데이터베이스 연결에 적합하지 않습니다),BgWorkerStart_CondependentState(상시 대기에서 일관된 상태에 도달하자마자 시작하여 토토 꽁 머니가 데이터베이스에 연결하고 읽기 전용 쿼리를 실행할 수 있도록 허용) 및BgWorkerStart_RecoveryFinished(시스템이 정상적인 읽기-쓰기 상태에 진입하자마자 시작). 마지막 두 값은 상시 대기가 아닌 서버에서 동일합니다. 이 설정은 토토 꽁 머니가 시작되는 시기만 나타냅니다. 다른 상태에 도달해도 멈추지 않습니다.

bgw_restart_time초 단위의 간격입니다.포스트그레스충돌이 발생할 경우 토토 꽁 머니를 다시 시작하기 전에 기다려야 합니다. 양수 값일 수 있습니다. 또는BGW_NEVER_RESTART, 충돌 발생 시 토토 꽁 머니를 다시 시작하지 않음을 나타냅니다.

bgw_main은 프로세스가 시작될 때 실행할 함수에 대한 포인터입니다. 이 함수는 다음 유형의 단일 인수를 사용해야 합니다.데이텀그리고 돌아옴무효. bgw_main_arg유일한 인수로 전달됩니다. 전역 변수에 유의하세요.MyBgworkerEntry다음의 사본을 가리킵니다BackgroundWorker등록 시 구조가 전달되었습니다.bgw_mainNULL일 수 있습니다. 이 경우에는,bgw_library_name그리고bgw_function_name진입점을 결정하는 데 사용됩니다. 이는 포스트마스터가 필수 라이브러리를 로드하지 않은 포스트마스터 시작 후 시작된 백그라운드 작업자에게 유용합니다.

bgw_library_name은(는) 백그라운드 워커의 초기 진입점을 찾아야 하는 라이브러리의 이름입니다. 다음이 아니면 무시됩니다.bgw_main은 NULL입니다. 하지만 만일bgw_main이 NULL이면 명명된 라이브러리가 작업자 토토 꽁 머니에 의해 동적으로 로드되고bgw_function_name호출할 함수를 식별하는 데 사용됩니다.

bgw_function_name은 새로운 백그라운드 워커의 초기 진입점으로 사용되어야 하는 동적으로 로드된 라이브러리의 함수 이름입니다. 다음이 아니면 무시됩니다.bgw_mainNULL입니다.

bgw_extra백그라운드 작업자에게 전달될 추가 데이터를 포함할 수 있습니다. 달리bgw_main_arg, 이 데이터는 작업자의 기본 함수에 인수로 전달되지 않지만 다음을 통해 액세스할 수 있습니다.MyBgworkerEntry, 위에서 논의한 바와 같습니다.

bgw_notify_pid포스트마스터가 보내야 하는 PostgreSQL 백엔드 토토 꽁 머니의 PID입니다.SIGUSR1프로세스가 시작되거나 종료될 때. 포스트마스터 시작 시간에 등록된 작업자의 경우 또는 작업자를 등록하는 백엔드가 작업자가 시작될 때까지 기다리지 않으려는 경우 0이어야 합니다. 그렇지 않으면 다음으로 초기화되어야 합니다.MyProcPid.

실행되면 토토 꽁 머니는 호출을 통해 데이터베이스에 연결할 수 있습니다.BackgroundWorkerInitializeConnection(char *dbname, char *사용자 이름)또는BackgroundWorkerInitializeConnectionByOid(오이드 드보이드, Oid 유저로이드). 이를 통해 프로세스는 다음을 사용하여 트랜잭션과 쿼리를 실행할 수 있습니다.SPI인터페이스. 만일db이름NULL이거나doidisInvalidOid, 세션이 특정 데이터베이스에 연결되어 있지 않지만 공유 카탈로그에 액세스할 수 있습니다. 만일사용자 이름NULL이거나유저로이드isInvalidOid, 토토 꽁 머니는 동안 생성된 수퍼유저로 실행됩니다.initdb. 백그라운드 작업자는 이 두 함수 중 하나만, 한 번만 호출할 수 있습니다. 데이터베이스를 전환할 수 없습니다.

통제가 도달하면 신호가 처음에 차단됩니다.bgw_main기능이며 이 기능에 의해 차단 해제되어야 합니다. 이는 필요한 경우 프로세스가 신호 처리기를 사용자 정의할 수 있도록 하기 위한 것입니다. 다음을 호출하여 새 프로세스에서 신호를 차단 해제할 수 있습니다.BackgroundWorkerUnblockSignals전화로 차단됨BackgroundWorkerBlockSignals.

만약bgw_restart_time백그라운드 작업자의 경우 다음과 같이 구성됩니다.BGW_NEVER_RESTART, 또는 종료 코드 0으로 종료되거나에 의해 종료되는 경우BackgroundWorker 종료, 종료 시 포스트마스터가 자동으로 등록을 취소합니다. 그렇지 않으면 다음을 통해 구성된 기간 후에 다시 시작됩니다.bgw_restart_time또는 백엔드 오류로 인해 포스트마스터가 클러스터를 다시 초기화하는 경우 즉시 발생합니다. 실행을 일시적으로만 일시 중지해야 하는 백엔드는 종료하는 대신 중단 가능한 절전 모드를 사용해야 합니다. 이는 다음을 호출하여 달성할 수 있습니다.대기 래치(). 다음을 확인하세요.WL_POSTMASTER_DEATH플래그는 해당 함수를 호출할 때 설정되며 긴급 상황에서 프롬프트 종료를 위한 반환 코드를 확인합니다.포스트그레스자체가 종료되었습니다.

백그라운드 작업자가 다음을 사용하여 등록된 경우DynamicBackgroundWorker 등록함수를 사용하면 등록을 수행하는 백엔드에서 작업자 상태에 관한 정보를 얻을 수 있습니다. 이를 수행하려는 백엔드는 a의 주소를 전달해야 합니다.BackgroundWorkerHandle *두 번째 인수로DynamicBackgroundWorker 등록. 작업자가 성공적으로 등록되면 이 포인터는 이후에 전달될 수 있는 불투명 핸들로 초기화됩니다.GetBackgroundWorkerPid(BackgroundWorkerHandle *, pid_t *)또는BackgroundWorker 종료(BackgroundWorkerHandle *). GetBackgroundWorkerPid작업자의 상태를 폴링하는 데 사용할 수 있습니다. 반환 값은BGWH_NOT_YET_STARTED포스트마스터가 작업자를 아직 시작하지 않았음을 나타냅니다.BGWH_STOPPED은 시작되었지만 더 이상 실행되지 않음을 나타냅니다. 그리고BGWH_STARTED현재 실행 중임을 나타냅니다. 이 마지막 경우에는 PID가 두 번째 인수를 통해서도 반환됩니다.BackgroundWorker 종료우체국장이 보내도록 합니다SIGTERM실행 중인 경우 작업자에게 전달하고 그렇지 않은 경우 즉시 등록을 취소합니다.

어떤 경우에는 백그라운드 작업자를 등록하는 토토 꽁 머니가 작업자가 시작될 때까지 기다릴 수 있습니다. 이는 초기화를 통해 수행할 수 있습니다.bgw_notify_pidMyProcPid그런 다음 전달BackgroundWorkerHandle *등록 시 획득WaitForBackgroundWorkerStartup(BackgroundWorkerHandle *핸들, pid_t *)함수. 이 함수는 포스트마스터가 백그라운드 작업자를 시작하려고 시도하거나 포스트마스터가 죽을 때까지 차단됩니다. 백그라운드 실행기가 실행 중이면 반환 값은 다음과 같습니다.BGWH_STARTED, 제공된 주소에 PID가 기록됩니다. 그렇지 않으면 반환 값은 다음과 같습니다.BGWH_중지됨또는BGWH_POSTMASTER_DIED.

src/test/modules/worker_spi모듈에는 몇 가지 유용한 기술을 보여주는 작업 예제가 포함되어 있습니다.

등록된 백그라운드 작업자의 최대 수는 다음에 의해 제한됩니다.max_worker_processes.