Você está na página 1de 6

Unificando bases de dados com Shemas - PostgreSQL-BR Mo...

http://wiki.postgresql.org.br/Unificando_bases_de_dados_co...

Aqui explico como organizar diversos bancos de dados PostgreSQL utilizando o conceito de Schemas. A idia centralizar varias bases de sistemas distintos em um nico banco, centralizando todo o seu gerenciamento. Neste processo iremos: Criar um novo banco de dados destinado a ser o "Banco de Dados Central"; Criar tablespaces para tabelas e ndices e fazer com que todos os ndices e tabelas de todos os sistemas armazenem seus dados nas suas respectivas tablespaces; Centralizar toda a codificao de caracteres para todos os sistemas em UTF8; Utilizar apenas um usurio administrador, o postgres para todos os sistemas; Utilizar um usurio e um schema com o mesmo nome para cada sistema a ser utilizado pelo desenvolvedor para criar os objetos do sistema; Utilizar um ou mais usurios para a aplicao com permisses restritas em cada objeto a ser utilizado; Para isto, utilizaremos o PostgreSQL 8.1 rodando em Linux. No entanto, a maioria das coisas aqui descritas se aplicam a outros sistemas operacionais no padro POSIX (linux, BSDs, Solaris, etc) e verses 8.x do PostgreSQL.

Parte I - Preparao
1. Criar tablespaces:
Antes mesmo de criar nosso banco de dados centralizado, criaremos os tablespaces a serem utilizados. Mesmo que voc no possua vrios discos ou arrays distintos para armazenar os seus dados, importante j comear a preparar os seus sistemas para isto. Conforme eles crescem voc dever precisar de mais storage. Separar os logs, tabelas e ndices e unidades fsicas distintas costuma ser a providncia nmero um para aumentar a performance. claro que sistemas maiores podem utilizar tablespaces separados para cada sistema ou para tabelas e ndices com dados histricos (utilizando o particionamento de tabelas) para aumentar ainda mais o desempenho. Como nosso tpico principal aqui no o tunning, no nos aprofundaremos no assunto aqui. Criaremos as seguintes tablespaces bsicas: Uma tablespace para tabelas chamada tbs_tables Uma tablespace para ndices chamada tbs_indexes Antes de criar sua tablespace, voc deve entender que o PostgreSQL 8.x trata cada tablespace como um diretrio no seu sistema de arquivos. Portanto preciso criar os diretrios no seu sistema operacional antes de criar os tablespaces. Tambm preciso garantir a permisso de leitura e gravao nas pastas recm criadas. O local onde voc ir criar seus tablespaces depende da forma como voc deseja organizar sua estrutura de diretrios. Aqui, criaremos
1 de 6 07-11-2011 23:00

Unificando bases de dados com Shemas - PostgreSQL-BR Mo...

http://wiki.postgresql.org.br/Unificando_bases_de_dados_co...

uma pasta especfica para isso, na raiz. Na sua linha de comando digite:
$ # $ $ $ $ $ $ $ su su postgres cd / mkdir postgresql cd postgresql mkdir tablespaces cd tablespaces mkdir tables mkdir indexes

Feito isto, voc pode se conectar ao psql e criar os tablespaces:


$ psql > CREATE TABLESPACE tbs_tables OWNER postgres LOCATION '/postgresql /tablespaces/tables'; > CREATE TABLESPACE tbs_indexes OWNER postgres LOCATION '/postgresql /tablespaces/indexes';

2. Criar o banco de dados central:


Feito isto, criaremos o banco de dados que servir para para centralizar todos os seus bancos de dados. Para isto utilizarei a opo '-D' para definir um tablespace padro a ser utilizado em todos os objetos que no especificarem um tablespace padro. Outra opo importante o '-E' onde especifico o tipo de codificao de caracteres.
$ createdb -D tbs_tables -E utf-8 nome_do_banco

3. Criar role padro para desenvolvedores:


O prximo passo criar um role que ser utilizado por todos os usurios que podero criar objetos no banco. Note que este role no ser utilizado para se logar no banco e sim para que novos usurios herdem suas permisses. Concederemos permisso para: Criar objetos no banco de dados recm criado; Criar objetos nos tablespaces tbs_tables e tbs_indexes.
> > > > CREATE ROLE developer WITH NOLOGIN; GRANT CREATE ON DATABASE nome_do_banco TO developer; GRANT CREATE ON TABLESPACE tbs_tables TO developer; GRANT CREATE ON TABLESPACE tbs_indexes TO developer;

Parte II - Unificando os bancos de dados


