====== PostgreSQL Upgrade ====== * [[https://decatec.de/linux/postgresql-upgrade-auf-neue-version-durchfuehren/|PostgreSQL: Upgrade auf neue Version durchführen]] * [[https://madafa.de/blog/postgres-aktualisieren-und-upgraden/|Postgres aktualisieren und upgraden]] * [[https://runebook.dev/de/docs/postgresql/pgupgrade|pg_upgrade]] * [[https://www.postgresql.org/docs/12/runtime.html|postgresql.org]] * [[https://www.postgresql.org/docs/12/upgrading.html|18.6. Upgrading a PostgreSQL Cluster]] * **[[https://www.postgresql.org/docs/12/pgupgrade.html|pg_upgrade]]** ===== Upgrade auf PostgreSQL 14 ===== [[https://decatec.de/linux/postgresql-upgrade-auf-neue-version-durchfuehren/#Hinweise_fuer_Upgrade_auf_PostgreSQL_14|Hinweise für Upgrade auf PostgreSQL 14]] Beim Upgrade auf PostgreSQL 14 gibt es noch einen weiteren Punkt zu beachten: Hier ändert sich das Authentifizierungs-Verfahren von md5 auf scram-sha-256. Dabei handelt es sich um Hashing-Verfahren von Passwörtern. Weitere Informationen dazu sind in der PostgreSQL-Dokumentation zu finden. Nach einem Update von PostgreSQL 13 auf Version 14 werden die Anwendungen zunächst einmal keine Verbindung mehr zur Datenbank aufbauen können, da sich das Hashing-Verfahren geändert hat. In diesem Fall müssen die Passwörter aller PostgreSQL-Benutzer neu gesetzt werden. Zunächst einmal kann man sich alle Datenbank-Benutzer auflisten lassen: > echo "\du" | psql -U postgres So wird das Passwort eines Datenbank-Users neu gesetzt //(neu setzen, nicht ändern)//: > echo "\password user_name" | psql -U postgres **Hinweis:** Das Passwort sollte in diesem Schritt nicht geändert werden, sondern es sollte das gleiche Passwort für den Benutzer verwendet werden, welches vorher auch schon genutzt wurde. Andernfalls müsste auch die Konfiguration des Programms geändert werden, welches den Datenbank-Zugriff benötigt. Anschließend sollte der Datenbank-Zugriff wieder wie gewohnt funktionieren. ===== Stand-Alone-Installation ===== ==== komplett neu machen ==== Dump erstellen: > pg_dumpall -E UTF8 -U postgres --if-exists --inserts -c > dump_data+schema.sql > pg_dumpall -E UTF8 -U postgres --inserts -a > dump_data.sql > pg_dumpall -E UTF8 -U postgres -s > dump_schema.sql DB komplett löschen und neu machen > service postgresql stop > rm -fr /usr/local/pgsql/data > su - postgres -c "initdb -D /usr/local/pgsql/data -U postgres -E UTF8 --locale=de_DE.UTF-8" > service postgresql status > service postgresql start > echo -e "\du\n\l" | psql -U postgres Benutzer anlegen: > createuser -U postgres --no-superuser --no-createdb --no-createrole MEINUSER Datenbank für den neuen Benutzer anlegen: > createdb -E UTF8 --locale=de_DE.UTF-8 -U postgres -O MEINUSER MEINEDB Dump in die Datenbank des neuen Benutzers einspielen: > psql -U MEINUSER -d MEINEDB -f dump_xxx.sql > echo -e "\du\n\l\n\dt" | psql -U MEINUSER -d MEINEDB === So geht es auch === echo -e "\du\n\l" | psql -U postgres pg_dumpall -E UTF8 -U postgres --if-exists --inserts -c > dump_data+schema.sql service postgresql stop mv /usr/local/pgsql/data /usr/local/pgsql/data.old pkg info -oa | grep -Fi postgresql postgresql16-client-16.9 databases/postgresql16-client postgresql16-server-16.9_1 databases/postgresql16-server pkg install -y databases/postgresql17-server pkg info -oa | grep -Fi postgresql postgresql17-client-17.5 databases/postgresql17-client postgresql17-server-17.5_1 databases/postgresql17-server su - postgres -c "initdb -D /usr/local/pgsql/data -U postgres -E UTF8 --locale=de_DE.UTF-8" cat /usr/local/pgsql/data/PG_VERSION service postgresql start echo -e "\du" | psql -U postgres time cat dump_data+schema.sql | psql -U postgres -d template1 real 41m21.991s user 0m4.765s sys 0m3.138s echo "SELECT * FROM pg_stat_activity;" | psql -U postgres echo "SELECT COUNT(MEINESPALTE) FROM MEINETAB;" | psql -U MEINUSER -td MEINEDB echo -e "\du\n\l" | psql -U postgres ==== mit pg_upgrade ==== **SICHERHEIT GEHT VOR!**\\ Als erstes eine Sicherung anlegen **//(Bevor das Upgrade begonnen wird!)//**: > pg_dumpall -E UTF8 -U postgres --if-exists --inserts -c > dumpall.sql __Beachten Sie, dass ''pg_upgrade'' nur funktioniert, wenn die Kodierungen der alten und der neuen Datenbankinstanz übereinstimmen. Andernfalls schlägt es fehl.__ **Bei dieser Methode muß sowohl die alte als auch die neue Version, nebeneinander installiert sein!** => ''siehe Internet''