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

45장. 배경 작업자 범퍼카 토토

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

경고

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

다음에 나열된 모듈만shared_preload_libraries백그라운드 작업자를 실행할 수 있습니다. 백그라운드 작업자를 실행하려는 모듈은 이를 등록해야 합니다. 전화RegisterBackgroundWorker(BackgroundWorker *작업자)그것으로부터_PG_init(). 구조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;
    데이텀 bgw_main_arg;
 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등록 시 구조 통과됨 시간.

실행되면 범퍼카 토토는 호출을 통해 데이터베이스에 연결할 수 있습니다.BackgroundWorkerInitializeConnection(char *dbname, 문자 *사용자 이름). 이를 통해 범퍼카 토토가 트랜잭션을 실행할 수 있습니다. 및 쿼리를 사용하여SPI인터페이스. 만일db이름은 NULL입니다. 세션이 아닙니다. 특정 데이터베이스에 연결되지만 공유 카탈로그는 액세스했습니다. 만일사용자 이름NULL입니다. 범퍼카 토토 동안 생성된 수퍼유저로 실행됩니다.initdb. BackgroundWorkerInitializeConnection을 사용할 수 있습니다. 백그라운드 프로세스당 한 번만 호출될 수 있으므로 데이터베이스를 전환합니다.

통제가 도달하면 신호가 처음에 차단됩니다.bgw_main기능이며 다음과 같아야 합니다. 차단이 해제되었습니다. 이는 프로세스가 필요한 경우 신호 처리기. 새로운 환경에서 신호 차단을 해제할 수 있습니다. 전화로 처리BackgroundWorkerUnblockSignals다음에 의해 차단되었습니다. 전화BackgroundWorkerBlockSignals.

백그라운드 작업자는 지속적으로 실행될 것으로 예상됩니다. 만약에 깔끔하게 종료됩니다.포스트그레스다시 시작됩니다 즉시. 다음과 같은 경우 방해받지 않는 수면을 취하는 것을 고려하세요. 할 일이 없습니다. 이는 다음을 호출하여 달성할 수 있습니다.대기 래치(). 다음을 확인하세요.WL_POSTMASTER_DEATH플래그는 호출할 때 설정됩니다. 함수를 실행하고 프롬프트 종료에 대한 반환 코드를 확인합니다. 긴급상황 발생포스트그레그 자체가 종료되었습니다.

worker_spicontrib 모듈에는 다음이 포함됩니다. 몇 가지 유용한 기술을 보여주는 실제 예제입니다.