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

47 장. 배경 토토 결과 프로세스

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

경고

배경 토토 결과 프로세스를 사용하는 데 상당한 견고성과 보안 위험이 있습니다.C언어, 그들은 데이터에 대한 무제한 액세스 권한이 있습니다. 배경 토토 결과 프로세스를 포함하는 모듈을 활성화하려는 관리자는 매우주의를 기울여야합니다.

배경 토토 결과는 당시에 초기화 될 수 있습니다PostgreSQL모듈 이름을 포함하여 시작됩니다shared_preload_libraries. 배경 토토 결과를 실행하려는 모듈은 전화하여 등록 할 수 있습니다RegisterBackgroundWorker (BackgroundWorker *Worker)에서_pg_init (). 백그라운드 토토 결과는 시스템을 시작한 후에도 시작될 수 있으며 함수를 호출하여 실행할 수 있습니다.RegisterDynamicbackbackgroundworker (BackgroundWorker *Worker, BackgroundWorkerHandle ** 핸들). 같지 않은RegisterBackgroundWorker, 우체국 내에서만 호출 할 수 있습니다.RegisterDynamicbackbackgroundworker일반 백엔드 또는 다른 백그라운드 작업자에서 호출해야합니다.

구조배경 worker따라서 정의됩니다.

typedef void (*bgworker_main_type) (datum main_arg);

bgw_nameandbgw_type문자열은 로그 메시지, 프로세스 목록 및 유사한 컨텍스트에 사용할 문자열입니다.bgw_type예를 들어 프로세스 목록에서 해당 작업자를 그룹화 할 수 있도록 동일한 유형의 모든 배경 작업자에 대해 동일해야합니다.bgw_name반면에 특정 프로세스에 대한 추가 정보가 포함될 수 있습니다. (일반적으로 문자열bgw_name어떻게 든 유형이 포함되어 있지만 엄격하게 필요하지는 않습니다.)

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

bgworker_shmem_access

공유 메모리 액세스 요청. 공유 메모리 액세스가없는 토토 결과는에 액세스 할 수 없습니다.postgresql 's헤비급 또는 경량 잠금, 공유 버퍼 또는 작업자 자체가 생성 및 사용하려는 사용자 정의 데이터 구조와 같은 공유 데이터 구조..

bgworker_backend_database_connection

나중에 트랜잭션 및 쿼리를 실행할 수있는 데이터베이스 연결을 설정하는 기능을 요청합니다. 사용을 사용하는 백그라운드 토토 결과bgworker_backend_database_connection데이터베이스에 연결하려면 공유 메모리를 사용하여 첨부해야합니다bgworker_shmem_access또는 토토 결과 스타트 업이 실패합니다.

BGW_START_TIME서버 상태는Postgres프로세스를 시작해야합니다. 중 하나 일 수 있습니다.bgworkerstart_postmasterstart(곧 시작Postgres자체 자체 초기화를 마쳤습니다. 이를 요청하는 프로세스는 데이터베이스 연결에 적합하지 않습니다),bgworkerstart_consistentstate(일관된 상태에 도달하자마자 시작하여 프로세스가 데이터베이스에 연결하고 읽기 전용 쿼리를 실행할 수 있도록합니다) 및.bgworkerstart_recoveryfinished(시스템이 정상적인 읽기 쓰기 상태에 들어가 자마자 시작). 참고 마지막 두 값은 핫 스탠드가 아닌 서버에서 동일합니다.

bgw_restart_time| 몇 초 만에Postgres충돌시 프로세스를 다시 시작하기 전에 기다려야합니다. 긍정적 가치가 될 수 있습니다.BGW_NEVER_RESTART, 충돌시 프로세스를 다시 시작하지 않음을 나타냅니다.

bgw_library_name배경 토토 결과의 초기 진입 점을 찾아야하는 라이브러리의 이름입니다. 명명 된 라이브러리는 토토 결과 프로세스에 의해 동적으로로드됩니다.bgw_function_name호출 할 함수를 식별하는 데 사용됩니다. 핵심 코드에서 함수를로드하는 경우 "Postgres"로 설정해야합니다.

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

bgw_main_argDatum백그라운드 토토 결과 주요 기능에 대한 인수. 이 주요 기능은 유형의 단일 인수를 취해야합니다Datumand returnvoid. bgw_main_arg논증으로 전달됩니다. 또한 글로벌 변수mybgworkerentry를 가리 킵니다배경 worker등록 시간에 통과 된 구조; 근로자는이 구조를 조사하는 것이 도움이 될 수 있습니다.

Windows에서 (그리고 다른 곳exec_backend정의 됨) 또는 동적 배경 작업자에서는 전달하는 것이 안전하지 않습니다Datum참조로만, 값으로 만. 인수가 필요한 경우 int32 또는 기타 작은 값을 전달하여 공유 메모리에 할당 된 배열로 인덱스로 사용하는 것이 가장 안전합니다.cstring또는텍스트전달됩니다. 그러면 새 배경 작업자 프로세스에서 포인터가 유효하지 않습니다.

bgw_extra배경 작업자에게 전달할 추가 데이터를 포함 할 수 있습니다. 같지 않은bgw_main_arg,이 데이터는 토토 결과의 주요 기능에 대한 인수로 전달되지 않지만에 액세스 할 수 있습니다mybgworkerentry, 위에서 논의한대로.

bgw_notify_pidPostgresql 백엔드 프로세스의 PID는 Postmaster가 보내야 할 Postgresql 백엔드 프로세스의 PID입니다SigusR1프로세스가 시작되거나 종료 될 때. 우체국 마스터 스타트 업 시간에 등록 된 근로자 또는 근로자 등록이 근로자가 시작되기를 기다리지 않을 때는 0이어야합니다.MyProcPid.

