Como atualizar o PostgreSQL da versão 9.6 para a versão 10.1 sem perder dados?


207

Estou usando o banco de dados PostgreSQL para meu aplicativo Ruby on Rails (no Mac OS X 10.9).

Existem instruções detalhadas sobre como atualizar o banco de dados PostgreSQL?

Receio destruir os dados no banco de dados ou estragar tudo.


8
Faça backups em qualquer caso.
Patrick Oscity

Respostas:


402

Supondo que você tenha usado o home-brew para instalar e atualizar o Postgres, você pode executar as seguintes etapas.

  1. Pare o servidor Postgres atual:

    launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

  2. Inicialize um novo banco de dados 10.1:

    initdb /usr/local/var/postgres10.1 -E utf8

  3. execute pg_upgrade (nota: altere a versão do compartimento se estiver atualizando de algo diferente do que abaixo) :

    pg_upgrade -v \
        -d /usr/local/var/postgres \
        -D /usr/local/var/postgres10.1 \
        -b /usr/local/Cellar/postgresql/9.6.5/bin/ \
        -B /usr/local/Cellar/postgresql/10.1/bin/

    -v para habilitar o log interno detalhado

    -d o antigo diretório de configuração do cluster de banco de dados

    -D o novo diretório de configuração do cluster de banco de dados

    -b o antigo diretório executável do PostgreSQL

    -B o novo diretório executável do PostgreSQL

  4. Mova novos dados para o local:

    cd /usr/local/var
    mv postgres postgres9.6
    mv postgres10.1 postgres
  5. Reinicie o Postgres:

    launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

  6. Verifique os /usr/local/var/postgres/server.logdetalhes e verifique se o novo servidor foi iniciado corretamente.

  7. Por fim, reinstale a pggema de trilhos

    gem uninstall pg
    gem install pg

Sugiro que você reserve um tempo para ler a documentação do PostgreSQL para entender exatamente o que está fazendo nas etapas acima para minimizar frustrações.


8
Eu tinha que usar o seguinte comando para inicializar o banco de dados:initdb /usr/local/var/postgres9.4 -E utf8 --lc-collate=C --lc-ctype=utf-8 --lc-monetary=C --lc-numeric=C
sunsations

Siga o seu guia passo a passo. E tudo funcionou! Muito obrigado.
Trantor Liu

3
Tenha cuidado com o delete_old_cluster.shcomando. Primeiro, excluí manualmente os diretórios /usr/local/postgres9.3, depois executei este comando e parece que perdi todo o diretório / usr / local / var / postgres (consegui restaurá-lo no Time Machine)
peter_v

1
Se você estiver usando o Bundler, remova a gem usando, gem uninstall pgmas deixe o bundler reinstalar a versão correta do Gemfile.lock simplesmente executando bundle.
Danielricecodes

1
Atualização secundária: brewagora também tem a opção de usar brew services stop postgresqle, em brew services start postgresqlvez de chamar diretamente launchctl unloade launchctl load.
florish

59

Apesar de todas as respostas acima, aqui estão meus 5 centavos.

Funciona em qualquer sistema operacional e a partir de qualquer versão do postgres.

  • Pare qualquer instância do postgres em execução;
  • Instale a nova versão e inicie-a; Verifique se você pode se conectar à nova versão também;
  • Alterar versão antiga postgresql.conf-> portde 5432para 5433;
  • Inicie a versão antiga da instância do postgres;
  • Abra um terminal e cdpara a nova binpasta da versão ;
  • Corre pg_dumpall -p 5433 -U <username> | psql -p 5432 -U <username>
  • Pare o postgres antigo executando a instância;

4
Obrigado Christian, esta é definitivamente uma solução ótima e fácil, fui com sucesso de 9.3 para 9.5 como este
fnicollet

3
Funcionou perfeitamente para a atualização da versão 9.1 para a versão 9.5 em um servidor Windows 2012.
Rolf

