Różnice pomiędzy wersjami 6 i 9 (Spinanie 3 wersji)
⇤ ← Wersja 6 z 2017-12-14 15:02:39 →
Rozmiar: 3801
Edytor: wtps0n
Komentarz: literówka w highlight
← Wersja 9 z 2024-10-25 09:04:05 → ⇥
Rozmiar: 7538
Edytor: wtps0n
Komentarz: + postgresql.conf
Usunięcia zostały oznaczone w ten sposób. Dodatki zostały oznaczone w ten sposób.
Linia 17: Linia 17:
# dla wersji 9.x
Linia 18: Linia 19:

# dla wersji 10+
psql -U postgres -lt | egrep -v '(postgres|^$)' | awk '{print "createdb -U postgres -O", $3, "-E",$5, $1}' | tee /root/bin/psql.upgrade
Linia 23: Linia 27:
== Proces upgrade-u == == Proces migracji do nowej wersji ==
Linia 27: Linia 31:
# wylistowanie pakietów, które zostaną zdeinstalowane
pkg info -r postgresql95-client | tee /root/pgsql95.deps

# zatrzymanie serwera bazy danych
Linia 29: Linia 37:
# deinstalacja klienta spowoduje deinstalacj/e wszystkich pakiet/ow zael/znych # deinstalacja klienta spowoduje deinstalacj/e wszystkich pakiet/ow zale/znych
Linia 37: Linia 45:
# lub nowsza wersja
pkg install -y postgresql11-server
Linia 39: Linia 49:
== Po upgrade == == Po zainstalowaniu nowych pakietów ==

=== PostgreSQL 9.x ===
Linia 43: Linia 55:

/usr/local/etc/rc.d/postgresql initdb
Linia 47: Linia 57:
=== Upgrade do PostgreSQL 9 oraz bytea ===
Problem dotyczy głównie aplikacji [[MailZu|mailzu]], niemniej mogą trafić się inne aplikacje korzystające z bytea. Nowy format (domyślny) dla bytea to '''hex'''. Aby wszystko zostało po staremu (PostgreSQL <= 8.x), to konieczna jest modyfikacja w pliku '''postgres.conf''':
{{{#!highlight cfg numbers=off
bytea_output = 'escape' # hex, escape
=== PostgreSQL 10+ ===
W razie konieczności wykonanie nowego katalogu zfs (patrz [[SerwerBazDanychPgsql|konfiguracja PostgreSQL]]-a)
=== Inicjalizacja bazy danych ===
{{{#!highlight bash numbers=off
service postgresql initdb
Linia 52: Linia 63:

=== Ustawienie bytea ===
Zgodnie z zapisami w [[SerwerBazDanychPgsql|konfiguracji PostgreSQL]]-a.
Linia 55: Linia 69:
{{{#!highlight cfg numbers=off
log_destination = 'syslog'
# These are relevant when logging to syslog:
syslog_facility = 'LOCAL3'
syslog_ident = 'postgres'
{{{#!highlight diff numbers=off
--- /var/db/postgres/data16/postgresql.conf.install 2024-10-25 10:25:09.216639000 +0200
+++ /var/db/postgres/data16/postgresql.conf 2024-10-25 10:26:30.842746000 +0200
@@ -215,7 +215,7 @@ dynamic_shared_memory_type = posix # the default is us
                                        # unrecoverable data corruption)
 #synchronous_commit = on # synchronization level;
                                        # off, local, remote_write, remote_apply, or on
-#wal_sync_method = fsync # the default is the first option
+#wal_sync_method = fdatasync # the default is the first option
                                        # supported by the operating system:
                                        # open_datasync
                                        # fdatasync (default on Linux and FreeBSD)
@@ -225,7 +225,7 @@ dynamic_shared_memory_type = posix # the default is us
 #full_page_writes = on # recover from partial page writes
 #wal_log_hints = off # also do full page writes of non-critical updates
                                        # (change requires restart)
-#wal_compression = off # enables compression of full-page writes;
+wal_compression = zstd # enables compression of full-page writes;
                                        # off, pglz, lz4, zstd, or on
 #wal_init_zero = on # zero-fill new WAL files
 #wal_recycle = on # recycle WAL files
@@ -482,8 +482,8 @@ log_destination = 'syslog'
                                        # in all cases.

 # These are relevant when logging to syslog:
-#syslog_facility = 'LOCAL0'
-#syslog_ident = 'postgres'
+syslog_facility = 'LOCAL3'
+syslog_ident = 'postgres'
 #syslog_sequence_numbers = on
 #syslog_split_messages = on

@@ -705,7 +705,7 @@ log_timezone = Poland
 #vacuum_multixact_freeze_table_age = 150000000
 #vacuum_multixact_freeze_min_age = 5000000
 #vacuum_multixact_failsafe_age = 1600000000
-#bytea_output = 'hex' # hex, escape
+bytea_output = 'escape' # hex, escape
 #xmlbinary = 'base64'
 #xmloption = 'content'
 #gin_pending_list_limit = 4MB
Linia 63: Linia 113:

=== postmaster.opts ===
Może sie zdarzyć, że przy niektórych instalacjach brakuje pliku postmaster.opts. Trzeba sprawdzić ew. wykonać
{{{#!highlight bash numbers=off
export pgver=16
echo '/usr/local/bin/postgres "-D" "/var/db/postgres/data${pgver}"' > /var/db/postgres/data${pgver}/postmaster.opts
}}}

=== pg_hba.conf ===
Należy sprawdzić, oraz w razie potrzeby zmodyfikować plik `pg_hba.conf` po aktualizacji.
Linia 69: Linia 129:
# dla postgresql 9.x
Linia 70: Linia 131:

# dla postgresql 10+
zcat `find /opt/backups/pgsql/ -type f -name 'pgglobals_*' -ctime -+1h` | psql -U postgres template1
Linia 76: Linia 140:

createdb -U postgres -O <owner> -E <kodowanie> <nazwa_bazy_danych>
Linia 77: Linia 143:
Albo też ze skryptu wygenerowanego w ramach przygotowań Albo też ze skryptu wygenerowanego w ramach przygotowań.
Linia 82: Linia 148:

pg_restore -c -U postgres -d <nazwa_bazy_danych> /katalog/backupu/pgdump_<nazwa_bazy_danych>
Linia 89: Linia 157:

pg_restore -C -v -U postgres /katalog/backupu/pgdump_<nazwa_bazy_danych> | psql -U pgsql template1
Linia 90: Linia 160:

=== pg_restore - skrypt ===
Jednolinijkowiec, który automatyzuje proces odtwarzania backupów:
{{{#!highlight bash numbers=off
for f in `find /opt/backups/pgsql/ -type f -name 'pgdump*' -ctime -+1h | egrep -v '(postgres|template)'`; do db=`echo $f|awk -F"_" '{print $2}'`; echo pg_restore -U postgres -d $db $f; done
}}}

Jeżeli jest wszystko dobrze, to można na końcu dodać '''| sh''', aby całość została wykonana

Upgrade PostgreSQL

Podniesienie wersji PostgreSQL (nieważne, czy main, czy minor) wymaga następujących kroków opisanych poniżej.

psql -l

Po pierwsze konieczność sprawdzenia, jak wygląda matryca użytkownicy, bazy danych, kodowanie:

psql -U pgsql -l

Skrypt pomocniczy do kreacji baz po upgrade

# dla wersji 9.x
psql -U pgsql -lt | egrep -v '(pgsql|^$)' | awk '{print "createdb -U pgsql -O", $3, "-E",$5, $1}' | tee /root/bin/psql.upgrade

# dla wersji 10+
psql -U postgres -lt | egrep -v '(postgres|^$)' | awk '{print "createdb -U postgres -O", $3, "-E",$5, $1}' | tee /root/bin/psql.upgrade

Backup bazy danych

Konieczne jest wykonanie backupu baz danych. Skrypt wykonuje oddzielnie również zapytanie SQL definiujące użytkowników: czy to samego postgres-a, jak również innych.

Proces migracji do nowej wersji

Z wykorzystaniem własnego repozytorium pakietów wykonujemy proces upgrade:

# wylistowanie pakietów, które zostaną zdeinstalowane
pkg info -r postgresql95-client | tee /root/pgsql95.deps

# zatrzymanie serwera bazy danych
service postgresql stop

# deinstalacja klienta spowoduje deinstalacj/e wszystkich pakiet/ow zale/znych
#
pkg delete -y postgresql94-client

# instalacja serwera spowoduje zainstalowanie r/ownie/z klienta
#
pkg install -y postgresql95-server

# lub nowsza wersja
pkg install -y postgresql11-server

Po zainstalowaniu nowych pakietów

PostgreSQL 9.x

Po pierwsze trzeba na nowo utworzyć katalog z bazami danych, konfiguracją etc. Konieczne jest zatem skasowanie obecnego katalogu. Przed deinstalacją warto wykonać backup plików konfiguracyjnych.

rm -rf /usr/local/pgsql/data/*

PostgreSQL 10+

W razie konieczności wykonanie nowego katalogu zfs (patrz konfiguracja PostgreSQL-a)

Inicjalizacja bazy danych

service postgresql initdb

Ustawienie bytea

Zgodnie z zapisami w konfiguracji PostgreSQL-a.

sprawdzenie ustawień syslog

PostgreSQL potrafi logować do sysloga zamiast na ekran. W tym celu trzeba sprawdzić ustawienia, aby były poprawne (zgodne z ustawieniami /etc/syslog.conf):

--- /var/db/postgres/data16/postgresql.conf.install     2024-10-25 10:25:09.216639000 +0200
+++ /var/db/postgres/data16/postgresql.conf     2024-10-25 10:26:30.842746000 +0200
@@ -215,7 +215,7 @@ dynamic_shared_memory_type = posix  # the default is us
                                        # unrecoverable data corruption)
 #synchronous_commit = on               # synchronization level;
                                        # off, local, remote_write, remote_apply, or on
-#wal_sync_method = fsync               # the default is the first option
+#wal_sync_method = fdatasync           # the default is the first option
                                        # supported by the operating system:
                                        #   open_datasync
                                        #   fdatasync (default on Linux and FreeBSD)
@@ -225,7 +225,7 @@ dynamic_shared_memory_type = posix  # the default is us
 #full_page_writes = on                 # recover from partial page writes
 #wal_log_hints = off                   # also do full page writes of non-critical updates
                                        # (change requires restart)
-#wal_compression = off                 # enables compression of full-page writes;
+wal_compression = zstd                 # enables compression of full-page writes;
                                        # off, pglz, lz4, zstd, or on
 #wal_init_zero = on                    # zero-fill new WAL files
 #wal_recycle = on                      # recycle WAL files
@@ -482,8 +482,8 @@ log_destination = 'syslog'
                                        # in all cases.

 # These are relevant when logging to syslog:
-#syslog_facility = 'LOCAL0'
-#syslog_ident = 'postgres'
+syslog_facility = 'LOCAL3'
+syslog_ident = 'postgres'
 #syslog_sequence_numbers = on
 #syslog_split_messages = on

@@ -705,7 +705,7 @@ log_timezone = Poland
 #vacuum_multixact_freeze_table_age = 150000000
 #vacuum_multixact_freeze_min_age = 5000000
 #vacuum_multixact_failsafe_age = 1600000000
-#bytea_output = 'hex'                  # hex, escape
+bytea_output = 'escape'                        # hex, escape
 #xmlbinary = 'base64'
 #xmloption = 'content'
 #gin_pending_list_limit = 4MB

Po restarcie bazy danych będzie działać poprawnie.

postmaster.opts

Może sie zdarzyć, że przy niektórych instalacjach brakuje pliku postmaster.opts. Trzeba sprawdzić ew. wykonać

export pgver=16
echo '/usr/local/bin/postgres "-D" "/var/db/postgres/data${pgver}"' > /var/db/postgres/data${pgver}/postmaster.opts

pg_hba.conf

Należy sprawdzić, oraz w razie potrzeby zmodyfikować plik pg_hba.conf po aktualizacji.

Odzyskiwanie backupów

Użytkownicy

Kolejnym krokiem jest odzyskanie backupów. Po pierwsze warto wgrać wszystkich użytkowników:

# dla postgresql 9.x
zcat /katalog/backupu/pgglobals_data.gz | grep -v pgsql | psql -U pgsql template1

# dla postgresql 10+
zcat `find /opt/backups/pgsql/ -type f -name 'pgglobals_*' -ctime -+1h` | psql -U postgres template1

Utworzenie baz danych

Następnie utworzenie baz danych zgodnie z kodowaniem, jakie było:

createdb -U pgsql -O <owner> -E <kodowanie> <nazwa_bazy_danych>

createdb -U postgres -O <owner> -E <kodowanie> <nazwa_bazy_danych>

Albo też ze skryptu wygenerowanego w ramach przygotowań.

pg_restore

pg_restore -c -U pgsql -d <nazwa_bazy_danych> /katalog/backupu/pgdump_<nazwa_bazy_danych>

pg_restore -c -U postgres -d <nazwa_bazy_danych> /katalog/backupu/pgdump_<nazwa_bazy_danych>

pg_restore z utworzeniem docelowej bazy danych

Opcja -v oczywiście spowoduje głośne logowanie pg_restore na ekran:

pg_restore -C -v -U pgsql  /katalog/backupu/pgdump_<nazwa_bazy_danych> | psql -U pgsql template1

pg_restore -C -v -U postgres  /katalog/backupu/pgdump_<nazwa_bazy_danych> | psql -U pgsql template1

pg_restore - skrypt

Jednolinijkowiec, który automatyzuje proces odtwarzania backupów:

for f in `find /opt/backups/pgsql/ -type f -name 'pgdump*' -ctime -+1h | egrep -v '(postgres|template)'`; do db=`echo $f|awk -F"_" '{print $2}'`; echo pg_restore -U postgres -d $db $f; done

Jeżeli jest wszystko dobrze, to można na końcu dodać | sh, aby całość została wykonana

Na wszelki wypadek backup na nowo

Na wszelki wypadek warto zrobić backup na nowo. Niemniej powinno wszystko działać poprawnie i bez zarzutu.

Przekompilowanie portów zależnych

Przy wykorzystaniu własnego repozytorium pakietów krok jest zbędny - polecenie pkg zrobi wszystko za nas.


PostgreSQL, skrypty, administracja, upgrade


{i}  (c) 2004 - 2026 BSD Serwis Krzysztof Stryjek. W przypadku błędów, poprawek proszę kontaktować się z administratorem wiki.

UpgradePostgresql (ostatnio edytowane 2024-10-25 09:13:39 przez wtps0n)