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.

PostgreSQL logó
PostgreSQL logó

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.