4
Um problema desta solução é que, se você alterou alguns arquivos de configuração do Postgres (por exemplo, postgresql.confou pg_hba.conf), seria necessário replicar manualmente essas alterações na nova instalação. Em vez disso, se você usar pg_upgradecluster, os arquivos de configuração
serão

1
Observe que logo após iniciar o comando, você receberá uma solicitação de senha, mas precisará digitar 2 senhas uma a uma, confirmando cada uma com Enter. Ou você terápg_dumpall: could not connect to database "XXX": fe_sendauth: no password supplied
Lu55 3/17

2
Tecnicamente isso não vai funcionar para qualquer-a-qualquer versão, apenas para versões de origem iguais ou superiores a 7.0, como os estados manuais:Current releases of the dump programs can read data from any server version back to 7.0.
Mark Tielemans

56

Aqui está a solução para usuários do Ubuntu

Primeiro temos que parar o postgresql

sudo /etc/init.d/postgresql stop

Crie um novo arquivo chamado /etc/apt/sources.list.d/pgdg.list e adicione a linha abaixo

deb http://apt.postgresql.org/pub/repos/apt/ utopic-pgdg main

Siga os comandos abaixo

wget -q -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt-get update
sudo apt-get install postgresql-9.4
sudo pg_dropcluster --stop 9.4 main 
sudo /etc/init.d/postgresql start

Agora temos tudo, basta atualizá-lo como abaixo

sudo pg_upgradecluster 9.3 main
sudo pg_dropcluster 9.3 main

É isso aí. O cluster mais atualizado será executado na porta número 5433. Verifique com o comando abaixo

sudo pg_lsclusters

2
A penúltima frase em que você diz "O cluster mais atualizado será executado na porta número 5433" provavelmente deve dizer "O cluster 9.3 estará em execução na porta número 5433 para que você possa reverter, se necessário".
Andrew Thaddeus Martin

3
Nota: para o Ubuntu 14.04 uso "fiel-pgdb" em vez de utópico-pgdb
Johnny

3
Observe que isso NÃO faz uma atualização no local. é, portanto, completamente inútil para meu DB de 700 GB em um volume de 1 TB.
Fake Name

16

Atualização : esse processo é o mesmo para atualizar 9.5 a pelo menos 11.5; simplesmente modifique os comandos para refletir as versões 9.6e 10, onde 9.6está a versão antiga e 10a nova versão. Certifique-se de ajustar também os diretórios "antigo" e "novo".


Acabei de atualizar o PostgreSQL 9.5 para 9.6 no Ubuntu e pensei em compartilhar minhas descobertas, pois há algumas nuances específicas de SO / pacote que você deve conhecer.

( Eu não queria despejar e restaurar dados manualmente , portanto, várias das outras respostas aqui não eram viáveis.)

Em resumo, o processo consiste em instalar a nova versão do PostgreSQL ao lado da versão antiga (por exemplo, 9.5 e 9.6) e depois executar o pg_upgradebinário, o que é explicado em (alguns) detalhes em https://www.postgresql.org/ docs / 9.6 / static / pgupgrade.html .

O único aspecto "complicado" pg_upgradeé que a falha em passar o valor correto para um argumento ou a falha no logon como o usuário correto oucd no local correto antes da execução de um comando podem levar a mensagens de erro enigmáticas.

No Ubuntu (e provavelmente no Debian), desde que você esteja usando o repositório "oficial", deb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg main e não alterando os caminhos padrão do sistema de arquivos ou as opções de tempo de execução, o procedimento a seguir deve fazer o trabalho.

Instale a nova versão (observe que especificamos 9.6explicitamente):

sudo apt install postgresql-9.6

Depois que a instalação for bem-sucedida, as duas versões serão executadas lado a lado, mas em portas diferentes. A saída da instalação menciona isso, na parte inferior, mas é fácil ignorar:

Creating new cluster 9.6/main ...
  config /etc/postgresql/9.6/main
  data   /var/lib/postgresql/9.6/main
  locale en_US.UTF-8
  socket /var/run/postgresql
  port   5433

