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 모듈에는 다음이 포함됩니다. 몇 가지 유용한 기술을 보여주는 실제 예제입니다.