Professional Documents
Culture Documents
Postgre SQL13 Admin Practices
Postgre SQL13 Admin Practices
1 serwera PostgreSQL
1. Zaloguj się do systemu operacyjnego jako użytkownik postgres. Uruchom serwer PostgreSQL.
/usr/pgsql-13/bin/pg_ctl start
2. Połącz się z serwerem bazy danych za pomocą programu psql. Utwórz tabelę pracownicy(id
serial, nazwisko varchar(20)) i wstaw do niej jeden rekord. Na zakończenie wyświetl
strukturę utworzonej tabeli oraz wykaz wszystkich tabel w bieżącej bazie danych.
psql
\d pracownicy
\dt
\dt+
3. Korzystając nadal z programu psql znajdź nazwę i lokalizację pliku danych, w którym
zapisana jest tabela pracownicy.
select pg_relation_filepath('pracownicy');
4. Korzystając nadal z programu psql wyświetl nazwy dostępnych baz danych, nazwy wszystkich
przestrzeni tabel oraz nazwy wszystkich tabel w bieżącej bazie danych. Opuść program psql.
\l
\db
\q
mkdir /var/lib/pgsql/13/mojatbs01
psql
\db
\l+
6. Podłącz się programem psql do bazy danych baza01. Wyświetl nazwę bieżącej bazy danych.
\c baza01
select current_database();
7. Korzystając nadal z programu psql utwórz w bieżącej bazie danych tabelę faktury(numer
char(6), data date, kwota float). Następnie znajdź nazwę i lokalizację jej pliku
danych. Zwróć uwagę na zapis ścieżki dostępu do pliku danych – zawiera ona odniesienie do
linku symbolicznego, który powstał w katalogu pg_tblspc wewnątrz katalogu Data Directory.
select pg_relation_filepath('faktury');
\c postgres
drop database baza01;
drop tablespace mojatbs01;
2
serwera bazy danych PostgreSQL
1. Korzystając z psql zmień hasło użytkownika postgres serwera bazy danych PostgreSQL.
Opuść program psql.
vi /var/lib/pgsql/13/data/pg_hba.conf
/usr/pgsql-13/bin/pg_ctl restart
4. Korzystając z programu psql zaloguj się jako użytkownik postgres i utwórz schemat o
nazwie APLIKACJA1.
psql --username=postgres
create schema aplikacja1;
9. Korzystając z programu psql zaloguj się do bazy danych POSTGRES jako PRACOWNIK z hasłem
PRACOWNIK i spróbuj wykonać zapytanie do tabel PRODUKTY i MAGAZYNY ze schematu
APLIKACJA1. Dla wygody ustaw schemat APLIKACJA1 jako domyślną ścieżkę przeszukiwania.
11. Wyloguj użytkownika PRACOWNIK. Zaloguj się ponownie jako użytkownik postgres. Wyświetl
listę wszystkich ról.
\q
psql --username=postgres
\duS
\dp aplikacja1.produkty
select role_name
from information_schema.applicable_roles
where grantee='pracownik';
3 serwera PostgreSQL
1. Skonfiguruj serwer PostgreSQL tak, aby w pliku logu rejestrował czasochłonne polecenia SQL (np.
trwające dłużej niż 50 ms). W tym celu wyedytuj poniższy parametr w pliku postgresql.conf:
vi /var/lib/pgsql/13/data/postgresql.conf
log_min_duration_statement=50
/usr/pgsql-13/bin/pg_ctl restart
3. Wykonaj poniższe przykładowe polecenia SQL. Niektóre wykonają się szybko, niektóre powoli.
Następnie sprawdź nowe zapisy w pliku logu serwera (/var/lib/pgsql/13/data/log):
4. Skonfiguruj serwer PostgreSQL tak, aby moduł AUTO_EXPLAIN automatycznie rejestrował w pliku
logu plany wykonania czasochłonnych zapytań SQL (np. trwających ponad 50 ms). W tym celu
dokonaj poniższych modyfikacji w pliku postgresql.conf.
vi /var/lib/pgsql/13/data/postgresql.conf
log_min_duration_statement=-1
session_preload_libraries='auto_explain'
auto_explain.log_analyze=on
auto_explain.log_min_duration=50
6. Ponownie wykonaj zapytania z kroku (3). Następnie sprawdź nowe zapisy w pliku logu serwera
(/var/lib/pgsql/13/data/log):
7. Skonfiguruj plik logu w formacie CSV, który będzie rejestrować operacje logowania użytkowników
oraz wykonywane polecenia SQL. W tym celu umieść w pliku postgresql.conf parametry
log_destination (zmodyfikuj istniejący!), log_connections, log_statement:
vi /var/lib/pgsql/13/data/postgresql.conf
log_destination = 'stderr,csvlog'
log_connections = on
log_statement = all
/usr/pgsql-13/bin/pg_ctl restart
cat /var/lib/pgsql/13/data/current_logfiles
8. Korzystając z narzędzia psql zaloguj się do serwera oraz wykonaj kilka przykładowych operacji
SQL.
psql
create table pracownicy(id serial, nazwisko varchar(20));
insert into pracownicy(nazwisko) values ('Nowak');
\q
9. Obejrzyj zawartość pliku logu CSV zanotowanego w punkcie 1. Znajdź ślady wykonywanych przez
siebie operacji.
cat /var/lib/pgsql/13/data/log/postgresql-*.csv
10. W celu łatwiejszej analizy załaduj plik logu do tabeli w bazie danych:
psql
11. Zweryfikuj zawartość pliku logu załadowanego do tabeli postgres_log - odszukaj ślady
wykonywanych przez siebie operacji SQL.
W celu oczyszczenia środowiska, usuń tabelę POSTGRES_LOG (drop table postgres_log), usuń
wszystkie dodane oraz przywróć zmodyfikowane parametry w pliku postgresql.conf i zrestartuj
serwer.
12. W celu aktywowania pełnej funkcjonalności Statistics Collectora wykonaj poniższe polecenia:
set track_activities=on;
set track_counts=on;
set track_functions='all';
set track_io_timing=on;
13. Pozostań połączony z serwerem bazy danych, a dodatkowo, w oddzielnym oknie uruchom drugi
proces PSQL i nawiąż kolejną sesję z serwerem. Posługując się tą nową sesją, wykonaj zapytanie
do pg_stat_activity w celu wyświetlenia statusu i tekstu ostatniego polecenia wykonywanego
przez sesję/połączenie wykorzystywane w kroku (9):
\q
\q
6. Korzystając z narzędzia pg_dump wykonaj kolejną logiczną kopię bezpieczeństwa bazy danych
o nazwie postgres. Tym razem kopia powinna być skompresowana.
5
bazy danych PostgreSQL
mkdir /var/lib/pgsql/13/arch
vi /var/lib/pgsql/13/data/postgresql.conf
archive_mode=on
archive_command = 'cp %p /var/lib/pgsql/13/arch/%f'
/usr/pgsql-13/bin/pg_ctl restart
ls -l /var/lib/pgsql/13/arch
ls -l /var/lib/pgsql/13/backups/backup01
7. Zatrzymaj serwer PostgreSQL i "omyłkowo" zniszcz jego katalog Data Directory oraz katalog
przestrzeni tabel mojatbs01.
/usr/pgsql-13/bin/pg_ctl stop
rm -r /var/lib/pgsql/13/data
/usr/pgsql-13/bin/pg_ctl start
9. W celu odzyskania bazy danych skopiuj wszystkie pliki kopii bezpieczeństwa w oryginalne
lokalizacje.
cp -r /var/lib/pgsql/13/backups/backup01 /var/lib/pgsql/13/data
vi /var/lib/pgsql/13/data/postgresql.conf
11. W katalogu Data Directory utwórz pusty plik recovery.signal, aby zasygnalizować potrzebę
odtworzenia bazy danych za pomocą archiwalnych plików WAL.
12. Uruchom serwer PostgreSQL - odtwarzanie stanu bazy danych powinno nastąpić
automatycznie. Ślady odtwarzania możesz odnaleźć w pliku logu w podkatalogu log w Data
Directory. Zauważ też, że zniknął plik recovery.signal.
/usr/pgsql-13/bin/pg_ctl start
tail /var/lib/pgsql/13/data/log/*
13. Za pomocą psql sprawdź liczbę rekordów w tabeli PRACOWNICY. Czy udało się odzyskać
kompletną zawartość bazy danych?
Notka: pomimo utraty zawartości całego Data Directory, a w tym bieżących plików WAL, nie
doszło do utraty danych, ponieważ serwer przed awarią zatrzymany został ręcznie i zdążył
zarchiwizować dotychczasowe pliki WAL. W sytuacji typowej awarii zaobserwowalibyśmy
jednak częściową utratę danych w związku z utratą ostatniego (ostatnich) pliku WAL.
6
zapasowego PostgreSQL
d. ustaw tryb komunikacji sieciowej jako "Mostkowana karta sieciowa (bridget)" (menu
Urządzenia->Sieć->Ustawienia sieciowe...)
2. (MASTER) Zaloguj się do systemu operacyjnego jako postgres. Korzystając z programu psql
utwórz nowe konto użytkownika, które będzie wykorzystywane do replikacji.
/usr/pgsql-13/bin/pg_ctl start
psql
ls /var/lib/pgsql/13/arch
cat /var/lib/pgsql/13/data/postgresql.conf
archive_mode=on
archive_command = 'cp %p /var/lib/pgsql/13/arch/%f'
vi /var/lib/pgsql/13/data/postgresql.conf
listen_addresses = '*'
vi /var/lib/pgsql/13/data/pg_hba.conf
/usr/pgsql-13/bin/pg_ctl restart
7. (MASTER) Korzystając z psql utwórz nową tabelę MIASTA i wstaw do niej jeden rekord.
psql
8. (STANDBY) Zaloguj się do systemu operacyjnego jako postgres. Wyczyść zawartość katalogu
Data Directory, uprzednio zabezpieczając pliki postgresql.conf i pg_hba.conf. Następnie
wykonaj na maszynie STANDBY kopię bezpieczeństwa bazy danych MASTER (hasło użytkownika
replication: 'replication').
mv /var/lib/pgsql/13/data/*.conf /var/lib/pgsql/13/backups
rm -rf /var/lib/pgsql/13/data/
mv /var/lib/pgsql/13/backups/*.conf /var/lib/pgsql/13/data
vi /var/lib/pgsql/13/data/postgresql.conf
hot_standby=on
primary_conninfo='host=adres.ip.master port=5432 user=replication
password=replication'
touch /var/lib/pgsql/13/data/standby.signal
11. (STANDBY) Uruchom serwer PostgreSQL - replikacja stanu bazy danych powinna uruchomić się
automatycznie.
psql
13. (MASTER) Korzystając z programu psql sprawdź, czy użytkownik REPLICATION podłączył się do
serwera. Następnie dodaj nowy rekord do tabeli MIASTA.
\x
select * from pg_stat_activity where usename = 'replication' ;
\x
14. (STANDBY) Korzystając z programu psql sprawdź czy nowy rekord został zreplikowany do
tabeli MIASTA
15. (STANDBY) Korzystając z programu psql przekonaj się, że serwer STANDBY pracuje w trybie
tylko do odczytu
16. (STANDBY) Aby zakończyć pracę serwera STANDBY jako zapasowego i aktywować go w trybie
serwera podstawowego, wykonaj polecenie pg_ctl promote.
/usr/pgsql-13/bin/pg_ctl promote
17. (STANDBY) Korzystając z programu psql przekonaj się, że serwer STANDBY pracuje już teraz
w trybie samodzielnym i pozwala na modyfikowanie danych. Zauważ też, że automatycznie
zniknął plik standby.signal.
psql
ls /var/lib/pgsql/13/data/standby.signal
2. Za pomocą widoku pg_stats wyświetl statystyki Query Plannera dla utworzonych tabel:
set max_parallel_workers_per_gather=0;
select max(amount)
from sales, salesmen, products
where sales.salesman_id = salesmen.salesman_id
and sales.prod_id = products.prod_id
and salesmen.sex='M'
and products.price=400000;
Czy Query Planner postanowił skorzystać z indeksu w celu selekcji według kolumny sex?
Czy Query Planner postanowił skorzystać z indeksu w celu selekcji według kolumny price?
Jaki algorytm łączenia tabel został wybrany?
W jakiej kolejności łączone będą tabele?
Z której tabeli odczytana będzie największa liczba rekordów?
Ponownie wyświetl wygenerowany plan wykonania zapytania dla zapytania z kroku (5).
Które z utworzonych indeksów zostały wykorzystane? Dlaczego?
select max(amount)
from sales, salesmen, products
where sales.salesman_id = salesmen.salesman_id
and sales.prod_id = products.prod_id
and salesmen.sex='M'
and products.price=400000;
Indeksy
7. Wyświetl wygenerowany plan wykonania dla poniższego zapytania. Czy Query Planner postanowił
użyć indeksu? Jaki jest szacunkowy koszt planu wykonania zapytania?
9. Sprawdź, czy indeksy utworzone w kroku (8) będą wykorzystane przez poniższe zapytania.
Dlaczego?
11. W celu wspierania operatorów LIKE/ILIKE, utwórz nowy indeks B-tree n akolumnie NAME tabeli
PRODUCTS, korzystając z opcji text_pattern_ops (create index i2patt on products(name
text_pattern_ops);). Sprawdź, które z poniższych zapytań skorzysta z tego indeksu:
12. Wyświetl wygenerowany plan wykonania poniższego zapytania. Czy serwer dokonuje odczytu
tabeli PRODUCTS? Dlaczego?
select count(*)
from products
where price=51000;
13. Wyświetl plany wykonania poniższych zapytań. Czy Query Planner postanowił w obu przypadkach
skorzystać z indeksu? Utwórz nowy indeks na upper(name) i zweryfikuj jego użycie (create
index i5 on products(upper(name));).