Come aggiornare PostgreSQL dalla versione 9.6 alla versione 10.1 senza perdere dati?


207

Sto usando il database PostgreSQL per la mia applicazione Ruby on Rails (su Mac OS X 10.9).

Ci sono istruzioni dettagliate su come aggiornare il database PostgreSQL?

Temo di distruggere i dati nel database o di rovinarli.


8
Eseguire i backup in ogni caso.
Patrick Oscity,

Risposte:


402

Supponendo che tu abbia usato la birra fatta in casa per installare e aggiornare Postgres, puoi eseguire i seguenti passaggi.

  1. Arresta l'attuale server Postgres:

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

  2. Inizializza un nuovo database 10.1:

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

  3. esegui pg_upgrade (nota: cambia la versione del cestino se esegui l' aggiornamento da qualcosa di diverso da quello di seguito) :

    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 per abilitare la registrazione interna dettagliata

    -d la vecchia directory di configurazione del cluster di database

    -D la nuova directory di configurazione del cluster di database

    -b la vecchia directory eseguibile PostgreSQL

    -B la nuova directory eseguibile PostgreSQL

  4. Sposta nuovi dati in posizione:

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

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

  6. Verificare i /usr/local/var/postgres/server.logdettagli e assicurarsi che il nuovo server sia stato avviato correttamente.

  7. Infine, reinstalla la pggemma delle rotaie

    gem uninstall pg
    gem install pg

Ti suggerisco di dedicare del tempo a leggere la documentazione di PostgreSQL per capire esattamente cosa stai facendo nei passaggi precedenti per ridurre al minimo le frustrazioni.


8
Odio usare il seguente comando per inizializzare il database:initdb /usr/local/var/postgres9.4 -E utf8 --lc-collate=C --lc-ctype=utf-8 --lc-monetary=C --lc-numeric=C
sunsations,

Segue la tua guida passo dopo passo. E tutto ha funzionato! Grazie mille.
Trantor Liu,

3
Stai attento con il delete_old_cluster.shcomando. Avevo prima cancellato manualmente le directory /usr/local/postgres9.3, quindi ho eseguito questo comando e sembra che abbia perso l'intera directory / usr / local / var / postgres (sono stato in grado di ripristinarlo da Time Machine)
peter_v

1
Se stai usando Bundler, dovresti rimuovere la gemma usando gem uninstall pgma poi consentire al bundler di reinstallare la versione corretta da Gemfile.lock semplicemente eseguendolo bundle.
danielricecodes

1
Aggiornamento minore: brewora ha anche la possibilità di usare brew services stop postgresqle brew services start postgresqlinvece di chiamare direttamente launchctl unloade launchctl load.
fiorito

59

Nonostante tutte le risposte sopra, ecco i miei 5 centesimi.

Funziona su qualsiasi sistema operativo e da qualsiasi postgres versione.

  • Ferma qualsiasi istanza postgres in esecuzione;
  • Installa la nuova versione e avviala; Verifica se riesci a connetterti anche alla nuova versione;
  • Cambia la vecchia versione postgresql.conf-> portda 5432a 5433;
  • Avviare la vecchia versione dell'istanza postgres;
  • Aprire un terminale e cdnella bincartella della nuova versione ;
  • Correre pg_dumpall -p 5433 -U <username> | psql -p 5432 -U <username>
  • Ferma il vecchio postgres che esegue istanza;

4
Grazie Christian, questa è sicuramente un'ottima soluzione, sono passato con successo dal 9.3 al 9.5 in questo modo
fnicollet,

3
Ha funzionato magnificamente per l'aggiornamento da 9.1 a 9.5 su un server Windows 2012.
Rolf,

4
Un problema di questa soluzione è che se avessi modificato alcuni file di configurazione di Postgres (ad es. postgresql.confO pg_hba.conf), dovrai replicare manualmente tali modifiche nella nuova installazione. Invece, se si utilizza pg_upgradecluster, i file di configurazione vengono copiati nel nuovo cluster: manpages.ubuntu.com/manpages/precise/man8/...
Alphaaa

1
Nota che subito dopo avvierai il comando riceverai una richiesta di password, ma devi inserire 2 password una per una confermando ognuna con Enter. Oppure otterraipg_dumpall: could not connect to database "XXX": fe_sendauth: no password supplied
Lu55,

2
Tecnicamente questo non funzionerà per nessuna versione, solo per le versioni sorgente alla 7.0 o successive, come afferma il manuale:Current releases of the dump programs can read data from any server version back to 7.0.
Mark Tielemans,

56

Ecco la soluzione per gli utenti Ubuntu

Per prima cosa dobbiamo smettere di postgresql

sudo /etc/init.d/postgresql stop

Crea un nuovo file chiamato /etc/apt/sources.list.d/pgdg.list e aggiungi sotto la riga

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

Segui i comandi seguenti

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

Ora abbiamo tutto, basta aggiornarlo come di seguito

sudo pg_upgradecluster 9.3 main
sudo pg_dropcluster 9.3 main

Questo è tutto. Il cluster per lo più aggiornato verrà eseguito sul numero di porta 5433. Verificare con il comando seguente

sudo pg_lsclusters

2
La penultima frase in cui si dice "Il cluster per lo più aggiornato verrà eseguito sul numero di porta 5433" dovrebbe probabilmente dire "Il cluster 9.3 verrà eseguito sul numero di porta 5433 in modo da poter ripristinare se necessario".
Andrew Thaddeus Martin,

3
Nota: per Ubuntu 14.04 usa "trusty-pgdb" invece di utopic-pgdb
Johnny

3
Si noti che questo NON esegue un aggiornamento sul posto. è quindi completamente inutile per il mio DB da 700 GB su un volume da 1 TB.
Nome falso

16

Aggiornamento : questo processo è lo stesso per l'aggiornamento da 9.5 a almeno 11.5; semplicemente modificare i comandi per riflettere le versioni 9.6e 10, dove 9.6è la vecchia versione ed 10è la nuova versione. Assicurati di modificare anche le directory "vecchie" e "nuove" di conseguenza.


Ho appena aggiornato PostgreSQL da 9.5 a 9.6 su Ubuntu e ho pensato di condividere le mie scoperte, dato che ci sono un paio di sfumature specifiche per OS / pacchetto di cui tenere conto.

( Non volevo scaricare e ripristinare i dati manualmente , quindi molte delle altre risposte qui non erano valide.)

In breve, il processo consiste nell'installare la nuova versione di PostgreSQL insieme alla versione precedente (ad es. 9.5 e 9.6) e quindi eseguire il pg_upgradebinario, che è spiegato in (alcuni) dettagli su https://www.postgresql.org/ docs / 9.6 / static / pgupgrade.html .

L'unico aspetto "ingannevole" pg_upgradeè che la mancata trasmissione del valore corretto per un argomento o la mancata registrazione come utente corretto o cdnella posizione corretta prima di eseguire un comando, possono portare a messaggi di errore criptici.

Su Ubuntu (e probabilmente Debian), a condizione che si stia utilizzando il repository "ufficiale" deb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg main, e purché non siano stati modificati i percorsi predefiniti del file system o le opzioni di runtime, la seguente procedura dovrebbe funzionare.

Installa la nuova versione (nota che specifichiamo 9.6esplicitamente):

sudo apt install postgresql-9.6

Al termine dell'installazione, entrambe le versioni verranno eseguite fianco a fianco, ma su porte diverse. L'output dell'installazione menziona questo, in fondo, ma è facile da trascurare:

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

Arresta entrambe le istanze del server (ciò si interromperà contemporaneamente):

sudo systemctl stop postgresql

Passa all'utente di sistema PostgreSQL dedicato:

su postgres

Passa alla sua home directory (in caso contrario si causeranno errori):

cd ~

pg_upgrade richiede i seguenti input ( pg_upgrade --helpci dice questo):

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)

