¿Cómo actualizar PostgreSQL de la versión 9.6 a la versión 10.1 sin perder datos?

207

Estoy usando la base de datos PostgreSQL para mi aplicación Ruby on Rails (en Mac OS X 10.9).

¿Hay instrucciones detalladas sobre cómo actualizar la base de datos PostgreSQL?

Me temo que destruiré los datos en la base de datos o los estropearé.

usuario3675188
fuente
8
Hacer copias de seguridad en cualquier caso.
Patrick Oscity

Respuestas:

402

Suponiendo que ha utilizado home-brew para instalar y actualizar Postgres, puede realizar los siguientes pasos.

  1. Detener el servidor actual de Postgres:

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

  2. Inicialice una nueva base de datos 10.1:

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

  3. ejecutar pg_upgrade (nota: cambie la versión de bin si está actualizando desde algo diferente a lo siguiente) :

    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 el registro interno detallado

    -d el antiguo directorio de configuración del clúster de base de datos

    -D el nuevo directorio de configuración del clúster de base de datos

    -b el antiguo directorio ejecutable de PostgreSQL

    -B el nuevo directorio ejecutable de PostgreSQL

  4. Mueva los nuevos datos a su lugar:

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

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

  6. Verifique los /usr/local/var/postgres/server.logdetalles y asegúrese de que el nuevo servidor se inició correctamente.

  7. Finalmente, reinstale la pggema de rieles

    gem uninstall pg
    gem install pg

Le sugiero que se tome un tiempo para leer la documentación de PostgreSQL para comprender exactamente lo que está haciendo en los pasos anteriores para minimizar las frustraciones.

Donovan
fuente
8
I hade utilizar el siguiente comando para inicializar la base de datos:initdb /usr/local/var/postgres9.4 -E utf8 --lc-collate=C --lc-ctype=utf-8 --lc-monetary=C --lc-numeric=C
Sunsations
Sigue a tu guía paso a paso. ¡Y todo funcionó! Muchas gracias.
Trantor Liu
3
Ten cuidado con el delete_old_cluster.shcomando. Primero eliminé manualmente los directorios /usr/local/postgres9.3, luego ejecuté este comando y parece que perdí todo el directorio / usr / local / var / postgres (pude restaurarlo desde Time Machine)
peter_v
1
Si está utilizando Bundler, debe eliminar la gema usando gem uninstall pgpero luego dejar que el reinstalador reinstale la versión correcta de Gemfile.lock simplemente ejecutándolo bundle.
danielricecodes
1
Actualización menor: brewahora también tiene la opción de usar brew services stop postgresqly en brew services start postgresqllugar de llamar directamente launchctl unloady launchctl load.
florish
59

A pesar de todas las respuestas anteriores, aquí van mis 5 centavos.

Funciona en cualquier sistema operativo y desde cualquier versión de postgres.

  • Detenga cualquier instancia de postgres en ejecución;
  • Instale la nueva versión e iníciela; Compruebe si también puede conectarse a la nueva versión;
  • Cambiar versiones antiguas postgresql.conf-> portde 5432a 5433;
  • Inicie la versión anterior de la instancia de postgres;
  • Abra una terminal y cdla bincarpeta de la nueva versión ;
  • correr pg_dumpall -p 5433 -U <username> | psql -p 5432 -U <username>
  • Detener la antigua instancia de postgres en ejecución;
