PostgreSQL + Docker: főverzió frissítés egyszerűen
Probléma: Dockerben futó PostgreSQL adatbázist akarsz új főverzióra frissíteni, de sajnos az új verzió nem tudja automatikusan felhasználni a régi adatait.
Probléma: Dockerben futó PostgreSQL adatbázist akarsz új főverzióra frissíteni, de sajnos az új verzió nem tudja automatikusan felhasználni a régi adatait.
Megoldás: A szokásoshoz képest ez a megoldás egy kicsit komplexebbnek tűnhet, de a látszat csal. :) A kisokos során feltételezem, hogy olyan felhasználóval vagy belépve, ami képes a Docker démont kezelni. Továbbá feltételezem, hogy a birtokodban van a „postgres” felhasználó jelszava.
Továbbá, hogy elegendő helyed van az adatbázis adatait 3x tárolni:
- Meglévő DB
- Mentés
- Visszaállítás
Példánkban egy helyi gépen futó PostgreSQL 15 → 16 frissítését fogunk levezényelni.
1. Állíts le minden klienst
Állíts le minden olyan alkalmazást, ami az adatbázisszerverhez csatlakozik, ezzel biztosítva az adatkonzisztenciát a frissítés során. A PostgreSQL-nek magának viszont még futnia kell!
2. PostgreSQL 16 konténer indítása
Indíts egy PostgreSQL 16-ot tartalmazó konténert a következő feltételekkel:
- NE fusson a PostgreSQL benne
- Csatolj fel rá egy üres könyvtárat, ide fogunk menteni (nálam ez a
pg16_tmp
névre hallgat) - Érje el a még futó PGSQL 15-öt
Ez azért kell, mert szükségünk van a 16-os PGSQL mellé csomagolt pg_dumpall
alkalmazásra. Azért kell ez, mert az az ajánlás, hogy mindig az új verzióhoz tartozó pg_dumpall
legyen használva.
Leírni hosszabb volt, mint maga a parancs:
$ mkdir pg16_tmp
$ docker run -it -v ./pg16_tmp:/pg16_tmp postgres:16 /bin/bash
3. Mentés indítása
Kezdjük el az adatok kimentését a régi adatbázisból. A kimeneti fájl neve nálam pg15_bkp
névre hallgat (a postgres felhasználó jelszavát minden egyes logikai adatbázis mentésekor bekéri).
$ cd /pg16_tmp
$ pg_dumpall -h 172.17.0.1 -U postgres -f pg15_bkp
Hagyhatod futni, vagy leállíthatod. A mentés meglesz a pg16_tmp
könyvtárban pg15_bkp
néven. Ha leállítod, akkor az adatok visszaállításkor ne feledd a 2. pontban olvasható paranccsal újraindítani.
4. PostgreSQL 15 leállítása, 16 indítása
Ha követed (és remélem követed) a jó gyakorlatokat, akkor saját kötete (volume) van minden olyan konténernek, ami perzisztens adatokat ír. Így volt egy kötete a 15-ös Postgrének, és lesz egy a 16-osnak. Így ha bármi félremenne, akkor csak visszaindítod a régi PostgreSQL-t, mintha misem történt volna.
Állítsd le a még futó PostgreSQL 15-öt.
Indíts egy „üres” 16-os PostgreSQL-t úgy, hogy a „postgres
” felhasználó jelszava legyen ugyanaz, ami a 15-ösnél is volt (hogy egyszerűbb legyen az élet). Ezt legegyszerűbben a POSTGRES_PASSWORD
környezeti változó beállításával érheted el.
5. Adat visszaállítás
A kimentett adatok mindent tartalmaznak, ideértve az adatbázis felhasználóit is. Ideje mindent visszaállítani. A következő parancsot a 2-es pontban indított konténerben végezd el.
$ psql -h 172.17.0.1 -U postgres < pg15_bkp
Visszaállítás közben érdemes lehet nézegetni a PostgreSQL logokat, biztos, ami biztos alapon.
6. Tesztelés
Mielőtt ráengednénk az alkalmazásokat, nézzük meg, hogy minden visszaállt-e. A \l
paranccsal listázhatod az adatbázisokat, így ellenőrizheted, hogy minden visszakerült-e.
postgres=# \l
List of databases
Name | Owner | Encoding | Locale Provider | Collate | Ctype | ICU Locale | ICU Rules | Access privileges
-----------+-----------+----------+-----------------+------------+------------+------------+-----------+-----------------------
gitea | gitea | UTF8 | libc | en_US.utf8 | en_US.utf8 | | |
postgres | postgres | UTF8 | libc | en_US.utf8 | en_US.utf8 | | |
sonarqube | sonarqube | UTF8 | libc | en_US.utf8 | en_US.utf8 | | |
template0 | postgres | UTF8 | libc | en_US.utf8 | en_US.utf8 | | | =c/postgres +
| | | | | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | libc | en_US.utf8 | en_US.utf8 | | | =c/postgres +
| | | | | | | | postgres=CTc/postgres
Eddig jónak tűnik. Megvan a sonarqube és a forgejo (gitea) is. Listázzuk a felhasználókat (és csoportokat is), ehhez a \du
parancs kell:
postgres=# \du
List of roles
Role name | Attributes
-----------+------------------------------------------------------------
gitea |
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS
sonarqube |
Kész vagyunk!
Ha minden szuper zöld – most az –, akkor indíthatod az alkalmazásokat. Nálam a Forgejo és SonarQube teljesen jól vette az akadályt.