4. Fazer DUMP do banco de dados a ser migrado
2 de 6 07-11-2011 23:00

Unificando bases de dados com Shemas - PostgreSQL-BR Mo...

http://wiki.postgresql.org.br/Unificando_bases_de_dados_co...

A primeira coisa que voc deve fazer agora exportar cada banco de dados individual. A melhor forma de fazer isto utilizando o pg_dump atravs da linha de comando. Voc pode fazer alguns testes iniciais sem carregar a estrutura dos dados para ver se est tudo ok. Para isto, utilize a opo '-s'. Depois voc pode exportar apenas os dados utilizando a opo '-a'.
$ pg_dump --use-set-session-authorization -E utf-8 -h ip_do_banco -U postgres nome_do_banco_a_ser_migrado > nome_do_banco_a_ser_migrado.sql

a opo '--use-set-session-authorization' opcional. Ela faz com que seja utilizada o comando SQL 'SET SESSION AUTHORIZATION' ao invs do 'ALTER ... OWNER' para cada objeto. A opo '-E' fora a exportao ser realizada na codificao de caracteres desejada. Desta forma no preciso utilizar o iconv ou mudar o 'client enconding' para importar os dados na codificao correta.

5. Editar o dump:
Agora vem a parte mais importante do processo de migrao, editar o dump e corrigir algumas coisas: Alterar o tablespace para as tabelas e ndices com o comando SQL 'SET default tablespace'; Criar o usurio que ser dono do schema e todos os objetos dentro dele, a ser utilizado pelo desenvolvedor. Colocamos tambm um limite de conexes para este usurio para impedir que o desenvolvedor tente utilizar este usurio como usurio da aplicao; Criar um ou mais usurios a serem utilizados pela aplicao; Criar o schema e defini-lo como padro para que todos os objetos subsequentes sejam criados dentro dele, atravs da instruo 'SET search path'; Criar as permisses para os usurios das aplicaes concedendo apenas os privilgios realmente necessrios para eles. Alguns cuidados: Utilize um editor em modo texto, principalmente se o seu dump for muito grande. Isto ir facilitar o seu trabalho de edio, pois abrir arquivos grandes em modo grfico pode acabar com a memria do seu computador mais rpido do que em modo texto. Outra alternativa criar um dump separado para a definio de dados DDL e outro para os dados em DML. A maior parte das alteraes dizem respeito apenas a DDL, que so arquivos bem menores. Verifique se existe uma linha igual a esta no incio do arquivo:
SET client_encoding = 'utf-8';

ela importante para garantir que o psql v utilizar a codificao correta durante a importao. Caso voc esteja utilizando outra codificao, voc poder ter
3 de 6 07-11-2011 23:00

Unificando bases de dados com Shemas - PostgreSQL-BR Mo...

http://wiki.postgresql.org.br/Unificando_bases_de_dados_co...

problemas durante a importao. Mude a codificao de caractere para UTF8 ou mude o 'client-encoding' para aquele que o arquivo do dump est utilizando. Algumas linhas como o 'SET default tablespace' e 'SET search path' j vem no dump padro realizado pelo pg_dump. Ao invs de reescrever estas linhas, apenas altere a j existente. O risco no faz-lo criar um parmetro que ser sobrescrito pr-existente no dump pouco aps da linha que voc acrescentou. Algumas funes em PL so criadas dependendo da verso do PostgreSQL que voc est utilizando. Estas funes costumam ser criadas ao se criar o banco de dados ou ao se implementar alguma funcionalidade do diretrio contrib do PostgreSQL. Geralmente, estas funes so comuns a todos os sistemas e no precisam ser includas novamente. Costuma ser seguro remover estas linhas do dump. Caso ocorra algum problema durante a homologao, voc poder criar um novo dump e recuperar as funes da base de dados antiga. 5.1 Criando usurios:
CREATE ROLE sistema_a WITH LOGIN PASSWORD '123456' INHERIT IN ROLE developer CONNECTION LIMIT 2; CREATE ROLE sistema_a_client WITH LOGIN PASSWORD '123456'; SET SESSION AUTHORIZATION sistema_a;

Note aqui que o 'INHERIT IN ROLE developer' faz com que o usurio faa parte da role developer e ainda herde as permisses dele. A linha 'SET SESSION AUTHORIZAION' faz com que os objetos subsequentes sejam todos criados com o usurio citado como owner. 5.2 Criando o schema: Agora criaremos o schema com o mesmo nome do usurio do desenvolvedor. importante que o usurio tenha o mesmo nome do schema, pois no arquivo postgresql.conf o 'search_path' inclui a varivel '$user' por default. Isto significa que o nome do usurio que se conectar procurar automaticamente objetos neste schema sem precisar qualificar seu nome ou utilizar o 'SET search path'.
CREATE SCHEMA sistama_a AUTHORIZATION sistema_a;