일단 실행되면 프로세스가 전화하여 데이터베이스에 연결할 수 있습니다BackgroundWorkerInitializeConnection (char *dbname, char *username, UINT32 플래그)또는BackgroundWorkerInitializeConnectionByoid (OID DBOID, OID Useroid, UINT32 플래그). 이를 통해 프로세스는를 사용하여 트랜잭션 및 쿼리를 실행할 수 있습니다.SPI인터페이스. 만약에dbnameis null 또는dboidisinvalidoid, 세션은 특정 데이터베이스에 연결되어 있지 않지만 공유 카탈로그에 액세스 할 수 있습니다. 만약에사용자 이름is null 또는useroidisinvalidoid, 프로세스는 |initdb. 만약에bgworker_bypass_allowconn플래그사용자 연결을 허용하지 않는 데이터베이스에 연결하도록 제한을 우회 할 수 있습니다. 배경 토토 결과는이 두 기능 중 하나만 전화 할 수 있으며 한 번만 호출 할 수 있습니다.

제어가 배경 토토 결과의 주요 기능에 도달하면 신호가 처음 차단되며, 이에 의해 차단 해제되어야합니다. 이는 프로세스가 필요한 경우 신호 처리기를 사용자 정의 할 수 있도록하는 것입니다.BackgroundWorkerUnblockSignals전화로 차단BackgroundWorkerBlockSignals.

ifbgw_restart_time배경 토토 결과의 경우BGW_NEVER_RESTART또는 종료 코드가 0으로 종료되거나 종료되는 경우TernatineBackgroundworker, 출구의 우체국 장에 의해 자동으로 등록되지 않습니다. 그렇지 않으면,이를 통해 구성된 시간 이후에 다시 시작됩니다bgw_restart_time실행을 일시적으로 중단 해야하는 백엔드는 일시적으로 나가기보다는 중단 가능한 수면을 사용해야합니다.Waitlatch (). 확인하십시오wl_postmaster_death해당 함수를 호출 할 때 플래그가 설정되어 있으며 비상 사례에서 신속한 종료에 대한 반환 코드를 확인하십시오.Postgres자체가 종료되었습니다.

배경 토토 결과가 등록 된 경우RegisterDynamicbackbackgroundworker함수, 등록을 수행하는 백엔드가 토토 결과의 상태에 관한 정보를 얻을 수 있습니다. 이를 원하는 백엔드는 a의 주소를 전달해야합니다.BackgroundWorkerHandle *두 번째 인수RegisterDynamicbackbackgroundworker. 토토 결과가 성공적으로 등록되면이 포인터는 불투명 핸들로 초기화되어 이후에 전달할 수 있습니다.getbackgroundworkerpid (BackgroundWorkerHandle *, pid_t *)또는TernatineBackgroundworker (BackgroundWorkerHandle *). getbackgroundworkerpid근로자의 상태를 폴링하는 데 사용될 수 있습니다 : 반환 값bgwh_not_yet_started근로자가 아직 우체국에 의해 시작되지 않았 음을 나타냅니다.bgwh_stopped그것이 시작되었지만 더 이상 실행되지 않았 음을 나타냅니다. 그리고bgwh_started현재 실행 중임을 나타냅니다. 이 마지막 경우, PID는 두 번째 인수를 통해 반환됩니다.TernatineBackgroundworkerPostmaster가 보내도록Sigterm작동중인 경우 토토 결과에게, 그렇지 않은 즉시 등록 해제합니다.

경우에 따라 배경 토토 결과를 등록하는 프로세스는 토토 결과가 시작되기를 기다릴 수 있습니다. 이것은 초기화함으로써 달성 될 수 있습니다bgw_notify_pidtoMyProcPid그리고 전달BackgroundWorkerHandle *등록 시간에 획득Waitforbackgroundworkerstrup (BackgroundWorkerHandle *핸들, pid_t *)함수. 이 기능은 우체국 장이 배경 토토 결과를 시작하려고 시도하거나 우체국이 죽을 때까지 차단됩니다.bgwh_started, PID는 제공된 주소에 기록됩니다. 그렇지 않으면 반환 값은입니다.bgwh_stopped또는bgwh_postmaster_died.

프로세스는 또한 배경 토토 결과가 종료 될 때까지 기다릴 수 있습니다.Waitforbackgroundworkershutdown (BackgroundWorkerHandle *핸들)함수 및 전달BackgroundWorkerHandle *등록시 획득. 이 기능은 백그라운드 토토 결과가 종료 될 때까지 차단되거나 우체국 장 마스터가 사라질 때까지 차단됩니다.bgwh_stopped, 포스트 마스터가 죽으면 반환됩니다bgwh_postmaster_died.

배경 토토 결과가 비동기 알림을 보내는 경우Notify서버 프로그래밍 인터페이스를 통한 명령 (SPI), 호출해야합니다ProcessCompleTedNotifies알림을 전달할 수 있도록 동봉 된 트랜잭션을 저지른 후 명시 적으로. 배경 토토 결과가 등록하여에 비동기 알림을받는 경우듣기throughSPI, 토토 결과는 해당 알림을 기록하지만 토토 결과가 해당 알림을 가로 채고 응답하는 프로그래밍 방식은 없습니다.

thesrc/test/modules/worker_spi모듈은 몇 가지 유용한 기술을 보여주는 작업 예제를 포함합니다.

등록 된 백그라운드 토토 결과의 최대 수는에 의해 제한됩니다.max_worker_processes.