Eu gostaria de chamar um procedimento armazenado em uma base regular. No Oracle, eu criaria um job para isso. Descobri que o Postgresql pode imitar isso bem usando uma ferramenta externa (cron etc) e o PgAgent.
Você conhece alguma alternativa "interna" que não envolva a ferramenta externa?
- Quero evitar problemas de segurança com a senha armazenada na linha de comando do pgAgent.
- Quero evitar qualquer configuração adicional do sistema para ocultar a senha (
~/.pgpass
).
Postgresql 8.3
Linux RedHat 64 bits
A partir do PostgreSQL 9.5, você pode usar a extensão pg_cron , que é carregada como uma biblioteca compartilhada no PostgreSQL.
Depois de configurá-lo, criar um trabalho é bem simples:
Isso executará o comando delete de acordo com o agendamento cron especificado. Você também pode usar
@reboot
para agendar um trabalho quando o servidor reiniciar, e o pg_cron iniciará automaticamente a execução de trabalhos se você promover um hot standby.Em vez de usar .pgpass, você pode fornecer acesso localhost para o usuário cron em pg_hba.conf.
Mesmo se você estivesse executando o PostgreSQL 10 a ser lançado em breve (no momento da escrita) ou o PostgreSQL 9.6 atual, não uma versão antiga como 8.3, ainda não há um agendador de tarefas embutido.
Algo como PgAgent ou cron jobs externos é necessário, não há solução conveniente.
O recurso de trabalho em segundo plano introduzido na versão 9.3 deve permitir que uma ferramenta como o PgAgent seja movida para o núcleo do PostgreSQL em uma versão posterior, mas isso ainda não foi feito. Mesmo no 9.3, você ainda precisa executar o cron ou o pgagent.
Algumas pessoas estão trabalhando em agendadores baseados em trabalho em segundo plano, e existem alguns patches que devem fornecer recursos para ajudar com isso. Mas a partir do PostgreSQL 10 ainda não há um agendador de boa qualidade e amplamente adotado, e a maioria das pessoas usa o agendador de tarefas cron / ms / etc.
Por favor, dê uma olhada na política de versão também; você está executando uma versão obsoleta e sem suporte.
Você realmente não quer fazer isso. Postgres não é um sistema operacional, é um servidor de banco de dados. Mesmo que o banco de dados suporte a execução de tarefas agendadas, não é realmente uma boa ideia abusar do banco de dados assim.
Se sua preocupação é que você não deseja configurar senha e outros itens, isso é fácil de resolver. Configure uma conexão de soquete Unix local usando autenticação de confiança ou ident , execute seu cronjob como esse usuário.
Em sua configuração pronta para uso, geralmente o postgres configura o usuário do sistema
postgres
para executar o servidor db, e esse usuário do sistema geralmente já está pré-configurado para que possa se conectar ao servidor local usando autenticação de confiança ao conectar-se via soquete unix local. Você pode executar seu cronjob como usuário do sistema postgres, conectar-se ao soquete local e, em seguida, alternar a função se não quiser que seu procedimento armazenado seja executado com privilégio de superusuário.Na configuração padrão, você pode apenas fazer isso:
No editor, adicione à entrada crontab assim:
e no seu arquivo /path/to/run_stored_procedure.sh você simplesmente usa psql para chamar seu procedimento stores
TimescaleDB é uma extensão do Postgres que lida com dados de séries temporais - tem ações/trabalhos - pode ser útil para alguns.
https://docs.timescale.com/timescaledb/latest/how-to-guides/user-defined-actions