외부 cron과 같은 도구없이 PostgreSQL에서 반복 작업을 실행하는 방법은 무엇입니까?


41

저장 프로 시저를 정기적으로 호출하고 싶습니다. Oracle에서는이를 위해 작업을 작성합니다. Postgresql은 외부 도구 (cron 등)와 PgAgent를 사용하여이를 잘 모방 할 수 있음을 발견했습니다.

외부 도구와 관련이없는 "내부"대안을 알고 있습니까?

  • pgAgent의 명령 줄에 저장된 암호와 관련된 보안 문제를 피하고 싶습니다.
  • 비밀번호 ( ~/.pgpass) 를 숨기기위한 추가 시스템 구성을 피하고 싶습니다 .

PostgreSQL 8.3
Linux RedHat 64 비트


pgAgent 또는 crontab을 사용할 수없는 이유를 추가 할 수 있습니까? 특히 어떤 기능이
빠졌는가

@Rohan 내 질문을 업데이트했습니다
Stephan

포스트에 복사 및 붙여 넣기 한 것으로 보인다 stackoverflow.com/q/16958625/398670
크레이그 벨소리를

답변:


30

릴리스 예정인 (작성 시점) PostgreSQL 10 또는 현재 PostgreSQL 9.6을 8.3과 같은 고대 릴리스가 아닌 경우에도 기본 제공 작업 스케줄러는 없습니다.

PgAgent 또는 외부 크론 작업과 같은 것이 필요하며 편리한 해결 방법이 없습니다.

9.3에 도입 된 백그라운드 워커 기능은 PgAgent와 같은 도구가 이후 릴리스에서 PostgreSQL 코어로 이동 될 수 있기를 바라지 만 아직 완료되지 않았습니다. 9.3에서도 여전히 cron 또는 pgagent를 실행해야합니다.

일부 직원은 백그라운드 작업자 기반 스케줄러에서 작업하고 있으며이를 지원하는 기능을 제공해야하는 패치가 있습니다. 그러나 PostgreSQL 10부터는 여전히 좋은 품질, 널리 채택 된 스케줄러가 없으며 대부분의 사람들은 cron / ms 작업 스케줄러 등을 사용합니다.

버전 정책 도 살펴보십시오 . 더 이상 사용되지 않는 지원되지 않는 릴리스를 실행 중입니다.


Please take a look at the version policyPostgreSQL 업그레이드는 옵션이 아닙니다.
Stephan

2
@Alex 당신은 어느 시점에서 업그레이드해야 할 것이고, 그것은 더 어려워 질 것입니다. 그런데 어떤 8.3 포인트 릴리스? 몇 가지 중요한 버그 수정이 누락 되었습니까? 아니면 8.3.23 이상입니까? 내가 말했듯이 원하는 기능이 향후 9.3 릴리스에서도 존재하지 않지만 추가 할 수있는 기초가 추가되었습니다.
Craig Ringer

나는 상사와 이야기 할 것이다 :)
Stephan

1
@ 알렉스 좋은 생각 :-). 긴급히 8.3.23으로 업데이트 한 다음 최신 릴리스로 업그레이드 계획을 시작하십시오. 그것은이 문제를 해결하지 않을 것이다, 그러나 그것은이다 매우 미래의 고통을 저장하는 것이 좋습니다. 현재 상태를 유지 한 적이 없었던 문제를 겪고있는 고객을 지원하는 고객은 놀랍습니다. 우리는 차기 위해 새 버전을 출시하지 않습니다 ;-). 처리해야 할 사항에 대한 지침은 각 .0 버전의 릴리스 정보를 읽고 업그레이드에 대한 매뉴얼을 읽으십시오. 유일한 가능성이 고통 포인트는 standard_conforming_stringsbytea_output.
Craig Ringer

크레이그, pg_cron에 대해 어떻게 생각하십니까?
mehmet

21

PostgreSQL 9.5 부터는 pg_cron 확장자를 사용할 수 있습니다.이 확장자는 PostgreSQL에 공유 라이브러리로로드됩니다.

설정 후 작업을 만드는 것은 매우 간단합니다.

SELECT cron.schedule('30 3 * * 6', $$DELETE FROM events WHERE event_time < now() - interval '1 week'$$);

지정된 cron 스케줄에 따라 delete 명령이 실행됩니다. @reboot서버를 다시 시작할 때 작업을 예약 하는데도 사용할 수 있으며 핫 대기를 승격 시키면 pg_cron이 자동으로 작업 실행을 시작합니다.

pgpg를 사용하는 대신 pg_hba.conf에서 cron 사용자에게 로컬 호스트 액세스를 제공 할 수 있습니다.


-1

당신은 정말로, 이것을하고 싶지 않습니다. Postgres는 운영 체제가 아니며 데이터베이스 서버입니다. 데이터베이스가 예약 된 작업 실행을 지원하더라도 실제로 데이터베이스를 남용하는 것은 좋은 생각이 아닙니다.

우려 사항이 있다면 비밀번호와 물건을 설정하지 않으려는 경우 쉽게 해결할 수 있습니다. 대신 신뢰 또는 ID 인증을 사용하여 로컬 Unix 소켓 연결을 설정하고 해당 사용자로 cronjob을 실행하십시오.

기본 구성에서 postgres는 일반적으로 시스템 사용자 postgres가 db 서버를 실행하도록 설정 하고이 시스템 사용자는 일반적으로 이미 사전 구성되어 있으므로 로컬 유닉스 소켓을 통해 연결할 때 트러스트 인증을 사용하여 로컬 서버에 연결할 수 있습니다. cronjob을 postgres 시스템 사용자로 실행하고 로컬 소켓에 연결 한 다음 저장 프로 시저를 수퍼 유저 권한으로 실행하지 않으려면 역할전환 할 수 있습니다.

기본 설정에서 다음을 수행 할 수 있습니다.

$ sudo -u postgres crontab -e

편집기에서 다음과 같이 crontab 항목에 추가하십시오.

0    0    *     *    * bash /path/to/run_stored_procedure.sh

/path/to/run_stored_procedure.sh 파일에서 psql을 사용하여 상점 프로 시저를 호출하기 만하면됩니다.

#!/usr/bin/env bash
psql my_db_name <<END
    SET ROLE limited_user;
    SELECT my_stored_proc();
    SELECT 1 FROM my_stored_proc();
END

1
'실제로 데이터베이스를 악용하는 것은 좋은 생각이 아닙니다' 왜 악용이라고 생각합니까? 다른 주류 RDBMS는 비슷한 접근법을 사용하는 경향이 있으며 그렇게 끔찍하다고 생각하지 않습니다. 또한 OS에 액세스 할 수 없으면 crontab이 부족합니다.
dezso
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.