quinta-feira, 7 de maio de 2015

Configurando Stream Replication No PostgreSQL 9

Esse tutorial explica como configurar 2 servidores PosgreSQL como master e slave com stream replication, é bem simples.
Cenário:
  • Master 192.168.1.200 (Debian 6 – PostgreSQL 9)
  • Slave 192.168.1.201 (Debian 6 – PostgreSQL 9)
Configuração do Master: 
No arquivo postgresql.conf, alterar as seguintes opções:
listen_address = ‘*’ # Reponderá por qualquer ip cadastrado no server
wal_level = hot_standby
max_wal_senders = 1 # Número maximo de servidores slave
wal_keep_segments = 32
No arquivo pg_hba.conf, adicione o servidor slave para replicação:
host    replication     postgres         192.168.1.201/32        trust
Configuração do Slave 
Criar o arquivo recovery.conf no mesmo diretório do arquivo postgresql.conf, com o seguinte conteúdo:
standby_mode = ‘on’
primary_conninfo = ‘host=192.168.1.200 port=5432 user=postgres’
trigger_file = ‘/tmp/pgsql.trigger’
Parar o PostgreSQL dos 2 servidores:
[postgres@server ~]$ /usr/local/pgsql/bin/pg_ctl stop -D /usr/local/pgsql/data/
[postgres@client ~]$ /usr/local/pgsql/bin/pg_ctl stop -D /usr/local/pgsql/data/
Agora você deverá copiar todo o conteúdo do data do master para o data do slaver:
[postgres@server ~]$ rsync -a -v -e ssh /usr/local/pgsql/data/ 192.168.1.201:/usr/local/pgsql/data/ –exclude postmaster.pid
E no arquivo postgresql.conf do slave, alterar as seguintes opções:
hot_standby = on
Agora você pode iniciar os 2 serviços do PostgreSQL:
[postgres@server ~]$ /usr/local/pgsql/bin/pg_ctl start -D /usr/local/pgsql/data/
[postgres@client ~]$ /usr/local/pgsql/bin/pg_ctl start -D /usr/local/pgsql/data/
Para verificar se a replicação está certa você pode ver assim:
No master:
[postgres@server ~]$ ps ax | grep sender
1573 ?        Ss     0:00 postgres: wal sender process postgres 192.168.1.201(53314) streaming 0/C0000D0
No slave:
[postgres@server ~]$ ps ax | grep receiver
3180 ?        Ss     0:00 postgres: wal receiver process   streaming 0/C0000D0
Testando a replicação:
No master crie uma tabela teste e popule:
postgres=# CREATE TABLE tabelaTeste (valor varchar(30));
postgres=# INSERT INTO tabelaTeste VALUES(‘teste1′);
postgres=# INSERT INTO tabelaTeste VALUES(‘teste2′);
Agora no server slave (stand by) veja se a tabela “tabelaTeste| foi criada:
postgres=# SELECT * FROM tabelaTeste;
Se o resultado for esse abaixo, está correto:
valor
—————
teste1
teste2
(2 rows)

terça-feira, 5 de maio de 2015

COMO RECUPERAR BANCO DO POSTGRES PELO DIRETÓRIO


Pode acontecer de você precisar recuperar um banco de dados Postgres, mas tendo a seu dispor apenas uma cópia de um HD como backup, e não um arquivo de backup gerado com o comando pg_dump

Neste caso, após algumas tentativas, consegui restaurar o banco e compartilho aqui o procedimento que funcionou comigo. Ou seja, recuperação do banco através dos diretórios. 

Antes de tudo, instale no servidor a versão do Postgres idêntica à versão instalada no backup. 

Depois, pare o serviço Postgres. No caso do Debian, onde a dica foi testada, executei: 


# sh /etc/init.d/postgresql stop 

Depois, copie do backup os seguintes diretórios, substituindo os mesmos diretórios no servidor atual. Por exemplo, usando o Postgres 9.3:
  • /var/lib/postgresql/9.3
  • /usr/share/postgresql/9.3
  • /etc/postgresql/9.3

Obs.: recomendo renomear os diretórios originais para "nome-backup", ao invés de simplesmente substituí-los. 

É necessário dar permissão para um diretório, após a cópia para o servidor: 

# chmod 700 /var/lib/postgresql/9.3 -R 

Inicialmente usei "777", mas o próprio sistema informou que era para mudar para 700, quando tentei iniciar o serviço. 

Depois inicie o serviço: 

# sh /etc/init.d/postgresql start 

Pronto! Se tiver o phpPgAdmin instalado, poderá acessá-lo para visualizar o banco, acessando: 

Talvez exista uma forma mais fácil, mas essa foi a que eu encontrei. 

Foi na base do comando find que encontrei os referidos diretórios e fui copiando para o servidor. 

Espero ajudar alguém na mesma situação.
Abraço!