5.3 Definido os tablespaces Para definir o tablespace, voc deve procurar dois pontos importantes no seu dump: o ponto imediatamente anterior antes de criar as tabelas e o ponto imediatamente anterior a criao dos ndices e constraints. Antes da criao das tabelas coloque a seguinte linha:

4 de 6

07-11-2011 23:00

Unificando bases de dados com Shemas - PostgreSQL-BR Mo...

http://wiki.postgresql.org.br/Unificando_bases_de_dados_co...

SET default_tablespace = 'tbs_tables';

Antes da criao de ndices e constraints, coloque a seguinte linha:


SET default_tablespace = 'tbs_indexes';

5.4 Concedendo privilgios aos usurios da aplicao No final do dump, o pg_dump coloca as permisses inerentes aos objetos criados para cada usurio. Esta parte do trabalho no tem como ser automatizada. interessante manter o REVOKE para o usurio PUBLIC de forma a zerar as permisses para todos os usurios antes de conced-las novamente. Evite a todo o custo conceder privilgios do tipo ALL, a fim de no conceder mais privilgio do que o estritamente necessrio para cada usurio. Apesar de ser uma tarefa tediosa, esta uma tarefa importante no trabalho de qualquer bom DBA. Privilgios do tipo CREATE, TEMP, DELETE, RULE, REFERENCES, TRIGGER que s devem existir em usurios de sistema em casos especficos.

6. Importao
O ltimo passo importar cada dump devidamente alterado no passo anterior para o banco de dados central.
$ psql -h ip_do_banco -U postgres nome_do_banco < nome_do_banco_a_ser_migrado.sql

7. Testes
Por fim, deve-se testar a aplicao para que ver se tudo est funcionando adequadamente com o usurio do sistema e senha nova. Pode ser necessrio qualificar o nome dos esquemas para acessar os objetos no local correto. Uma alternativa mais simples utilizar a instruo 'SET search path' logo aps a conexo com o banco de dados. Uma boa idia utilizar tambm a instruo 'SET client enconding' utilizando a codificao da sua aplicao. Como o UTF8 tem a capacidade de ser convertido para a maior parte dos tipos de codificao, ele ideal para ser utilizado no servidor, enquanto no cliente voc pode escolher o tipo de codificao mais adequado para a sua aplicao. Lembre-se de testar cuidadosamente sua aplicao antes de libera-la para a produo. Um servidor de testes fundamental para este processo.

Referncias:
Schemas: http://www.postgresql.org/docs/8.1/interactive/ddl-schemas.html

5 de 6

07-11-2011 23:00

Unificando bases de dados com Shemas - PostgreSQL-BR Mo...

http://wiki.postgresql.org.br/Unificando_bases_de_dados_co...

psql:

http://www.postgresql.org/docs/8.1/interactive/app-psql.html http://www.postgresql.org/docs/8.1/interactive/app-pgdump.html http://www.postgresql.org/docs/8.1/interactive http://www.postgresql.org/docs/8.1/interactive

pg_dump:

CREATE DATABASE: /sql-createdatabase.html CREATE TABLESPACE: /sql-createtablespace.html

CREATE SCHEMA: http://www.postgresql.org/docs/8.1/interactive /sql-createschema.html CREATE ROLE: GRANT: REVOKE: SET: http://www.postgresql.org/docs/8.1/interactive/sql-createrole.html http://www.postgresql.org/docs/8.1/interactive/sql-grant.html http://www.postgresql.org/docs/8.1/interactive/sql-revoke.html http://www.postgresql.org/docs/8.1/interactive

http://www.postgresql.org/docs/8.1/interactive/sql-set.html

SET AUTHORIZATION SESSION: /sql-set-session-authorization.html

Notas de Copyright
Este documento foi criado por Fbio Telles Rodriguez < fabio.telles@gmail.com> em 2006 e foi originalmente publicado em http://www.midstorm.org/~telles/modules /news/article.php?storyid=99 Este documento pode ser utilizado, copiado, modificado e distribuido para qualquer fim de acordo com os termos da GPL.
PostgreSQLBR: Unificando bases de dados com Shemas (editada pela ltima vez em 2006-11-17 11:46:13 por FabioTelles)

6 de 6

07-11-2011 23:00