ustify>

Capa SQl 33

Clique aqui para ler todos os artigos desta edição

Gerenciamento de tarefas no PostgreSQL

 

Olá a todos, estou de volta em mais este artigo tratando de algo bem interessante e muito útil para os interessados em banco de dados PostgreSQL: tarefas agendadas. Esse recurso possui aplicação no cotidiano de qualquer DBA, devido à necessidade de tarefas como backup, atualizações de banco de dados, replicações, dentre outras.

 O PostgreSQL não possui um agendador de tarefas próprio, então, para realizar uma tarefa agendada é necessário utilizar-se de ferramentas de terceiros. É bem comum utilizar as ferramentas que acompanham o sistema operacional para trabalhar com tarefas agendadas. No caso Unix/Linux utiliza-se o CRON, já no Windows o programa “Tarefas agendadas”. Seja no Unix/Linux ou Windows, se faz necessário um conhecimento um pouco mais aprofundado do sistema operacional visto que estas ferramentas não possuem vínculo direto com o banco de dados, porém podem ser integradas com outras ferramentas ou comandos do sistema operacional ou softwares instalados nele.

Para os usuários de ambos os sistemas operacionais, a comunidade desenvolvedora do PgAdmin desenvolveu um programa chamado pgAgent que é instalado junto com o pgAdmin. Para quem ainda não conhece, o pgAdmin é uma plataforma de desenvolvimento e  administração de banco de dados PostgreSQL e o pgAgent é uma ferramenta que roda em segundo plano no mesmo servidor que está sendo executado o banco de dados PostgreSQL. Ele é integrado ao pgAdmin e, assim, fornece uma solução gráfica muito simples para administrar tarefas agendadas.

Ao longo desse artigo, descreveremos como gerenciar tarefas através do pgAgent em diferentes cenários através da criação de Jobs, schedules e steps que simularão comandos reais usados no gerenciamento de um banco de dados.

Problemas a serem resolvidos

Para tornar o artigo o mais próximo possível da realidade e buscando resolver problemas cotidianos nas tarefas de um DBA, iremos focar em quatro cenários diferentes:

·         CENÁRIO 1: Precisamos executar um script responsável pelo Vacuum do banco de dados “Magazine” todos os dias de 3 em 3 horas, iniciando às 00:00. Para quem conhece o PostgreSQL, mesmo com o auto-vacuum, ele não possui as mesmas funcionalidades de um Vacuum Full Analyze (Ver Nota 1). Neste cenário, a execução via pgAgent foi realizada através da DDL Vacuum, demonstrando assim a integração do pgAgent com o PostgreSQL, sendo possível programar qualquer query SQL.

 

Nota 1. Auto-Vacuum e Vacuum

O PostgreSQL utiliza do conceito MVCC, o que permite um gerenciamento bem mais eficiente no controle de transações do que outros SGBDs. No MVCC, os dados ao sofrerem um delete não são  excluídos, apenas são marcados como expirados. O mesmo ocorre com o update, a diferença é que os dados são clonados com a alteração do update e o original se torna expirado. Esta técnica permite menos LOCKs em nível de registro e tabela no caso de um usuário solicitar um select ao mesmo tempo em que um outro usuário está realizando um delete ou update. Como o dado nunca é excluído fisicamente do sistema de arquivos, precisamos executar uma ferramenta para essa tarefa, neste caso o Vacuum, liberando assim espaço no HD. Um dos problemas da não utilização do Vacuum é a perda drástica de desempenho.

O auto-vacuum é um serviço habilitado no postgresql.conf que quando ativado, realiza a limpeza de dados marcados como expirados de forma automática. O Vacuum faz a mesma coisa, no entanto de forma manual. A diferença é que o auto-vacuum não possui o recurso “FULL” que o Vacuum manual possui; o Vacuum no modo FULL além de excluir os dados expirados, ainda reorganiza, desfragmenta as lacunas que foram geradas pela exclusão dos arquivos, ou seja, é um tipo de “DEFRAG” (desfragmentador de disco do Windows) do PostgreSQL. O Vacuum FULL gera lock de tabela e por isso o auto-vacuum não possui este recurso. Para maiores informações, consulte a edição 19 da SQL Magazine – “Otimizando um servidor Linux para banco de dados - Parte 3”, na qual esse assunto é abordado de forma bem ilustrativa.

 