cristiano
fuente
44
Gracias Christian, esta es definitivamente una solución excelente y fácil, pasé con éxito de 9.3 a 9.5 así
fnicollet
3
Funcionó maravillosamente para actualizar de 9.1 a 9.5 en un servidor Windows 2012.
Rolf
44
Un problema de esta solución es que si hubiera cambiado algunos archivos de configuración de Postgres (por ejemplo, postgresql.confo pg_hba.conf) necesitaría replicar manualmente esos cambios en la nueva instalación. En cambio, si lo usa pg_upgradecluster, los archivos de configuración se copian en el nuevo clúster: manpages.ubuntu.com/manpages/precise/man8/…
Alphaaa
1
Tenga en cuenta que justo después de iniciar el comando obtendrá una solicitud de contraseña, pero debe ingresar 2 contraseñas una por una, confirmando cada una con Enter. O obtendráspg_dumpall: could not connect to database "XXX": fe_sendauth: no password supplied
Lu55
2
Técnicamente, esto no funcionará para cualquier versión, solo para versiones de origen en 7.0 o superior, como dice el manual:Current releases of the dump programs can read data from any server version back to 7.0.
Mark Tielemans
56

Aquí está la solución para usuarios de Ubuntu

Primero tenemos que parar postgresql

sudo /etc/init.d/postgresql stop

Cree un nuevo archivo llamado /etc/apt/sources.list.d/pgdg.list y agregue la siguiente línea

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

Siga los siguientes comandos

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

Ahora tenemos todo, solo necesito actualizarlo como se muestra a continuación

sudo pg_upgradecluster 9.3 main
sudo pg_dropcluster 9.3 main

Eso es. El clúster mayormente actualizado se ejecutará en el número de puerto 5433. Verifíquelo con el siguiente comando

sudo pg_lsclusters
pramod
fuente
2
La penúltima oración donde diga "El clúster mayormente actualizado se ejecutará en el número de puerto 5433" probablemente debería decir "El clúster 9.3 se ejecutará en el número de puerto 5433 para que pueda revertirlo si es necesario".
Andrew Thaddeus Martin
3
Nota: Para ubuntu 14.04 use "trusty-pgdb" en lugar de utopic-pgdb
Johnny
3
Tenga en cuenta que esto NO hace una actualización en el lugar. Por lo tanto, es completamente inútil para mi DB de 700 GB en un volumen de 1 TB.
Nombre falso el
16

Actualización : este proceso es el mismo para actualizar 9.5 a través de al menos 11.5; simplemente modificar los comandos para reflejar las versiones 9.6y 10, donde 9.6es la antigua versión y 10es la nueva versión. Asegúrese de ajustar los directorios "antiguo" y "nuevo" en consecuencia, también.


Acabo de actualizar PostgreSQL 9.5 a 9.6 en Ubuntu y pensé en compartir mis hallazgos, ya que hay un par de matices específicos del sistema operativo / paquete de los que debo tener en cuenta.

( No quería tener que volcar y restaurar datos manualmente , por lo que varias de las otras respuestas aquí no eran viables).

En resumen, el proceso consiste en instalar la nueva versión de PostgreSQL junto con la versión anterior (por ejemplo, 9.5 y 9.6), y luego ejecutar el pg_upgradebinario, que se explica en (algunos) detalles en https://www.postgresql.org/ docs / 9.6 / static / pgupgrade.html .

El único aspecto "complicado" pg_upgradees que si no se pasa el valor correcto para un argumento, o si no se inicia sesión como el usuario correcto o cden la ubicación correcta antes de ejecutar un comando, pueden aparecer mensajes de error crípticos.

En Ubuntu (y probablemente Debian), siempre que esté utilizando el repositorio "oficial" deb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg main, y siempre que no haya cambiado las rutas predeterminadas del sistema de archivos o las opciones de tiempo de ejecución, el siguiente procedimiento debería hacer el trabajo.

Instale la nueva versión (tenga en cuenta que especificamos el 9.6, explícitamente):

sudo apt install postgresql-9.6

Una vez que la instalación se realice correctamente, ambas versiones se ejecutarán una al lado de la otra, pero en diferentes puertos. El resultado de la instalación menciona esto, en la parte inferior, pero es fácil pasarlo por alto:

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

Detenga ambas instancias del servidor (esto detendrá ambas al mismo tiempo):

sudo systemctl stop postgresql

Cambie al usuario dedicado del sistema PostgreSQL:

su postgres

Vaya a su directorio de inicio (si no lo hace, se producirán errores):