Pare as duas instâncias do servidor (isso irá parar as duas ao mesmo tempo):

sudo systemctl stop postgresql

Alterne para o usuário dedicado do sistema PostgreSQL:

su postgres

Mova-se para o diretório pessoal (a falha ao fazer isso causará erros):

cd ~

pg_upgrade requer as seguintes entradas ( pg_upgrade --helpnos diz isso):

When you run pg_upgrade, you must provide the following information:
  the data directory for the old cluster  (-d DATADIR)
  the data directory for the new cluster  (-D DATADIR)
  the "bin" directory for the old version (-b BINDIR)
  the "bin" directory for the new version (-B BINDIR)

Essas entradas podem ser especificadas com "nomes longos", para facilitar a visualização:

  -b, --old-bindir=BINDIR       old cluster executable directory
  -B, --new-bindir=BINDIR       new cluster executable directory
  -d, --old-datadir=DATADIR     old cluster data directory
  -D, --new-datadir=DATADIR     new cluster data directory

Também devemos passar o --new-optionscomutador, porque a falha ao fazer isso resulta no seguinte:

connection to database failed: could not connect to server: No such file or directory
        Is the server running locally and accepting
        connections on Unix domain socket "/var/lib/postgresql/.s.PGSQL.50432"?

Isso ocorre porque as opções de configuração padrão são aplicadas na ausência dessa opção, o que resulta no uso de opções de conexão incorretas, daí o erro do soquete.

Execute o pg_upgradecomando da nova versão do PostgreSQL:

/usr/lib/postgresql/9.6/bin/pg_upgrade --old-bindir=/usr/lib/postgresql/9.5/bin --new-bindir=/usr/lib/postgresql/9.6/bin --old-datadir=/var/lib/postgresql/9.5/main --new-datadir=/var/lib/postgresql/9.6/main --old-options=-cconfig_file=/etc/postgresql/9.5/main/postgresql.conf --new-options=-cconfig_file=/etc/postgresql/9.6/main/postgresql.conf

Logout da conta de usuário do sistema dedicada:

exit

A atualização está concluída agora, mas a nova instância será vinculada à porta 5433(o padrão padrão é5432 ), portanto, lembre-se disso se tentar testar a nova instância antes de "cortá-la".

Inicie o servidor normalmente (novamente, isso iniciará as instâncias antiga e nova):

systemctl start postgresql

Se você deseja tornar a nova versão o padrão, será necessário editar o arquivo de configuração efetivo, por exemplo /etc/postgresql/9.6/main/postgresql.conf, e garantir que a porta esteja definida da seguinte maneira:

port = 5432

Se você fizer isso, altere o número da porta da versão antiga para 5433ao mesmo tempo (antes de iniciar os serviços) ou simplesmente remova a versão antiga (isso não removerá o conteúdo real do banco de dados; você precisaria usá-lo apt --purge remove postgresql-9.5para que isso acontecesse ):

apt remove postgresql-9.5

O comando acima interromperá todas as instâncias, portanto, você precisará iniciar a nova instância uma última vez com:

systemctl start postgresql

Como observação final, não se esqueça de considerar pg_upgradeos bons conselhos:

Upgrade Complete
----------------
Optimizer statistics are not transferred by pg_upgrade so,
once you start the new server, consider running:
    ./analyze_new_cluster.sh

Running this script will delete the old cluster's data files:
    ./delete_old_cluster.sh

1
Para mim no Mac Yosemite, PostgreSQL 9.2 -> 9.5: sudo su postgres, mudar tudo MÉTODO em pg_hba.conf tanto de instalação para a confiança antes pg_upgrade, correndo pg_upgrade in / / tmp privado não ~ não funcionou, então sudo mkdir /foobarcom chmod 777 /foobare ele correu lá. Por fim, o comando pg_upgrade:/Library/PostgreSQL/9.5/bin/pg_upgrade -b /Library/PostgreSQL/9.2/bin -B /Library/PostgreSQL/9.5/bin -d /Library/PostgreSQL/9.2/data -D /Library/PostgreSQL/9.5/data -o -cconfig_file=/Library/PostgreSQL/9.2/data/postgresql.conf -O -cconfig_file=/Library/PostgreSQL/9.5/data/postgresql.conf
Jarno Argillander 5/17/17

