You are on page 1of 206

PostgreSQL:

wprowadzenie do administracji

Maciej Zakrzewicz
PLAN SZKOLENIA
▪ Wprowadzenie do PostgreSQL, architektura, instalacja, konfiguracja,
narzędzia
▪ Uwierzytelnianie i autoryzacja użytkowników, role, uprawnienia
▪ Monitorowanie serwera, audytowanie użytkowników
▪ Logiczne i fizyczne kopie bezpieczeństwa, odtwarzanie po awarii
▪ Przegląd mechanizmów replikacji
▪ Przegląd zagadnień zarządzania wydajnością

PostgreSQL: wprowadzenie do administracji


2
© 2021 Maciej Zakrzewicz
MATERIAŁY ŹRÓDŁOWE
▪ PostgreSQL 13 documentation
▪ https://www.postgresql.org/docs/13/index.html
▪ The Internals of PostgreSQL
▪ http://www.interdb.jp/pg/index.html
▪ Enrico Pirozzi, PostgreSQL 10 High Performance, Packt Publishing Ltd,
2018
▪ Postgresqlco.nf – parametry PostgreSQL, rekomendacje
▪ https://postgresqlco.nf/en/doc/param/

PostgreSQL: wprowadzenie do administracji


3
© 2021 Maciej Zakrzewicz
WPROWADZENIE

4
PostgreSQL: wprowadzenie do administracji
HISTORIA POSTGRESQL
▪ Obiektowo-relacyjny system zarządzania bazą danych
▪ oparty na POSTGRES, budowanym na University of Berkeley, California w
latach 1986-1993 (język zapytań PostQUEL)
▪ Postgres95 (obsługa języka SQL) w latach 1994-1995
▪ PostgreSQL od roku 1996
▪ open-source
▪ licencja umożliwia bezpłatne wykorzystywanie, modyfikowanie
i dystrybuowanie w celach prywatnych, akademickich lub komercyjnych

PostgreSQL: wprowadzenie do administracji


5
© 2021 Maciej Zakrzewicz
HISTORIA WERSJI POSTGRESQL

[źródło: postgresql.org]
© 2021 Maciej Zakrzewicz
6
PostgreSQL: wprowadzenie do administracji
ARCHITEKTURA POSTGRESQL
logger checkpointer logical rep

bg writer WAL writer


postmaster
inicjacja stats coll autovacuum
pliki danych
połączenia uruchomienie
procesu
pamięć
aplikacja postgres współdzielona
kliencka (backend process)
Buffer Cache
pliki WAL
aplikacja postgres WAL buffers
kliencka (backend process)
maintenance
memory
… …

© 2021 Maciej Zakrzewicz


7
PostgreSQL: wprowadzenie do administracji
UTILITY PROCESSES (1/2)
▪ Logger Process
▪ rejestruje informacje o funkcjonowaniu procesów w katalogu pg_log w Data
Directory
▪ Checkpointer Process
▪ zapisuje wszystkie zmodyfikowane bloki danych do plików danych (zdarzenie
Checkpoint)
▪ co checkpoint_timeout sekund (300s)
▪ Writer Process
▪ zapisuje zmodyfikowane bloki danych do plików danych, aby zapobiegać
przepełnieniu Buffer Cache (pracuje w tle)
▪ co bgwriter_delay milisekund (200ms), w jednej iteracji zapisuje maksymalnie
bgwriter_lru_maxpages zmodyfikowanych bloków (100)

PostgreSQL: wprowadzenie do administracji


8
© 2021 Maciej Zakrzewicz
UTILITY PROCESSES (2/2)
▪ WAL Writer Process
▪ zapisuje Write Ahead Logs – pliki rejestrujące wszystkie zmiany dokonywane
przez użytkowników w bazie danych
▪ Autovacuum Launcher Process
▪ automatycznie wykonuje operacje VACUUM i ANALYZE
▪ Stats Collector Process
▪ gromadzi statystyki dostępów do bazy danych: liczba operacji na tabelach i
indeksach, liczba modyfikowanych rekordów w tabeli, informacje o
operacjach VACUUM i ANALYZE na każdej tabeli
▪ Logical Replication Launcher
▪ uruchamia procesy obsługi logicznej replikacji danych

PostgreSQL: wprowadzenie do administracji


9
© 2021 Maciej Zakrzewicz
KATALOG DANYCH (DATA DIRECTORY)
▪ Pojedynczy katalog dyskowy, w którym umieszczone są m.in.:
▪ pliki danych wszystkich baz danych serwera PostgreSQL
▫ podkatalog base
▪ pliki tabel systemowych serwera
▫ podkatalog global
▪ pliki konfiguracyjne
▫ *.conf
▪ pliki logów
▫ podkatalog log
▪ pliki WAL
▫ podkatalog pg_wal
▪ itp.
▪ Wskazywany podczas uruchamiania serwera PostgreSQL
▪ lub domyślna lokalizacja (/var/lib/pgsql/13/data)

PostgreSQL: wprowadzenie do administracji


10
© 2021 Maciej Zakrzewicz
PLIKI DANYCH
▪ Tabele, widoki materializowane i indeksy są zapisywane w formie plików
danych
▪ domyślnie przechowywane wewnątrz katalogu Data Directory/base, w
odrębnych katalogach dla każdej bazy danych
▪ gdy rozmiar obiektu przekracza 1GB, jest on dzielony na pliki o rozmiarze
maksymalnym 1GB (otrzymują przyrostki .1, .2, itd.)
▪ Pliki danych są podzielone na bloki o rozmiarze 8kB, w których
zapisywane są rekordy
▪ rekord nie może rozciągać się na wiele bloków
▪ do przechowywania rekordów o bardzo dużych rozmiarach służy mechanizm
TOAST

PostgreSQL: wprowadzenie do administracji


11
© 2021 Maciej Zakrzewicz
JAK ODNALEŹĆ PLIK DANYCH TABELI?

select pg_relation_filepath('cars');

pg_relation_filepath
---------------------- nazwa tabeli
base/13318/1247

nazwa główna pliku danych

lokalizacja względem Data Directory

© 2021 Maciej Zakrzewicz


12
PostgreSQL: wprowadzenie do administracji
PLIKI WAL
▪ Przechowywane w katalogu pg_wal
▪ Automatycznie, kolejno zapisywane przez serwer, rejestrujące opisy zmian
dokonywanych przez użytkowników w blokach bazy danych
▪ niezbędne do automatycznego odtworzenia stanu bazy danych po awarii serwera (utrata
zawartości Buffer Cache)
▪ usuwane przez serwer gdy nie są już potrzebne
▫ wal_keep_segments określa minimalna liczbę plików WAL, które pozostają na dysku
▫ możliwy recykling starych plików w celu poprawy wydajności (zamiast usuwać/tworzyć)
▪ Domyślny rozmiar każdego pliku: 16MB (możliwość zmiany podczas inicjalizacji
serwera: --wal-segsize)
▪ 24-znakowa nazwa pliku zawiera numer sekwencyjny oraz numer inkarnacji (timeline)
▪ W zapisie pośredniczy WAL Buffer - dane trafiają na dysk w chwili operacji commit
▪ Narzędzie pg_waldump umożliwia wyświetlenie zawartości pliku WAL w postaci
czytelnej

PostgreSQL: wprowadzenie do administracji


13
© 2021 Maciej Zakrzewicz
POZIOM ZAPISÓW DO PLIKÓW WAL
▪ Parametr wal_level
▪ minimal - rejestruje tylko taki zakres informacji, jaki jest niezbędny do
odtworzenia stanu bazy danych o awarii serwera (np. zanik zasilania);
operacje masowe (CTAS, CREATE INDEX) nie są rejestrowane w pliku WAL,
lecz są natychmiast zapisywane do plików danych
▪ replica - jw. plus dodatkowo informacje, jakie są niezbędne do odtworzenia
stanu bazy danych z kopii bezpieczeństwa oraz do replikacji fizycznej
(domyślny)
▪ logical - jw. plus dodatkowo informacje umożliwiające dekodowanie
logiczne/replikację logiczną

PostgreSQL: wprowadzenie do administracji


14
© 2021 Maciej Zakrzewicz
ZARZĄDZANIE SERWEREM

15
PostgreSQL: wprowadzenie do administracji
URUCHAMIANIE I ZATRZYMYWANIE SERWERA
za pomocą pg_ctl

# uruchomienie serwera w tle