Questi input possono essere specificati con "nomi lunghi", per renderli più facili da visualizzare:

  -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

Dobbiamo anche passare lo --new-optionsswitch, poiché in caso contrario si ottiene quanto segue:

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"?

Ciò si verifica perché in assenza di questa opzione vengono applicate le opzioni di configurazione predefinite, il che comporta l'utilizzo di opzioni di connessione errate, quindi l'errore del socket.

Eseguire il pg_upgradecomando dalla nuova versione di 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

Disconnessione dell'account utente di sistema dedicato:

exit

L'aggiornamento è ora completo, ma la nuova istanza si collegherà alla porta 5433(l'impostazione predefinita è 5432), quindi tienilo a mente se tenti di provare la nuova istanza prima di "tagliare" su di essa.

Avvia il server normalmente (di nuovo, questo avvierà sia la vecchia che la nuova istanza):

systemctl start postgresql

Se si desidera impostare la nuova versione come predefinita, sarà necessario modificare il file di configurazione effettivo, ad es. /etc/postgresql/9.6/main/postgresql.conf, E assicurarsi che la porta sia definita come tale:

port = 5432

In tal caso, modificare contemporaneamente il numero di porta della versione 5433precedente (prima di avviare i servizi) oppure rimuovere semplicemente la versione precedente (ciò non rimuoverà il contenuto del database effettivo; è necessario utilizzarlo apt --purge remove postgresql-9.5affinché ciò accada ):

apt remove postgresql-9.5

Il comando sopra interromperà tutte le istanze, quindi dovrai avviare la nuova istanza un'ultima volta con:

systemctl start postgresql

Come ultimo punto da notare, non dimenticare di considerare pg_upgradei buoni consigli:

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
Per me in Mac Yosemite, PostgreSQL 9.2 -> 9.5: sudo su postgres, cambiare tutto METODO in pg_hba.conf sia di installazione di fiducia prima pg_upgrade, in esecuzione pg_upgrade in / / tmp privato non ~ non ha funzionato così sudo mkdir /foobarcon chmod 777 /foobare corse lì. Finalmente il 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,

1
sono stato in grado di aggiornare con successo dalla 9.5 alla 11.5 ho dovuto aggiungere i repository apt postgres a Ubuntu. e quindi segui questi passaggi: tecadmin.net/install-postgresql-server-on-ubuntu
shakee93

14

Se stai usando i servizi homebrew e homebrew, probabilmente puoi semplicemente fare:

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

Penso che questo potrebbe non funzionare completamente se stai usando le funzionalità avanzate di Postgres, ma ha funzionato perfettamente per me.


1
Ha funzionato perfettamente per macOS Mojave 10.14.2 - Grazie!
8

13

Il manuale dell'utente tratta questo argomento in modo approfondito. Puoi:

  • pg_upgradea posto; o

  • pg_dumpe pg_restore.

In caso di dubbio, fallo con le discariche. Non cancellare la vecchia directory dei dati, conservala nel caso qualcosa vada storto / commetti un errore; in questo modo puoi semplicemente tornare alla tua installazione 9.3 invariata.

Per i dettagli, consultare il manuale.

Se sei bloccato, pubblica una domanda dettagliata che spiega come sei bloccato, dove e cosa hai provato per primo. Dipende un po 'anche da come hai installato PostgreSQL, dato che esistono diverse "distribuzioni" di PostgreSQL per OS X (purtroppo). Quindi dovresti fornire tali informazioni.


8

In piedi sulle spalle delle altre povere creature che calpestavano questo letame, sono stato in grado di seguire questi passaggi per tornare su e correre dopo un aggiornamento a Yosemite:

Supponendo che tu abbia usato la birra fatta in casa per installare e aggiornare Postgres, puoi eseguire i seguenti passaggi.

  1. Arresta l'attuale server Postgres:

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

  2. Inizializza un nuovo database 9.4:

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

  3. Installa postgres 9.3 (in quanto non era più presente sul mio computer):

    brew install homebrew/versions/postgresql93

  4. Aggiungi directory rimosse durante l'aggiornamento di 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. correre 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. Sposta nuovi dati in posizione:

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

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

  8. Verificare i /usr/local/var/postgres/server.logdettagli e assicurarsi che il nuovo server sia stato avviato correttamente.

  9. Infine, reinstallare le librerie correlate?

    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/ # Le versioni minori potrebbero essere diverse.
Aaron McMillin il

1
Grazie per questo. Ho eseguito per errore brew cleanupprima della migrazione dei dati e ciò ha causato la disinstallazione di postgres9.3. Questo ha aiutato. :)
markquezada,

5

Sembra che la soluzione sia stata inserita in Homebrew ora:

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

1

Questo è stato per me.

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

Breve e dritto al punto. Onestamente, non intendo capire l'intestino di PostgreSQL, voglio fare cose.


1
Questo utilizza lo strumento pg_upgradecluster di Ubuntu che può essere molto più lento dello strumento pg_upgrade di PostgreSQL e ovviamente è disponibile solo su Ubuntu.
Alfonso

@alfonx Non è vero. Ce l'ho sul mio Debian jessie. Aveva oltre 10 DB e una quantità di ~ 400 MB di dati del database è stata convertita in un batter d'occhio. Poi di nuovo, sto usando un Debian virtuale su un SSD.
dimitarvp,

Consentitemi di correggermi: pg_upgradecluster fa parte dell '"infrastruttura Debian PostgreSQL", quindi disponibile solo su distribuzioni basate su Debian. Informazioni sulla velocità pg_upgrade offre l'opzione "--link", che collega non copiando i dati ove possibile: postgresql.org/docs/9.4/static/pgupgrade.html
alfonx

1
Forse puntiamo a risultati diversi. Dopo un aggiornamento del software in tutta la distribuzione, ho finito con 2 versioni di PostgreSQL e i dati utilizzati dai miei progetti erano bloccati sulla versione precedente (9.3). Quindi ho appena cercato il link sopra (nella mia risposta) e l'ho aggiornato, mi sono sbarazzato del vecchio "cluster" e della versione PG precedente.
dimitarvp,

Ho provato ad aggiornare da 9.4 a 11 con pg_upgradecluster 9.4 mainma ricevo l'errore Errore: specified cluster does not exist... Immagino, devo installare di nuovo postgresql-9.4 prima con questa guida: wiki.postgresql.org/wiki/Apt#Quickstart
rubo77

1

Su Windows ho continuato ad affrontare diversi messaggi di errore durante il tentativo di utilizzo pg_upgrade.

Ho risparmiato un sacco di tempo per me solo a:

  1. DB di backup
  2. Disinstallare tutte le copie di PostgreSQL
  3. Installa 9.5
  4. Ripristina DB

Ha fatto questo per 9.5 a 9.6 e ha funzionato perfettamente. Buono per essere in grado di fare anche un facile aggiornamento esatto, piuttosto che "più recente". Ho usato Big SQL per ottenere il programma di installazione giusto ( openscg.com/bigsql/postgresql/installers.jsp ).
The Coder,

0

La mia soluzione era quella di fare una combinazione di queste due risorse:

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

e

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

Il secondo uno ha aiutato di più , allora il primo. Inoltre, non seguire i passaggi in quanto alcuni non sono necessari. Inoltre, se non si è in grado di eseguire il backup dei dati tramite la console di Postgres, è possibile utilizzare un approccio alternativo e eseguirne il backup con pgAdmin 3 o altri programmi, come ho fatto nel mio caso.

Inoltre, il link: https://help.ubuntu.com/stable/serverguide/postgresql.html Ha aiutato a impostare la password crittografata e impostare md5 per l'autenticazione dell'utente di Postgres.

Dopo tutto, per verificare la serverversione di postgres eseguita nel terminale:

sudo -u postgres psql postgres

