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

47장. 백그라운드 무지개 토토 프로세스

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

경고

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

백그라운드 무지개 토토는 해당 시점에 초기화될 수 있습니다.PostgreSQL모듈 이름을 포함하여 시작됩니다.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 */
    char bgw_library_name[BGW_MAXLEN];
    char bgw_function_name[BGW_MAXLEN];
    데이텀 bgw_main_arg;
    char bgw_extra[BGW_EXTRALEN];
    int bgw_notify_pid;
 BackgroundWorker;

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

bgw_flags은 모듈이 원하는 기능을 나타내는 비트별 비트 마스크입니다. 가능한 값은 다음과 같습니다:

BGWORKER_SHMEM_ACCESS

공유 메모리 접근을 요청합니다. 공유 메모리에 액세스할 수 없는 작업자는 다음 항목에 액세스할 수 없습니다.PostgreSQL의무거운 또는 가벼운 잠금, 공유 버퍼 또는 작업자가 직접 만들고 사용하려는 사용자 정의 데이터 구조와 같은 공유 데이터 구조.

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_library_name은(는) 백그라운드 워커의 초기 진입점을 찾아야 하는 라이브러리의 이름입니다. 명명된 라이브러리는 무지개 토토 프로세스에 의해 동적으로 로드되며bgw_function_name호출할 함수를 식별하는 데 사용됩니다. 핵심 코드에서 함수를 로드하는 경우 "postgres"로 설정해야 합니다.

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

bgw_main_arg이것은데이텀백그라운드 작업자 기본 기능에 대한 인수입니다. 이 기본 함수는 다음 유형의 단일 인수를 취해야 합니다.데이텀그리고 돌아옴무효. bgw_main_arg인수로 전달됩니다. 또한 전역 변수MyBgworkerEntry다음의 사본을 가리킵니다BackgroundWorker등록 시 구조가 전달되었습니다. 작업자는 이 구조를 조사하는 것이 도움이 될 수 있습니다.

Windows에서(그리고 다른 곳에서는EXEC_BACKEND이 정의됨) 또는 동적 백그라운드 무지개 토토에서는 a를 전달하는 것이 안전하지 않습니다.데이텀참조로, 값으로만. 인수가 필요한 경우 int32 또는 기타 작은 값을 전달하고 이를 공유 메모리에 할당된 배열에 대한 인덱스로 사용하는 것이 가장 안전합니다. a와 같은 값인 경우cstring또는텍스트이 전달되면 포인터는 새 백그라운드 무지개 토토 프로세스에서 유효하지 않습니다.

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. 백그라운드 무지개 토토는 이 두 함수 중 하나만, 한 번만 호출할 수 있습니다. 데이터베이스를 전환할 수 없습니다.

제어가 백그라운드 작업자의 주요 기능에 도달하면 신호가 처음에 차단되며 이에 의해 차단을 해제해야 합니다. 이는 필요한 경우 프로세스가 신호 처리기를 사용자 정의할 수 있도록 하기 위한 것입니다. 다음을 호출하여 새 프로세스에서 신호를 차단 해제할 수 있습니다.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_STOPPED또는BGWH_POSTMASTER_DIED.

백그라운드 작업자가 다음을 사용하여 비동기 알림을 보내는 경우알림서버 프로그래밍 인터페이스를 통한 명령(SPI), 호출해야 합니다프로세스 완료 알림모든 알림이 전달될 수 있도록 포함 트랜잭션을 명시적으로 커밋한 후. 백그라운드 작업자가 비동기 알림을 수신하도록 등록한 경우듣기통해SPI, 작업자는 해당 알림을 기록하지만 작업자가 해당 알림을 가로채서 응답할 수 있는 프로그래밍 방식은 없습니다.

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

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