/usr/pgsql-*/bin/pg_ctl -D /var/lib/pgsql/*/data start

# zatrzymanie serwera
/usr/pgsql-*/bin/pg_ctl –D /var/lib/pgsql/*/data stop

jako użytkownik OS: postgres

© 2021 Maciej Zakrzewicz


16
PostgreSQL: wprowadzenie do administracji
URUCHAMIANIE I ZATRZYMYWANIE SERWERA
za pomocą systemctl

# uruchomienie serwera
systemctl start postgresql-*.service

# zatrzymanie serwera
systemctl stop postgresql-*.service

# konfiguracja automatycznego uruchamiania


systemctl enable postgresql-*.service

jako użytkownik OS: root

© 2021 Maciej Zakrzewicz


17
PostgreSQL: wprowadzenie do administracji
DEFINICJA USŁUGI SYSTEMOWEJ POSTGRESQL-13.SERVICE
/usr/lib/systemd/system/postgresql-13.service
[Unit]
Description=PostgreSQL 13 database server
Documentation=https://www.postgresql.org/docs/13/static/
After=syslog.target
After=network.target
[Service]
Type=notify
User=postgres
Group=postgres
Environment=PGDATA=/var/lib/pgsql/13/data/
OOMScoreAdjust=-1000
Environment=PG_OOM_ADJUST_FILE=/proc/self/oom_score_adj
Environment=PG_OOM_ADJUST_VALUE=0
ExecStartPre=/usr/pgsql-13/bin/postgresql-13-check-db-dir ${PGDATA}
ExecStart=/usr/pgsql-13/bin/postmaster -D ${PGDATA}
ExecReload=/bin/kill -HUP $MAINPID
KillMode=mixed
KillSignal=SIGINT
TimeoutSec=0
[Install]
WantedBy=multi-user.target

© 2021 Maciej Zakrzewicz


18
PostgreSQL: wprowadzenie do administracji
LOGOWANIE SIĘ DO SERWERA POSTGRESQL
Narzędzie PSQL

$ su – postgres

$ psql
postgres=# \c postgres
You are now connected to database "postgres" a user "postgres".
postgres=# create table pracownicy(id serial, nazwisko varchar(20));
CREATE TABLE
postgres=# insert into pracownicy(nazwisko) values ('Kowalski');
INSERT 0 1
postgres=# select * from pracownicy;
...
postgres=# \q
$ exit
$

© 2021 Maciej Zakrzewicz


19
PostgreSQL: wprowadzenie do administracji
KOMENDY NARZĘDZIA PSQL (1/3)
General
\copyright show PostgreSQL usage and distribution terms
\crosstabview [COLUMNS] execute query and display results in crosstab
\errverbose show most recent error message at maximum verbosity
\g [FILE] or ; execute query (and send results to file or |pipe)
\gdesc describe result of query, without executing it
\gexec execute query, then execute each value in its result
\gset [PREFIX] execute query and store results in psql variables
\gx [FILE] as \g, but forces expanded output mode
\q quit psql
\watch [SEC] execute query every SEC seconds
Help
\? [commands] show help on backslash commands
\? options show help on psql command-line options
\? variables show help on special variables
\h [NAME] help on syntax of SQL commands, * for all commands
Query Buffer
\e [FILE] [LINE] edit the query buffer (or file) with external editor
\ef [FUNCNAME [LINE]] edit function definition with external editor
\ev [VIEWNAME [LINE]] edit view definition with external editor
\p show the contents of the query buffer
\r reset (clear) the query buffer
\s [FILE] display history or save it to file
\w FILE write query buffer to file
Input/Output
\copy ... perform SQL COPY with data stream to the client host
\echo [STRING] write string to standard output
\i FILE execute commands from file
\ir FILE as \i, but relative to location of current script
\o [FILE] send all query results to file or |pipe
\qecho [STRING] write string to query output stream (see \o)
Conditional
\if EXPR begin conditional block
\elif EXPR alternative within current conditional block
\else final alternative within current conditional block
\endif end conditional block

© 2021 Maciej Zakrzewicz


20
PostgreSQL: wprowadzenie do administracji
KOMENDY NARZĘDZIA PSQL (2/3)
Informational (options: S = show system objects, + = additional detail)
\d[S+] list tables, views, and sequences
\d[S+] NAME describe table, view, sequence, or index
\da[S] [PATTERN] list aggregates
\dA[+] [PATTERN] list access methods
\db[+] [PATTERN] list tablespaces
\dc[S+] [PATTERN] list conversions
\dC[+] [PATTERN] list casts
\dd[S] [PATTERN] show object descriptions not displayed elsewhere
\dD[S+] [PATTERN] list domains
\ddp [PATTERN] list default privileges
\dE[S+] [PATTERN] list foreign tables
\det[+] [PATTERN] list foreign tables
\des[+] [PATTERN] list foreign servers
\deu[+] [PATTERN] list user mappings
\dew[+] [PATTERN] list foreign-data wrappers
\df[anptw][S+] [PATRN] list [only agg/normal/procedures/trigger/window] functions
\dF[+] [PATTERN] list text search configurations
\dFd[+] [PATTERN] list text search dictionaries
\dFp[+] [PATTERN] list text search parsers
\dFt[+] [PATTERN] list text search templates
\dg[S+] [PATTERN] list roles
\di[S+] [PATTERN] list indexes
\dl list large objects, same as \lo_list
\dL[S+] [PATTERN] list procedural languages
\dm[S+] [PATTERN] list materialized views
\dn[S+] [PATTERN] list schemas
\do[S] [PATTERN] list operators
\dO[S+] [PATTERN] list collations \du[S+] [PATTERN] list roles
\dp [PATTERN] list table, view, and sequence access privileges \dv[S+] [PATTERN] list views
\drds [PATRN1 [PATRN2]] list per-database role settings \dx[+] [PATTERN] list extensions
\dRp[+] [PATTERN] list replication publications \dy [PATTERN] list event triggers
\dRs[+] [PATTERN] list replication subscriptions \l[+] [PATTERN] list databases
\ds[S+] [PATTERN] list sequences \sf[+] FUNCNAME show a function's definition
\dt[S+] [PATTERN] list tables \sv[+] VIEWNAME show a view's definition
\dT[S+] [PATTERN] list data types \z [PATTERN] same as \dp

© 2021 Maciej Zakrzewicz


21
PostgreSQL: wprowadzenie do administracji
KOMENDY NARZĘDZIA PSQL (3/3)
Formatting
\a toggle between unaligned and aligned output mode
\C [STRING] set table title, or unset if none
\f [STRING] show or set field separator for unaligned query output
\H toggle HTML output mode (currently off)
\pset [NAME [VALUE]] set table output option (NAME := {border|columns|expanded|fieldsep|fieldsep_zero|footer|format|linestyle|null|numericlocale|pager|
pager_min_lines|recordsep|recordsep_zero|tableattr|title|tuples_only|unicode_border_linestyle|unicode_column_linestyle|unicode_header_linestyle})
\t [on|off] show only rows (currently off)
\T [STRING] set HTML <table> tag attributes, or unset if none
\x [on|off|auto] toggle expanded output (currently off)
Connection
\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo} connect to new database (currently "postgres")
\conninfo display information about current connection
\encoding [ENCODING] show or set client encoding
\password [USERNAME] securely change the password for a user
Operating System
\cd [DIR] change the current working directory
\setenv NAME [VALUE] set or unset environment variable
\timing [on|off] toggle timing of commands (currently off)
\! [COMMAND] execute command in shell or start interactive shell
Variables
\prompt [TEXT] NAME prompt user to set internal variable
\set [NAME [VALUE]] set internal variable, or list all if no parameters
\unset NAME unset (delete) internal variable
Large Objects
\lo_export LOBOID FILE
\lo_import FILE [COMMENT]
\lo_list
\lo_unlink LOBOID large object operations

© 2021 Maciej Zakrzewicz


22
PostgreSQL: wprowadzenie do administracji
PGADMIN III/IV

© 2021 Maciej Zakrzewicz


23
PostgreSQL: wprowadzenie do administracji
PLIKI KONFIGURACYJNE

24
PostgreSQL: wprowadzenie do administracji
PARAMETRY KONFIGURACYJNE - PRZEGLĄD
▪ Lokalizacja plików z parametrami konfiguracyjnymi: Data Directory Parametry - dokumentacja
▪ postgresql.conf
▪ postgresql.auto.conf
▪ Zawierają parametry konfiguracyjne serwera PostgreSQL, np.:
▪ port – port nasłuchu sieciowego
▪ listen_addresses – adres IP nasłuchu sieciowego ('*' dla wszystkich adresów)
▪ max_connections – maksymalna liczba równoczesnych połączeń
▪ statement_timeout – maksymalny czas pracy polecenia SQL
▪ Zmiana wartości parametrów konfiguracyjnych:
▪ w pliku postgresql.conf
▪ za pomocą opcji uruchomienia serwera PostgreSQL
▪ poleceniem ALTER SYSTEM (zapisywane w pliku postgresql.auto.conf)
▪ poleceniem ALTER DATABASE – na poziomie bazy danych
▪ poleceniem SET – na poziomie sesji użytkownika
▪ Obserwacja aktualnych wartości parametrów konfiguracyjnych:
▪ poleceniem SHOW
▪ poprzez widok pg_settings

PostgreSQL: wprowadzenie do administracji


25
© 2021 Maciej Zakrzewicz
WYŚWIETLANIE PARAMETRÓW

show max_connections;

max_connections
-----------------
100

select setting from pg_settings where name='max_connections';

setting
---------
100

© 2021 Maciej Zakrzewicz


26
PostgreSQL: wprowadzenie do administracji
WIDOK PG_SETTINGS
▪ Wybrane kolumny:
▪ name – nazwa parametru
▪ setting – aktualna wartość parametru
▪ unit – niejawna jednostka miary dla parametru, np. "s", "ms", "MB"
▪ short_desc – krótki opis parametru
▪ source – źródło pochodzenia aktualnej wartości parametru, np. "default",
"configuration file"
▪ min_val, max_val – minimalna/maksymalna dozwolona wartość
▪ enumvals – lista dozwolonych wartości
▪ boot_val – oryginalna wartość parametru z chwili uruchomienia serwera

PostgreSQL: wprowadzenie do administracji


27
© 2021 Maciej Zakrzewicz
USTAWIENIE PARAMETRU: POSTGRESQL.CONF
Przykład
postgresql.conf

port = 5432 # (change requires restart)
max_connections = 100 # (change requires restart)
#superuser_reserved_connections = 3 # (change requires restart)
#unix_socket_directories = '' # comma-separated list of directories
# (change requires restart)

Aby zmienione parametry zostały zastosowane przez serwer, konieczne


jest przeładowanie pliku parametrów:
▪ polecenie pg_ctl reload lub select pg_reload_conf();
▪ w przypadku niektórych parametrów (np. port) - pełen restart serwera

© 2021 Maciej Zakrzewicz


28
PostgreSQL: wprowadzenie do administracji
USTAWIENIE PARAMETRU: ALTER SYSTEM
Przykład

alter system set max_connections=100; zapisuje parametr

postgresql.auto.conf
# Do not edit this file manually!
Plik postgresql.auto.conf przesłania # It will be overwritten by the ALTER SYSTEM command.
wpisy w pliku postgresql.conf! max_connections = '100'

Aby zmienione parametry zostały zastosowane przez serwer, konieczne


jest przeładowanie pliku parametrów:
▪ polecenie pg_ctl reload lub select pg_reload_conf();
▪ w przypadku niektórych parametrów (np. port) - pełen restart serwera

© 2021 Maciej Zakrzewicz


29
PostgreSQL: wprowadzenie do administracji
USTAWIENIE PARAMETRU: SET
Przykład

set work_mem=3172;
▪ Zmiana dotyczy wyłącznie
show work_mem;
bieżącej sesji
▪ Tracona po zakończeniu sesji
work_mem
----------
▪ Tylko nieliczne parametry
3172kB

© 2021 Maciej Zakrzewicz


30
PostgreSQL: wprowadzenie do administracji
UWIERZYTELNIANIE KLIENTÓW
▪ Metody uwierzytelniania:
▪ trust: bezwarunkowy dostęp bez potrzeby podawania hasła
▪ reject: bezwarunkowe odrzucanie klientów
▪ password: uwierzytelnianie na podstawie hasła przekazywanego przez sieć otwartym
tekstem (niezalecane)
▪ scram-sha-256: uwierzytelnianie na podstawie hasła kodowanego przez SCRAM-SHA-256
▪ md5: uwierzytelnianie na podstawie hasła kodowanego przez SCRAM-SHA-256 lub MD5
▪ ident: pobranie nazwy użytkownika w zdalnym systemie operacyjnym i uwierzytelnienie
jako użytkownik PostgreSQL o takiej samej nazwie (korzysta z usługi IDENT systemu
operacyjnego, port 113)
▪ peer: pobranie nazwy użytkownika w lokalnym systemie operacyjnym i uwierzytelnienie jako
użytkownik PostgreSQL o takiej samej nazwie
▪ ldap: uwierzytelnienie z użyciem serwera LDAP
▪ itd.
▪ Konfiguracja w pliku pg_hba.conf

PostgreSQL: wprowadzenie do administracji


31
© 2021 Maciej Zakrzewicz
PLIK PG_HBA.CONF
dokumentacja: https://www.postgresql.org/docs/13/static/auth-pg-hba-conf.html

# "local" is for Unix domain socket connections only ▪ Konfiguruje metody


local all all peer uwierzytelniania klientów
# IPv4 local connections: ▪ Lokalizacja: katalog Data
host all all 127.0.0.1/32 scram-sha-256 Directory
# IPv6 local connections: ▪ Każdy wiersz pliku określa:
host all all ::1/128 scram-sha-256
▪ rodzaj połączenia
# Allow replication connections from localhost, by a user
▪ zakres adresów IP (/maska
# with the replication privilege. podsieci)
local replication all peer ▪ nazwę bazy danych
host replication all 127.0.0.1/32 scram-sha-256 ▪ nazwę użytkownika lub grupy
host replication all ::1/128 scram-sha-256 ("+" przed nazwą grupy)
# Use pg_ident.conf mapping ▪ metodę uwierzytelniania
host all all 192.168.0.0/16 ident map=omicron

© 2021 Maciej Zakrzewicz


32
PostgreSQL: wprowadzenie do administracji
PLIK PG_HBA.CONF
Przykłady
host all all 127.0.0.1/32 scram-sha-256
psql -U postgres
Password for user postgres:<hasło>
postgres=#

host all all 127.0.0.1/32 trust


psql -U postgres
postgres=#
bez hasła

host all all 127.0.0.1/32 ident


psql -U postgres
psql: error: could not connect to server: KATASTROFALNY:
autoryzacja ident nie powiodła się dla użytkownika "postgres"

użytkownik OS nie nazywał się postgres


© 2021 Maciej Zakrzewicz
33
PostgreSQL: wprowadzenie do administracji
SPOSOBY ZAPISU HASEŁ UŻYTKOWNIKÓW NA SERWERZE

set password_encryption='md5';
alter role postgres password 'postgres'; ▪ Wybór metody za pomocą
select rolpassword from pg_authid where rolname='postgres'; parametru
rolpassword password_encryption
-------------------------------------
md53175bce1d3201d16594cebf9d7eb3f9d hasło zapisane jako MD5 ▪ md5
set password_encryption='scram-sha-256'; ▪ scram-sha-256
alter role postgres password 'postgres';
▪ Hasła nieszyfrowane nie są
wspierane od PostgreSQL 10
select rolpassword from pg_authid where rolname='postgres';
rolpassword
----------------------------------------------------------
SCRAM-SHA-256$4096:4zo2e7TyrFl2oomLWXQjzQ==$BEK9mTYa98mWH8
JtM/fS8KlEgDE5H/qo7RZtAI2kQtU=:Dg+2t6pnKRW/7Goh5Ah8eodAmLn
PXB2D9Gf8OqGIQfA=
hasło zapisane jako SHA

© 2021 Maciej Zakrzewicz


34
PostgreSQL: wprowadzenie do administracji
PLIK PG_HBA.CONF
▪ Rodzaje połączeń:
▪ local: połączenia lokalne za pomocą socketów Unix
▪ host: połączenia sieciowe za pomocą TCP/IP, zarówno z użyciem SSL, jak i
non-SSL (wymaga prowadzenia nasłuchu sieciowego na adresie IP)
▪ hostssl: połączenia sieciowe za pomocą TCP/IP wyłącznie z użyciem SSL
(wymaga aktywacji nasłuchu sieciowego SSL)
▪ hostnossl: połączenia sieciowe za pomocą TCP/IP wyłącznie bez użycia SSL

PostgreSQL: wprowadzenie do administracji


35
© 2021 Maciej Zakrzewicz
PLIK PG_IDENT.CONF
dokumentacja: https://www.postgresql.org/docs/13/auth-username-maps.html

# MAPNAME SYSTEM-USERNAME PG-USERNAME


▪ Umożliwia odwzorowanie
omicron bryanh bryanh
nazwy użytkownika w
omicron ann ann systemie operacyjnym na
nazwę użytkownika serwera
# bob has user name robert on these machines
bazy danych
omicron robert bob
▪ Nazwa odwzorowania
# bryanh can also connect as guest1 podana w pliku pg_hba.conf
omicron bryanh guest1 jako atrybut "map"
▪ Możliwość użycia wyrażeń
regularnych

© 2021 Maciej Zakrzewicz


36
PostgreSQL: wprowadzenie do administracji
BAZY DANYCH, SCHEMATY,
PRZESTRZENIE TABEL
37
PostgreSQL: wprowadzenie do administracji
BAZY DANYCH, SCHEMATY, TABELE
Organizacja logiczna
PostgreSQL Server
(Database Cluster)

database database database

schema schema schema schema schema schema schema

table table table table table table table table table table table table table table

© 2021 Maciej Zakrzewicz


38
PostgreSQL: wprowadzenie do administracji
BAZA DANYCH
▪ Baza danych jest kontenerem przechowującym obiekty użytkowników zorganizowane w
schematy
▪ Każdy obiekt należy do dokładnie jednego schematu w jednej bazie danych
▪ wyjątkiem są tabele systemowe, np. pg_database, należące do serwera (Database Cluster) jako
całości
▪ Tworzenie i usuwanie baz danych:
▪ polecenie CREATE DATABASE lub program narzędziowy createdb
▪ polecenie DROP DATABASE lub program narzędziowy dropdb
▪ Tworzenie bazy danych jest realizowane jako kopia szablonu
▪ domyślnie w oparciu o predefiniowany szablon template1
▪ można wskazać inny szablon: CREATE DATABASE dbname TEMPLATE template0;
▪ Pobranie wykazu istniejących baz danych:
▪ SELECT datname FROM pg_database;
▪ Baza danych ma właściciela (użytkownik, który ma prawo zarządzać i konfigurować)
▪ CREATE DATABASE dbname OWNER rolename;

PostgreSQL: wprowadzenie do administracji


39
© 2021 Maciej Zakrzewicz
WYBÓR BAZY DANYCH DO PRACY
▪ Podczas nawiązywania połączenia z serwerem
▪ psql -U postgres <nazwa_bazy_danych>
▪ Podczas pracy z PSQL
▪ \c <nazwa_bazy_danych>
▪ Wyświetlenie nazwy bieżącej bazy danych
▪ select current_database();
▪ \conninfo

PostgreSQL: wprowadzenie do administracji


40
© 2021 Maciej Zakrzewicz
SCHEMATY
▪ Obiekty bazy danych są logicznie pogrupowane w schematy
▪ Tworzenie/usuwanie schematu:
▪ CREATE SCHEMA nazwa
▪ DROP SCHEMA nazwa
▪ Tworzenie obiektu w schemacie:
▪ CREATE TABLE nazwa_schematu.nazwa_tabeli
▪ Usunięcie schematu wraz z obiektami
▪ DROP SCHEMA nazwa CASCADE
▪ Pobranie wykazu istniejących schematów:
▪ \dnS
▪ select nspname from pg_namespace;
▪ select schema_name from information_schema.schemata;

PostgreSQL: wprowadzenie do administracji


41
© 2021 Maciej Zakrzewicz
SCHEMATY PREDEFINIOWANE
▪ PUBLIC: gromadzi obiekty, którym jawnie nie przypisano schematu
▪ CREATE TABLE nazwa_tabeli
▪ PG_CATALOG: gromadzi tabele i widoki systemowe, wbudowane typy
danych funkcje i operatory
▪ podawanie nazwy tego schematu w zapytaniach nie jest konieczne – jest on
przeszukiwany niejawnie
▪ INFORMATION_SCHEMA: gromadzi widoki systemowe zgodne ze
standardem ANSI SQL
▪ PG_TOAST: przechowuje systemowe tabele TOAST obsługujące
ponadnormatywne wartości kolumn

PostgreSQL: wprowadzenie do administracji


42
© 2021 Maciej Zakrzewicz
ŚCIEŻKA PRZESZUKIWANIA SCHEMATÓW
▪ Gdy użytkownik odwołuje się do obiektu nie podając nazwy schematu,
następuje przeszukanie schematów znajdujących się w ścieżce
przeszukiwania (postgresql.conf):
▪ SHOW search_path
▪ SET search_path TO myschema,public;

PostgreSQL: wprowadzenie do administracji


43
© 2021 Maciej Zakrzewicz
BAZY DANYCH, PRZESTRZENIE TABEL, TABELE
Organizacja fizyczna
database

table table table table table table table table table table table table table table

tablespace tablespace tablespace

folder folder folder

disk disk

© 2021 Maciej Zakrzewicz


44
PostgreSQL: wprowadzenie do administracji
PRZESTRZENIE TABEL (TABLESPACES) (1/2)
▪ Umożliwiają definiowanie lokalizacji w systemie plików, gdzie przechowywane będą
pliki obiektów bazy danych
▪ pliki danych mogą być rozlokowane na wielu partycjach/dyskach
▪ obiekty o większej częstotliwości dostępów mogą być zlokalizowane na szybszych
(kosztowniejszych) urządzeniach dyskowych
▪ Tworzenie przestrzeni tabel
▪ CREATE TABLESPACE fastspace1 LOCATION '/ssd1/postgresql/data';
▪ W celu wykorzystywania przestrzeni tabel, użytkownik musi posiadać uprawnienie
CREATE
▪ Tworzenie obiektów we wskazanej przestrzeni tabel
▪ CREATE DATABASE base1 TABLESPACE fastspace1;
▪ CREATE TABLE foo(i int) TABLESPACE fastspace1;
▪ lub: SET default_tablespace = fastspace1;
CREATE TABLE foo(i int);

PostgreSQL: wprowadzenie do administracji


45
© 2021 Maciej Zakrzewicz
PRZESTRZENIE TABEL (TABLESPACES) (2/2)
▪ Z jednej przestrzeni tabel korzystać może wiele baz danych
▪ Predefiniowane przestrzenie tabel:
▪ pg_default – domyślna lokalizacja dla tabel użytkowników, wewnątrz katalogu
Data Directory/base
▪ pg_global – dla tabel systemowych, wewnątrz katalogu Data Directory/global
▪ Wykaz istniejących przestrzeni tabel:
▪ \db
▪ SELECT spcname FROM pg_tablespace;
▪ Usuwanie przestrzeni tabel:
▪ polecenie DROP TABLESPACE
▪ Każda przestrzeń tabel zdefiniowana przed administratora jest implementowana w formie
linku symbolicznego w katalogu Data Directory/pg_tblspc

PostgreSQL: wprowadzenie do administracji


46
© 2021 Maciej Zakrzewicz
UŻYTKOWNICY I UPRAWNIENIA

47
PostgreSQL: wprowadzenie do administracji
ROLE
▪ Rola w uniwersalny sposób reprezentuje użytkownika lub grupę
użytkowników
▪ przed PostgreSQL 8.1 rozróżniano użytkowników i grupy
▪ Rola może być właścicielem obiektów bazy danych (tabel, funkcji, itp.)
▪ Rola może otrzymywać uprawnienia
▪ systemowe - wskazywane za pomocą atrybutów roli
▪ obiektowe - przydzielane poleceniami GRANT

PostgreSQL: wprowadzenie do administracji


48
© 2021 Maciej Zakrzewicz
TWORZENIE I USUWANIE RÓL
▪ Tworzenie nowej roli:
▪ create role nazwa
▪ create user nazwa # alias dla create role z automatycznie ustawionym atrybutem login
▪ create group nazwa # alias dla create role
▪ narzędzie createuser nazwa
▪ Usuwanie roli:
▪ drop role nazwa
▪ drop user nazwa
▪ drop group nazwa
▪ narzędzie dropuser nazwa
▪ Wyświetlenie istniejących ról:
▪ select rolname from pg_roles;
▪ komenda \du programu psql
▪ Jedna predefiniowana rola administracyjna: postgres
▪ Rola może być właścicielem obiektu
▪ alter table bobs_table owner to alice;

PostgreSQL: wprowadzenie do administracji


49
© 2021 Maciej Zakrzewicz
TWORZENIE RÓL
https://www.postgresql.org/docs/13/sql-createrole.html

▪ Polecenie CREATE ROLE nazwa [[ WITH ] opcje [ ... ]]


▪ Opcje:
▪ SUPERUSER – przekazuje roli uprawnienia administratora
▪ CREATEDB – przekazuje roli uprawnienia do tworzenia baz danych
▪ CREATEROLE -przekazuje roli uprawnienia do tworzenia ról
▪ LOGIN – przekazuje roli uprawnienia do logowania się (rola typu użytkownik końcowy)
▪ REPLICATION – przekazuje roli uprawnienia do replikowania baz danych
▪ CONNECTION LIMIT connlimit – maksymalna liczba równoczesnych połączeń, jakie mogą
być otwarte przez tę rolę (-1 = brak limitu)
▪ PASSWORD 'password' – hasło logowania się z użyciem roli
▪ VALID UNTIL 'timestamp' – data ważności hasła
▪ IN ROLE role_name [, ...] – nazwy ról-grup, do których przydzielona zostanie ta rola
▪ ROLE role_name [, ...] – nazwy ról, które zostaną przydzielone do tej roli

PostgreSQL: wprowadzenie do administracji


50
© 2021 Maciej Zakrzewicz
MODYFIKOWANIE RÓL
https://www.postgresql.org/docs/13/sql-alterrole.html

▪ Polecenie ALTER ROLE nazwa [WITH] opcje [...]


▪ Opcje:
▪ SUPERUSER, CREATEDB, CREATEROLE, LOGIN, REPLICATION, CONNECTION
LIMIT, PASSWORD, VALID UNTIL – znaczenie jak w CREATE ROLE
▪ Zmiana nazwy roli:
▪ ALTER ROLE name RENAME TO nowa_nazwa
▪ Zmiana ustawień parametrów konfiguracyjnych serwera na poziomie roli:
▪ ALTER ROLE nazwa [IN DATABASE nazwa] SET parametr = wartość

PostgreSQL: wprowadzenie do administracji


51
© 2021 Maciej Zakrzewicz
GRUPOWANIE UŻYTKOWNIKÓW I UPRAWNIEŃ
https://www.postgresql.org/docs/13/static/role-membership.html

▪ Rola może wchodzić w skład innych ról


▪ np. rola-użytkownik może być członkiem roli-grupy
▪ Polecenia:
▪ GRANT rola_grupa TO rola1, ... ;
▪ REVOKE rola_grupa FROM rola1, ... ;

PostgreSQL: wprowadzenie do administracji


52
© 2021 Maciej Zakrzewicz
TWORZENIE RÓL - PRZYKŁADY
# tworzenie konta użytkownika końcowego
create role smith login password 'smith';

# tworzenie grupy użytkowników


create role dyrekcja;

# przydzielenie użytkownika do grupy


grant dyrekcja to smith

# wykaz wszystkich ról (grup i użytkowników końcowych)


\du
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------------------+------------
dyrekcja | Cannot login | {}
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
smith | | {dyrekcja}

# tworzenie konta administratora


create role admin login superuser password 'admin';

© 2021 Maciej Zakrzewicz


53
PostgreSQL: wprowadzenie do administracji
MONITOROWANIE I PRZERYWANIE SESJI UŻYTKOWNIKA

select pid, usename, client_addr from pg_stat_activity; ▪ Poprzez zabicie procesu


backend obsługującego sesję
pid | usename | client_addr użytkownika
-------+----------+------------- ▪ za pomocą funkcji
18076 | postgres | pg_terminate_backend(),
18101 | ewa | lub:
18105 | jan | ▪ poleceniem kill systemu
operacyjnego
18115 | anna |
▪ Przerwanie bieżącego
select pg_terminate_backend(18105); polecenia SQL bez przerywania
sesji
kill 18101 ▪ za pomocą funkcji
pg_cancel_backend()

© 2021 Maciej Zakrzewicz


54
PostgreSQL: wprowadzenie do administracji
ROLE DOMYŚLNE
pg_read_all_settings pozwala odczytywać wszystkie parametry konfiguracyjne serwera
pg_read_all_stats pozwala odczytywać wszystkie widoki pg_stat_*
pozwala uruchamiać funkcje monitorowania, które mogą blokować
pg_stat_scan_tables
tabele w trybie ACCESS SHARE
pg_signal_backend pozwala wysyłać sygnały przerwania zapytania, sesji
pg_read_server_files pozwala odczytywać pliki z dysku serwera (np. polecenie COPY)
pg_write_server_files pozwala zapisywać pliki na dysku serwera (np. polecenie COPY)
pg_execute_server_program pozwala uruchamiać aplikacje na serwerze (np. dla polecenia COPY)
pozwala odczytywać widoki monitoringowe oraz uruchamiać funkcje
pg_monitor monitorujące. Rola ta należy do ról pg_read_all_settings,
pg_read_all_stats i pg_stat_scan_tables.

PostgreSQL: wprowadzenie do administracji


55
© 2021 Maciej Zakrzewicz
UPRAWNIENIA OBIEKTOWE
https://www.postgresql.org/docs/13/sql-grant.html
▪ Właściciel obiektu (np. tabeli) posiada pełnię uprawnień
▪ Uprawnienia przyznawane rolom za pomocą polecenia GRANT uprawnienie ON obiekt TO rola:
▪ SELECT – odczyt tabeli, kolumny, widoku, sekwencji
▪ INSERT – wstawianie rekordów do tabeli
▪ UPDATE – modyfikacja kolumny lub tabeli
▪ DELETE – usuwanie rekordów z tabeli
▪ TRUNCATE – usuwanie zawartości tabeli poleceniem TRUNCATE
▪ TRIGGER – tworzenie wyzwalacza na tabeli
▪ CREATE – tworzenie tabel, schematów, indeksów, przestrzeni tabel
▪ CONNECT – logowanie się do konkretnej bazy danych
▪ TEMP – tworzenie tabel tymczasowych
▪ EXECUTE – uruchamianie funkcji
▪ USAGE – używanie konkretnego języka programowania
▪ USAGE ON SCHEMA – prawo korzystania ze schematu
▪ ALL PRIVILEGES – wszystkie uprawnienia na obiekcie
▪ Dopisek WITH GRANT OPTION daje prawo do dalszego rozdawania otrzymanego uprawnienia
▪ Rola PUBLIC oznacza wręczenie uprawnień wszystkim użytkownikom (obecnym i przyszłym)

PostgreSQL: wprowadzenie do administracji


56
© 2021 Maciej Zakrzewicz
UPRAWNIENIA OBIEKTOWE – POLECENIE \DP
▪ Wyświetlanie uprawnień obiektowych:
GRANT SELECT ON mytable TO PUBLIC; ▪ nazwa_roli=xxxx – uprawnienia
GRANT SELECT, UPDATE, INSERT ON mytable TO admin; przyznane roli
▪ =xxxx – uprawnienia przyznane PUBLIC
GRANT SELECT (col1), UPDATE (col1) ON mytable TO miriam_rw;
▪ r – SELECT ("read")
▪ w – UPDATE ("write")
=> \dp mytable ▪ a – INSERT ("append")
▪ d – DELETE
Access privileges ▪ D – TRUNCATE
Schema | Name | Type | Access privileges | Column access privileges ▪ x – REFERENCES
--------+---------+-------+-----------------------+------------------------- ▪ t – TRIGGER
- ▪ X – EXECUTE
public | mytable | table | miriam=arwdDxt/miriam | col1: ▪ U – USAGE
: =r/miriam : miriam_rw=rw/miriam ▪ C – CREATE
: admin=arw/miriam ▪ c – CONNECT
▪ T – TEMPORARY
▪ arwdDxt – ALL PRIVILEGES
Jak odczytać wszystkie uprawnienia nadane na serwerze? ▪ * – with grant option
Artykuł na blogu ▪ /yyyy – nawa roli, która przyznała te
uprawnienia

© 2021 Maciej Zakrzewicz


57
PostgreSQL: wprowadzenie do administracji
UPRAWNIENIA DOMYŚLNE

alter default privileges in schema myschema


grant select on tables to public;
▪ Będą dotyczyły obiektów,
które zostaną utworzone w
alter default privileges in schema myschema przyszłości
revoke select on tables from public;
▪ do tabel, widoków,
# wyświetlanie uprawnień domyślnych sekwencji, typów lub
select nspname, defaclobjtype, defaclacl funkcji
from pg_default_acl a ▪ nie wpływają na obiekty już
join pg_namespace b on a.defaclnamespace=b.oid;
istniejące
# w psql: ▪ Ustalane poleceniem ALTER
\dpp DEFAULT PRIVILEGES

© 2021 Maciej Zakrzewicz


58
PostgreSQL: wprowadzenie do administracji
UPRAWNIENIA PREDEFINIOWANE (1/2)

postgres=# \dn+
List of schemas
▪ W każdej nowoutworzonej
Name | Owner | Access privileges | Description bazie danych, wszyscy
--------+----------+----------------------+------------------------ użytkownicy (PUBLIC)
public | postgres | postgres=UC/postgres+| standard public schema
| | =UC/postgres |
otrzymują uprawnienia do
schematu PUBLIC (usage,
create)
nadawane automatycznie
▪ Często rekomendowane jest
odebranie tych uprawnień
▪ revoke all privileges
on schema public from
public;

© 2021 Maciej Zakrzewicz


59
PostgreSQL: wprowadzenie do administracji
UPRAWNIENIA PREDEFINIOWANE (2/2)
Pozostałe uprawnienia nadawane automatycznie dla PUBLIC

© 2021 Maciej Zakrzewicz


60
PostgreSQL: wprowadzenie do administracji
OPERACJE VACUUM, ANALYZE, REINDEX

61
PostgreSQL: wprowadzenie do administracji
OPERACJA VACUUM
https://www.postgresql.org/docs/13/sql-vacuum.html
▪ Gdy wykonywane są operacje UPDATE i DELETE, serwer PostgreSQL nie usuwa natychmiast
starego obrazu rekordu
▪ w celu zapewnienia spójności innych transakcji w toku (multiversion concurrency control - MVCC)
▪ Gdy stare obrazy rekordów nie są już potrzebne, mogą być usunięte za pomocą operacji
Vacuum
▪ usuwa stare obrazy rekordów (tzw. martwe rekordy – "dead tuples") i oznacza zajmowane przez nie
miejsce na dysku jako wolne
▪ VACUUM nie zwraca automatycznie wolnego miejsca systemowi operacyjnemu
▪ VACUUM FULL zwraca automatycznie wolne miejsce systemowi operacyjnemu (blokuje całkowicie
tabelę, uniemożliwia operacje SELECT!)
▪ Zwykle wykonywana przez proces drugoplanowy Autovacuum
▪ lub ręcznie przez administratora – np. raz dziennie
▪ VACUUM nazwa_tabeli
▪ VACUUM FULL nazwa_tabeli
▪ program narzędziowy vacuumdb
▪ Należy wykonywać co najmniej raz na 2 miliardy transakcji, aby uniknąć problemu
Transaction ID Wraparound

PostgreSQL: wprowadzenie do administracji


62
© 2021 Maciej Zakrzewicz
MVCC I VACUUM
1
INSERT ROW_1;
INSERT ROW_2;
INSERT ROW_3;
INSERT ROW_4;
INSERT ROW_5; 2 3 4 5
INSERT ROW_6; UPDATE ROW_2; DELETE ROW_4; VACUUM; VACUUM FULL;

block 0 block 0 block 0 block 0 block 0


ROW_4 ROW_4 ROW_4 ROW_6
ROW_3 ROW_3 ROW_3 ROW_5
ROW_2 ROW_2 ROW_2 ROW_3 ROW_3
ROW_1 ROW_1 ROW_1 ROW_1 ROW_1

block 1 block 1 block 1 block 1 block 1

ROW_2 ROW_2 ROW_2


ROW_6 ROW_6 ROW_6 ROW_6
ROW_5 ROW_5 ROW_5 ROW_5 ROW_2

© 2021 Maciej Zakrzewicz


63
PostgreSQL: wprowadzenie do administracji
IN-PAGE VACUUM
▪ In-Page Vacuum to automatyczna, "miniaturowa", efektywna operacja
Vacuum, wykonywana wewnątrz bloku, na którym aktualnie PostgreSQL
wykonuje jakąś modyfikację lub odczyt
▪ jeżeli poprzednia operacja UPDATE nie mogła zmieścić nowej wersji rekordu
w tym samym bloku
▪ jeżeli wypełnienie bloku przekracza ustawienie FILLFACTOR tabeli
▪ Dotyczy tylko bieżącego bloku
▪ ma charakter pomocniczy, optymalizacyjny
▪ Skutki operacji In-Page Vacuum nie są ujawniane w statystykach
systemowych

PostgreSQL: wprowadzenie do administracji


64
© 2021 Maciej Zakrzewicz
OPERACJA ANALYZE
https://www.postgresql.org/docs/13/sql-analyze.html

▪ Może być wykonana jako część VACUUM lub samodzielnie


▪ Może być wywołana przez proces drugoplanowy Autovacuum
▪ Gromadzi/aktualizuje statystyki dla Query Plannera
▪ Powinna być wykonywana po znaczącej zmianie charakterystyki danych w
tabeli
▪ Polecenia:
▪ ANALYZE nazwa_tabeli
▪ VACUUM ANALYZE nazwa_tabeli
▪ Przeglądanie statystyk dla Query Plannera:
▪ widok pg_stats
▪ dokumentacja: https://www.postgresql.org/docs/13/static/view-pg-stats.html

PostgreSQL: wprowadzenie do administracji


65
© 2021 Maciej Zakrzewicz
PROCES AUTOVACUUM
▪ Automatyzuje wykonanie operacji VACUUM i ANALYZE
▪ Analizuje tabele, na których wystąpiła duża liczba operacji INSERT,
UPDATE, DELETE
▪ Konfiguracja progów zadziałania operacji VACUUM i ANALYZE za pomocą
parametrów w pliki postgresql.conf:
▪ vacuum threshold = autovacuum_vacuum_threshold +
autovacuum_vacuum_scale_factor * liczba rekordów
▪ analyze threshold = autovacuum_analyze_threshold +
autovacuum_analyze_scale_factor * liczba rekordów

PostgreSQL: wprowadzenie do administracji


66
© 2021 Maciej Zakrzewicz
MONITOROWANIE VACUUM I ANALYZE
Wyświetlanie liczby rekordów

# ile martwych rekordów znajduje się w tabelach


select relname, pg_stat_get_live_tuples(c.oid), pg_stat_get_dead_tuples(c.oid)
from pg_class c;

select relname, n_live_tup, n_dead_tup from pg_stat_user_tables;

# kiedy wykonano ostatnie operacje Vacuum i Analyze


select relname, last_vacuum, last_autovacuum, last_analyze, last_autoanalyze
from pg_stat_user_tables;

© 2021 Maciej Zakrzewicz


67
PostgreSQL: wprowadzenie do administracji
REINDEX
https://www.postgresql.org/docs/13/sql-reindex.html

▪ W wyniku wielokrotnych aktualizacji indeksów B-drzewo, ich struktura fizyczna ulega


"pogorszeniu" – indeks zajmuje więcej bloków, a wypełnienie bloków się zmniejsza
▪ Polecenie REINDEX umożliwia przebudowę struktury indeksu w celu optymalizacji
struktury fizycznej
▪ logicznie podobne do DROP INDEX + CREATE INDEX
▪ działa szybciej
▪ Składnia:
▪ REINDEX INDEX nazwa_indeksu
▪ REINDEX TABLE nazwa_tabeli -- przebudowuje wszystkie indeksy tabeli
▪ REINDEX DATABASE nazwa_bazy_danych -- przebudowuje wszystkie indeksy w bazie
danych
▪ REINDEX INDEX CONCURRENTLY nazwa_indeksu -- przebudowuje indeks nie blokując
tabeli przed modyfikacjami

PostgreSQL: wprowadzenie do administracji


68
© 2021 Maciej Zakrzewicz
TABELE, WIDOKI, FUNKCJE SYSTEMOWE

69
PostgreSQL: wprowadzenie do administracji
TABELE SYSTEMOWE
▪ Tabele wykorzystywane wewnętrznie przez serwer PostgreSQL do
przechowywania metadanych o obiektach i strukturze systemu
▪ Dostępne dla administratora
▪ bezpośrednio, poprzez widoki systemowe, poprzez funkcje systemowe
▪ nie powinny być modyfikowane ręcznie

PostgreSQL: wprowadzenie do administracji


70
© 2021 Maciej Zakrzewicz
WYBRANE TABELE SYSTEMOWE SYSTEM CATALOGS
https://www.postgresql.org/docs/13/catalogs.html

▪ Specyficzne dla PostgreSQL


▪ pg_attribute – wykaz wszystkich kolumn wszystkich tabel
▪ pg_class – wykaz wszystkich tabel, indeksów, widoków, widoków materializowanych, itp.
▪ pg_database – wykaz wszystkich baz danych
▪ pg_extension – wykaz wszystkich zainstalowanych rozszerzeń serwera
▪ pg_foreign_data_wrapper – wykaz wszystkich zarejestrowanych Foreign Data Wrapper
▪ pg_indexes – wykaz wszystkich indeksów
▪ pg_index – część informacji na temat indeksów
▪ pg_sequence – wykaz wszystkich sekwencji
▪ pg_tablespace – wykaz wszystkich przestrzeni tabel
▪ pg_trigger – wykaz wszystkich wyzwalaczy
▪ pg_matviews – wykaz wszystkich widoków materializowanych
▪ pg_roles – wykaz wszystkich ról na serwerze
▪ pg_settings – wykaz wszystkich parametrów konfiguracyjnych wraz z wartościami
▪ pg_views – wykaz wszystkich widoków
PostgreSQL: wprowadzenie do administracji
71
© 2021 Maciej Zakrzewicz
WYBRANE WIDOKI SYSTEMOWE INFORMATION SCHEMA
https://www.postgresql.org/docs/13/information-schema.html

▪ Zachowują zgodność ze standardem ANSI SQL


▪ information_schema.columns – wykaz wszystkich kolumn wszystkich tabel
▪ information_schema.foreign_data_wrappers – wykaz wszystkich
zarejestrowanych Foreign Data Wrappers
▪ information_schema.schemata – wykaz wszystkich schematów
▪ information_schema.sequences – wykaz wszystkich sekwencji
▪ information_schema.table_privileges – wykaz wszystkich uprawnień
przydzielonych użytkownikom do tabel
▪ information_schema.tables – wykaz wszystkich tabel
▪ information_schema.triggers – wykaz wszystkich wyzwalaczy
▪ information_schema.views – wykaz wszystkich widoków

PostgreSQL: wprowadzenie do administracji


72
© 2021 Maciej Zakrzewicz
WYBRANE FUNKCJE SYSTEMOWE
https://www.postgresql.org/docs/13/functions-info.html

▪ Udostępniają informacje o sesjach i systemie


▪ current_database() - nazwa bieżącej bazy danych
▪ current_user - nazwa bieżącego użytkownika
▪ inet_client_addr() - adres IP bieżącego klienta
▪ pg_backend_pid() - identyfikator systemowy procesu Backend obsługującego bieżącą
sesję
▪ pg_blocking_pids (integer) - lista identyfikatorów procesów Backend, które blokadami
transakcyjnymi wstrzymują pracę procesu Backend o podanym identyfikatorze
▪ pg_current_logfile() - nazwa bieżącego pliku logu
▪ pg_postmaster_start_time() - data i czas uruchomienia serwera PostgreSQL
▪ version() - numer wersji oprogramowania serwera PostgreSQL
▪ has_table_privilege(username,table,privilege) - czy podany użytkownik posiada
podane uprawnienie do wskazanej tabeli
▪ pg_has_role(username,role,'member') - czy podany użytkownik należy do podanej
grupy

PostgreSQL: wprowadzenie do administracji


73
© 2021 Maciej Zakrzewicz
INSTALACJA I UPGRADE SERWERA

74
PostgreSQL: wprowadzenie do administracji
INSTALOWANIE POSTGRESQL
Za pomocą YUM (np. Oracle Linux)

wget https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-
latest.noarch.rpm

rpm –hiv pgdg-redhat-repo-latest.noarch.rpm

yum install postgresql13 postgresql13-server postgresql13-contrib

/usr/pgsql-13/bin/postgresql-13-setup initdb

yum update openssl kreuje inicjalny katalog Data Directory

© 2021 Maciej Zakrzewicz


75
PostgreSQL: wprowadzenie do administracji
INSTALOWANIE POSTGRESQL
Za pomocą DNF (np. CentOS)

dnf install https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-


latest.noarch.rpm

dnf -qy module disable postgresql

dnf install postgresql13 postgresql13-server postgresql13-contrib

/usr/pgsql-13/bin/postgresql-13-setup initdb

yum update openssl kreuje inicjalny katalog Data Directory

© 2021 Maciej Zakrzewicz


76
PostgreSQL: wprowadzenie do administracji
KREOWANIE INICJALNEGO KATALOGU DATA DIRECTORY
https://www.postgresql.org/docs/13/app-initdb.html
▪ Narzędzie initdb generuje nowy, kompletny katalog Data Directory; metody wywołania:
▪ /usr/pgsql-13/bin/initdb
▪ /usr/pgsql-13/bin/pg_ctl initdb
▪ Parametry wywołania:
▪ -D - lokalizacja katalogu Data Directory (domyślnie /var/lib/pgsql/13/data)
▪ --auth, --auth-host, --auth-local - metody uwierzytelniania, jakie zostaną zapisane w
wygenerowanym pliku pg_hba.conf
▪ --encoding - domyślny standard kodowania znaków narodowych dla później tworzonych baz
danych
▪ --data-checksums - czy bloki danych mają wykorzystywać sumy kontrolne
▪ --username - określa nazwę użytkownika-administratora, który zostanie utworzony
▪ --waldir - wskazuje lokalizację katalogu do zapisu plików WAL (tworzy link symboliczny)
▪ --wal-segsize - określa rozmiar pojedynczego pliku WAL (16MB)
▪ initdb jest także wołany przez skrypt postinstalacyjny "postgresql-13-setup init"
▪ otrzymuje parametry --auth scram-sha-256 --auth-local=peer $PGSETUP_INITDB_OPTIONS

PostgreSQL: wprowadzenie do administracji


77
© 2021 Maciej Zakrzewicz
PRZEBIEG PROCESU UPGRADE
Narzędzie pg_upgrade

▪ Instalacja nowej wersji oprogramowania serwera PostgreSQL


▪ w odrębnym katalogu
▪ Inicjalizacja nowego katalogu danych
▪ program initdb
▪ Zatrzymanie obu serwerów PostgreSQL (nowego i starego)
▪ Uruchomienie programu pg_upgrade (z katalogu NOWEGO serwera)
▪ pg_upgrade --old-datadir ... --new-datadir ... --old-bindir ... --new-bindir ...
▪ Przywrócenie zawartości plików pg_hba.conf i postgresql.conf
▪ Opcjonalnie – wykonanie wygenerowanych skryptów poinstalacyjnych
▪ psql --username=postgres --file=script.sql postgres
▪ Usunięcie starego katalogu danych i katalogu binariów
▪ Dokumentacja: https://www.postgresql.org/docs/13/pgupgrade.html

PostgreSQL: wprowadzenie do administracji


78
© 2021 Maciej Zakrzewicz
MONITOROWANIE SERWERA

79
PostgreSQL: wprowadzenie do administracji
KONFIGURACJA LOGÓW SERWERA
Dokumentacja: https://www.postgresql.org/docs/13/static/runtime-config-logging.html

▪ log_destination – rodzaje wykorzystywanych logów: stderr, csvlog, syslog


▪ plik current_logfiles wskazuje bieżące pliki logów w użyciu
▪ logging_collector (on/off) – uruchamia proces drugoplanowy, który przekierowuje
komunikaty stderr do plików logów
▪ log_directory – katalog zapisu plików logu (gdy logging_collector=on)
▪ log_filename – szablon nazwy plików logu (gdy logging_collector=on)
▪ log_rotation_age – czas rotacji plików logu (gdy logging_collector=on)
▪ log_min_messages – poziom zapisów plików logu (INFO, NOTICE, WARNING, ERROR, itp.)
▪ log_connections (on/off) – rejestrowanie połączeń w plikach logu
▪ log_duration (on/off) – rejestrowanie czasu trwania poleceń
▪ log_statement – rejestrowanie poleceń SQL
▪ log_min_duration_statement – czas wykonania, po przekroczeniu którego zapytanie
trafi do pliku logu

PostgreSQL: wprowadzenie do administracji


80
© 2021 Maciej Zakrzewicz
AUTO-EXPLAIN
Dokumentacja: https://www.postgresql.org/docs/13/auto-explain.html

▪ Moduł serwera, umożliwiający rejestrowanie w pliku logu każdego


długotrwałego polecenia SQL wraz z jego planem wykonania
▪ Konfiguracja w pliku postgresql.conf:
▪ shared_preload_libraries = 'auto_explain' – załadowanie modułu
▪ auto_explain.log_min_duration – minimalny czas wykonywania polecenia
(ms), po którym zarejestrowany zostanie jego plan wykonania
▪ auto_explain.log_analyze – generuje wynik EXPLAIN ANALYZE zamiast
EXPLAIN
▪ auto_explain.log_buffers – w celu rejestrowania statystyk użycia Buffer
Cache
▪ auto_explain.log_format – wybór formatu wyniku EXPLAIN (text, xml, json,
yaml)

PostgreSQL: wprowadzenie do administracji


81
© 2021 Maciej Zakrzewicz
MODUŁ PG_STAT_STATEMENTS
▪ Opcjonalny moduł służący do rejestrowania wskaźników wydajnościowych
poleceń SQL realizowanych przez serwer
▪ automatycznie parametryzuje rejestrowane polecenia w celu agregacji pomiarów
▪ Musi zostać załadowany i aktywowany:
▪ shared_preload_libraries = 'pg_stat_statements' w postgresql.conf
▪ create extension pg_stat_statements;
▪ Dostęp do zgromadzonych wskaźników wydajnościowych: widok
pg_stat_statements
▪ Wyczyszczenie zgromadzonych wskaźników: pg_stat_statements_reset()

PostgreSQL: wprowadzenie do administracji


82
© 2021 Maciej Zakrzewicz
WIDOK PG_STAT_STATEMENTS
▪ Jeden rekord per zapytanie
▪ query – treść zapytania
▪ calls – liczba wykonań
▪ total_time – sumaryczny czas wykonywania (ms)
▪ rows – całkowita liczba pobranych/przetworzonych rekordów
▪ shared_blks_hit – całkowita liczba bloków odczytanych z Buffer Cache blocks
▪ shared_blks_read – całkowita liczba bloków odczytanych z dysku
▪ blk_read_time – całkowity czas odczytywania bloków z dysku (ms)
▫ wymaga track_io_timing=on
▪ blk_write_time – całkowity czas zapisywania bloków na dysku (ms)
▫ wymaga track_io_timing=on

PostgreSQL: wprowadzenie do administracji


83
© 2021 Maciej Zakrzewicz
WIDOK PG_STAT_STATEMENTS
Przykład
set track_io_timing=on;

\x

select count(*) from cars where make='audi';

select count(*) from cars where make='bmw';

select * from pg_stat_statements;

-[ RECORD 1 ]-------+-------------------------------------------------------------------
userid | 10
dbid | 13318
queryid | 7614968655942141176 Sparametryzowane, zagregowane
query | select count(*) from cars where make=$1
calls | 2
total_time | 134.91809999999998
min_time | 15.722199999999999
max_time | 119.1959
mean_time | 67.45904999999999
stddev_time | 51.73685
rows | 2
shared_blks_hit | 4000
shared_blks_read | 4000
shared_blks_dirtied | 0
shared_blks_written | 0
local_blks_hit | 0
local_blks_read | 0
local_blks_dirtied | 0
local_blks_written | 0
temp_blks_read | 0
temp_blks_written | 0
blk_read_time | 93.3792
blk_write_time | 0

© 2021 Maciej Zakrzewicz


84
PostgreSQL: wprowadzenie do administracji
MONITOROWANIE PRACY UŻYTKOWNIKÓW - PGAUDIT
https://github.com/pgaudit/pgaudit

▪ Pgaudit - opcjonalne rozszerzenie umożliwiające drobnoziarniste monitorowanie pracy


użytkowników serwera PostgreSQL w standardowym pliku logu
▪ instalacja:
▫ yum install pgaudit15_13 # jako root w systemie operacyjnym
▫ shared_preload_libraries = 'pgaudit' # w pliku postgresql.conf
▫ create extension pgaudit; # za pomocą psql
▪ konfiguracja:
▫ parametr pgaudit.log =
– READ (SELECT, COPY), WRITE (INSERT, UPDATE, DELETE, TRUNCATE, COPY), FUNCTION (funkcje i bloki
anonimowe), ROLE (GRANT, REVOKE, CREATE/ALTER/DROP ROLE), DDL (wszystkie DDL niewymienione w
ROLE), MISC (DISCARD, FETCH, CHECKPOINT, VACUUM)
– np. pgaudit.log = 'read, write'
▫ parametr log_line_prefix = '%m %u %d [%p]: '
– umożliwia rejestrowanie dodatkowych atrybutów, np. nazwy użytkownika, bazy danych, itp.
▪ wyniki zapisywane do logu serwera, format:
▫ 2020-07-20 13:22:16.450 CEST [21059] LOG: AUDIT: SESSION,1,1,READ,SELECT,,,select * from
test;,<not logged>

PostgreSQL: wprowadzenie do administracji


85
© 2021 Maciej Zakrzewicz
STATISTICS COLLECTOR
▪ Komponent serwera PostgreSQL odpowiedzialny za gromadzenie
i raportowanie informacji o aktywności użytkowników
▪ liczby dostępów do tabel i indeksów
▫ na poziomie bloków i rekordów
▪ liczby rekordów w tabelach
▪ operacje Vacuum i Analyze
▪ wykonania funkcji użytkownika
▫ liczba wykonań, czas pracy
▪ aktualne operacje wykonywane w systemie

PostgreSQL: wprowadzenie do administracji


86
© 2021 Maciej Zakrzewicz
STATISTICS COLLECTOR
Konfiguracja

▪ Aktywacja i konfiguracja Statistics Collectora za pomocą parametrów w


pliku postgresql.conf
▪ track_activities – monitorowanie aktualnych operacji wykonywanych w
systemie
▪ track_counts – gromadzenie statystyk na temat tabel i indeksów
▪ track_functions – monitorowanie wykonania funkcji użytkownika
▪ track_io_timing – monitorowanie czasów odczytu/zapisu bloków
dyskowych

PostgreSQL: wprowadzenie do administracji


87
© 2021 Maciej Zakrzewicz
WIDOK PG_STAT_ACTIVITY
Dokumentacja: https://www.postgresql.org/docs/13/static/monitoring-stats.html#PG-STAT-ACTIVITY-VIEW

▪ Prezentuje stan procesów serwera oraz dostarcza informacji o aktualnie wykonywanej


operacji, m.in.:
▪ datname – nazwa bazy danych, do której przyłączony jest proces
▪ pid – identyfikator procesu
▪ usename – nazwa zalogowanego użytkownika
▪ client_addr – adres IP przyłączonego klienta
▪ backend_start – czas uruchomienia procesu
▪ state – stan procesu (active, idle, itp.)
▪ query – tekst ostatnio wykonywanego polecenia
▪ query_start – czas rozpoczęcia ostatnio wykonywanego polecenia
▪ state_change – czas ostatniej zmiany stanu procesu (state)
▪ wait_event – aktualnie trwające zdarzenie oczekiwania (wykaz zdarzeń oczekiwania:
https://www.postgresql.org/docs/13/static/monitoring-stats.html#WAIT-EVENT-TABLE)

PostgreSQL: wprowadzenie do administracji


88
© 2021 Maciej Zakrzewicz
WIDOK PG_STAT_ACTIVITY
Przykład użycia – aktualne operacje

postgres=# select pid, datname, usename, query, query_start


postgres-# from pg_stat_activity where state='active';

pid | datname | usename | query | query_start


-----+----------+----------+-----------------------+---------------------
3520 | postgres | postgres | select pid, datname, | 2018-05-01 11:02:38
| usename, query, |
| query_start |
| from pg_stat_activity |
| where state='active'; |

© 2021 Maciej Zakrzewicz


89
PostgreSQL: wprowadzenie do administracji
WIDOK PG_STAT_ACTIVITY
Przykład użycia – zdarzenia oczekiwania

postgres=# select pid, wait_event_type, wait_event


postgres-# from pg_stat_activity where wait_event is not null;

pid | wait_event_type | wait_event


------+-----------------+---------------
2540 | Lock | relation
6644 | LWLock | ProcArrayLock

proces oczekuje na
założenie blokady na tabeli

© 2021 Maciej Zakrzewicz


90
PostgreSQL: wprowadzenie do administracji
WIDOK PG_STAT_DATABASE
Dokumentacja: https://www.postgresql.org/docs/13/static/monitoring-stats.html#PG-STAT-DATABASE-VIEW

▪ Prezentuje ogólne statystyki aktywności baz danych (od chwili startu serwera), m.in.:
▪ datname – nazwa bazy danych
▪ numbackends – liczba aktualnie przyłączonych procesów klientów
▪ blks_read – liczba bloków odczytanych z dysku
▪ blks_hit – liczba bloków odczytanych z Bufer Cache
▪ tup_returned – liczba odczytanych rekordów (np. pełne odczyty tabel)
▪ tup_fetched – liczba rekordów pobranych przez zapytania (spełniających
kryteria)
▪ tup_inserted – liczba wstawionych rekordów
▪ tup_updated – liczba zmodyfikowanych rekordów
▪ tup_deleted – liczba usuniętych rekordów
▪ blk_read_time – sumaryczny czas odczytu bloków dyskowych (ms)
▪ blk_write_time – sumaryczny czas zapisu bloków dyskowych (ms)

PostgreSQL: wprowadzenie do administracji


91
© 2021 Maciej Zakrzewicz
WIDOK PG_STAT_DATABASE
Przykład użycia

postgres=# select datname, numbackends, blks_read, blks_hit,


postgres-# tup_returned, blk_read_time from pg_stat_database;

datname | numbackends | blks_read | blks_hit | tup_returned | blk_read_time


-----------+-------------+-----------+----------+--------------+---------------
postgres | 1 | 33528 | 2131100 | 6330239 | 54.118
baza01 | 0 | 0 | 0 | 0 | 0
template1 | 0 | 0 | 0 | 0 | 0
template0 | 0 | 0 | 0 | 0 | 0

© 2021 Maciej Zakrzewicz


92
PostgreSQL: wprowadzenie do administracji
WIDOK PG_STAT_ALL_TABLES
Dokumentacja: https://www.postgresql.org/docs/13/static/monitoring-stats.html#PG-STAT-ALL-TABLES-VIEW

▪ Prezentuje informacje o aktywności użytkowników w stosunku do tabel


bazy danych, m.in.:
▪ schemaname – nazwa schematu tabeli
▪ relname – nazwa tabeli
▪ seq_scan – liczba pełnych odczytów tabeli (Sequential Scan)
▪ idx_scan – liczba odczytów z użyciem indeksów
▪ n_tup_ins – liczba wstawionych rekordów
▪ n_tup_upd – liczba zmodyfikowanych rekordów
▪ n_tup_del – liczba usuniętych rekordów
▪ n_mod_since_analyze – przybliżona liczba rekordów zmodyfikowanych od
czasu ostatniej operacji Analyze

PostgreSQL: wprowadzenie do administracji


93
© 2021 Maciej Zakrzewicz
WIDOK PG_STAT_ALL_TABLES
Przykład użycia

postgres=# select relname, seq_scan, idx_scan


postgres-# from pg_stat_all_tables;

relname | seq_scan | idx_scan


-------------------------+----------+----------
pracownicy | 10 | 0
pg_ts_dict | 0 | 0
pg_ts_template | 0 | 0
pg_toast_13656 | 0 | 0
pg_proc | 0 | 57
pg_index | 8 | 172
pg_tablespace | 0 | 2

© 2021 Maciej Zakrzewicz


94
PostgreSQL: wprowadzenie do administracji
WIDOK PG_STAT_ALL_INDEXES
Dokumentacja: https://www.postgresql.org/docs/13/static/monitoring-stats.html#PG-STAT-ALL-INDEXES-VIEW

▪ Prezentuje informacje o aktywności użytkowników w stosunku do


indeksów bazy danych, m.in.:
▪ indexrelname – nazwa indeksu
▪ schemaname – nazwa schematu indeksu
▪ relname – nazwa tabel, na której utworzony jest indeks
▪ idx_scan – liczba odczytów wykonanych na indeksie
▪ idx_tup_read – liczba odczytanych wpisów indeksu

PostgreSQL: wprowadzenie do administracji


95
© 2021 Maciej Zakrzewicz
WIDOK PG_STAT_ALL_INDEXES
Przykład użycia

postgres=# create index prac_idx on pracownicy(id);


CREATE INDEX
postgres=# select indexrelname, relname, idx_scan, idx_tup_read,
postgres-# idx_tup_fetch from pg_stat_all_indexes where schemaname='public';

indexrelname | relname | idx_scan | idx_tup_read | idx_tup_fetch


--------------+------------+----------+--------------+---------------
prac_idx | pracownicy | 0 | 0 | 0

postgres=# select * from pracownicy where id between 100 and 105;


(...)

postgres=# select indexrelname, relname, idx_scan, idx_tup_read,


postgres-# idx_tup_fetch from pg_stat_all_indexes where schemaname='public';

indexrelname | relname | idx_scan | idx_tup_read | idx_tup_fetch


--------------+------------+----------+--------------+---------------
prac_idx | pracownicy | 3 | 8 | 8

© 2021 Maciej Zakrzewicz


96
PostgreSQL: wprowadzenie do administracji
WIDOK PG_STATIO_ALL_TABLES
Dokumentacja: https://www.postgresql.org/docs/13/static/monitoring-stats.html#PG-STATIO-ALL-TABLES-VIEW

▪ Prezentuje informacje o aktywności I/O w stosunku do każdej tabeli w


bazie danych
▪ schemaname – nazwa schematu
▪ relname – nazwa tabeli
▪ heap_blks_read – liczba bloków odczytanych z dysku
▪ heap_blks_hit – liczba bloków odczytanych z Buffer Cache
▪ idx_blks_read – liczba bloków odczytanych z dysku dla wszystkich indeksów
tej tabeli
▪ idx_blks_hit – liczba bloków odczytanych z Buffer Cache dla wszystkich
indeksów tej tabeli

PostgreSQL: wprowadzenie do administracji


97
© 2021 Maciej Zakrzewicz
WIDOK PG_LOCKS
Dokumentacja: https://www.postgresql.org/docs/13/view-pg-locks.html

▪ Prezentuje informacje o aktywnych blokadach transakcyjnych w systemie


▪ locktype – typ blokady (relation, extend, page, tuple,
transactionid, virtualxid, object, userlock, advisory)
▪ database – nazwa bazy danych
▪ relation – nazwa tabeli
▪ transactionid – identyfikator transakcji
▪ mode – nazwa blokady
▪ granted – czy blokada została uzyskana, czy też trwa oczekiwanie

PostgreSQL: wprowadzenie do administracji


98
© 2021 Maciej Zakrzewicz
WIDOK PG_LOCKS
Przykład użycia

SELECT blocked_locks.pid AS blocked_pid,


blocked_activity.usename AS blocked_user,
blocking_locks.pid AS blocking_pid,
blocking_activity.usename AS blocking_user,
blocked_activity.query AS blocked_statement,
blocking_activity.query AS current_statement_in_blocking_process
FROM pg_catalog.pg_locks blocked_locks
JOIN pg_catalog.pg_stat_activity blocked_activity ON blocked_activity.pid = blocked_locks.pid
JOIN pg_catalog.pg_locks blocking_locks
ON blocking_locks.locktype = blocked_locks.locktype
AND blocking_locks.DATABASE IS NOT DISTINCT FROM blocked_locks.DATABASE
AND blocking_locks.relation IS NOT DISTINCT FROM blocked_locks.relation
AND blocking_locks.page IS NOT DISTINCT FROM blocked_locks.page
AND blocking_locks.tuple IS NOT DISTINCT FROM blocked_locks.tuple
AND blocking_locks.virtualxid IS NOT DISTINCT FROM blocked_locks.virtualxid
AND blocking_locks.transactionid IS NOT DISTINCT FROM blocked_locks.transactionid
AND blocking_locks.classid IS NOT DISTINCT FROM blocked_locks.classid
AND blocking_locks.objid IS NOT DISTINCT FROM blocked_locks.objid
AND blocking_locks.objsubid IS NOT DISTINCT FROM blocked_locks.objsubid
AND blocking_locks.pid != blocked_locks.pid
JOIN pg_catalog.pg_stat_activity blocking_activity ON blocking_activity.pid = blocking_locks.pid
WHERE NOT blocked_locks.GRANTED;

© 2021 Maciej Zakrzewicz


99
PostgreSQL: wprowadzenie do administracji
WIDOK PG_LOCKS
Przykład użycia

-[ RECORD 1 ]-------------------------+--------------------------------------
blocked_pid | 13660
blocked_user | postgres
blocking_pid | 2776
blocking_user | postgres
blocked_statement | update cars set price=0 where c_id=1;
current_statement_in_blocking_process | update cars set price=0 where c_id=1;

© 2021 Maciej Zakrzewicz


100
PostgreSQL: wprowadzenie do administracji
STATISTIC COLLECTOR
pozostałe widoki

▪ pg_stat_bgwriter – aktywność procesu Writer


▪ pg_stat_user_functions – aktywność funkcji użytkownika
▪ pg_stat_replication – status replikacji (proces WAL Sender)
▪ pg_stat_wal_receiver – status replikacji (proces WAL Receiver)
▪ Dokumentacja: https://www.postgresql.org/docs/13/static/monitoring-
stats.html

PostgreSQL: wprowadzenie do administracji


101
© 2021 Maciej Zakrzewicz
OCHRONA PRZED SKUTKAMI AWARII

102
PostgreSQL: wprowadzenie do administracji
WERYFIKACJA POPRAWNOŚCI PLIKÓW DANYCH
▪ W domyślnej konfiguracji serwera, uszkodzenia plików danych są wykrywane podczas
dostępu do bloku dyskowego tylko w sytuacji, kiedy blok danych nie może być odczytany z
dysku lub jego zawartość jest nieczytelna
▪ Aby umożliwić automatyczną detekcję "subtelnych" uszkodzeń bloków, wprowadzono
mechanizm sum kontrolnych
▪ Wymagana aktywacja mechanizmu sum kontrolnych
▪ initdb --data-checksums (w chwili tworzenia Data Directory), lub:
▪ pg_checksums (w istniejącym środowisku)
▪ Weryfikacja podczas odczytu bloku przez PostgreSQL lub za pomocą
pg_checksums

PostgreSQL: wprowadzenie do administracji


103
© 2021 Maciej Zakrzewicz
STOSOWANIE PG_CHECKSUMS
https://www.postgresql.org/docs/13/app-pgchecksums.html

$ pg_checksums -D /var/lib/pgsql/13/data --enable


Checksum operation completed
Files scanned: 920
Blocks scanned: 55752 aktywacja sum kontrolnych
pg_checksums: syncing data directory
pg_checksums: updating control file
Checksums enabled in cluster

$ pg_checksums -D /var/lib/pgsql/13/data --check


Checksum operation completed
Files scanned: 920
Blocks scanned: 55752 weryfikacja sum kontrolnych
Bad checksums: 0
Data checksum version: 1

© 2021 Maciej Zakrzewicz


104
PostgreSQL: wprowadzenie do administracji
RODZAJE KOPII BEZPIECZEŃSTWA
▪ Logiczna kopia bezpieczeństwa
▪ eksport zawartości wszystkich tabel w formie plików tekstowych,
zawierających polecenia SQL
▪ wykonywana w trybie online
▪ odtwarzanie polega na wykonaniu poleceń SQL, które budują tabele i
wypełniają je rekordami
▪ Fizyczna kopia bezpieczeństwa
▪ wierna kopia katalogu Data Directory
▪ wykonywana w trybie offline lub online
▪ odtwarzanie polega na skopiowaniu kopii bezpieczeństwa do katalogu Data
Directory

PostgreSQL: wprowadzenie do administracji


105
© 2021 Maciej Zakrzewicz
LOGICZNA KOPIA BEZPIECZEŃSTWA
▪ SQL Dump (https://www.postgresql.org/docs/13/static/app-pgdump.html)
▪ narzędzie pg_dump generuje skrypt poleceń SQL, które mogą być
wykorzystane do zrekonstruowania struktury i zawartości bazy danych
▫ pg_dump nazwa_bazy_danych > plik_kopii_bezpieczeństwa
▫ psql nazwa_bazy_danych < plik_kopii_bezpieczeństwa
▪ narzędzie pg_dumpall generuje kopię bezpieczeństwa wszystkich baz danych
(Database Cluster)
▫ pg_dumpall > plik_kopii_bezpieczeństwa
▫ psql -f plik_kopii_bezpieczeństwa postgres
▪ zapisuje spójny obraz bazy danych, nie blokuje obiektów

PostgreSQL: wprowadzenie do administracji


106
© 2021 Maciej Zakrzewicz
PG_DUMP: UŻYCIE
przykłady

pg_dump -U postgres -f kopia1.sql postgres kopia1.sql


--
-- PostgreSQL database dump
--
pg_dump -U postgres postgres > kopia1.sql
-- Dumped from database version 12.2
-- Dumped by pg_dump version 12.2

pg_dump -U postgres --format=d -f ./kopie postgres SET statement_timeout = 0;


SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
...
CREATE TABLE public.aircraft (
a_id integer,
manufacturer character varying(30),
...);

ALTER TABLE public.aircraft OWNER TO postgres;


danej każdej tabeli COPY public.aircraft (a_id, manufacturer, type, ...
1 Airbus A300-600
w oddzielnym pliku 2
3
Airbus
Airbus
A310-200
A310-300

+ plik katalogowy 4
5
Airbus
Airbus
A318-100
A319-100
6 Airbus A319-100N
7 Airbus A320-200
...

© 2021 Maciej Zakrzewicz


107
PostgreSQL: wprowadzenie do administracji
PG_DUMP: PARAMETRY
wybrane przykłady

▪ --data-only – zapisuje wyłącznie dane, bez struktur tabel


▪ --schema-only – zapisuje wyłącznie struktury tabel, bez danych
▪ --clean – generuje komendy usuwania oryginalnych tabel przed ponownym
załadowaniem
▪ --create – generuje komendę tworzącą bazę danych
▪ -f – zapisuje do pliku o podanej nazwie
▪ --format – format zapisywanych plików: plain (plik SQL), custom (dla pg_restore),
directory (dla pg_restore, tworzy katalog z plikami tabel)
▪ --schema – zapisuje tylko obiekty z podanego schematu (szablon)
▪ --table - zapisuje tylko podane tabele (szablon)
▪ --no-privileges – nie zapisuje uprawnień do obiektów
▪ --compress – włącza kompresję, ustawia stopień kompresji (0-9)
▪ --inserts – generuje polecenia INSERT zamiast COPY

PostgreSQL: wprowadzenie do administracji


108
© 2021 Maciej Zakrzewicz
WCZYTYWANIE KOPII LOGICZNEJ
▪ Jeżeli kopia zapisana w formacie tekstowym (plain):
▪ psql nazwa_bazy_danych < plik_kopii_bezpieczeństwa
▪ psql -f plik_kopii_bezpieczeństwa nazwa_bazy_danych
▪ Jeżeli kopia zapisana w formacie custom lub directory:
▪ za pomocą narzędzia pg_restore
▪ pg_restore plik_kopii_bezpieczeństwa
▪ wybrane parametry pg_restore:
▫ --data-only – ładuje dane do istniejących tabel
▫ --schema-only – wyłącznie tworzy tabele, nie ładuje ich zawartości
▫ --clean – usuwa tabele przed ponownym utworzeniem
▫ --create – tworzy bazę danych
▫ -d – wskazuje bazę danych do ładowania
▫ --schema – ładuje wyłącznie obiekty z podanego schematu
▫ --table – ładuje tylko wskazane tabele
▫ --single-transaction – wykonuje całe ładowanie w ramach jednej transakcji
PostgreSQL: wprowadzenie do administracji
109
© 2021 Maciej Zakrzewicz
WCZYTYWANIE KOPII LOGICZNEJ
przykłady

pg_dump -U postgres --format=d -f ./kopie postgres

pg_restore -U postgres --clean –d postgres ./kopie

psql –U postgres –f kopia.sql

pg_dump -U postgres -f kopia1.sql postgres

© 2021 Maciej Zakrzewicz


110
PostgreSQL: wprowadzenie do administracji
FIZYCZNA KOPIA BEZPIECZEŃSTWA
▪ Fizyczna kopia bezpieczeństwa (w trybie online)
▪ narzędziem pg_basebackup
(https://www.postgresql.org/docs/13/static/app-pgbasebackup.html)
▫ pg_basebackup -h mydbserver -D /usr/local/pgsql/data
▫ lokalnie lub zdalnie
▫ niespójna (wykorzystuje pliki WAL)
▪ poleceniami systemu operacyjnego:
▫ SELECT pg_start_backup('label', false, false);
▫ tar -cf backup.tar /usr/local/pgsql/data
▫ SELECT * FROM pg_stop_backup(false, true);
▫ niespójna (wykorzystuje pliki WAL)

PostgreSQL: wprowadzenie do administracji


111
© 2021 Maciej Zakrzewicz
PG_BASEBACKUP: PARAMETRY
przykłady

▪ -D – katalog do zapisu fizycznej kopii bezpieczeństwa (nieistniejący lub


pusty)
▪ --format – format zapisu fizycznej kopii bezpieczeństwa: plain (taki sam
układ jak katalogu Data Directory) lub tar (do pliku tar)
▪ --max-rate – maksymalna prędkość kopiowania danych, w KB/s
▪ --tablespace-mapping – zmiana lokalizacji katalogów przestrzeni tabel
▪ --wal-method – czy dołączone mają być pliki WAL wygenerowane w czasie
trwania pracy pg_basebackup: none lub fetch
▪ --gzip – kompresja pliku tar
▪ --progress - wyświetla informacje o postępie wykonywania kopii
bezpieczeństwa

PostgreSQL: wprowadzenie do administracji


112
© 2021 Maciej Zakrzewicz
PG_BASEBACKUP: PRZYKŁADY

pg_basebackup -U postgres -D ./backup1

pg_basebackup -U postgres -D ./backup2 --format=tar --gzip

backup_manifest
Plik JSON, zawierający wykaz base.tar.gz
wszystkich skopiowanych pg_wal.tar.gz
plików, ich sumy kontrolne
oraz zakres wpisów WAL
wygenerowanych podczas
wykonywania kopii.

© 2021 Maciej Zakrzewicz


113
PostgreSQL: wprowadzenie do administracji
PLIK BACKUP_MANIFEST

{ "PostgreSQL-Backup-Manifest-Version": 1,
"Files": [
{ "Path": "backup_label", "Size": 226, "Last-Modified": "2021-01-12 10:04:23
GMT", "Checksum-Algorithm": "CRC32C", "Checksum": "c927d580" },
{ "Path": "global/1262", "Size": 8192, "Last-Modified": "2021-01-03 17:35:59
GMT", "Checksum-Algorithm": "CRC32C", "Checksum": "ae6ede64" },
...
{ "Path": "global/pg_control", "Size": 8192, "Last-Modified": "2021-01-12
10:04:22 GMT", "Checksum-Algorithm": "CRC32C", "Checksum": "43872087" }
],
"WAL-Ranges": [
{ "Timeline": 1, "Start-LSN": "0/EB000028", "End-LSN": "0/EB000138" }
],
"Manifest-Checksum":
"04e59701bdafafec5f77117cadd2425e863397a4a1c8447cd34900062b24e1c1"}

© 2021 Maciej Zakrzewicz


114
PostgreSQL: wprowadzenie do administracji
MONITOROWANIE POSTĘPU PG_BASEBACKUP
select * from pg_stat_progress_basebackup;

postgres=# select * from pg_stat_progress_basebackup;


-[ RECORD 1 ]--------+---------------------------------
pid | 14188
phase | waiting for checkpoint to finish
backup_total | 0
backup_streamed | 0
tablespaces_total | 0
tablespaces_streamed | 0
...
postgres=# select * from pg_stat_progress_basebackup;
-[ RECORD 1 ]--------+-------------------------
pid | 14188
phase | streaming database files
backup_total | 25071616
backup_streamed | 17296384
tablespaces_total | 1
tablespaces_streamed | 0
...
postgres=# select * from pg_stat_progress_basebackup;
(0 rows)

© 2021 Maciej Zakrzewicz


115
PostgreSQL: wprowadzenie do administracji
WERYFIKACJA POPRAWNOŚCI KOPII BEZPIECZEŃSTWA

pg_basebackup -D backups/daily ▪ pg_verifybackup


wykorzystuje plik
pg_verifybackup backups/daily
backup successfully verified
backup_manifest do
sprawdzenia:
▪ obecności każdego z plików
kopii bezpieczeństwa
▪ jego sumy kontrolnej
▪ poprawności zabezpieczonych
plików WAL w podanym
zakresie rekordów (użyto do
pg_waldump w trybie cichym)

© 2021 Maciej Zakrzewicz


116
PostgreSQL: wprowadzenie do administracji
ODTWARZANIE BAZY DANYCH Z KOPII FIZYCZNEJ
1. Zatrzymać serwer PostgreSQL
2. Skopiować (wypakować) zawartość fizycznej kopii bezpieczeństwa do
katalogu Data Directory
3. Uruchomić serwer PostgreSQL

PostgreSQL: wprowadzenie do administracji


117
© 2021 Maciej Zakrzewicz
KOMPLETNE ODTWARZANIE BAZY DANYCH
▪ Zastosowanie kopii bezpieczeństwa powoduje przywrócenie stanu, jaki
baza danych posiadała w momencie wykonywania kopii bezpieczeństwa
▪ utrata transakcji, które nastąpiły później
▪ Kompletne odtwarzanie bazy danych polega na przywróceniu jej stanu z
momentu wystąpienia awarii
▪ wymaga uzupełnienia brakujących transakcji
▪ na podstawie zawartości plików WAL zapisanych po wykonaniu kopii
bezpieczeństwa

PostgreSQL: wprowadzenie do administracji


118
© 2021 Maciej Zakrzewicz
KOMPLETNE ODTWARZANIE BAZY DANYCH
Data Directory kopia bezpieczeństwa

9:00 backup rekord 1 rekord 1

WAL:
insert rekord 1
9:05 - rekord 2
rekord 2 rekord 2

insert rekord 1 WAL:


9:10 rekord 2 - rekord 2
rekord 3
rekord 3 - rekord 3

rekord 1 WAL:
rekord 1
9:15 rekord 2 - rekord 2 + rekord 2
rekord 3 - rekord 3
czas rekord 3
awaria
© 2021 Maciej Zakrzewicz
119
PostgreSQL: wprowadzenie do administracji
ARCHIWIZACJA PLIKÓW WAL
▪ Archiwizacja plików WAL
▪ gdy archiwizacja WAL nie jest włączona, pliki dzienników WAL (WAL segment
files) są nadpisywane przez serwer (gdy działania w nich odnotowane zostały
pomyślnie zapisane w plikach danych - checkpoint)
▪ archiwizacja WAL powoduje zapisywanie zapełnionych plików dzienników WAL
w bezpiecznej lokalizacji
▫ wal_level=replica
▫ archive_mode=on
▫ archive_command = 'cp %p /mnt/server/archivedir/%f'

polecenie OS, za pomocą którego serwer będzie archiwizować pliki WAL


PostgreSQL: wprowadzenie do administracji
120
© 2021 Maciej Zakrzewicz
USUWANIE ZBĘDNYCH ARCHIWALNYCH WAL
▪ Po wykonaniu nowej kopii bezpieczeństwa, wcześniejsze archiwalne pliki WAL nie
będą wymagane do odtworzenia bazy danych – mogą zostać usunięte
▪ ręcznie – poprzez obserwację, które pliki archiwalne WAL znajdowały się na dysku przed
rozpoczęciem wykonywania kopii bezpieczeństwa
▪ za pomocą pg_archivecleanup
▪ Narzędzie pg_archivecleanup umożliwia automatyczne usunięcie zbędnych plików
archiwalnych WAL
▪ wymaga dodatkowej instalacji:
▫ yum install postgresql-contrib
▪ Wywołanie pg_archivecleanup:
▪ pg_archivecleanup -n ./arch 000000010000000000000004.00000028.backup

plik "marker", utworzony przez pg_basebackup, w celu zaznaczenia,


do którego momentu można usuwać pliki archiwalne WAL
PostgreSQL: wprowadzenie do administracji
121
© 2021 Maciej Zakrzewicz
ZDALNA ARCHIWIZACJA PLIKÓW WAL
▪ Aplikacja pg_receivewal umożliwia pobieranie zapełnionych plików WAL
na inną maszynę
▪ pg_receivewal -h <adres_serwera_PG> -D <lokalne_archiwum_WAL>
▪ Parametr --synchronous umożliwia pobierane zapisów do pliku WAL w
chwili, gdy się pojawiają, a nie dopiero po zapełnieniu pliku WAL

PostgreSQL pg_receivewal

WAL WALWALWALWALWALWALWALWAL
WAL

PostgreSQL: wprowadzenie do administracji


122
© 2021 Maciej Zakrzewicz
ODTWARZANIE PO AWARII
z wykorzystaniem archiwalnych plików WAL

1. Zatrzymanie serwera bazy danych


2. Przywrócenie fizycznej kopii bezpieczeństwa
3. Dodanie parametru restore_command do postgresql.conf
4. Utworzenie pustego pliku recovery.signal w Data Directory
5. Uruchomienie serwera bazy danych – odtwarzanie stanu bazy danych
odbędzie się automatycznie (poprzez zauważenie pliku
recovery.signal)

PostgreSQL: wprowadzenie do administracji


123
© 2021 Maciej Zakrzewicz
UZUPEŁNIENIE POSTGRESQL.CONF
▪ restore_command – komenda odzyskująca archiwalne pliki WAL
▪ restore_command = 'cp /mnt/server/archivedir/%f %p'
▪ recovery_end_command - komenda wykonywana po zakończeniu
odtwarzania bazy danych
▪ recovery_target_time – czas, według którego odtworzony zostanie
stan bazy danych
▪ tzw. odtwarzanie niepełne, PITR (Point in Time Recovery)

PostgreSQL: wprowadzenie do administracji


124
© 2021 Maciej Zakrzewicz
ODTWARZANIE: POCZĄTKOWA LOKALIZACJA WAL

/usr/pgsql-13/bin/pg_controldata
▪ Podczas odtwarzania bazy
pg_control version number:
...
1300 danych po awarii, PostgreSQL
Latest checkpoint location: 0/EA2A9460 automatycznie odnajduje
Latest checkpoint's REDO location:
Latest checkpoint's REDO WAL file:
0/E7401968
0000000100000000000000E7 początkową pozycję w pliku
...
Latest checkpoint's oldestXID: 479
WAL posługując się plikiem
...
Time of latest checkpoint: Mon 11 Jan 2021 01:34:04 PM CET
global/pg_control
... ▪ binarny, 8kB
wal_level setting: replica
wal_log_hints setting: off ▪ przechowuje informacje
max_connections setting:
max_worker_processes setting:
100
8
systemowe, w tym związane z
max_wal_senders setting: 10 zapisami WAL i operacjami
...
Database block size: 8192
Checkpoint
...
WAL block size: 8192
▪ analiza zawartości za pomocą
Bytes per WAL segment: 16777216 pg_controldata
...

© 2021 Maciej Zakrzewicz


125
PostgreSQL: wprowadzenie do administracji
TIMELINE HISTORY
▪ Po odtworzeniu stanu bazy danych metodą PITR (niepełne), mogłoby
wystąpić ryzyko nadpisywania plików WAL, zawierających historyczne
operacje, które nie zostały zaaplikowane
▪ uniemożliwiłoby powtórzenie błędnie przeprowadzonego odtwarzania PITR
▪ Rozwiązanie: linia czasu (timeline) - po ukończeniu odtwarzania stanu bazy
danych
▪ powstaje jej nowa "inkarnacja", opisana numerem kolejnym, który stanowi prefiks
nazwy plików WAL
▪ nowe pliki WAL nie nadpisują starych
▪ powstaje plik history, zawierający informacje o czasie powstania nowej
inkarnacji
▪ Podczas odtwarzania stanu bazy danych istnieje możliwość wskazania linii
czasu, z której pobierane mają być pliki WAL
▪ parametr recovery_target_timeline
PostgreSQL: wprowadzenie do administracji
126
© 2021 Maciej Zakrzewicz
TIMELINE HISTORY: PRZYKŁAD
timeline: 1
transakcja #1
generowane pliki WAL
transakcja #2
000000010000000000000029
transakcja #3
00000001000000000000002A
odtwarzanie PITR timeline: 2
generowane pliki WAL
00000001000000000000002B
transakcja #4 transakcja #4 00000002000000000000002B
00000001000000000000002C transakcja #5 transakcja #5
00000002000000000000002C
transakcja #6

wygenerowany plik 00000002.history


1 0/2B000000 no recovery target specified

© 2021 Maciej Zakrzewicz


127
PostgreSQL: wprowadzenie do administracji
GDY BRAK KOPII BEZPIECZEŃSTWA
▪ Przy próbie odczytu rekordów z uszkodzonego pliku danych, serwer
PostgreSQL odmawia wykonania polecenia
▪ Parametr zero_damaged_pages umożliwia odczyt rekordów tabeli, która
zawiera uszkodzone bloki
▪ set zero_damaged_pages=on;
▪ odczytywane są rekordy z wszystkich sprawnych bloków
▪ bloki uszkodzone są pomijane

PostgreSQL: wprowadzenie do administracji


128
© 2021 Maciej Zakrzewicz
PRZEGLĄD MECHANIZMÓW REPLIKACJI

129
PostgreSQL: wprowadzenie do administracji
ROZWIĄZANIA HIGH AVAILABILITY
▪ Shared Disk Failover – wspólna macierz dyskowa przyłączona do dwóch
serwerów zdolnych wykonywać oprogramowanie PostgreSQL (nie
jednocześnie)
▪ Filesystem Replication – replikacja plików na poziomie systemu
operacyjnego, pomiędzy dwoma serwerami wykonującymi
oprogramowanie PostgreSQL (np. DRBD)
▪ WAL Shipping – transmisja plików WAL w celu konsumpcji przez drugi
serwer PostgreSQL (wbudowane)
▪ Logical Replication, Trigger-Based Replication, Statement-Based
Replication – transmisja operacji wykonywanych na bazie danych do
drugiego serwera PostgreSQL (np. pglogical, Londiste, Slony, pgpool-II)

PostgreSQL: wprowadzenie do administracji


130
© 2021 Maciej Zakrzewicz
ARCHITEKTURA REPLIKACJI BAZ DANYCH
INSERT, UPDATE, DELETE, SELECT SELECT load
balancer

master hot standby hot standby hot standby


database database database database
walreceiver walreceiver walreceiver
strumień transakcji
WAL
WAL walsender

© 2021 Maciej Zakrzewicz


131
PostgreSQL: wprowadzenie do administracji
WAL SHIPPING
▪ Serwery:
▪ podstawowy (master) – w sposób ciągły generuje pliki WAL, które są przesyłane do
serwera zapasowego (log shipping)
▫ dowolną metodą transferu plików
▫ bezpośrednio poprzez TCP (Streaming Replication) – proces walsender
▪ zapasowy (standby) – pracuje w trybie ciągłego odtwarzania bazy danych za
pomocą otrzymywanych plików WAL serwera podstawowego (proces
walreceiver)
▪ Przygotowanie stanu zerowego serwera zapasowego polega na przeniesieniu
kopii bezpieczeństwa z serwera podstawowego
▪ Gdy serwer podstawowy ulegnie awarii, tryb pracy serwera zapasowego
zostanie przełączony na "podstawowy"
▪ Jednakowe wersje oprogramowania PostgreSQL

PostgreSQL: wprowadzenie do administracji


132
© 2021 Maciej Zakrzewicz
REPLIKACJA ASYNCHRONICZNA I SYNCHRONICZNA
▪ Domyślnie replikacja metodą Streaming Replication jest asynchroniczna
▪ serwer podstawowy (Master) nie wstrzymuje transakcji w oczekiwaniu na potwierdzenie od
serwera zapasowego (Standby)
▪ replikacja może być opóźniona (możliwość celowego opóźnienia - recovery_min_apply_delay)
▪ ryzyko niewielkiej utraty transakcji, które nastąpiły tuż przed awarią serwera podstawowego
▪ Replikacja synchroniczna
▪ transakcja zatwierdzana na serwerze podstawowym (Master) oczekuje na potwierdzenie
replikacji przez serwer zapasowy (Standby)
▪ aktywowana parametrami:
▫ synchronous_commit: remote_write (czekaj aż Standby skieruje transakcję do zapisu na
dysku), on (czekaj aż Standby ukończy zapis transakcji na dysku), remote_apply (czekaj aż
Standby zaaplikuje transakcję)
▫ synchronous_standby_names: nazwy serwerów zapasowych, które podlegają synchronicznej
replikacji (np. ' ANY 3 (s1, s2, s3, s4)', 'FIRST 3 (s1, s2, s3, s4)', 's1, s2')
– nazwa serwera zapasowego: parametr application_name

PostgreSQL: wprowadzenie do administracji


133
© 2021 Maciej Zakrzewicz
WAL STREAMING REPLICATION
INSERT, UPDATE, DELETE, SELECT SELECT load
balancer

postgresql.conf
hot_standby = on
master hotprimary_conninfo
standby =hot standby
'host=localhost hot standby
port=5432
database user=postgres
database password=postgres'
database database
port = 5433
port=5432 postgresql.conf walreceiver walreceiver walreceiver
wal_level=replica
strumień transakcji <pusty> standby.signal
WAL
walsender

© 2021 Maciej Zakrzewicz


134
PostgreSQL: wprowadzenie do administracji
WAL STREAMING REPLICATION - KONFIGURACJA
/usr/pgsql-13/bin/pg_ctl –D data stop
cp -R data standby
echo "hot_standby = on" >> standby/postgresql.conf
echo "primary_conninfo = 'host=127.0.0.1 port=5432 user=postgres'" >> standby/postgresql.conf
echo "port = 5433" >> standby/postgresql.conf
touch standby/standby.signal
/usr/pgsql-13/bin/pg_ctl -D data start
MASTER STANDBY
/usr/pgsql-13/bin/pg_ctl -D standby start
data_directory: data data_directory: standby
port: 5432 port: 5433
# sprawdzenie działania replikacji
psql –p 5432
create table test(msg varchar(100));insert into test values ('Hello');
\q
psql –p 5433
select * from test;
Hello
\q

© 2021 Maciej Zakrzewicz


135
PostgreSQL: wprowadzenie do administracji
MONITOROWANIE WAL STREAMING REPLICATION
▪ pid: identyfikator procesu
walsender
select * from pg_stat_replication;
▪ state: stan procesu walsender
pid | 28442 (startup, catchup, streaming,
usesysid | 10 backup, stopping)
usename
application_name
|
|
postgres
server1
▪ sent_lsn: adres ostatniego
client_addr | wysłanego wpisu WAL
client_hostname
client_port
|
| -1
▪ write_lsn: adres ostatniego wpisu
backend_start | 2020-07-16 11:12:43.531439+02 WAL skierowanego na dysk przez
backend_xmin | serwer zapasowy
state
sent_lsn
|
|
streaming
0/4016728
▪ flush_lsn: adres ostatniego wpisu
write_lsn | 0/4016728 WAL zapisanego na dysku przez
flush_lsn | 0/40166C0 serwer zapasowy
replay_lsn
write_lag
|
|
0/40166C0
00:00:00.00009
▪ replay_lsn: adres ostatniego wpisu
flush_lag | 00:00:00.00009 WAL zaaplikowanego przez serwer
replay_lag | 00:00:00.00009 zapasowy
sync_priority
sync_state
|
|
0
async
▪ replay_lag: opóźnienie pomiędzy
reply_time | 2020-07-16 12:03:34.175298+02 zapisaniem zmiany do pliku WAL
przez serwer podstawowy, a
zaaplikowaniem tej zmiany przez
serwer zapasowy
© 2021 Maciej Zakrzewicz
136
PostgreSQL: wprowadzenie do administracji
MONITOROWANIE WAL STREAMING REPLICATION

select * from pg_stat_wal_receiver; ▪ pid: identyfikator procesu


walreceiver
pid | 28441
status | streaming ▪ status: aktualny status procesu
receive_start_lsn | 0/4000000 walreceiver
receive_start_tli | 1 ▪ receive_start_lsn: adres wpisu
received_lsn | 0/4016760 WAL z chwili uruchamiania procesu
received_tli | 1
walreceiver
last_msg_send_time | 2020-07-16 12:07:38.97492+02
last_msg_receipt_time | 2020-07-16 12:07:38.974943+02 ▪ received_lsn: adres ostatniego
latest_end_lsn | 0/4016760 wpisu WAL pobranego i zapisanego
latest_end_time | 2020-07-16 12:03:38.668598+02 na dysku
slot_name |
▪ conninfo: parametry połączenia z
sender_host | /var/run/postgresql
sender_port | 11002
serwerem podstawowym
conninfo | user=postgres ...

© 2021 Maciej Zakrzewicz


137
PostgreSQL: wprowadzenie do administracji
PROBLEM CIĄGŁOŚCI REPLIKACJI
▪ Gdy serwer zapasowy (Standby) zostanie chwilowo zatrzymany, po
ponownym uruchomieniu "nadgoni" serwer podstawowy (Master) na
podstawie zawartości plików WAL
▪ Gdy serwer zapasowy (Standby) był zatrzymany na dłuższy czas:
▪ potrzebne pliki WAL mogły zostać już usunięte przez serwer podstawowy
▪ rozwiązania:
▫ zachowywanie na dysku zbędnych już danych WAL w rozmiarze określonym
parametrem wal_keep_size (w MB)
▫ włączenie archiwizacji plików WAL po stronie serwera podstawowego
▫ utworzenie obiektu Replication Slot, który gwarantuje, że serwer podstawowy nie
usunie pliku WAL, dopóki nie zostanie on skonsumowany przez serwer zapasowy

PostgreSQL: wprowadzenie do administracji


138
© 2021 Maciej Zakrzewicz
REPLICATION SLOT
▪ Tworzenie za pomocą funkcji pg_create_physical_replication_slot:
▪ select pg_create_physical_replication_slot('slot1');
▪ limit określony parametrem max_replication_slots (domyślnie 10)
▪ Usuwanie za pomocą funkcji pg_drop_replication_slot:
▪ select pg_drop_replication_slot('slot1');
▪ Monitorowanie:
▪ select * from pg_replication_slots;
▪ Serwer zapasowy wskazuje Replication Slot zdefiniowany na serwerze
podstawowym:
▪ primary_slot_name = 'slot1'
▪ Uwaga: zdefiniowany, a nieużywany Replication Slot może spowodować
paraliż serwera z powodu nieusuwania starych plików WAL!

PostgreSQL: wprowadzenie do administracji


139
© 2021 Maciej Zakrzewicz
REPLICATION SLOT – KONFIGURACJA REPLIKACJI
/usr/pgsql-13/bin/pg_ctl –D data stop
cp -R data standby

echo "hot_standby = on" >> standby/postgresql.conf


echo "primary_conninfo = 'host=127.0.0.1 port=5432 user=postgres'" >> standby/postgresql.conf
echo "port = 5433" >> standby/postgresql.conf
echo "primary_slot_name = 'slot1'" >> standby/postgresql.conf

touch standby/standby.signal

/usr/pgsql-13/bin/pg_ctl -D data start


psql –p 5432
select pg_create_physical_replication_slot('slot1');
\q

/usr/pgsql-13/bin/pg_ctl -D standby start

© 2021 Maciej Zakrzewicz


140
PostgreSQL: wprowadzenie do administracji
REPLICATION SLOT - MONITOROWANIE

select * from pg_replication_slots; ▪ slot_name: nazwa slotu


▪ slot_type: typ slotu (physical,
slot_name | slot1 logical)
plugin | ▪ active: czy slot jest aktualnie
slot_type | physical używany
datoid | ▪ active_pid: identyfikator
database | procesu walsender aktualnie
temporary | f korzystającego z tego slotu
active | t ▪ restart_lsn: najstarszy adres
active_pid | 27973 wpisu WAL blokowany przez ten
xmin | slot (przed usunięciem)
catalog_xmin | ▪ confirmed_flush_lsn: dla slotów
restart_lsn | 0/16C8E30 logicznych – ostatni pobrany przez
confirmed_flush_lsn | klienta adres wpisu WAL

© 2021 Maciej Zakrzewicz


141
PostgreSQL: wprowadzenie do administracji
FAILOVER
▪ Po awarii serwera podstawowego (Master), serwer zapasowy (Standby)
musi zostać przełączony do roli podstawowego
▪ operacja promote wywołana przez administratora
▫ za pomocą pg_ctl promote
▫ za pomocą funkcji pg_promote()
▫ poprzez utworzenie pliku wskazanego parametrem promote_trigger_file
▪ Po aktywacji nowego serwera podstawowego (Master), stary serwer
podstawowy może zostać przekształcony w serwer zapasowy (Standby)
▪ poprzez przeniesienie kopii nowego serwera podstawowego, lub:
▪ poprzez odświeżenie dotychczasowego stanu za pomocą pg_rewind

PostgreSQL: wprowadzenie do administracji


142
© 2021 Maciej Zakrzewicz
FAILOVER - PRZYKŁAD

/usr/pgsql-13/bin/pg_ctl -D data stop # symulacja awarii

psql -p 5433
select pg_is_in_recovery(); # czy w trybie standby?
t

select pg_promote(); # aktywacja

select pg_is_in_recovery(); # czy w trybie standby?


f
MASTER STANDBY MASTER
data_directory: data data_directory: standby
port: 5432 port: 5433

© 2021 Maciej Zakrzewicz


143
PostgreSQL: wprowadzenie do administracji
REPLIKACJA LOGICZNA
▪ Polega na replikacji modyfikowanych rekordów
▪ a nie replikacji zmian bajtów na poziomie bloków (replikacja fizyczna WAL
Shipping)
▪ Opiera się na modelu Publish-Subscribe
▪ serwer Master publikuje (rozgłasza) informacje o modyfikacjach rekordów
▪ serwery Slave subskrybują informacje rozgłaszane przez serwer Master
▪ Przykłady zastosowań:
▪ konsolidacja danych z wielu źródłowych baz danych do jednej docelowej
▪ replikacja danych pomiędzy różnymi wersjami oprogramowania PostgreSQL
▪ replikacja fragmentu bazy danych, wybranych operacji (np. INSERT)

PostgreSQL: wprowadzenie do administracji


144
© 2021 Maciej Zakrzewicz
REPLIKACJA LOGICZNA
konfiguracja

▪ Po stronie serwera Master:


▪ wymagane ustawienie wal_level=logical
▪ zdefiniowanie zbioru tabel do replikacji – ich modyfikacje będą rozgłaszane
▫ create publication mypublication for table users, departments;
▫ create publication alltables for all tables;
▫ create publication insert_only for table mydata
with (publish = 'insert');
▪ Po stronie serwera Slave:
▪ zarejestrowanie subskrypcji zmian pochodzących od serwera Master
▫ create subscription mysub
connection 'host=192.168.1.50 port=5432 user=foo password=pass
dbname=foodb' publication mypublication, insert_only;

PostgreSQL: wprowadzenie do administracji


145
© 2021 Maciej Zakrzewicz
OPTYMALIZACJA ZAPYTAŃ: PRZEGLĄD

146
PostgreSQL: wprowadzenie do administracji
QUERY PLANNER
▪ Moduł Query Planner jest odpowiedzialny za:
▪ wygenerowanie wszystkich możliwych planów wykonania zapytania
▪ oszacowanie kosztów wykonania każdego z wygenerowanych planów
▪ wybór najtańszego planu

PostgreSQL: wprowadzenie do administracji


147
© 2021 Maciej Zakrzewicz
JAK DZIAŁA QUERY PLANNER
kroki pracy
Zapytanie

Transformuj

Wygeneruj „wszystkie”
możliwe
plany wykonania

statystyki
Oszacuj koszty Wybierz
parametry planów wykonania Plan
najtańszy
optymalny

© 2021 Maciej Zakrzewicz


148
PostgreSQL: wprowadzenie do administracji
QUERY PLANNER
koszt zwrócenia koszt zwrócenia
pierwszego rekordu wszystkich rekordów

EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 100;


▪ Zapytania SQL
QUERY PLAN przekazywane do serwera
---------------------------------------------------------
Bitmap Heap Scan on tenk1 (cost=5.07..229.20 rows=101 width=244) są przekształcane do
Recheck Cond: (unique1 < 100)
-> Bitmap Index Scan on tenk1_unique1 (cost=0.00..5.04 rows=101 width=0)
postaci planów wykonania
Index Cond: (unique1 < 100) (query plans) przez moduł
EXPLAIN SELECT *
przewidywana liczba przewidywany Query Plannera
FROM tenk1 t1, tenk2 t2 rekordów rozmiar rekordu ▪ Plan wykonania jest
WHERE t1.unique1 < 10 AND t2.unique2 < 10 AND t1.hundred < t2.hundred;
wybierany na podstawie
QUERY PLAN
----------------------------------------------------------
szacunków kosztów (Query
Nested Loop (cost=4.65..49.46 rows=33 width=488)
Join Filter: (t1.hundred < t2.hundred)
Planner)
-> Bitmap Heap Scan on tenk1 t1 (cost=4.36..39.47 rows=10 width=244) ▪ w oparciu o statystyki
Recheck Cond: (unique1 < 10)
-> Bitmap Index Scan on tenk1_unique1 (cost=0.00..4.36 rows=10 width=0) ▪ Do kontrolnego
wyświetlenia planu
Index Cond: (unique1 < 10)
-> Materialize (cost=0.29..8.51 rows=10 width=244)
-> Index Scan using tenk2_unique2 on tenk2 t2 (cost=0.29..8.46 rows=10 width=244)
Index Cond: (unique2 < 10) wykonania służy polecenie
EXPLAIN
© 2021 Maciej Zakrzewicz
149
PostgreSQL: wprowadzenie do administracji
WIZUALIZACJA PLANU WYKONANIA
http://tatiyants.com/pev

© 2021 Maciej Zakrzewicz


150
PostgreSQL: wprowadzenie do administracji
WERYFIKACJA SZACUNKÓW QUERY PLANNERA

EXPLAIN ANALYZE SELECT *


FROM tenk1 t1, tenk2 t2
WHERE t1.unique1 < 10 AND t1.unique2 = t2.unique2;

QUERY PLAN
-------------------------------------------------------------------------------------------------
Nested Loop (cost=4.65..118.62 rows=10 width=488) (actual time=0.128..0.377 rows=10 loops=1)
-> Bitmap Heap Scan on tenk1 t1 (cost=4.36..39.47 rows=10 width=244) (actual time=0.057..0.121 rows=10 loops=1)
Recheck Cond: (unique1 < 10)
-> Bitmap Index Scan on tenk1_unique1 (cost=0.00..4.36 rows=10 width=0) (actual time=0.024..0.024 rows=10 loops=1)
Index Cond: (unique1 < 10)
-> Index Scan using tenk2_unique2 on tenk2 t2 (cost=0.29..7.91 rows=1 width=244) (actual time=0.021..0.022 rows=1 loops=10)
Index Cond: (unique2 = t1.unique2)
Planning time: 0.181 ms
Execution time: 0.501 ms

actual time – czas zwrócenia pierwszego rekordu/wszystkich rekordów


rows – rzeczywista liczba zwróconych rekordów
loops – liczba iteracji

© 2021 Maciej Zakrzewicz


151
PostgreSQL: wprowadzenie do administracji
EXPLAIN BUFFERS
Informacje o liczbie bloków pobranych z bufora

explain (analyze, buffers) select count(*) from mytable;

QUERY PLAN
--------------------------------------------------------------------------------------
Aggregate (cost=179889.00..179889.01 rows=1 width=8)
(actual time=1287.306..1287.307 rows=1 loops=1)
Buffers: shared hit=10869 read=44020
-> Seq Scan on mytable (cost=0.00..154889.00 rows=10000000 width=0)
(actual time=0.022..751.461 rows=10000000 loops=1)
Buffers: shared hit=10869 read=44020

shared hit – liczba bloków pobranych z bufora


read – liczba bloków pobranych z dysku

© 2021 Maciej Zakrzewicz


152
PostgreSQL: wprowadzenie do administracji
GENETIC QUERY OPTIMIZER
Genetyczny optymalizator zapytań - https://www.postgresql.org/docs/13/geqo.html

▪ Stosuje heurystyki w celu ograniczenia przestrzeni poszukiwań optymalnego


planu wykonania w przypadku bardzo skomplikowanych zapytań
▪ losowo generuje inicjalny zbiór planów
▪ najlepsze plany poddaje mutacjom w celu ich ulepszania
▪ może znajdować plany gorsze niż tradycyjny Query Planner, plany mogą się
zmieniać w kolejnych wykonaniach tego samego zapytania
▪ znajduje plany szybciej niż tradycyjny Query Planner
▪ Konfiguracja:
▪ geqo (true/false) – włącza/wyłącza genetyczny optymalizator zapytań
(domyślnie włączony)
▪ geqo_threshold (domyślnie 12) – genetyczny optymalizator zapytań będzie
stosowany dla zapytań, w których występuje co najmniej geqo_threshold
elementów w klauzuli FROM

PostgreSQL: wprowadzenie do administracji


153
© 2021 Maciej Zakrzewicz
METODY DOSTĘPU DO DANYCH

154
PostgreSQL: wprowadzenie do administracji
WYKORZYSTYWANIE INDEKSÓW
Przykładowa tabela

create table mytable (id int, num numeric);

insert into mytable


select generate_series, random() * 1000
from generate_series(1, 10000000);

create index myidx on mytable(num);

© 2021 Maciej Zakrzewicz


155
PostgreSQL: wprowadzenie do administracji
ODCZYT SEKWENCYJNY

explain select * from mytable where num < 20000; ▪ Seq Scan – odczytuje
QUERY PLAN kolejno wszystkie bloki
-------------------------------------------------------------------- tabeli, wyszukuje rekordy o
Seq Scan on mytable (cost=0.00..179891.55 rows=10000124 width=15)
Filter: (num < '20000'::numeric) podanej wartości klucza
▪ odczytuje (i pomija) także
wszystkie "dead rows"

gdy pobierany duży fragment tabeli ▪ Dostęp sekwencyjny do


dysku (sequential read)

© 2021 Maciej Zakrzewicz


156
PostgreSQL: wprowadzenie do administracji
WYKORZYSTYWANIE INDEKSÓW

explain select * from mytable where num = 20000; ▪ Index Scan – znajduje
wartości klucza w indeksie,
QUERY PLAN odczytuje wskaźniki (TID) na
--------------------------------------------------------------------- rekordy tabeli, odczytuje
Index Scan using myidx on mytable (cost=0.43..8.45 rows=1 width=15)
rekordy tabeli
Index Cond: (num = '20000'::numeric)
▪ Rekordy odczytywane
pojedynczo
▪ Ten sam blok tabeli może być
gdy pobierany mały fragment tabeli odczytywany wielokrotnie
▪ Indeks i tabela odwiedzane
naprzemiennie
▪ Dostęp swobodny do dysku
(random read)

© 2021 Maciej Zakrzewicz


157
PostgreSQL: wprowadzenie do administracji
WYKORZYSTYWANIE INDEKSÓW

explain select * from mytable where num < 200; ▪ Bitmap Index Scan –
przeszukuje indeks w celu
QUERY PLAN
znalezienia wartości klucza,
gromadzi wskaźniki na
------------------------------------------------------------------------------
rekordy w formie bitmapy TID
Bitmap Heap Scan on mytable (cost=46566.87..126596.28 rows=2011153 width=15)
lub bloków (gdy bitmapa TID
Recheck Cond: (num < '200'::numeric) jest zbyt wielka)
-> Bitmap Index Scan on myidx (cost=0.00..46064.08 rows=2011153 width=0) ▪ gdy zastosowana jest
Index Cond: (num < '200'::numeric) bitmapa bloków, konieczna
jest wtórna weryfikacja
rekordów (Recheck Cond)
▪ Bitmap Heap Scan – sortuje
bitmapę TID lub bloków,
gdy pobierany średni fragment tabeli odczytuje rekordy z tabeli
▪ Może łączyć wiele indeksów
▪ Dostępy swobodne
i sekwencyjne do dysku

© 2021 Maciej Zakrzewicz


158
PostgreSQL: wprowadzenie do administracji
WYKORZYSTYWANIE INDEKSÓW
użycie wielu indeksów jednocześnie

explain select * from mytable where num < 2 and id < 50000;
▪ Query Planner rozważa
QUERY PLAN
także użycie wielu
----------------------------------------------------------------- indeksów jednocześnie
Bitmap Heap Scan on mytable
(cost=1472.74..1876.72 rows=104 width=15)
▪ na podstawie każdego
Recheck Cond: ((num < '2'::numeric) AND (id < 50000)) indeksu generowana
-> BitmapAnd (cost=1472.74..1472.74 rows=104 width=0) bitmapa TID lub
-> Bitmap Index Scan on myidx bloków
(cost=0.00..421.40 rows=18262 width=0)
▪ operacja BitmapAnd
Index Cond: (num < '2'::numeric)
lub BitmapOr na
-> Bitmap Index Scan on myidx2
(cost=0.00..1051.04 rows=56881 width=0) bitmapach
Index Cond: (id < 50000)

© 2021 Maciej Zakrzewicz


159
PostgreSQL: wprowadzenie do administracji
WYKORZYSTYWANIE INDEKSÓW

explain select num from mytable where num = 20000; ▪ Index Only Scan – wynik
zapytania powstaje
QUERY PLAN
--------------------------------------------------------------------------
wyłącznie na podstawie
Index Only Scan using myidx on mytable (cost=0.43..8.45 rows=1 width=11) przeszukania indeksu, bez
Index Cond: (num = '20000'::numeric) fizycznego dostępu do
tabeli
▪ tzw. covering index
▪ Może zaistnieć potrzeba
gdy wszystkie potrzebne dane znajdują się w indeksie sięgnięcia do tabeli w
związku z MVCC
▪ gdy tabela była ostatnio
modyfikowana

© 2021 Maciej Zakrzewicz


160
PostgreSQL: wprowadzenie do administracji
WYKORZYSTYWANIE CTID

select ctid, * from mytable order by num limit 3;


▪ Wyszukiwanie na podstawie
ctid | id | num CTID polega na
-------------+---------+---------------------- natychmiastowym sięgnięciu
(39132,150) | 7129426 | 0.000177416950464249 do bloku o wskazanym adresie
(21817,33) | 3974712 | 0.000255182385444641
(24046,125) | 4380871 | 0.000314787030220032 ▪ nie występuje pełne
przeszukiwanie tabeli
explain select * from mytable where ctid='(24046,125)'; ▪ nie są potrzebne indeksy
QUERY PLAN
▪ optymalny koszt
-------------------------------------------------------- ▪ Uwaga: CTID może ulec
Tid Scan on mytable (cost=0.00..4.01 rows=1 width=15) zmianie po zakończeniu
TID Cond: (ctid = '(24046,125)'::tid)
transakcji!

© 2021 Maciej Zakrzewicz


161
PostgreSQL: wprowadzenie do administracji
SORTOWANIE REKORDÓW

explain select * from mytable order by num; ▪ Operacja sortowania


wykonywana:
QUERY PLAN ▪ w pamięci Work Memory
--------------------------------------------------------- ▫ jeśli rozmiar work_mem jest
Sort (cost=1659366.83..1684366.83 rows=10000000 width=15) wystarczający
Sort Key: num ▪ na dysku, za pomocą algorytmu
-> Seq Scan on mytable (cost=0.00..154889.00 sortowania zewnętrznego
rows=10000000 width=15) ▫ jeśli rozmiar work_mem jest
niewystarczający
▫ pliki tymczasowe zapisywane w
base/pgsql_tmp
▫ możliwe monitorowanie plików
tymczasowych: log_temp_files
▪ z wykorzystaniem indeksu

© 2021 Maciej Zakrzewicz


162
PostgreSQL: wprowadzenie do administracji
SORTOWANIE Z WYKORZYSTANIEM INDEKSU

explain select * from mytable order by num;


▪ Możliwe wykorzystanie
QUERY PLAN
indeksu w celu posortowania
--------------------------------------------------------- rekordów
Index Scan using myidx on mytable
(cost=0.44..523580.44 rows=10000000 width=36)

© 2021 Maciej Zakrzewicz


163
PostgreSQL: wprowadzenie do administracji
LIMIT I OFFSET

explain analyze select * from mytable limit 5;


▪ Operator Limit zatrzyma
QUERY PLAN
--------------------------------------------------------------- wykonywanie Seq Scan z
Limit (cost=0.00..0.08 rows=5 width=15)
(actual time=0.108..0.111 rows=5 loops=1)
chwilą uzyskania
-> Seq Scan on mytable
(cost=0.00..154889.00 rows=10000000 width=15)
odpowiedniej liczby
(actual time=0.103..0.105 rows=5 loops=1) rekordów
explain analyze select * from mytable limit 5 offset 10;

QUERY PLAN
---------------------------------------------------------------
Limit (cost=0.15..0.23 rows=5 width=15)
(actual time=0.023..0.024 rows=5 loops=1)
-> Seq Scan on mytable
(cost=0.00..154889.00 rows=10000000 width=15)
(actual time=0.021..0.022 rows=15 loops=1)

© 2021 Maciej Zakrzewicz


164
PostgreSQL: wprowadzenie do administracji
AGREGACJA
Aggregate

explain select max(num) from mytable;


▪ Operacja Aggregate na
QUERY PLAN
-------------------------------------------------------------------------- zbiorze danych wejściowych
Aggregate (cost=179889.00..179889.01 rows=1 width=32)
-> Seq Scan on mytable (cost=0.00..154889.00 rows=10000000 width=11)
▪ Niektóre agregaty mogą być
postgres=# explain select max(id) from mytable;
pobrane z indeksu (Index
QUERY PLAN
Only Scan)
----------------------------------------------------------------------------
Result (cost=0.47..0.48 rows=1 width=4)
InitPlan 1 (returns $0)
-> Limit (cost=0.44..0.47 rows=1 width=4)
-> Index Only Scan Backward using myidx2 on mytable
(cost=0.44..339580.44 rows=10000000 width=4)
Index Cond: (id IS NOT NULL)

© 2021 Maciej Zakrzewicz


165
PostgreSQL: wprowadzenie do administracji
AGREGACJA
GroupAggregate

explain select avg(num) from mytable group by trunc(id/1000);


▪ Operacja GroupAggregate
QUERY PLAN pochodzi z wczesnych wersji
---------------------------------------------------------
GroupAggregate (cost=1802721.83..2077721.83 rows=10000000 width=40)
serwera PostgreSQL
Group Key: (trunc(((id / 1000))::double precision))
▪ Wylicza wartości funkcji
-> Sort (cost=1802721.83..1827721.83 rows=10000000 width=19)
Sort Key: (trunc(((id / 1000))::double precision)) grupowej
Wykorzystywana do
-> Seq Scan on mytable
(cost=0.00..229889.00 rows=10000000 width=19) ▪
agregacji z GROUP BY
▪ Od PostgreSQL 7.4 często
zastępowana przez
HashAggregate

© 2021 Maciej Zakrzewicz


166
PostgreSQL: wprowadzenie do administracji
AGREGACJA
HashAggregate

explain select avg(price) from cars group by make;


QUERY PLAN
▪ Operacja HashAggregate
------------------------------------------------------------------- zbiera dane z kubełki
HashAggregate (cost=5347.00..5347.05 rows=4 width=13)
Group Key: make
haszowe
-> Seq Scan on cars (cost=0.00..4847.00 rows=100000 width=13)
▪ Wylicza wartości funkcji
grupowej
▪ Wykorzystywana do
agregacji z GROUP BY
DISTINCT,UNION
▪ Sterowana parametrem
enable_hashagg

© 2021 Maciej Zakrzewicz


167
PostgreSQL: wprowadzenie do administracji
CTE SCAN
explain select c_id, price/(select avg(price) from cars)
from cars where price>(select avg(price) from cars);
QUERY PLAN
--------------------------------------------------------------- ▪ CTE: Common Table
Seq Scan on cars (cost=10194.03..15374.36 rows=33333 width=12)
Filter: (price > $1) Expression
InitPlan 1 (returns $0)
-> Aggregate (cost=5097.00..5097.01 rows=1 width=8)
-> Seq Scan on cars cars_1 (cost=0.00..4847.00 rows=100000 width=8)
▪ Reużywane fragmenty
InitPlan 2 (returns $1)
-> Aggregate (cost=5097.00..5097.01 rows=1 width=8) zapytania
-> Seq Scan on cars cars_2 (cost=0.00..4847.00 rows=100000 width=8)

explain with srednia_cena as (select avg(price) as s from cars)


select c_id, price/(select s from srednia_cena)
from cars where price>(select s from srednia_cena);
QUERY PLAN
-----------------------------------------------------------------------------------
Seq Scan on cars (cost=5097.05..10277.39 rows=33333 width=12)
Filter: (price > $2)
CTE srednia_cena
-> Aggregate (cost=5097.00..5097.01 rows=1 width=8)
-> Seq Scan on cars cars_1 (cost=0.00..4847.00 rows=100000 width=8)
InitPlan 2 (returns $1)
-> CTE Scan on srednia_cena (cost=0.00..0.02 rows=1 width=8)
InitPlan 3 (returns $2)
-> CTE Scan on srednia_cena srednia_cena_1 (cost=0.00..0.02 rows=1 width=8)

© 2021 Maciej Zakrzewicz


168
PostgreSQL: wprowadzenie do administracji
OPERACJA UNION

explain select * from cars where make='porsche' ▪ Operator APPEND scala


union all select * from cars where make='audi';
zbiory rekordów na potrzeby
QUERY PLAN operacji UNION
---------------------------------------------------------
Append (cost=0.00..10774.84 rows=38723 width=273)
-> Seq Scan on cars
(cost=0.00..5097.00 rows=5400 width=273)
Filter: ((make)::text = 'porsche'::text)
-> Seq Scan on cars cars_1
(cost=0.00..5097.00 rows=33323 width=273)
Filter: ((make)::text = 'audi'::text)

© 2021 Maciej Zakrzewicz


169
PostgreSQL: wprowadzenie do administracji
ALGORYTMY ŁĄCZENIA TABEL

170
PostgreSQL: wprowadzenie do administracji
ALGORYTMY ŁĄCZENIA TABEL: NESTED LOOPS
przykład
Tabela zewnętrzna Tabela wewnętrzna
A 3 2 a
B 2 1 b
C 1 2 c
D 3 3 d
1 e
Pojedyncze
Wielokrotne
przeglądanie
przeglądanie
A 3 3 d
B 2 2 a
B 2 2 c
C 1 1 b Wynik połączenia
Nested Loop (cost=0.00..2500914.00 rows=200000000 width=317)
C 1 1 e
... (actual time=0.016..572221.288 rows=200000000 loops=1) D 3 3 d
-> Seq Scan on customers (cost=0.00..688.00 rows=20000 width=268)
... (actual time=0.004..64.851 rows=20000 loops=1)
-> Materialize (cost=0.00..251.00 rows=10000 width=49)
... (actual time=0.001..8.786 rows=10000 loops=20000)
-> Seq Scan on products ...

© 2021 Maciej Zakrzewicz


171
PostgreSQL: wprowadzenie do administracji
ALGORYTMY ŁĄCZENIA TABEL: SORT MERGE
przykład
A 3 2 a
B 2 1 b
C 1 2 c
D 3 3 d
1 e
sortowanie
C 1 1 b
B 2 1 e
A 3 2 a
D 3 2 c
scalanie 3 d
-> Merge Join (cost=0.05..1859.49 rows=12000 width=12) ...
(actual time=0.071..146.272 rows=12000 loops=1)
Merge Cond: (c.customerid = o.customerid) C 1 1 b
-> Index Scan using customers_pkey on customers c C 1 1 e
... (cost=0.00..963.25 rows=20000 width=4)
... (actual time=0.031..37.242 rows=20000 loops=1)
B 2 2 a
-> Index Scan using ix_order_custid on orders o B 2 2 c
... (cost=0.00..696.24 rows=12000 width=12) A 3 3 d
... (actual time=0.025..30.722 rows=12000 loops=1) D 3 3 d
© 2021 Maciej Zakrzewicz
172
PostgreSQL: wprowadzenie do administracji
ALGORYTMY ŁĄCZENIA TABEL: HASH JOIN
przykład -> Hash Join (cost=70.25..341.25 rows=600 width=10)
... (actual time=2.670..30.282 rows=600 loops=1)
Hash Cond: (o.customerid = c.customerid)
-> Seq Scan on orders o ....
-> Hash (cost=57.75..57.75 rows=1000 width=4)

Tabela wewnętrzna Tabela zewnętrzna ... (actual time=2.615..2.615 rows=999 loops=1)


Buckets: 1024 Batches: 1 Memory Usage: 36kB
-> Index Scan using customers_pkey on customers c
A 3 2 a ... (cost=0.00..57.75 rows=1000 width=4)
... (actual time=0.013..1.440 rows=999 loops=1)
B 2 1 b Index Cond: (customerid < 1000)

C 1 2 c
D 3 3 d
Haszowanie HF 1 e

A 3 Hash = column mod 3


0
D 3
Wynik połączenia
1 C 1 B 2 2 a
C 1 1 b
2 B 2 B 2 2 c
A 3 3 d
D 3 3 d
C 1 1 e
© 2021 Maciej Zakrzewicz
173
PostgreSQL: wprowadzenie do administracji
STATYSTYKI DLA QUERY PLANNERA

174
PostgreSQL: wprowadzenie do administracji
POWTÓRKA – PLAN WYKONANIA

EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 100;

QUERY PLAN
---------------------------------------------------------
Bitmap Heap Scan on tenk1 (cost=5.07..229.20 rows=101 width=244)
Recheck Cond: (unique1 < 100)
-> Bitmap Index Scan on tenk1_unique1 (cost=0.00..5.04 rows=101 width=0)
Index Cond: (unique1 < 100)

© 2021 Maciej Zakrzewicz


175
PostgreSQL: wprowadzenie do administracji
JAK OBLICZANY JEST KOSZT
cost =
number of disk blocks read randomly * random page read cost +
number of disk blocks read sequentially * sequential page read cost +
number of table rows processed * cost of single row CPU processing +
number of index entries processed * cost of single index entry CPU processing +
number of rows processed by an operator/function * cost of operator/function CPU processing +

szacowane na podstawie statystyk optymalizatora (Query Planner)

PostgreSQL: wprowadzenie do administracji


176
© 2021 Maciej Zakrzewicz
ODCZYTY SEKWENCYJNE VS. SWOBODNE
głowica ramię
ścieżka

talerz

SZYBCIEJ WOLNIEJ

odczyt sekwencyjny odczyt swobodny


(sąsiednie bloki, np. seq scan) (bloki rozproszone, np. index scan)

© 2021 Maciej Zakrzewicz


177
PostgreSQL: wprowadzenie do administracji
STATYSTYKI DLA QUERY PLANNERA
Statystyki dla tabeli

SELECT relname, relkind, reltuples, relpages


▪ Liczba rekordów (wpisów)
FROM pg_class
WHERE relname LIKE 'tenk1%';
i liczba bloków danych
▪ tabel
relname | relkind | reltuples | relpages ▪ indeksów
----------------------+---------+-----------+----------
tenk1 | r | 10000 | 358
tenk1_hundred | i | 10000 | 30
tenk1_thous_tenthous | i | 10000 | 30
tenk1_unique1 | i | 10000 | 30
tenk1_unique2 | i | 10000 | 30
(5 rows)

© 2021 Maciej Zakrzewicz


178
PostgreSQL: wprowadzenie do administracji
STATYSTYKI DLA QUERY PLANNERA
Statystyki dla kolumny

▪ pg_stats
▪ tablename – nazwa tabeli
▪ attname – nazwa kolumny
▪ null_frac – procent wartości null w kolumnie
▪ avg_width – średni rozmiar wartości kolumny
▪ n_distinct – liczba różnych wartości kolumny (gdy wartość dodatnia) lub liczba różnych
wartości kolumny podzielona przez liczbę rekordów (gdy wartość ujemna)
▪ most_common_vals – najpopularniejsze wartości kolumny
▪ most_common_freqs – procentowe częstotliwości występowania każdej z
najpopularniejszych wartości kolumny
▪ histogram_bounds – granice przedziałów, dzielących rekordy na równoliczne podzbiory
▪ correlation – statystyczna korelacja pomiędzy fizycznym porządkiem rekordów na dysku a
logicznym porządkiem wartości kolumny (<-1;1>)

PostgreSQL: wprowadzenie do administracji


179
© 2021 Maciej Zakrzewicz
STATYSTYKI DLA INDEKSÓW

create extension pgstattuple;

select * from pgstatindex('cid_idx');

version | tree_level | index_size | root_block_no | internal_pages | leaf_pages | empty_pages | deleted_pages | avg_leaf_density | leaf_fragmentation
---------+------------+------------+---------------+----------------+------------+-------------+---------------+------------------+-------------------

3 | 1 | 2260992 | 3 | 1 | 274 | 0 | 0 | 89.83 | 0

▪ pgstatindex jest częścią rozszerzenia pgstattuple


▪ Pobiera statystyki zgromadzone dla indeksów
▪ tree_level – liczba poziomów drzewa indeksu
▪ index_size – rozmiar indeksu w bajtach
▪ leaf_pages – liczba bloków-liści indeksu

© 2021 Maciej Zakrzewicz


180
PostgreSQL: wprowadzenie do administracji
OPERACJA ANALYZE
▪ Gromadzi/aktualizuje statystyki dla Query Plannera
▪ Może być wykonana jako część VACUUM lub samodzielnie
▪ Może być wykonywana przez proces Autovacuum
▪ Powinna być jawnie wywołana po istotnej zmianie zawartości tabeli
▪ Polecenia:
▪ ANALYZE tabela
▪ VACUUM ANALYZE tabela

PostgreSQL: wprowadzenie do administracji


181
© 2021 Maciej Zakrzewicz
STATYSTYKI - MCV
Most Common Values (MCV) - przykład

select n_distinct, most_common_vals, most_common_freqs


from pg_stats where tablename='cars' and attname='make'; ▪ Tabela CARS:
▪ 100.000 rekordów
n_distinct| most_common_vals | most_common_freqs ▪ bmw: 33284
----------+---------------------------+-------------------------------- ▪ audi: 33503
4 |{bmw,audi,mercedes,porsche}|{0.3348,0.331733,0.277467,0.056}
▪ mercedes: 27705
▪ porsche: 5508
explain select * from cars where make='porsche';

QUERY PLAN
------------------------------------------------------------
Seq Scan on cars (cost=0.00..5097.00 rows=5600 width=273)
Filter: ((make)::text = 'porsche'::text)

© 2021 Maciej Zakrzewicz


182
PostgreSQL: wprowadzenie do administracji
STATYSTYKI – HISTOGRAM BOUNDS
Histogram Bounds - przykład

select histogram_bounds from pg_stats


where tablename = 'cars' and attname = 'c_id';
▪ Histogramy są
gromadzone dla kolumn o
histogram_bounds
dużej liczbie różnych
wartości
------------------------------------------------------------------------------
{2,1097,2069,3078,4029,5088,6201,7181,8157,9121,10116,11075,12021,13002,13982,
▪ histogram_bounds to
14950,16021,17031,18140,19234,20310,21311,22326,23322,24315,25314,26348,27363,
lista progów, które
28249,29280,30291,31342,32361,33389,34448,35501,36474,37501,38537,39499,40497, rozdzielają zakres
41499,42489,43547,44465,45487,46490,47535,48574,49608,50589,51632,52632,53561, wartości kolumny na
54620,55648,56637,57636,58573,59591,60486,61532,62548,63581,64543,65455,66410, przedziały o równej
67355,68245,69249,70333,71284,72265,73274,74276,75279,76242,77160,78112,79093, liczności rekordów
80119,81179,82181,83129,84149,85211,86148,87171,88153,89215,90176,91196,92127, ▪ Domyślnie
93092,94086,95101,96082,97126,98084,98990,100000} histogram_bounds
dzielą na 100
przedziałów
(parametr default_
statistics_target)
#rek

2 1097 2069 3078 4029 …


© 2021 Maciej Zakrzewicz
183
PostgreSQL: wprowadzenie do administracji
STATYSTYKI - PRZYKŁAD
z wykorzystaniem Histogram Bounds

explain select * from cars where c_id < 2500; ▪ Tabela CARS:
QUERY PLAN
▪ 100.000 rekordów
------------------------------------------------------------ ▪ każdy przedział
Seq Scan on cars (cost=0.00..5097.00 rows=2426 width=273) reprezentuje
Filter: (c_id < 2500) 100,000/100 = 1000
rekordów
▪ wartości c_id < 2500
< 2500 obejmują:
▫ pierwsze dwa
przedziały całkowicie
(2000 rekordów)
#rek

▫ trzeci przedział w
(2500 – 2070)/(3078-
2 1097 2069 3078 4029 … 2070)=42,6%=426
rekordów

© 2021 Maciej Zakrzewicz


184
PostgreSQL: wprowadzenie do administracji
STATYSTYKI - PRZYKŁAD
Korelacja ordered | messedup
---------+----------
1 | 2500
2 | 1448
create table ordered_messedup (ordered int, messedup int); 3 | 9529
4 | 8020
5 | 9929
insert into ordered_messedup 6 | 3974
select generate_series, random()*10000
▪ Korelacja kolumny
7 | 7623
from generate_series(1, 10000); 8 | 6685
9 | 926

(fizyczny porządek
10 | 8902
analyze ordered_messedup; ...

select attname, correlation from pg_stats where tablename = 'ordered_messedup';


rekordów względem
attname | correlation wysoka korelacja (100%) wartości kolumny) wpływa
----------+-------------
ordered | 1
messedup | -0.01 brak korelacji tani odczyt zakresowy na koszt odczytu
create index ordered_idx on ordered_messedup(ordered);
create index messedup_idx on ordered_messedup(messedup);
dla kolumny wysoce zakresowego z użyciem
skorelowanej
explain select * from ordered_messedup where ordered < 613; indeksu
---------------------------------------------------------------------------------------
Index Scan using ordered_idx on ordered_messedup (cost=0.29..25.00 rows=612 width=8)
Index Cond: (ordered < 613)

explain select * from ordered_messedup where messedup < 613;


------------------------------------------------------------------------------ kosztowny odczyt
Bitmap Heap Scan on ordered_messedup (cost=13.03..65.68 rows=612 width=8) zakresowy dla kolumny
Recheck Cond: (messedup < 613)
-> Bitmap Index Scan on messedup_idx (cost=0.00..12.88 rows=612 width=0) nieskorelowanej
Index Cond: (messedup < 613)

© 2021 Maciej Zakrzewicz


185
PostgreSQL: wprowadzenie do administracji
STATYSTYKI - PRZYKŁAD

select attname, most_common_vals, most_common_freqs ▪ Tabela CARS:


from pg_stats where tablename='cars' and attname in ('make','model'); ▪ 100.000 rekordów
▪ liczba rekordów z 'audi a6':
attname | most_common_vals | most_common_freqs
11.220
---------+-------------------------------+-----------------------------
make | {bmw,audi,mercedes,porsche} | {0.3348,0.331733,0.277467, ▪ Operator AND:
0.056} ▪ freq1 x freq2
model | {5,e,x3,a6,glc,a4,3,q5,911,c} | {0.113267,0.1126,0.1116,
0.111433,0.111233,0.1109,0.109933,0.1094,0.056,0.0536333}
▪ Operator OR:
▪ freq1 + freq2 – freq1 x
explain select * from cars where make='audi' and model='a6';
freq2
0.331733 x 0.111433 x 100000
QUERY PLAN
---------------------------------------------------------------------------
Seq Scan on cars (cost=0.00..5347.00 rows=3697 width=273)
Filter: (((make)::text = 'audi'::text) AND ((model)::text = 'a6'::text))

© 2021 Maciej Zakrzewicz


186
PostgreSQL: wprowadzenie do administracji
STATYSTYKI - PRZYKŁAD

explain select * from cars where upper(make)='PORSCHE';


▪ Gdy równościowy warunek
QUERY PLAN selekcji jest oparty o
--------------------------------------------------------- wyrażenie/funkcję:
Seq Scan on cars (cost=0.00..5347.00 rows=500 width=273)
Filter: (upper((make)::text) = 'PORSCHE'::text) ▪ selektywność 0.5%
▪ Gdy nierównościowy
explain analyze select * from cars where upper(make)='PORSCHE';
warunek selekcji jest
QUERY PLAN oparty o
-----------------------------------------------------------------
wyrażenie/funkcję:
Seq Scan on cars (cost=0.00..5347.00 rows=500 width=273)
(actual time=0.116..85.693 rows=5508 loops=1) ▪ selektywność 33.333%
Filter: (upper((make)::text) = 'PORSCHE'::text)

© 2021 Maciej Zakrzewicz


187
PostgreSQL: wprowadzenie do administracji
STATYSTYKI ROZSZERZONE
▪ Generowane na żądanie programisty/administratora
▪ poleceniem CREATE STATISTICS
▪ aktualizowane przez ANALYZE
▪ Rodzaje statystyk rozszerzonych
▪ zależności funkcyjne (functional dependencies)
▫ CREATE STATISTICS stts (dependencies) ON zip, city FROM zipcodes;
▪ wielokolumnowe (multivariate n-distinct counts)
▫ CREATE STATISTICS stts2 (ndistinct) ON zip, state, city FROM
zipcodes;
▪ Podgląd za pomocą: pg_statistic_ext

PostgreSQL: wprowadzenie do administracji


188
© 2021 Maciej Zakrzewicz
STATYSTYKI ROZSZERZONE - PRZYKŁAD

create statistics cars_make_model_stts (dependencies) on make, model


from cars; ▪ Tabela CARS:
analyze cars;
▪ 100.000 rekordów
▪ liczba rekordów z
select stxname, stxdependencies from pg_statistic_ext;
'audi a6': 11.220
stxname | stxdependencies
----------------------+------------------------------------------
cars_make_model_stts | {"2 => 3": 0.053367, "3 => 2": 1.000000}

explain select * from cars where make='audi' and model='a6';

QUERY PLAN kolumna 3 (model) w 100% wyznacza funkcyjnie kolumnę 2 (make)


---------------------------------------------------------------------------
Seq Scan on cars (cost=0.00..5347.00 rows=11477 width=273)
Filter: (((make)::text = 'audi'::text) AND ((model)::text = 'a6'::text))

© 2021 Maciej Zakrzewicz


189
PostgreSQL: wprowadzenie do administracji
STATYSTYKI ROZSZERZONE - PRZYKŁAD

create index upp_make_idx on cars((upper(make)));


▪ Jeżeli zostanie
analyze cars; utworzony indeks
na wyrażeniu, to
explain select * from cars where upper(make)='PORSCHE';
gromadzone będą
QUERY PLAN statystyki dla tego
--------------------------------------------------------------------------
Bitmap Heap Scan on cars (cost=115.87..4239.19 rows=5607 width=273)
wyrażenia
Recheck Cond: (upper((make)::text) = 'PORSCHE'::text)
-> Bitmap Index Scan on upp_make_idx (cost=0.00..114.47 rows=5607 width=0)
Index Cond: (upper((make)::text) = 'PORSCHE'::text)

© 2021 Maciej Zakrzewicz


190
PostgreSQL: wprowadzenie do administracji
WAGI SKŁADNIKÓW KOSZTU
▪ seq_page_cost (domyślnie 1.0) – koszt odczytu jednego bloku w ramach
sekwencyjnego odczytu wieloblokowego (może być nadpisany na poziomie
tabeli/przestrzeni tabel – poleceniem alter table/tablespace)
▪ random_page_cost (domyślnie 4.0) - koszt odczytu jednego bloku w ramach odczytu
swobodnego (może być nadpisany na poziomie tabeli/przestrzeni tabel – poleceniem
alter table/tablespace)
▪ w systemach z dużą ilością RAM (OS cache), rozważyć mniejszą wartość
▪ dla dysków SSD rozważyć wartość bliską seq_page_cost
▪ cpu_tuple_cost (domyślnie 0.01) – koszt przetworzenia jednego rekordu przez CPU
▪ cpu_index_tuple_cost (domyślnie 0.005) - koszt przetworzenia jednego wpisu
indeksu przez CPU
▪ cpu_operator_cost (domyślnie 0.0025) – koszt wykonania jednego operatora lub
funkcji przez CPU
▪ Ustawiane jako parametry serwera lub poleceniem ALTER TABLESPACE

PostgreSQL: wprowadzenie do administracji


191
© 2021 Maciej Zakrzewicz
OBLICZANIE KOSZTU
przykład

EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 7000;

QUERY PLAN
------------------------------------------------------------
Seq Scan on tenk1 (cost=0.00..483.00 rows=7033 width=244)
Filter: (unique1 < 7000)

(disk pages read * seq_page_cost)


+ (rows scanned * cpu_tuple_cost)
+ (rows scanned * cpu_operator_cost) =
358 * 1 + 10000 * 0.01 + 10000 * 0.0025 = 483

© 2021 Maciej Zakrzewicz


192
PostgreSQL: wprowadzenie do administracji
KOSZT WYKONANIA FUNKCJI PL/PGSQL
create or replace function slow(x float) returns float cost 1000 as
$$ ▪ Kolejność ewaluacji wyrażeń w
begin klauzuli WHERE może mieć
perform pg_sleep(1); znaczenie dla wydajności:
return x; ▪ skrócona ewaluacja –
end; $$ language plpgsql;
▫ jeśli pierwszy z warunków AND
zwraca FALSE, drugi warunek
create or replace function fast(x float) returns float cost 1 as $$ nie jest badany
begin ▫ jeśli pierwszy z warunków OR
return x; zwraca TRUE, drugi warunek nie
end; $$ language plpgsql; jest badany
▪ najbardziej kosztowny warunek
explain select * from filmy where slow(cena)=5 and fast(cena)=5; powinien być umieszczony jako
QUERY PLAN ostatni
---------------------------------------------------------------------
Seq Scan on filmy (cost=0.00..26.22 rows=1 width=110)
▪ Atrybut COST umożliwia Query
Filter: ((fast((cena)::double precision) = '5'::double precision) Plannerowi optymalizację
AND (slow((cena)::double precision) = '5'::double precision)) kolejności warunków
▪ mnożony przez
1*1 + 10*0.01 + 0.0025*1000*10 + 0.0025*1*10 + 10*0.01 = 26.225 cpu_operator_cost
© 2021 Maciej Zakrzewicz
193
PostgreSQL: wprowadzenie do administracji
KOSZT WYKONANIA FUNKCJI PL/PGSQL
▪ Domyślna wartość atrybutu COST
▪ 1 dla funkcji wewnętrznych PostgreSQL
▪ 100 dla funkcji PL/pgSQL
▪ Atrybut ROWS
▪ dla funkcji, które zwracają kolekcje rekordów:
▫ szacowany rozmiar zwracanej kolekcji
▫ domyślnie 1000
▪ wykorzystywany przez Query Planner do szacowania kosztu planu wykonania
zapytania

PostgreSQL: wprowadzenie do administracji


194
© 2021 Maciej Zakrzewicz
WYKORZYSTYWANIE PAMIĘCI
BUFOROWEJ
195
PostgreSQL: wprowadzenie do administracji
ORGANIZACJA PAMIĘCI SERWERA POSTGRESQL

Buffer Cache/
WAL Buffers
Shared Buffers
Work Memory Vacuum Buffers

CLOG Buffers Memory for Locks


Maintenance
Temp Buffers
Work Memory
shared memory
process memory

dane commit log op. zarządcze tabele tymczasowe

odczyty/zapisy plików danych blokady operacje sort i hash

zapisy WAL pamięć dla autovacuum

© 2021 Maciej Zakrzewicz


196
PostgreSQL: wprowadzenie do administracji
WORK MEMORY
▪ Rozmiar określony parametrem work_mem
▪ Operacje sortowania rekordów mogę być wykonywane:
▪ wewnątrz Work Memory, za pomocą algorytmu Quicksort
▫ jeśli rozmiar work_mem size jest wystarczający
▪ na dysku, za pomocą algorytmu External Sorting
▫ jeśli rozmiar work_mem size jest niewystarczający
▫ pliki tymczasowe zapisywane są w base/pgsql_tmp
▫ monitorowanie plików tymczasowych: parametr log_temp_files
▪ z użyciem indeksu

PostgreSQL: wprowadzenie do administracji


197
© 2021 Maciej Zakrzewicz
ROZMIAR WORK MEMORY
set work_mem=4096;
Work Memory: 4096KB
explain analyze select * from cars order by price;

QUERY PLAN
----------------------------------------------------------------------------------------------------------------
sortowanie dyskowe
Sort (cost=26140.32..26390.32 rows=100000 width=273) (actual time=128.100..156.310 rows=96398 loops=1)
Sort Key: price
Sort Method: external merge Disk: 27272kB
-> Seq Scan on cars (cost=0.00..4847.00 rows=100000 width=273) (actual time=0.023..9.096 rows=96398 loops=1)
Planning Time: 0.075 ms
Execution Time: 163.576 ms

set work_mem=1000000;
Work Memory: 1 000 000KB
explain analyze select * from cars order by price;

QUERY PLAN
----------------------------------------------------------------------------------------------------------------
Sort (cost=13151.82..13401.82 rows=100000 width=273) (actual time=53.056..63.948 rows=96398 loops=1)
Sort Key: price
Sort Method: quicksort Memory: 52778kB
-> Seq Scan on cars (cost=0.00..4847.00 rows=100000 width=273) (actual time=0.017..9.605 rows=96398 loops=1)
Planning Time: 0.059 ms
Execution Time: 71.462 ms
sortowanie w pamięci

© 2021 Maciej Zakrzewicz


198
PostgreSQL: wprowadzenie do administracji
MAINTENANCE WORK MEMORY
▪ Rozmiar określony parametrem maintenance_work_mem (64MB)
▪ Wykorzystywana do realizacji operacji administracyjnych: VACUUM,
CREATE INDEX, ALTER TABLE ADD FOREIGN KEY
▪ dla operacji wykonywanych przez proces Autovacuum może być zdefiniowana
odrębnie za pomocą autovacuum_work_mem

PostgreSQL: wprowadzenie do administracji


199
© 2021 Maciej Zakrzewicz
ROZMIAR MAINTENANCE WORK MEMORY

set maintenance_work_mem=1024; Maintenance Work Memory: 1 MB

create index i1 on duza(a);


Time: 16572.408 ms (00:16.572)

drop index i1;

set maintenance_work_mem=102400; Maintenance Work Memory: 100 MB

create index i1 on duza(a);


Time: 10934.335 ms (00:10.934)

drop index i1;

© 2021 Maciej Zakrzewicz


200
PostgreSQL: wprowadzenie do administracji
SHARED BUFFERS/BUFFER CACHE
▪ Bufor w pamięci operacyjnej służących do obsługi dwukierunkowej (odczyty i zapisy)
komunikacji z plikami danych
▪ buforuje tabele, indeksy, pliki FSM, pliki VM
▪ przechowuje kompletne bloki (8KB), identyfikowane przez: numer pliku danych
(RelFileNode), typ pliku (fork number: 0: plik danych, 1: plik FSM, 2: plik VM), numer bloku
▪ blok, w którym nastąpiły modyfikacje: "dirty block"
▪ Rozmiar określony przez parametr shared_buffers
▪ zwykle rekomendowane ustawienie na poziomie 15-25% RAM
▪ Gdy brakuje miejsca na nowe bloki odczytywane z dysku:
▪ z bufora usuwane są bloki, które dotąd były rzadko używane
▫ algorytm LRU/Clock Sweep
▫ gdy blok jest brudny, wymagany jest zapis dyskowy
▪ bloki posiadają licznik użycia (LRU count, maksymalnie 5)
▫ powiększany podczas dostępu, pomniejszany podczas poszukiwania bloku do usunięcia z bufora

PostgreSQL: wprowadzenie do administracji


201
© 2021 Maciej Zakrzewicz
POMIAR WSPÓŁCZYNNIKA TRAFIEŃ W BUFOR

select relname,cast(heap_blks_hit as numeric) /


▪ Dla tabel
(heap_blks_hit + heap_blks_read) as hit_pct,
heap_blks_hit, heap_blks_read ▪ heap_blks_hit
from pg_statio_user_tables ▪ Dla indeksów
where (heap_blks_hit + heap_blks_read) > 0
▪ idx_blks_hit
order by hit_pct;

select relname,cast(idx_blks_hit as numeric) /


(idx_blks_hit + idx_blks_read) as
hit_pct,idx_blks_hit,idx_blks_read
from pg_statio_user_tables
where (idx_blks_hit + idx_blks_read) > 0
order by hit_pct;

© 2021 Maciej Zakrzewicz


202
PostgreSQL: wprowadzenie do administracji
TABELE NAJBARDZIEJ OBECNE W BUFORZE

create extension pg_buffercache; ▪ Widok pg_buffercache


select c.relname, count(*) as buffers
dostarcza informacji o
from pg_class c aktualnej zawartości
inner join pg_buffercache b on b.relfilenode=c.relfilenode Buffer Cache
inner join pg_database d on (b.reldatabase=d.oid
▪ który blok
and d.datname=current_database())
group by c.relname ▪ której tabeli
order by 2 desc ▪ czy brudny
limit 10;
▪ liczba użyć LRU

© 2021 Maciej Zakrzewicz


203
PostgreSQL: wprowadzenie do administracji
PEŁNE ODCZYTY TABELI
▪ Ponieważ pełne odczyty dużych tabel grożą dewastacją dotychczasowej
zawartości bufora, nie korzystają one w pełni z algorytmu LRU/Clock
Sweep
▪ duża tabela = większa niż 25% rozmiaru bufora
▪ jak odczytać rozmiar tabeli?
▫ np. \dt+
▪ Wykorzystywany jest fragment bufora (256 KB) – tzw. ring buffer - przez
który przechodzą odczyty bloków tabeli
▪ każdy kolejny pełen odczyt powoduje załadowanie kolejnych 256KB (32 bloki)

PostgreSQL: wprowadzenie do administracji


204
© 2021 Maciej Zakrzewicz
MANUALNA INICJALIZACJA BUFORA

create extension pg_prewarm;


▪ Moduł/funkcja pg_prewarm
select pg_prewarm('mytable'); umożliwia załadowanie
...
wskazanej tabeli do Buffer
explain (analyze,buffers) select count(*) from mytable; Cache
QUERY PLAN ▪ całej lub zakres bloków
---------------------------------------------------------------
Aggregate (cost=179889.00..179889.01 rows=1 width=8)
(actual time=1151.969..1151.969 rows=1 loops=1)
Buffers: shared hit=54889
-> Seq Scan on mytable
(cost=0.00..154889.00 rows=10000000 width=0)
(actual time=0.022..602.144 rows=10000000 loops=1)
Buffers: shared hit=54889

© 2021 Maciej Zakrzewicz


205
PostgreSQL: wprowadzenie do administracji
BUFFER CACHE VS. OS PAGE CACHE

▪ System operacyjny również wykorzystuje pamięć


PostgreSQL memory RAM do buforowania bloków dyskowych
▪ Buffer Cache częściowo dubluje działania systemu
operacyjnego
▪ te same bloki mogą znajdować się w Buffer Cache
OS/filesystem page i OS Page Cache
cache memory ▪ inne algorytmy zarządzania buforami: Clock
Sweep vs. LRU
▪ Wiele operacji I/O zlecanych przez PostgreSQL w
rzeczywistości nie trafia do dysku
▪ PostgreSQL powinien mieć świadomość tego, jaki
jest całkowity rozmiar pamięci RAM służącej do
buforowania operacji dyskowych:
physical storage ▪ parametr effective_cache_size
▪ wykorzystywany przez Query Plannera

© 2021 Maciej Zakrzewicz


206
PostgreSQL: wprowadzenie do administracji

You might also like