cd ~

pg_upgrade requiere las siguientes entradas ( pg_upgrade --helpnos dice esto):

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)

Estas entradas pueden especificarse con "nombres largos", para que sean más fáciles de visualizar:

  -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

También debemos pasar el --new-optionsinterruptor, porque si no lo hacemos, se produce lo siguiente:

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

Esto ocurre porque las opciones de configuración predeterminadas se aplican en ausencia de este conmutador, lo que da como resultado el uso de opciones de conexión incorrectas, de ahí el error de socket.

Ejecute el pg_upgradecomando desde la nueva versión de 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

Cierre de sesión de la cuenta de usuario del sistema dedicado:

exit

La actualización ahora está completa, pero la nueva instancia se vinculará al puerto 5433(el valor predeterminado estándar es 5432), así que tenga esto en cuenta si intenta probar la nueva instancia antes de "cortarla".

Inicie el servidor de manera normal (nuevamente, esto iniciará las instancias antiguas y nuevas):

systemctl start postgresql

Si desea hacer que la nueva versión sea la predeterminada, deberá editar el archivo de configuración efectivo, por ejemplo /etc/postgresql/9.6/main/postgresql.conf, y asegurarse de que el puerto esté definido como tal:

port = 5432

Si hace esto, cambie el número de puerto de la versión anterior 5433al mismo tiempo (antes de iniciar los servicios) o simplemente elimine la versión anterior (esto no eliminará el contenido real de la base de datos; deberá usarlo apt --purge remove postgresql-9.5para que eso suceda) ):

apt remove postgresql-9.5

El comando anterior detendrá todas las instancias, por lo que deberá iniciar la nueva instancia por última vez con:

systemctl start postgresql

Como punto final de la nota, no olvides considerar pg_upgradelos buenos consejos:

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
Ben Johnson
fuente
1
Para mí en Mac Yosemite, PostgreSQL 9.2 -> 9.5: sudo su postgres, cambiar todo METHOD en pg_hba.conf de instalación tanto a la confianza antes de pg_upgrade, corriendo en pg_upgrade / / tmp privado no ~ no funcionaba así sudo mkdir /foobarcon chmod 777 /foobary corrió allí. Por fin el 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
pude actualizar con éxito de 9.5 a 11.5 tuve que agregar repositorios aptos de postgres a ubuntu. y luego solo siga esos pasos: tecadmin.net/install-postgresql-server-on-ubuntu
shakee93
14

Si está utilizando servicios homebrew y homebrew, probablemente pueda hacer lo siguiente:

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

Creo que esto podría no funcionar por completo si está utilizando funciones avanzadas de postgres, pero funcionó perfectamente para mí.

jnmandal
fuente
1
Funcionó perfectamente para macOS Mojave 10.14.2 - ¡Gracias!
8bithero
13

El manual del usuario cubre este tema en profundidad. Usted puede:

  • pg_upgradeen su lugar; o

  • pg_dumpy pg_restore.

Si tiene dudas, hágalo con vertederos. No elimine el antiguo directorio de datos, solo guárdelo en caso de que algo salga mal / cometa un error; de esa manera puede volver a su instalación 9.3 sin cambios.

Para más detalles, consulte el manual.

Si está atascado, publique una pregunta detallada que explique cómo está atascado, dónde y qué intentó primero. Depende un poco de cómo instaló PostgreSQL también, ya que hay varias "distribuciones" diferentes de PostgreSQL para OS X (desafortunadamente). Por lo tanto, deberá proporcionar esa información.

Craig Ringer
fuente
8

De pie sobre los hombros de las otras criaturas pobres que pisotearon este fango, pude seguir estos pasos para volver a funcionar después de una actualización a Yosemite:

