PostgreSQL: upgrade 8.4 para 9.1 com mudança de diretório PGDATA em sistemas Debian com mínimo downtime

Em sistemas Debian há ao menos um modo correto de fazer upgrade de PostgreSQL 8.4 para 9.1, simultaneamente trocando diretório PGDATA para maior desempenho, e minimizar o downtime. Veja um exemplo e adapte ao seu cenário.

Você PRECISA analisar e adaptar ao seu cenário. Não copie e cole os comandos apenas. Leia as man pages dos comandos para avaliar as opções.

O Debian 6.x Squeeze tem PostgreSQL 8.4.x em sua versão estável. Mas está disponível no repositório squeeze-backports o PostgreSQL 9.1, que é o mesmo do Debian 7.x Wheezy. Tanto GNU/Linux como GNU/kFreeBSD.

Você pode aproveitar oportunidade para utilizar os conhecimentos de tuning de infraestrutura de PostgreSQL e aproveitar para trocar o diretório PGDATA para utilizar armazenamento de alto desempenho.

Em sistemas Debian há o modo correto de realizar upgrade de postgresql 8.4 para 9.1 com menor downtime possível quando existe espaço disponível para manter duas bases simultaneamente enquanto necessário.
Os comandos são mostrados com caminho completo pois quando há mais de um pg instalado, precisa especificar qual versão do comando deve ser chamada.
Também é mostrada a saída do comendo pg_createcluster para ilustrar.
Os arquivos de configuração são um pouco diferentes entre as versões 8.4 e 9.1, por isso são editadas as opções que sejam relevantes para tuning.
Alguns comandos são chamados com sudo porque em sistemas Debian o usuário "postgres" não tem senha por medida de segurança. 
É necessário subir a privilégios de root e depois descer a postgres com su (ou chamar o psql para usuário postgres).

Também repare que o comando pg_dumpall precisa usar o redirecionado de saída ">" para incluir algumas variáveis globais que de outra forma iriam para o console apenas.

Reparar que em sistemas Debian é possível parar e reiniciar diferentes versões de clusters de bancos de dados postgresql simultaneamente ou não. Veja as opções do /etc/init.d/postgresql e do /etc/postgresql/[version]/[cluster]/pg_ctl.conf

Leia também:

http://wiki.debian.org/PostgreSql

http://pwet.fr/man/linux/administration_systeme/pg_createcluster

cd
sudo nice pg_dumpall --column-inserts --username=postgres --clean --verbose | \

gzip -9 > /tmp/server1postgresqldump_201211090906.sql.gz

cp /tmp/server1postgresqldump_201211090906.sql.gz .
gunzip server1postgresqldump_201211090906.sql.gz
less server1postgresqldump_201211090906.sql
sudo apt-get update
sudo apt-get upgrade
sudo apt-get -t squeeze-backports install postgresql
sudo pg_dropcluster --stop 9.1 main

Os passos de criação manual de diretório e atribuição de propriedade podem ser dispensados se estiver executando como root ou com sudo, pois o comando pg_createcluster criaria para você. Mas se estivesse executando como postgres não conseguiria criar o diretório através da execução do pg_createcluster.

sudo mkdir -p /data/postgresql
sudo chown postgres.postgres /data/postgresql

Crie o cluster "main" no engine de versão "9.1", no diretório desejado, com propriedade de "postgres", e configure para iniciar e parar automaticamente com os scripts de /etc/init.d.

sudo pg_createcluster --datadir=/data/postgresql --user=postgres --start-conf=auto 9.1 main

O comando irá fazer sua mágica, criando arquivos e movendo para os locais corretos.

Creating new cluster (configuration: /etc/postgresql/9.1/main, data: /data/postgresql)...
Moving configuration file /data/postgresql/postgresql.conf to /etc/postgresql/9.1/main...
Moving configuration file /data/postgresql/pg_hba.conf to /etc/postgresql/9.1/main...
Moving configuration file /data/postgresql/pg_ident.conf to /etc/postgresql/9.1/main...
Configuring postgresql.conf to use port 5433...

Notar que encontrou uma porta livre para não conflitar com a 5432 em uso.

sudo cat /etc/postgresql/8.4/main/pg_hba.conf
sudo nano /etc/postgresql/9.1/main/pg_hba.conf
sudo invoke-rc.d postgresql stop
sudo invoke-rc.d postgresql restart
sudo /usr/lib/postgresql/9.1/bin/psql --username=postgres --port=5433 template1
sudo /usr/lib/postgresql/9.1/bin/psql --username=postgres --port=5433 -f server1postgresqldump_201211090906.sql
/usr/lib/postgresql/9.1/bin/psql --username=server1user --port=5433 --password server1db
cat /etc/postgresql/8.4/main/postgresql.conf
sudo cp /etc/postgresql/9.1/main/postgresql.conf /etc/postgresql/9.1/main/postgresql.conf.20121108
sudo nano /etc/postgresql/9.1/main/postgresql.conf
sudo invoke-rc.d postgresql restart 9.1
/usr/lib/postgresql/9.1/bin/psql --username=server1user --port=5433 --password server1db
cp /etc/postgresql/9.1/main/postgresql.conf postgresql_91.conf.20121109
sudo cp /etc/postgresql/9.1/main/pg_hba.conf pg_hba_91.conf.20121109
sudo chown andremachado.andremachado pg_hba_91.conf.20121109

 

Blog Tags: