PostgreSQL을 확장하여 사용자가 제공 한 코드를 별도로 실행할 수 있습니다. 범퍼카 토토. 이러한 범퍼카 토토는 시작, 중지 및 모니터링됩니다.Postgres수명은 서버의 상태와 밀접하게 연결되어 있습니다. 이 과정 첨부 할 수있는 옵션이 있습니다PostgreSQL의 공유 메모리 영역 및 연결 내부적으로 데이터베이스에; 또한 여러 거래를 실행할 수도 있습니다 일반 클라이언트 연결 서버 범퍼카 토토와 마찬가지로 일련의. 또한 링크libpq할 수 있습니다 서버에 연결하고 일반 클라이언트처럼 행동합니다. 애플리케이션.
경고 |
사용에는 상당한 견고성과 보안 위험이 있습니다 백그라운드 작업자 범퍼카 토토이기 때문에C언어, 제한되지 않은 액세스가 있습니다 데이터에. 관리자가 포함 된 모듈을 활성화하려는 관리자 백그라운드 작업자 범퍼카 토토는 매우주의를 기울여야합니다. 오직 신중하게 감사 된 모듈은 배경을 실행하도록 허용해야합니다 작업자 범퍼카 토토. |
나열된 모듈 만shared_preload_libraries배경 작업자를 운영 할 수 있습니다.
배경 작업자를 실행하려는 모듈은
부름RegisterBackgroundWorker (BackgroundWorker *Worker)
_pg_init ()
. 구조배경 worker따라서 정의됩니다.
typedef void (*bgworker_main_type) (datum main_arg); typedef 구조 배경 작업자 char bgw_name [bgw_maxlen]; int bgw_flags; bgworkerstarttime bgw_start_time; int bgw_restart_time; / * 몇 초 만에 bgw_never_restart */ bgworker_main_type bgw_main; Datum BGW_MAIN_ARG; bekgroundworker;
bgw_name는 사용할 문자열입니다 로그 메시지, 범퍼카 토토 목록 및 유사한 컨텍스트.
bgw_flags는 비트 마스크입니다 모듈이 원하는 기능을 나타냅니다. 가능한 값 이다bgworker_shmem_access(요청 공유 메모리 액세스) 및bgworker_backend_database_connection(요청 데이터베이스 연결을 설정하는 기능 나중에 트랜잭션 및 쿼리를 실행합니다). 사용을 사용하는 백그라운드 작업자bgworker_backend_database_connectionto 데이터베이스에 연결하면를 사용하여 공유 메모리를 첨부해야합니다.bgworker_shmem_access또는 작업자 스타트 업 실패합니다.
BGW_START_TIME는 서버 상태입니다 그 동안Postgres시작해야합니다 범퍼카 토토; 중 하나 일 수 있습니다.bgworkerstart_postmasterstart(곧 시작Postgres자체가 자체적으로 완료되었습니다 초기화; 이를 요청하는 범퍼카 토토는 적격이 없습니다 데이터베이스 연결),bgworkerstart_consistentstate(곧 시작하십시오 일관된 상태가 핫 스탠드로 도달하여 데이터베이스에 연결하고 읽기 전용 쿼리를 실행하는 프로세스 및bgworkerstart_recoveryFinished(시작 AS 시스템이 정상적인 읽기 쓰기 상태에 들어가 자마자). 참고 마지막 두 값은 핫이 아닌 서버에서 동일합니다. 대기. 이 설정은 범퍼카 토토시기 만 나타냅니다 시작해야합니다. 그들은 다른 상태 일 때 멈추지 않습니다 도달했다.
BGW_RESTART_TIME간격입니다. 몇 초 만에Postgres기다려야합니다 범퍼카 토토를 다시 시작하기 전에 충돌이 발생할 경우. 그것은 어떤 것일 수 있습니다 긍정적 가치, 또는BGW_NEVER_RESTART, 충돌시 범퍼카 토토를 다시 시작하지 않음을 나타냅니다.
bgw_main범퍼카 토토가 시작될 때 실행할 수 있습니다. 이 기능은해야합니다 유형의 단일 논증을 취하십시오Datum및 반품void. BGW_MAIN_ARG그로 전달됩니다 논쟁. 글로벌 변수MyBgworkerentry사본을 가리 킵니다배경 worker등록시 통과 된 구조 시간.
일단 실행되면 범퍼카 토토가 전화하여 데이터베이스에 연결할 수 있습니다BackgroundWorkerInitializeConnection (char *dbname, char
*사용자 이름)
. 이를 통해 범퍼카 토토가 트랜잭션을 실행할 수 있습니다
그리고를 사용하는 쿼리SPI인터페이스. 만약에dbname는 null이고 세션은 아닙니다
특정 데이터베이스에 연결되었지만 공유 카탈로그는
접근. 만약에사용자 이름은 NULL, 범퍼카 토토입니다
동안 생성 된 슈퍼업자로 실행됩니다initdb. BackgroundWorkerInitializeConnection 할 수 있습니다
배경 범퍼카 토토 당 한 번만 호출되면 불가능합니다.
데이터베이스 스위치.
신호는 제어가 도달 할 때 처음에 차단됩니다bgw_main기능
그것에 의해 차단되지 않음; 이는 범퍼카 토토가 사용자 정의 할 수 있도록하기위한 것입니다
필요한 경우 신호 처리기. 신호는 신호에서 차단 해제 될 수 있습니다
전화하여 범퍼카 토토BackgroundWorkerUnblockSignals
부름BackgroundWorkerBlockSignals
.
배경 작업자는 지속적으로 실행될 것으로 예상됩니다. 만약에
그들은 깨끗하게 빠져 나와Postgres다시 시작됩니다
즉시. 그들이있을 때 방해받을 수있는 수면을 고려하십시오
할 일이 없습니다. 이것은 전화하여 달성 할 수 있습니다Waitlatch ()
. 확인하십시오wl_postmaster_death플래그는 호출 할 때 설정됩니다
기능을하고 신속한 종료에 대한 반환 코드를 확인하십시오.
비상 사례Postgres그 자체가 있습니다
종료.
theWorker_SPIContrib 모듈이 포함되어 있습니다 유용한 기술을 보여주는 작업 예제.