Unificando bases de dados com Schemas
Aqui explico como organizar diversos bancos de dados PostgreSQL utilizando o conceito de Schemas. A idéia é centralizar varias bases de sistemas distintos em um único banco, centralizando todo o seu gerenciamento.
Parte I - Preparação
Neste processo iremos:
Antes mesmo de criar nosso banco de dados centralizado, criaremos os tablespaces a serem utilizados. Mesmo que você não possua vários discos ou arrays distintos para armazenar os seus dados, é importante já começar a preparar os seus sistemas para isto. Conforme eles crescem você deverá precisar de mais storage. Separar os logs, tabelas e índices e unidades físicas distintas costuma ser a providência número um para aumentar a performance.
É claro que sistemas maiores podem utilizar tablespaces separados para cada sistema ou para tabelas e índices com dados históricos (utilizando o particionamento de tabelas) para aumentar ainda mais o desempenho. Como nosso tópico principal aqui não é o tunning, não nos aprofundaremos no assunto aqui.
Criaremos as seguintes tablespaces básicas:
$ 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 opção '-D' para definir um tablespace padrão a ser utilizado em todos os objetos que não especificarem um tablespace padrão. Outra opção importante é o '-E' onde especifico o tipo de codificação de caracteres.
$ createdb -D tbs_tables -E utf-8 nome_do_banco
3. Criar role padrão para desenvolvedores:
O próximo passo é criar um role que será utilizado por todos os usuários que poderão criar objetos no banco. Note que este role não será utilizado para se logar no banco e sim para que novos usuários herdem suas permissões. Concederemos permissão para:
> 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;
- 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 codificação de caracteres para todos os sistemas em UTF8;
- Utilizar apenas um usuário administrador, o postgres para todos os sistemas;
- Utilizar um usuário 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 usuários para a aplicação com permissões restritas em cada objeto a ser utilizado;
Parte I - Preparação
1. Criar tablespaces:Antes mesmo de criar nosso banco de dados centralizado, criaremos os tablespaces a serem utilizados. Mesmo que você não possua vários discos ou arrays distintos para armazenar os seus dados, é importante já começar a preparar os seus sistemas para isto. Conforme eles crescem você deverá precisar de mais storage. Separar os logs, tabelas e índices e unidades físicas distintas costuma ser a providência número um para aumentar a performance.
É claro que sistemas maiores podem utilizar tablespaces separados para cada sistema ou para tabelas e índices com dados históricos (utilizando o particionamento de tabelas) para aumentar ainda mais o desempenho. Como nosso tópico principal aqui não é o tunning, não nos aprofundaremos no assunto aqui.
Criaremos as seguintes tablespaces básicas:
- Uma tablespace para tabelas chamada tbs_tables
- Uma tablespace para índices chamada tbs_indexes
$ 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 opção '-D' para definir um tablespace padrão a ser utilizado em todos os objetos que não especificarem um tablespace padrão. Outra opção importante é o '-E' onde especifico o tipo de codificação de caracteres.
$ createdb -D tbs_tables -E utf-8 nome_do_banco
3. Criar role padrão para desenvolvedores:
O próximo passo é criar um role que será utilizado por todos os usuários que poderão criar objetos no banco. Note que este role não será utilizado para se logar no banco e sim para que novos usuários herdem suas permissões. Concederemos permissão para:
- Criar objetos no banco de dados recém criado;
- Criar objetos nos tablespaces tbs_tables e tbs_indexes.
> 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;