Suponiendo que ha utilizado home-brew para instalar y actualizar Postgres, puede realizar los siguientes pasos.

  1. Detener el servidor actual de Postgres:

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

  2. Inicialice una nueva base de datos 9.4:

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

  3. Instalar postgres 9.3 (ya que ya no estaba presente en mi máquina):

    brew install homebrew/versions/postgresql93

  4. Agregar directorios eliminados durante la actualización de 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. ejecutar 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. Mueva los nuevos datos a su lugar:

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

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

  8. Verifique los /usr/local/var/postgres/server.logdetalles y asegúrese de que el nuevo servidor se inició correctamente.

  9. Finalmente, ¿reinstalar bibliotecas relacionadas?

    pip install --upgrade psycopg2
    gem uninstall pg
    gem install pg
Josh
fuente
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/ # Las versiones menores pueden ser diferentes.
Aaron McMillin
1
Gracias por esto. Accidentalmente ejecuté brew cleanupantes de migrar datos y eso provocó que se desinstalara postgres9.3. Esto ayudó :)
markquezada 02 de
5

Parece que la solución ha sido horneada en Homebrew ahora:

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

Esto lo hizo por mi.

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

Corto y al grano. Sinceramente, no pretendo entender las entrañas de PostgreSQL, quiero hacer las cosas.

dimitarvp
fuente
1
Utiliza la herramienta pg_upgradecluster de Ubuntu, que puede ser mucho más lenta que la herramienta pg_upgrade de PostgreSQL y, por supuesto, solo está disponible en Ubuntu.
alfonx
@alfonx No es cierto. Lo tengo en mi Debian jessie. Tenía más de 10 bases de datos y una cantidad de ~ 400 MB de datos de la base de datos se convirtió en un abrir y cerrar de ojos. Por otra parte, estoy usando un Debian virtual en un SSD.
dimitarvp
Permítanme corregirme: pg_upgradecluster es parte de la "infraestructura Debian PostgreSQL", por lo que solo está disponible en distribuciones basadas en Debian. Acerca de la velocidad, pg_upgrade ofrece la opción "--link", que vincula no copiar datos cuando sea posible: postgresql.org/docs/9.4/static/pgupgrade.html
alfonx
1
Quizás apuntemos a diferentes resultados. Después de una actualización de software en toda la distribución, terminé con la versión 2 de PostgreSQL y los datos que mis proyectos usaban estaban atascados en la versión anterior (9.3). Así que solo busqué el enlace de arriba (en mi respuesta) y lo actualicé, me deshice del viejo "clúster" y de la versión PG anterior.
dimitarvp
Intenté actualizar de 9.4 a 11 pg_upgradecluster 9.4 mainpero recibí el error Error: specified cluster does not exist... supongo que primero tengo que instalar postgresql-9.4 con esta guía: wiki.postgresql.org/wiki/Apt#Quickstart
rubo77
1

En Windows seguía enfrentando diferentes mensajes de error cuando intentaba usar pg_upgrade.

Me ahorró mucho tiempo solo para:

  1. DB de respaldo
  2. Desinstale todas las copias de PostgreSQL
  3. Instalar 9.5
  4. Restaurar DB
Andrés
fuente
Hice esto de 9.5 a 9.6 y funcionó perfectamente también. Es bueno poder hacer una actualización exacta fácil también, en lugar de "último". Utilicé Big SQL para obtener el instalador correcto ( openscg.com/bigsql/postgresql/installers.jsp ).
El codificador
0

Mi solución fue hacer una combinación de estos dos recursos:

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

y

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

El segundo uno ayudó más a continuación de la primera. Además, para no hacerlo, no siga los pasos tal como están, ya que algunos no son necesarios. Además, si no puede hacer una copia de seguridad de los datos a través de la consola de postgres, puede usar un enfoque alternativo y hacer una copia de seguridad con pgAdmin 3 o algún otro programa, como lo hice en mi caso.

Además, el enlace: https://help.ubuntu.com/stable/serverguide/postgresql.html Ayudó a establecer la contraseña encriptada y establecer md5 para autenticar al usuario de postgres.

Después de todo, para verificar la serverversión de postgres ejecutada en la terminal:

