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).
Download

procedimentos de backup e restore no postgres