·         CENÁRIO 2: Precisamos executar um script responsável pelo backup do banco de dados “Magazine” às terças e sábados às 2:30. Backup é algo imprescindível, e neste cenário foi criado um script shell para demonstrar a integração do pgAgent com o sistema operacional.

·         CENÁRIO 3: Precisamos executar um script responsável novamente pelo backup do banco de dados “Magazine”, só que agora diariamente. No entanto, durante a semana o script deve ser executado às 3:00, e nos fins de semana (sábados e domingos) ele deve ser executado ao meio dia.

·         CENÁRIO 4: Precisamos executar um script para adicionar um registro em uma tabela qualquer do banco de dados “Magazine” sempre no último dia de cada mês.

 

Para cada um dos problemas citados iremos demonstrar os passos necessários para resolvê-los usando o pgAgent. Antes disso, será apresentado de forma introdutória o CRON, ferramenta para agendar tarefas do Linux. A importância disso é que a plataforma Unix é muito utilizada como servidor de banco de dados PostgreSQL.

Resolvendo os problemas de agendamento no Linux usando CRON

Uma das grandes vantagens do Linux é ser um sistema operacional nada conservador, possuindo novas técnicas para gerenciar memória, controlar processos, etc. O Linux segue alguns padrões e utiliza-se das principais ferramentas de administração do sistema operacional para simplificar suas tarefas, e uma destas ferramentas é o CRON, programa para agendar tarefas do sistema operacional. Veremos agora como funciona o CRON.

Usando o Crontab

O Crontab é um arquivo texto no qual cada linha do arquivo representa um cronograma com a finalidade de executar um determinado comando. Este cronograma é definido por valores que estão dispostos através de seis colunas, conforme descrito na Tabela 1.

 

Coluna

Significado

Valores

Minuto

0-59

Hora

0-23

Dia do Mês

1-31

Mês

1-12

Dia da Semana

0-6 (0 para domingo e 1 para segunda, etc...)

Comando

Pode ser um script ou um binário

Tabela 1. Parâmetros do crontab.

 

Temos na Listagem 1 um exemplo de uma linha do crontab com os respectivos valores posicionados nas colunas correspondentes. Esse exemplo busca resolver o problema de agendamento definido no cenário 1 deste artigo, ou seja, executar um VACUUM a cada 3 horas todos os dias.

 

Listagem 1. Exemplo de uma linha crontab.

* */3 * * * psql –U postgres Magazine –c “VACUUM FULL ANALYSE VERBOSE;”

 

O comando agendado que será executado no Linux é o psql com os parâmetros –U postgres Magazine –c “VACUUM FULL ANALYSE VERBOSE”. Este não é um comando do sistema operacional, mas sim do PostgreSQL. Trata-se de um comando administrativo que serve para executar queries em um determinado bancos de dados, neste caso, a query “VACUUM FULL ANALYSE VERBOSE” no banco Magazine. Para este job, poderia ser usado o comando vacuumdb, que faz a mesma coisa. No entanto, estamos usando o cenário 1 descrito no início do artigo para exemplicar o mesmo procedimento no CRON. Para maiores informações sobre o vacuumdb, veja a documentação on-line do PostgreSQL http://www.postgresql.org/docs/8.2/interactive/app-vacuumdb.html.

Já o restante da linha - * */3 * * * - é legivel através da Tabela 1, ou seja, a qualquer minuto, a cada 3 horas de qualquer dia do mês, em qualquer mês e em qualquer dia da semana, pois o caracter * representa “TODO ou QUALQUER” e o */valor representa um ciclo de tempo. Sendo assim, o camando psql  com os respectivos parâmetros serão executados diariamente em todos os meses, de segunda a segunda a cada 3 horas, conforme definido no cenário 1 a ser resolvido.

Usando o Crond

...

Quer ler esse conteúdo completo? Tenha acesso completo