PROCEDIMENTOS DE BACKUP E RESTORE NO POSTGRES Como tudo que contém dados importantes, devem ser feitas cópias de segurança dos bancos de dados do PostgreSQL regularmente. Embora o procedimento seja essencialmente simples, é importante possuir uma compreensão básica das técnicas e princípios subjacentes. O Método SQL-dump A idéia por trás do Método SQL-dump é gerar um arquivo texto contendo comandos SQL que, ao serem processados pelo servidor, recriam o banco de dados no mesmo estado em que este se encontrava quando o arquivo foi gerado. O PostgreSQL disponibiliza o programa utilitário pg_dump para esta finalidade. A forma básica de utilização deste programa é: pg_dump nome_do_banco_de_dados > arquivo_de_saída Conforme pode ser visto, o programa pg_dump escreve o seu resultado na saída padrão. Será visto abaixo como isto pode ser útil. pg_dump Nome pg_dump -- salva um banco de dados do PostgreSQL em um arquivo de script ou de outro tipo Sinopse pg_dump [opção...] [nome_do_banco_de_dados] Descrição O pg_dump é um utilitário para fazer cópia de segurança de um banco de dados do PostgreSQL. São feitas cópias de segurança consistentes, mesmo que o banco de dados esteja sendo utilizado ao mesmo tempo. O pg_dump não bloqueia os outros usuários que estão acessando o banco de dados (leitura ou escrita). As cópias de segurança podem ser feitas no formato de script, personalizado ou tar. As cópias de segurança no formato de script são arquivos de texto puro, contendo os comandos SQL necessários para reconstruir o banco de dados no estado em que este se encontrava quando foi salvo. Para restaurar a partir destes scripts, deve ser utilizado o psql. Os arquivos de script podem ser utilizados para reconstruir o banco de dados até em outras máquinas com outras arquiteturas; com algumas modificações, até mesmo em outros produtos gerenciadores de banco de dados SQL. Os formatos personalizado e tar devem ser utilizados com o pg_restore para reconstruir o banco de dados. Estes formatos permitem que o pg_restore selecione o que será restaurado, ou mesmo reordene os itens antes de restaurá-los, e também permitem salvar e restaurar os "objetos grandes", o que não é possível com a cópia de segurança em arquivo de script. Os formatos personalizado e tar foram projetados para serem portáveis entre arquiteturas diferentes. Quando usado com o formato personalizado ou tar, e combinado com o pg_restore, o pg_dump fornece um mecanismo flexível para cópias de segurança e transferência. O pg_dump pode ser usado para fazer a cópia de segurança de todo o banco de dados e, posteriormente, o pg_restore pode ser usado para examinar a cópia de segurança e/ou selecionar as partes do banco de dados a serem restauradas. O formato de arquivo de saída mais flexível é o "personalizado" (custom, -Fc); permite a seleção e a reordenação de todos os itens da cópia de segurança, e é comprimido por padrão. O formato tar (-Ft) não é comprimido e não permite reordenar os dados ao restaurar, mas por outro lado é bastante flexível; além disso, pode ser manipulado pelas ferramentas padrão do Unix, como o tar. Exemplos Para salvar um banco de dados: pg_dump meu_bd > db.out Para recarregar este banco de dados: psql -d banco_de_dados -f Onde: -d nome_do_banco_de_dados db.out Especifica o nome do banco de dados a se conectar. Equivale a especificar nome_do_banco_de_dados como o primeiro argumento não-opção na linha de comando. -f nome_do_arquivo --file nome_do_arquivo Usa o arquivo nome_do_arquivo como origem dos comandos, em vez de ler os comandos interativamente. Após processar o arquivo, o psql termina. Sob muitos aspectos equivale ao comando interno \i. Se o nome_do_arquivo for - (hífen), então será lida a entrada padrão. O uso desta opção é sutilmente diferente de escrever psql < nome_do_arquivo. De uma maneira geral, as duas formas fazem o esperado, mas o uso da opção -f ativa algumas funcionalidades úteis, como mensagens de erro com o número da linha. Ao se usar esta opção existe, também, uma pequena chance de reduzir a sobrecarga de inicialização. Por outro lado, a utilização do redirecionamento da entrada na linha de comando garante, teoricamente, que será produzida exatamente a mesma saída que seria produzida se tudo fosse entrado à mão. Utilização de formatos segurança personalizados de cópia de Se o PostgreSQL foi construído em um sistema com a biblioteca de compressão zlib instalada, o formato de cópia de segurança personalizado comprime os dados ao escrever o arquivo de saída. Produz cópias de segurança com tamanhos semelhantes às produzidas utilizando o gzip, mas tem a vantagem adicional de permitir a restauração seletiva das tabelas. O comando abaixo gera a cópia de segurança do banco de dados utilizando o formato de cópia de segurança personalizado (custom dump format): pg_dump –Fc nome_do_banco_de_dados > nome_do_arquivo Onde: -F formato --format=formato Seleciona o formato da saída. O formato pode ser um dos seguintes: p Gera um arquivo de script SQL no formato texto-puro (o padrão) t Gera um arquivo tar adequado para servir de entrada para o pg_restore. A utilização deste formato de arquivo permite reordenar e/ou excluir objetos do banco de dados ao fazer a restauração. Também é possível limitar os dados a serem recarregados ao fazer a restauração. c Gera um arquivo personalizado adequado para servir de entrada para o pg_restore. Este é o formato mais flexível, porque permite a reordenação da restauração dos dados, assim como das definições dos objetos. Além disso, este formato é comprimido por padrão. O formato de cópia de segurança personalizado não é um script para o psql, devendo ser restaurado pelo pg_restore. Para restaurar este banco de dados (com os objetos grandes) no banco de dados chamado novo_bd: pg_restore -d novo_bd nome_do_arquivo Onde: -d nome_do_banco_de_dados --dbname=nome_do_banco_de_dados Conecta ao banco de dados nome_do_banco_de_dados e restaura diretamente neste banco de dados. Reordenando os itens do banco de dados Para reordenar os itens do banco de dados, primeiro é necessário criar um arquivo contendo a tabela de conteúdo (índice) da cópia de segurança: pg_restore -l copia_de_seguranca.arquivo > copia_de_seguranca.list O arquivo de listagem consiste de um cabeçalho e uma linha para cada item como, por exemplo, ; ; Archive created at Fri Jul 28 22:28:36 2000 ; dbname: birds ; TOC Entries: 74 ; Compression: 0 ; Dump Version: 1.4-0 ; Format: CUSTOM ; ; ; Selected TOC Entries: ; 2; 145344 TABLE species postgres 3; 145344 ACL species 4; 145359 TABLE nt_header postgres 5; 145359 ACL nt_header 6; 145402 TABLE species_records postgres 7; 145402 ACL species_records 8; 145416 TABLE ss_old postgres 9; 145416 ACL ss_old 10; 145433 TABLE map_resolutions postgres 11; 145433 ACL map_resolutions 12; 145443 TABLE hs_old postgres 13; 145443 ACL hs_old No início da linha ponto-e-vírgula inicia um comentário, e o número refere-se ao identificador interno de arquivamento atribuído a cada item. As linhas do arquivo podem ser transformadas em comentário, excluídas e reordenadas. Por exemplo, poderia ser usado 10; 145433 TABLE map_resolutions postgres ;2; 145344 TABLE species postgres ;4; 145359 TABLE nt_header postgres 6; 145402 TABLE species_records postgres ;8; 145416 TABLE ss_old postgres como entrada do pg_restore, e somente restauraria os itens 10 e 6, nesta ordem. pg_restore -L copia_de_seguranca.list copia_de_seguranca.arquivo Tratamento de bancos de dados grandes Como o PostgreSQL permite a existência de tabelas maiores do que o tamanho máximo de arquivo do sistema operacional, pode ser problemático fazer a cópia de segurança de uma tabela como esta em um arquivo, uma vez que o arquivo resultante provavelmente terá um tamanho maior que o máximo permitido pelo sistema operacional. Como o pg_dump pode escrever na saída padrão, podem ser utilizadas ferramentas padrão do Unix para superar este possível problema. Utilização de cópias de segurança comprimidas. Pode ser utilizado o programa de compressão favorito como, por exemplo, o gzip que também está disponível para Windows. pg_dump nome_do_banco_de_dados | gzip > nome_do_arquivo.gz Restaurar com createdb nome_do_banco_de_dados gunzip -c nome_do_arquivo.gz | psql nome_do_banco_de_dados No Windows o aplicativo gunzip.exe nada mais é do que uma cópia de gzip.exe renomeada, para isso execute o seguinte comando no prompt: copy gzip.exe gunzip.exe pg_dumpall Nome pg_dumpall -- salva um agrupamento de bancos de dados do PostgreSQL em um arquivo de script Sinopse pg_dumpall [opção...] Descrição O pg_dumpall é um utilitário para salvar (dump) todos os bancos de dados de um agrupamento do PostgreSQL em um arquivo de script. O arquivo de script contém comandos SQL que podem ser utilizados como entrada do psql para restaurar os bancos de dados. Isto é feito chamando o pg_dump para cada banco de dados do agrupamento. O pg_dumpall também salva os objetos globais, comuns a todos os bancos de dados (O pg_dump não salva estes objetos). Atualmente são incluídas informações sobre os usuários do banco de dados e grupos, e permissões de acesso aplicadas aos bancos de dados como um todo. Portanto, o pg_dumpall é uma solução integrada para realizar cópias de segurança dos bancos de dados. Entretanto, deve ser observada a seguinte limitação: não é possível salvar "objetos grandes", porque o pg_dump não pode salvar estes objetos em arquivos texto. Havendo bancos de dados contendo objetos grandes, estes devem ser salvos usando um dos modos de saída nãotexto do pg_dump. Como o pg_dumpall lê tabelas de todos os bancos de dados, muito provavelmente será necessário conectar como um superusuário para poder gerar uma cópia de segurança completa. Também serão necessários privilégios de superusuário para executar o script produzido, para poder adicionar usuários e grupos, e para poder criar os bancos de dados. O script SQL é escrito na saída padrão. Devem ser usados operadores de linha de comando para redirecionar para um arquivo. Exemplos Para salvar todos bancos de dados: pg_dumpall > db.out Para recarregar este banco de dados deve ser utilizado, por exemplo: psql -f db.out template1 Onde: -f nome_do_arquivo --file nome_do_arquivo Usa o arquivo nome_do_arquivo como origem dos comandos, em vez de ler os comandos interativamente. Após processar o arquivo, o psql termina. Sob muitos aspectos equivale ao comando interno \i. - template1 Template de modelo para o psql criar o banco. (Neste caso o banco de dados a se conectar não tem importância, porque o arquivo de script criado pelo pg_dumpall contém os comandos apropriados para criar e conectar aos bancos de dados salvos). O pg_dumpall precisa conectar várias vezes ao servidor PostgreSQL (uma vez para cada banco de dados). Se for utilizada autenticação por senha, provavelmente será solicitada a senha cada uma destas vezes. Neste caso é conveniente existir o arquivo ~/.pgpass (Unix) ou pgpass.conf (Windows) O arquivo de senhas pgpass O arquivo .pgpass, armazenado na pasta base (home) do usuário, é um arquivo que contém senhas a serem utilizadas se a conexão requisitar uma senha (e a senha não tiver sido especificada de outra maneira). No Microsoft Windows o arquivo se chama %APPDATA%\postgresql\pgpass.conf (onde %APPDATA% se refere ao subdiretório de dados do aplicativo no perfil do usuário). Ex: C:\Documents and Settings\Marcio Reis\Dados de aplicativos\posgresql\pgpass.conf Este arquivo deve conter linhas com o seguinte formato: nome_do_hospedeiro:porta:nome_do_banco_de_dados:nome_do_usuário:senha Os quatro primeiros valores podem ser um literal, ou * para corresponder a qualquer coisa. É utilizada a senha da primeira linha que corresponder aos parâmetros da conexão corrente (portanto, as entradas mais específicas devem ser colocadas primeiro quando são utilizados curingas). Se a entrada precisar conter os caracteres : ou \, estes caracteres devem receber o escape de \. As permissões de acesso ao arquivo .pgpass não devem permitir o acesso por todos os usuários ou para grupos; isto é conseguido pelo comando chmod 0600 ~/.pgpass. Se as permissões forem mais rígidas que esta, o arquivo será ignorado (Entretanto, atualmente as permissões não são verificadas no Microsoft Windows).