sudo -u postgres psql postgres

Después de ingresar la contraseña, ejecute en la terminal de Postgres:

SHOW SERVER_VERSION;

Producirá algo como:

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

Para configurar e iniciar postgres he usado el comando:

> sudo bash # root
> su postgres # postgres

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

Y luego para restaurar la base de datos desde un archivo:

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

O si no funciona, prueba con este:

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

Y si está utilizando Rails, haga un bundle exec rake db:migratedespués de extraer el código :)

Aleks
fuente
0

Para Mac a través de homebrew:

brew tap petere/postgresql,

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

Eliminar viejos Postgres:

brew unlink postgresql

brew link -f postgresql-9.6

Si ocurre algún error, no olvide leer y seguir las instrucciones de preparación en cada paso.

Mira esto para más información: https://github.com/petere/homebrew-postgresql

ThangTD
fuente
0

En Windows 10 desde que tenía npm, instalé el paquete rimraf. npm install rimraf -g

Haga una copia de seguridad de todas sus bases de datos una por una usando el comando pg_dump -U $username --format=c --file=$mydatabase.sqlc $dbname

Luego instalé la última versión de PostgreSQL, es decir, 11.2, que me impulsó a usar el puerto 5433 esta vez.

Seguido por La desinstalación de versiones anteriores de PostgreSQL mine fue 10. Tenga en cuenta que el desinstalador puede dar una advertencia de no eliminar la carpeta C:\PostgreSQL\10\data. Es por eso que tenemos el siguiente paso usando rimraf para eliminar permanentemente la carpeta y sus subcarpetas.

cambie al directorio de instalación de PostgreSQL y ejecutó el comando rimraf 10. 10 es un nombre de directorio. Tenga en cuenta que use su versión anterior de PostgreSQL, es decir, 9.5 o algo así.

Ahora agregue C:\PostgreSQL\pg11\bin, C:\PostgreSQL\pg11\liba las variables ambientales de Windows. Tenga en cuenta que mi nueva versión instalada es la 11, por eso estoy usando pg11.

Navegue hasta C:\PostgreSQL\data\pg11luego abra postgresql.confeditar port = 5433aport = 5432

Eso es. Abra cmd y escribapsql -U postgres

Ahora puede restaurar todas sus bases de datos respaldadas una por una usando el comando pg_restore -U $username --dbname=$databasename $filename

DINERO EN LA CALLE
fuente
0

Mi solución para actualizar de Postgresql 11 a Postgresql 12 en Windows 10 es la siguiente.

Como primer comentario, deberá poder detener e iniciar el servicio Postgresql. Puede hacerlo mediante los siguientes comandos en Powershell.

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

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

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

Sería aconsejable hacer una copia de seguridad antes de realizar la actualización. La instancia de Postgresql 11 debe estar ejecutándose. Luego, para copiar los globales

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

y luego para cada base de datos

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

Si aún no lo ha hecho, instale Postgresql 12 (ya que Postgresql 11 también está instalado, estará en el puerto 5433)

Luego para hacer la actualización de la siguiente manera:

1) Detener el servicio Postgresql 11 (ver arriba)

2) Edite el postgresql.confarchivo d:\postgresql\12\datay cámbieloport = 5433 aport = 5432

3) Edite la ruta del entorno de usuario de Windows ( windows startluego escribaenv ) para apuntar a Postgresql 12 en lugar de Postresql 11

4) Ejecute la actualización ingresando el siguiente 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

(En PowerShell, utilice la tecla de retroceso (o comilla inversa) `para continuar el comando en la línea siguiente)

5) y finalmente inicie el nuevo servicio Postgresql 12

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

Bruno Vermeulen
fuente
-1

Creo que este es el mejor enlace para su solución para actualizar Postgres a 9.6

https://sandymadaan.wordpress.com/2017/02/21/upgrade-postgresql9-3-9-6-in-ubuntu-retaining-the-databases/
zulqarnain nazir
fuente