atualizando do postgres 9.1 para 9.3 no servidor ubuntu

27

Eu tenho meu servidor de produção (ubuntu 13.10) rodando com o postgresql 9.1.

Quero usar alguns recursos da 9.3, portanto, quero atualizar.

Alguém poderia me ajudar com a atualização da 9.1 para a 9.3, para que haja um tempo de inatividade não superior a 30 minutos. ou então?

A principal preocupação é evitar uma perda de dados ou redundância de arquivos.

Ram Kumar
fonte
2
Os documentos do Postgres são realmente bons. google.co.uk/#q=postgres+upgrade+from+9.1+to+9.3
Philᵀᴹ
Eu não sou um DBA em si (tenho que cuidar da instalação estranha do Postgres e ainda mais estranho do mysql;}), e este post é antigo, mas por que você usaria qualquer versão do Ubuntu X.10 para prod em vez de um X.04 LTS?
21417

Respostas:

28

Existem basicamente três maneiras de atualizar o PostgreSQL de diferentes versões principais (por exemplo, 9.1 a 9.3).

Fazendo upgrade com pg_dump

O primeiro, e recomendado se possível, é fazer um dump da versão antiga (9.1) usando o binário da versão mais recente (9.3) e restaurá-lo em um novo cluster criado para a versão mais recente.

Essa abordagem é, geralmente, a mais lenta, mas também a mais viável. Uma dica para torná-lo mais rápido é usar simultaneidade. Para despejar com trabalhos paralelos, você pode:

$ pg_dump --format=directory --jobs=4 --no-synchronized-snapshots --file=/path/to/mydump mydatabase

Você precisará fazer isso para cada banco de dados que tiver, ajustar o --jobs=4valor para qualquer valor (teste alguns valores de 2 a número de núcleos e veja qual dá melhor velocidade). Além disso, durante esta fase, ninguém deve estar conectado ao banco de dados, qualquer modificação resultará em um dump corrompido (devido à opção não segura --no-synchronized-snapshots).

Depois disso, você pode restaurar o despejo na nova instância usando pg_restore:

$ createdb <options> -T template0 mydatabase
$ pg_restore --exit-on-error --jobs=4 --dbname=mydatabase /path/to/mydump

Depois disso, é recomendável executar ANALYZEno seu banco de dados:

$ vacuumdb --analyze-only mydatabase

(se você puder pagar o tempo, execute apenas --analyzetambém VACUUMo banco de dados e atualize os mapas de visibilidade)

Atualizando com pg_upgrade

Outra opção, é usar o contribpg_upgrade . Usando o --linkmétodo, ele fornece uma maneira muito rápida de atualizar o PostgreSQL.

Antes de usar, é necessário fazer um backup de todo o diretório de dados, pois, no --linkmodo, se algo der errado, você poderá perder os dados (novos e antigos). Além disso, leia todos os documentos e especialmente as notas na parte inferior (existem algumas limitações para pg_upgrade).

ATUALIZAÇÃO: Por favor, use a --checkopção antes de executar o comando definitivo. Além disso, para bancos de dados grandes, é recomendável executar este comando em uma sessão de tela.

Atualizar usando uma ferramenta de replicação baseada em gatilho

Outra opção para atualizar uma versão é usar uma ferramenta de replicação baseada no gatilho. Como Slony, Bucardo e Londiste.

Essa é a opção que requer o menor tempo de inatividade possível, mas é a mais difícil de se trabalhar.

Para fazer isso, você precisa construir um master-slave onde o master é sua versão atual (9.1) e o slave é a nova versão (9.3). Então, espere a primeira sincronização (com o sistema ainda em produção), depois feche todos os usuários conectados ao banco de dados (o tempo de inatividade começa aqui), aguarde o escravo recuperar o atraso, promova-o (o escravo) para dominar e redirecione todos os clientes / aplicativos para esta nova versão. E você terminou.

A documentação do Slony fornece um passo a passo para atualizar o PostgreSQL usando o Slony .

Qual escolher

Bem, como sempre depende, continuando:

  • O dump + restore é o mais confiável, mas geralmente o mais lento (o paralelismo pode dar bons resultados)
  • O pg_upgrade é uma das melhores opções para pouco tempo de inatividade (se você pode usar, veja as limitações), geralmente leva apenas alguns minutos, mesmo para grandes bancos de dados
  • A replicação do gatilho é, sem dúvida, a que oferece o menor tempo de inatividade possível (quase zero), mas é realmente difícil de alcançar e eu recomendo apenas para pessoas experientes (no PostgreSQL e na ferramenta de replicação).

Espero poder ajudar. Boa sorte.

MatheusOl
fonte
O pg_upgrade também funciona das 8.4.17 às 9.3?
31414 JohnMerlino
@JohnMerlino: sim, o pg_upgrade pode atualizar da versão 8.3 ou superior (inclui 8.3, 8.4, 9.0, 9.1, 9.2, ...).
MatheusOl
"usar o binário da versão mais recente (9.3)" pode não ser tão necessário. Eu pelo menos consegui que funcionasse sem fazer isso.
21417 theicfire
@theicfire na verdade depende de ambas as versões (antiga e nova), pode ou não funcionar. Na verdade, ele funcionará na maioria dos casos, exceto por algumas mensagens de erro que geralmente podem ser usadas ... O procedimento oficial é usar o binário da versão mais recente!
MatheusOl
Você pode usar pg_dumpallpara despejar todos os bancos de dados de uma só vez.
Matthieu
7

Siga estas etapas para atualizar o postgres 9.1 para 9.3:

  1. Primeiro, crie um arquivo /etc/apt/sources.list.d/pgdg.list com o seguinte conteúdo para o ubuntu:

    deb http://apt.postgresql.org/pub/repos/apt/ saucy-pgdg main 
  2. Adicione a chave executando a seguir:

     wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
  3. Instale ferramentas de desenvolvedor com o postgres:

    sudo apt-get install postgresql-9.3 postgresql-contrib-9.3 postgresql-server-dev-9.3 pgadmin3
  4. Para confirmar nossa instalação, digitaremos “sudo pg_lsclusters” e veremos nossas duas versões do PostgreSQL em execução.

  5. Pare o serviço Postgressql:

    sudo service postgresql stop
  6. Exclua o cluster 9.3 padrão criado pela instalação 9.3.

    sudo pg_dropcluster --stop 9.3 main
  7. Crie um novo cluster 9.3 a partir do cluster 9.1 existente.

    sudo pg_upgradecluster 9.1 main
  8. Confirme se o novo cluster é carregado e estamos executando o PostgreSQL 9.3.

    sudo service postgresql start 9.3
  9. Se tudo funcionar cair para o cluster 9.1.

    pg_dropcluster --stop 9.1 main

para mais informações consulte este link

Snehal Parmar
fonte