18.3. Bancos de dado modelo

Na verdade o comando CREATE DATABASE funciona copiando um banco de dados existente. Por padrão, copia o banco de dados padrão do sistema chamado template1. Portanto, este banco de dados é o "modelo" a partir do qual os novos bancos de dados são criados. Se forem adicionados objetos ao template1, estes objetos serão copiados nos próximos bancos de dados de usuário criados. Este comportamento permite modificar localmente o conjunto padrão de objetos nos bancos de dados. Por exemplo, se for instalada a linguagem procedural PL/pgSQL em template1, esta se tornará automaticamente disponível nos bancos de dados dos usuários sem que precise ser feito qualquer procedimento adicional na criação dos bancos de dados.

Existe um segundo banco de dados padrão do sistema chamado template0. Este banco de dados contém os mesmos dados contidos inicialmente em template1, ou seja, contém somente os objetos padrão pré-definidos pela versão do PostgreSQL. O banco de dados template0 nunca deve ser modificado após a execução do utilitário initdb. Instruindo o comando CREATE DATABASE para copiar template0 em vez de template1, pode ser criado um banco de dados de usuário "intacto", não contendo nenhuma adição feita ao banco de dados template1 da instalação local. É particularmente útil ao se restaurar uma cópia de segurança feita por pg_dump: o script da cópia de segurança deve ser restaurado em um banco de dados intocado, para garantir a recriação do conteúdo correto da cópia de segurança do banco de dados, sem conflito com as adições que podem estar presentes em template1.

Para criar um banco de dados copiando template0 deve ser utilizado:

CREATE DATABASE nome_do_banco_de_dados TEMPLATE template0;

a partir do ambiente SQL, ou

createdb -T template0 nome_do_banco_de_dados

a partir do interpretador de comandos.

É possível criar bancos de dados modelo adicionais e, na verdade, pode ser copiado qualquer banco de dados do agrupamento especificando seu nome como modelo no comando CREATE DATABASE. Entretanto, é importante compreender que não há intenção (ainda) que este seja um mecanismo tipo "COPY DATABASE" de uso geral. Em particular, é essencial que o banco de dados de origem esteja inativo (nenhuma transação em andamento alterando dados) durante a operação de cópia. O comando CREATE DATABASE verifica se nenhuma sessão (além da própria) está conectada ao banco de dados de origem no início da operação, mas não garante que não possa haver alteração durante a execução da cópia, resultando em um banco de dados copiado inconsistente. Portanto, recomenda-se que os bancos de dados utilizados como modelo sejam tratados como somente para leitura.

No catálogo do sistema pg_database existem para cada banco de dados dois sinalizadores úteis: as colunas datistemplate e datallowconn. A coluna datistemplate pode ser definida para indicar que o banco de dados se destina a servir de modelo para o comando CREATE DATABASE. Se este sinalizador estiver ativo, o banco de dados poderá ser clonado por qualquer usuário com privilégio de CREATEDB; se não estiver ativo, somente os superusuários e o dono do banco de dados poderão cloná-lo. Se datallowconn for falso, então não será permitida nenhuma nova conexão ao banco de dados (mas as sessões existentes não são interrompidas simplesmente definindo o sinalizador como falso). O banco de dados template0 normalmente é marcado com datallowconn igual a falso para evitar que seja modificado. Tanto template0 quanto template1 devem estar sempre marcados com datistemplate igual a verdade.

Após preparar um banco de dados modelo, ou fazer alguma mudança em um deles, é recomendado executar o comando VACUUM FREEZE ou VACUUM FULL FREEZE neste banco de dados. Se for feito quando não houver nenhuma outra transação aberta no mesmo banco de dados, é garantido que todas as linhas no banco de dados serão "congeladas" e não estarão sujeitas a problemas de recomeço do ID de transação. Isto é particularmente importante em um banco de dados que terá datallowconn definido como falso, uma vez que não será possível executar a rotina de manutenção VACUUM neste banco de dados. Para obter informações adicionais deve ser consultada a Seção 21.1.3 .

Nota: Os bancos de dados template1 e template0 não possuem qualquer status especial além do fato do nome template1 ser o nome padrão para banco de dados de origem do comando CREATE DATABASE, e além de ser o banco de dados padrão para se conectar utilizado por vários programas, como o createdb. Por exemplo, template1 pode ser removido e recriado a partir de template0 sem qualquer efeito prejudicial. Esta forma de agir pode ser aconselhável se forem adicionadas, por descuido, coisas inúteis ao template1.

Exemplo 18-1. Recriação do banco de dados template1

Neste exemplo o banco de dados template1 é recriado. Deve ser observado na seqüência de comandos utilizada que não é possível remover o banco de dados template1 conectado ao mesmo, e enquanto este banco de dados estiver marcado como modelo no catálogo do sistema pg_database. [1]

Para recriar o banco de dados template1 é necessário: se conectar a outro banco de dados (teste neste exemplo); atualizar o catálogo pg_database para que o banco de dados template1 não fique marcado como um banco de dados modelo; remover e criar o banco de dados template1; conectar ao banco de dados template1; executar os comandos VACUUM FULL e VACUUM FREEZE; atualizar o catálogo do sistema pg_database para que o banco de dados template1 volte a ficar marcado como um banco de dados modelo.

Abaixo está mostrada a seqüência de comandos utilizada:

template1=#  DROP DATABASE template1;
ERRO:  não é possível remover o banco de dados aberto atualmente
template1=#  \c teste
Conectado ao banco de dados "teste".
teste=#  DROP DATABASE template1;
ERRO:  não é possível remover um banco de dados modelo
teste=#  UPDATE pg_database SET datistemplate=false WHERE datname='template1';
UPDATE 1
teste=#  DROP DATABASE template1;
DROP DATABASE
teste=#  CREATE DATABASE template1 TEMPLATE template0 ENCODING 'latin1';
CREATE DATABASE
teste=#  \c template1
Conectado ao banco de dados "template1".
template1=#  VACUUM FULL;
VACUUM
template1=#  VACUUM FREEZE;
VACUUM
template1=#  UPDATE pg_database SET datistemplate=true WHERE datname='template1';
UPDATE 1

Notas

[1]

Exemplo escrito pelo tradutor, não fazendo parte do manual original.

SourceForge.net Logo CSS válido!