No PostgreSQL, a atualização de versões é realizada de diferentes maneiras:
Instalar pacotes com uma nova versão do PostgreSQL. Este método é adequado apenas para atualizações menores. Antes de realizar a atualização, consulte as notas de versão.
Uso do programa padrão pg_dumpall. É um método confiável, mas pode haver um tempo de inatividade prolongado.
Uso do programa padrão pg_upgrade. Outra maneira rápida de atualizar, mas erros podem ocorrer.
Atualização via replicação lógica. Esta opção tem um tempo de inatividade mínimo, mas é adequada apenas para versões do PostgreSQL superiores a 10.0. Versões anteriores exigem extensões. A escolha depende da versão em uso no servidor e da versão para a qual você deseja atualizar.
Neste artigo, vamos explorar todos os métodos de atualização mencionados.
O principal é entender as particularidades das atualizações entre diferentes versões.
Os números de versão consistem em dois dígitos, por exemplo, 10.1. O primeiro dígito é o número da versão principal (10). O segundo dígito é o número da versão menor (1).
Antes do PostgreSQL 10, os números de versão consistiam em três dígitos. Por exemplo, em 9.6.3, 9.6 é o número da versão principal e 3 é o número da versão menor.
Você deve entender essa diferença para escolher o método de atualização correto.
Nas versões menores, o formato de armazenamento de dados não muda, portanto, não há problemas de compatibilidade. Por isso, a transição do PostgreSQL 10.1 para o 10.6 pode ser feita muito facilmente. Para atualizar, basta desligar o servidor, substituir os arquivos executáveis e reiniciar o servidor.
No entanto, a documentação observa que algumas versões podem exigir alterações manuais. Portanto, sempre leia as notas de versão antes de atualizar.
Nas versões principais, o formato dos dados pode mudar. Isso torna a atualização mais difícil. Você precisará descarregar os dados e carregá-los novamente, usar o programa pg_upgrade ou utilizar replicação lógica.
Vamos ver como atualizar o PostgreSQL versão 14.1 para PostgreSQL 14.3 em um servidor Ubuntu.
O PostgreSQL está disponível no Ubuntu por padrão. Comece com o comando:
sudo apt-get upgrade
O Debian e o Ubuntu lançam apenas uma versão do PostgreSQL para cada versão do sistema operacional. Por exemplo, o Debian Squeeze/6.0 só tem o PostgreSQL 8.4. Se você precisar de uma versão diferente do PostgreSQL, use os pacotes do PGDG.
Se você deseja a versão mais recente do PostgreSQL, primeiro deve instalar o repositório do Postgres.
Adicione um repositório:
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
Imprima a chave de assinatura:
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
Atualize a lista de pacotes no sistema:
sudo apt-get update
Instale a versão necessária do PostgreSQL:
sudo apt-get -y install postgresql-14.3
Para ver a lista de DBMSs instalados, execute:
dpkg --get-selections | grep postgres
Também veja a lista de clusters:
pg_lsclusters
Desligue o PostgreSQL antes de fazer alterações:
sudo service postgresql stop
Quando os pacotes do PostgreSQL são instalados, eles criam um cluster padrão para você. Você deve renomear o novo cluster do Postgres para evitar conflitos com o nome do antigo cluster ao atualizar.
sudo pg_renamecluster 14.3 main main_pristine
Atualize o antigo cluster:
sudo pg_upgradecluster 14.1 main
Inicie o serviço:
sudo service postgresql start
Verifique novamente a lista de clusters e certifique-se de que o novo cluster está funcionando:
pg_lsclusters
Remova o antigo cluster:
sudo pg_dropcluster 14.1 main
Se você precisar mudar a versão principal, use o programa pg_dumpall. A essência deste método é descarregar os dados de uma versão principal e depois carregá-los em outra.
Antes de descarregar os dados, certifique-se de que nenhuma alteração está sendo feita no banco de dados no momento. Caso contrário, algumas das alterações podem não ser incluídas no dump final.
Obtenha o dump e escreva-o em um arquivo:
pg_dumpall > output_file
Desligue o servidor:
pg_ctl stop
Mude o nome do diretório antigo para evitar conflitos de nome:
mv /usr/local/pgsql /usr/local/pgsql.old
O diretório antigo pode ser excluído. Mas é mais sensato renomeá-lo para deixar espaço para restauração. Em vez de /usr/local/pgsql, especifique o caminho para o seu diretório.
Instale a nova versão a partir do código-fonte. Existe um guia detalhado na documentação.
Crie um novo cluster:
/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data
Transfira todas as alterações para os arquivos pg_hba.conf e postgresql.conf.
Inicie o servidor de banco de dados:
/usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data
Restaure os dados do backup:
/usr/local/pgsql/bin/psql -d postgres -f output_file
A desvantagem deste método é que o servidor ficará desligado por um longo tempo. Para reduzir o tempo de inatividade, você pode instalar o novo servidor em um diretório diferente e depois executar os servidores antigo e novo em diferentes portas. Para transferir os dados, use o comando:
pg_dumpall -p 5432 | psql -d postgres -p 5433
Em vez de 5432 e 5433, especifique os números de porta em que você executou os servidores.
Para evitar descarregar e carregar dados, use o programa pg_upgrade. Ele ajuda a atualizar mais rápido. O programa pg_upgrade cria novas tabelas do sistema, levando em conta as mudanças nas últimas versões do PostgreSQL. Nesse caso, os antigos arquivos de dados são mantidos. Além disso, o pg_upgrade verifica se os clusters são compatíveis.
O programa pg_upgrade ajuda você a atualizar do PostgreSQL 8.4.X para a versão atual do DBMS.
Vamos ver um plano de atualização geral usando o pg_upgrade.
Mova o cluster antigo. Isso deve ser feito se o diretório não estava vinculado à versão antiga. Por exemplo, se ele estiver em /usr/local/pgsql. Se você não renomeá-lo, ocorrerá um conflito durante a atualização.
O renomeio é feito quando o servidor está desligado com o comando:
mv /usr/local/pgsql /usr/local/pgsql.old
Construa a nova versão a partir do código-fonte. Ajuste o configure para que as opções sejam compatíveis com a configuração do cluster antigo. Antes de iniciar a atualização, o pg_upgrade verificará a compatibilidade das opções.
Instale novos arquivos executáveis. Para colocar o servidor em um diretório não padrão, use o prefixo:
make prefix=/usr/local/pgsql.new install
Use o initdb para inicializar um novo cluster. Verifique se as opções são compatíveis com as do cluster antigo.
Instale os arquivos de objetos compartilhados de extensão. Se houver atualizações disponíveis, o pg_upgrade criará automaticamente um script para sua instalação posterior.
Transfira os arquivos de pesquisa de texto completo.
Configure a autenticação de pares no pg_hba.conf. Isso deve ser feito porque o pg_upgrade se conectará aos antigos e novos hosts várias vezes.
Verifique se os servidores antigo e novo estão parados:
pg_ctl -D /opt/PostgreSQL/9.6 stop
pg_ctl -D /opt/PostgreSQL/14 stop
Execute o pg_upgrade no novo servidor. Primeiro, execute o programa em modo de verificação adicionando a opção: pg_upgrade --check. Em resposta, você receberá uma lista de ajustes que precisam ser feitos manualmente após a atualização.
Se você fez alterações no arquivo pg_hba.conf, restaure-o para o seu estado anterior. Às vezes, outras configurações no novo cluster precisam ser alteradas para coincidir com a configuração do cluster antigo.
Inicie o servidor.
Se estiver satisfeito com o resultado, exclua o cluster antigo.
Para detalhes e características do uso do pg_upgrade, consulte a documentação.
A partir da versão 10 do PostgreSQL, temos um método para replicação lógica de objetos de dados e as mudanças neles. Ele é baseado no uso de identificadores de replicação; geralmente, são chaves primárias.
A replicação lógica usa o modelo de publicação-assinatura. O usuário cria uma captura instantânea do banco de dados publicado e a copia para o assinante. Na documentação do PostgreSQL, um dos cenários típicos para usar replicação lógica é precisamente a replicação entre diferentes versões principais do PostgreSQL.
O servidor de backup pode estar no mesmo host ou em outro. Após a sincronização estar concluída, várias opções estão disponíveis. Por exemplo, você pode fazer o novo servidor ser o principal e desligar o antigo.
A principal vantagem da replicação lógica é o tempo de inatividade mínimo. A interrupção do servidor, em alguns casos, é limitada a apenas alguns segundos.
Examinamos os métodos universais para atualizar o PostgreSQL para uma nova versão principal e atualizar dentro de uma versão principal.
Com este guia, você pode selecionar o método que funciona melhor para o seu caso particular e atualizar sua versão atual do PostgreSQL.