1
Eu era capaz de atualizar com sucesso de 9.5 para 11.5 e tinha que adicionar repositórios apt do postgres no ubuntu. e depois é só seguir esses passos: tecadmin.net/install-postgresql-server-on-ubuntu
shakee93

14

Se você estiver usando os serviços homebrew e homebrew, provavelmente poderá fazer:

brew services stop postgresql
brew upgrade postgresql
brew postgresql-upgrade-database
brew services start postgresql

Eu acho que isso pode não funcionar completamente se você estiver usando recursos avançados do postgres, mas funcionou perfeitamente para mim.


1
Funcionou perfeitamente no macOS Mojave 10.14.2 - Obrigado!
8bithero

13

O manual do usuário aborda esse tópico em profundidade. Você pode:

  • pg_upgradeno lugar; ou

  • pg_dumpe pg_restore.

Em caso de dúvida, faça-o com lixões. Não exclua o diretório de dados antigo, apenas mantenha-o no caso de algo dar errado / você cometer um erro; Dessa forma, você pode voltar à sua instalação 9.3 inalterada.

Para detalhes, consulte o manual.

Se você estiver preso, poste uma pergunta detalhada explicando como está preso, onde e o que você tentou primeiro. Depende um pouco de como você instalou o PostgreSQL também, pois existem várias "distribuições" diferentes do PostgreSQL para OS X (infelizmente). Então, você precisará fornecer essas informações.


8

De pé sobre os ombros das outras pobres criaturas que pisavam nessa lama, pude seguir estas etapas para voltar a funcionar depois de uma atualização para Yosemite:

Supondo que você tenha usado o home-brew para instalar e atualizar o Postgres, você pode executar as seguintes etapas.

  1. Pare o servidor Postgres atual:

    launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

  2. Inicialize um novo banco de dados 9.4:

    initdb /usr/local/var/postgres9.4 -E utf8

  3. Instale o postgres 9.3 (como ele não estava mais presente na minha máquina):

    brew install homebrew/versions/postgresql93

  4. Adicione diretórios removidos durante a atualização do Yosemite:

    mkdir -p /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat_tmp}/touch /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat_tmp}/.keep

  5. executar pg_upgrade:

    pg_upgrade -v -d /usr/local/var/postgres -D /usr/local/var/postgres9.4 -b /usr/local/Cellar/postgresql93/9.3.5/bin/ -B /usr/local/Cellar/postgresql/9.4.0/bin/

  6. Mova novos dados para o local:

    cd /usr/local/var
    mv postgres postgres9.3
    mv postgres9.4 postgres
  7. Reinicie o Postgres:

    launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

  8. Verifique os /usr/local/var/postgres/server.logdetalhes e verifique se o novo servidor foi iniciado corretamente.

  9. Por fim, reinstale as bibliotecas relacionadas?

    pip install --upgrade psycopg2
    gem uninstall pg
    gem install pg

1
pg_upgrade -v -d / usr / local / var / postgres -D /usr/local/var/postgres9.4 -b /usr/local/Cellar/postgresql93/9.3.*/bin/ -B / usr / local / Cellar /postgresql/9.4.*/bin/ # Versões secundárias podem ser diferentes.
Aaron McMillin

1
Obrigado por isso. Eu executei acidentalmente brew cleanupantes da migração de dados e isso causou a desinstalação do postgres9.3. Isso ajudou. :)
markquezada

5

Parece que a solução foi incorporada ao Homebrew agora:

$ brew info postgresql
...
==> Caveats
To migrate existing data from a previous major version of PostgreSQL run:
  brew postgresql-upgrade-database
....

1

Isso fez por mim.