Dopo aver inserito la password, esegui nel terminale Postgres:

SHOW SERVER_VERSION;

Produrrà qualcosa del tipo:

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

Per impostare e avviare Postgres ho usato il comando:

> sudo bash # root
> su postgres # postgres

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

E poi per ripristinare il database da un file:

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

O se non funziona prova con questo:

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

E se stai usando Rails fai un bundle exec rake db:migratedopo aver tirato il codice :)


0

Per Mac tramite homebrew:

brew tap petere/postgresql,

brew install <formula>(ad es . brew install petere/postgresql/postgresql-9.6:)

Rimuovi vecchi Postgres:

brew unlink postgresql

brew link -f postgresql-9.6

Se si verifica un errore, non dimenticare di leggere e seguire le istruzioni per la preparazione in ogni passaggio.

Dai un'occhiata qui: https://github.com/petere/homebrew-postgresql


0

Su Windows 10 da quando avevo npm, ho installato il pacchetto rimraf. npm install rimraf -g

Eseguire il backup di tutti i database uno per uno utilizzando il comando pg_dump -U $username --format=c --file=$mydatabase.sqlc $dbname

Quindi ho installato l'ultima versione PostgreSQL, ovvero 11.2, che mi ha spinto a utilizzare la porta 5433 questa volta.

Seguito da Disinstallazione delle versioni precedenti di PostgreSQL miniera era 10. Si noti che il programma di disinstallazione potrebbe dare un avviso di non eliminare la cartella C:\PostgreSQL\10\data. Ecco perché abbiamo il passaggio successivo utilizzando rimraf per eliminare definitivamente la cartella e le sue sottocartelle.

passare alla directory di installazione di PostgreSQL ed eseguire il comando rimraf 10. 10 è un nome di directory. Nota: usa la tua versione precedente di PostgreSQL, ovvero 9.5 o qualcosa del genere.

Ora aggiungi C:\PostgreSQL\pg11\bin, C:\PostgreSQL\pg11\lible variabili ambientali di Windows. Nota che la mia nuova versione installata è 11, quindi perché sto usando pg11.

Passare a C:\PostgreSQL\data\pg11quindi aprire postgresql.confmodifica port = 5433aport = 5432

Questo è tutto. Apri cmd e digitapsql -U postgres

Ora puoi ripristinare tutti i tuoi database di backup uno per uno usando il comando pg_restore -U $username --dbname=$databasename $filename


0

La mia soluzione per l'aggiornamento da Postgresql 11 a Postgresql 12 su Windows 10 è la seguente.

Come prima osservazione dovrai essere in grado di interrompere e avviare il servizio Postgresql. Puoi farlo con i seguenti comandi in Powershell.

Inizio: pg_ctl start -D “d:\postgresql\11\data”

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

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

Sarebbe saggio fare un backup prima di eseguire l'aggiornamento. L'istanza Postgresql 11 deve essere in esecuzione. Quindi copiare i globali

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

e quindi per ciascun database

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

o

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

Se non è già stato installato, installare Postgresql 12 (poiché anche Postgresql 11 è installato, questo sarà sulla porta 5433)

Quindi eseguire l'aggiornamento come segue:

1) Interrompere il servizio Postgresql 11 (vedere sopra)

2) Modifica il postgresql.conffile in d:\postgresql\12\datae cambia port = 5433inport = 5432

3) Modifica il percorso dell'ambiente utente di Windows ( windows startquindi digita env) per puntare a Postgresql 12 anziché a Postresql 11

4) Eseguire l'aggiornamento immettendo il seguente 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

(In PowerShell usare backtick (o backquote) `per continuare il comando sulla riga successiva)

5) e infine avviare il nuovo servizio Postgresql 12

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


-1

Penso che questo sia il miglior collegamento per la tua soluzione per aggiornare Postgres alla 9.6

https://sandymadaan.wordpress.com/2017/02/21/upgrade-postgresql9-3-9-6-in-ubuntu-retaining-the-databases/
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.