https://gist.github.com/dideler/60c9ce184198666e5ab4

Curto e direto ao ponto. Sinceramente, não pretendo entender as entranhas do PostgreSQL, quero fazer as coisas.


1
Isso usa a ferramenta pg_upgradecluster do Ubuntu, que pode ser muito mais lenta que a ferramenta pg_upgrade do PostgreSQL e, é claro, está disponível apenas no Ubuntu.
Alfonx

@alfonx Não é verdade. Eu tenho isso no meu Debian jessie. Tinha mais de 10 bancos de dados e uma quantidade de ~ 400 MB de dados do banco de dados foi convertida em um piscar de olhos. Então, novamente, eu estou usando um Debian virtual em um SSD.
Dimitrevp

Deixe-me me corrigir: pg_upgradecluster faz parte da "infra-estrutura Debian PostgreSQL", disponível apenas nas distribuições baseadas no Debian. Sobre os pg_upgrade velocidade oferece a opção "--link", que Não Vinculação de cópia de dados sempre que possível: postgresql.org/docs/9.4/static/pgupgrade.html
alfonx

1
Talvez pretendamos resultados diferentes. Após uma atualização de software em toda a distribuição, terminei com a versão 2 do PostgreSQL e os dados que meus projetos usavam ficaram presos na versão mais antiga (9.3). Então, eu apenas procurei o link acima (na minha resposta) e o atualizei, me livrei do "cluster" antigo e da versão mais antiga do PG.
dimitarvp

Tentei atualizar do 9.4 para o 11, pg_upgradecluster 9.4 mainmas recebo o erro Erro: specified cluster does not exist... Acho que preciso instalar o postgresql-9.4 novamente primeiro com este guia: wiki.postgresql.org/wiki/Apt#Quickstart
rubo77

1

No Windows, eu continuava enfrentando diferentes mensagens de erro ao tentar usar pg_upgrade.

Economizou muito tempo para eu apenas:

  1. Banco de dados de backup
  2. Desinstale todas as cópias do PostgreSQL
  3. Instalar 9.5
  4. Restaurar banco de dados

Fiz isso de 9,5 a 9,6 e funcionou perfeitamente também. É bom poder fazer atualização exata fácil também, em vez de "mais recente". Usei o Big SQL para obter o instalador correto ( openscg.com/bigsql/postgresql/installers.jsp ).
A Coder

0

Minha solução foi fazer uma combinação desses dois recursos:

https://gist.github.com/tamoyal/2ea1fcdf99c819b4e07d

e

http://www.gab.lc/articles/migration_postgresql_9-3_to_9-4

O segundo um ajudou mais , em seguida, o primeiro. Além disso, não siga as etapas como estão, pois algumas não são necessárias. Além disso, se você não conseguir fazer backup dos dados via console do postgres, poderá usar uma abordagem alternativa e fazer backup deles com o pgAdmin 3 ou algum outro programa, como fiz no meu caso.

Além disso, o link: https://help.ubuntu.com/stable/serverguide/postgresql.html Ajudou a definir a senha criptografada e definir o md5 para autenticar o usuário do postgres.

Depois de tudo feito, para verificar a serverversão do postgres, execute o terminal:

sudo -u postgres psql postgres

Após digitar a senha, execute no terminal postgres:

SHOW SERVER_VERSION;

Ele produzirá algo como:

 server_version 
----------------
 9.4.5

Para definir e iniciar o postgres, usei o comando:

> sudo bash # root
> su postgres # postgres

> /etc/init.d/postgresql start
> /etc/init.d/postgresql stop

E, em seguida, para restaurar o banco de dados de um arquivo:

> psql -f /home/ubuntu_username/Backup_93.sql postgres

Ou, se não funcionar, tente com este:

> pg_restore --verbose --clean --no-acl --no-owner -h localhost -U postgres -d name_of_database ~/your_file.dump

E se você estiver usando Rails, faça um bundle exec rake db:migrateapós puxar o código :)


0

Para Mac via homebrew:

brew tap petere/postgresql,

brew install <formula>(por exemplo brew install petere/postgresql/postgresql-9.6:)

Remova Postgres antigos:

brew unlink postgresql

brew link -f postgresql-9.6

Se ocorrer algum erro, não se esqueça de ler e seguir as instruções de preparação em cada etapa.

Verifique isso para mais: https://github.com/petere/homebrew-postgresql


0

No Windows 10 desde que eu tinha o npm, instalei o pacote rimraf. npm install rimraf -g

Faça backup de todos os seus bancos de dados um por um usando o comando pg_dump -U $username --format=c --file=$mydatabase.sqlc $dbname

Em seguida, instalei a versão mais recente do PostgreSQL, isto é, a 11.2, que me levou a usar a porta 5433 neste momento.

Seguido por Desinstalação de versões mais antigas do PostgreSQL, a mina era 10. Observe que o desinstalador pode dar um aviso de não excluir a pasta C:\PostgreSQL\10\data. É por isso que temos o próximo passo usando o rimraf para excluir permanentemente a pasta e suas subpastas.

mude para o diretório de instalação do PostgreSQL e execute o comando rimraf 10. 10 é um nome de diretório. Nota: use sua versão mais antiga do PostgreSQL, isto é, 9.5 ou algo assim.

Agora adicione C:\PostgreSQL\pg11\bin, C:\PostgreSQL\pg11\libnas variáveis ​​ambientais do Windows. Observe que minha nova versão instalada é 11, portanto, por que estou usando pg11.

Navegue para, em C:\PostgreSQL\data\pg11seguida, abra a postgresql.confedição port = 5433paraport = 5432

É isso aí. Abra cmd e digitepsql -U postgres

Agora você pode restaurar todos os seus bancos de dados de backup um por um usando o comando pg_restore -U $username --dbname=$databasename $filename


0

Minha solução para atualizar do Postgresql 11 para o Postgresql 12 no Windows 10 é a seguinte.

Como primeira observação, você deverá poder parar e iniciar o serviço Postgresql. Você pode fazer isso seguindo os seguintes comandos no Powershell.

Começar: pg_ctl start -D “d:\postgresql\11\data”

Pare: pg_ctl stop -D “d:\postgresql\11\data”

Estado: pg_ctl status -D “d:\postgresql\11\data”

Seria sensato fazer um backup antes de fazer a atualização. A instância do Postgresql 11 deve estar em execução. Então, para copiar os globais

pg_dumpall -U postgres -g -f d:\bakup\postgresql\11\globals.sql

e depois para cada banco de dados

pg_dump -U postgres -Fc <database> > d:\backup\postgresql\11\<database>.fc

ou

pg_dump -U postgres -Fc -d <database> -f d:\backup\postgresql\11\<database>.fc

Se ainda não estiver pronto, instale o Postgresql 12 (como o Postgresql 11 também está instalado, isso estará na porta 5433)

Em seguida, faça a atualização da seguinte maneira:

1) Interrompa o serviço Postgresql 11 (veja acima)

2) Edite o postgresql.confarquivo d:\postgresql\12\datae mude port = 5433paraport = 5432

3) Edite o caminho do ambiente de usuário do Windows ( windows startdigiteenv ) para apontar para Postgresql 12 em vez de Postresql 11

4) Execute a atualização digitando o seguinte comando.

pg_upgrade `
-b c:\program files\postgresql\11\bin `
-B c:\program files\postgresql\12\bin `
-d d:\postgresql\11\data `
-D d:\postgresql\12\data --username=postgres

(No PowerShell, use backtick (ou backquote) `para continuar o comando na próxima linha)

5) e finalmente inicie o novo serviço Postgresql 12

pg_ctl start -D “d:\postgresql\12\data”


-1

Eu acho que esse é o melhor link para sua solução atualizar o postgres para 9.6

https://sandymadaan.wordpress.com/2017/02/21/upgrade-postgresql9-3-9-6-in-ubuntu-retaining-the-databases/
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.