# PostgreSQL na Ubuntu: profesjonalne wdrozenie krok po kroku

Wdrozenie klastra PostgreSQL na Ubuntu robione 'na szybko' czesto koczy sie problemami przy pierwszym powaznym obciazeniu. Ten tekst prowadzi przez instalacje zgodnie z dobrymi praktykami.

**Jak poprawnie wdrożyć klaster PostgreSQL na Ubuntu? Jak sprawić by uruchamiał się automatycznie z systemem? Jak określić położenie PGDATA? Na te i inne pytania znajdziesz odpowiedzi w tym artykule :)**

|  |  |  |  |
| --- | --- | --- | --- |
| [Ikona pliku PDF do pobrania   Cheatsheet](https://jsystems.pl/nowy_blog/download/postgresql/cheatsheety/010_Instrukcja_instalacji_na_Ubuntu_cheatsheet.pdf) | [Ikona notatek   Cheatsheet edytowalny](https://jsystems.pl/nowy_blog/download/postgresql/cheatsheety/010_Instrukcja_instalacji_na_Ubuntu_cheatsheet.docx) | [Ikona ćwiczenia   Ćwiczenie](https://jsystems.pl/nowy_blog/download/postgresql/cwiczenia/010_Instalacja_klastra_PostgreSQL_na_Ubuntu_cwiczenie.pdf) | [Ikona wskazówki   Rozwiązanie ćwiczenia](https://www.youtube.com/watch?v=5MmUgMIzRQY) |

  

**Z tego artykułu dowiesz się:**

- jak zainstalować binaria wybranej wersji (a nie - domyślnej dla systemu) na serwerach z systemem Ubuntu,- gdzie co leży,- jak dodać binaria PostgreSQL do PATHa,- jak samemu zdefiniować położenie klastra,- jak skonfigurować by PostgreSQL działał jako usługa (dzięki czemu wygodniej się nim zarządza),- jak skonfigurować automatyczny start PostgreSQL z systemem,- jak skonfigurować system Ubuntu w taki sposób, by nie restartował PostgreSQL w przypadku gdy zacznie kończyć się pamięć RAM,- jak skonfigurować system Ubuntu w taki sposób, by nie wpadał w nieskończony cykl odtwarzania.

Pierwszy krok to stworzenie pliku konfiguracji dla repozytorium jako użytkownik z uprawnieniami sudo albo root. W drugim przypadku pomijamy sudo na początku poleceń z instrukcji:

```
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
```

Pobranie i import klucza dla oficjalnego repozytorium Ubuntu do listy zaufanych kluczy w apt:

```
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
```

Aktualizacja listy dostępnych pakietów:

```
sudo apt-get update
```

Instalacja dostępnych aktualizacji:

```
sudo apt-get upgrade -y
```

Restart serwera po aktualizacji niektóre paczki, szczególnie te aktualizujące jądro linuxa, nie będą “aktywne” do następnego startu serwera:

```
sudo reboot
```

Przystępujemy do instalacji binariów PostgreSQL. Łączymy się do serwera ponownie (na pewno nas rozłączyło przy restarcie) i wykonujemy:

```
sudo apt-get -y install postgresql-15
```

Po instalacji pakietów PostgreSQL - Ubuntu automatycznie stworzy i wystartuje domyślny klaster. Sprawdzamy, czy działa:

```
systemctl status postgres*
```

![Profesjonalne wdrożenie klastra PostgreSQL na Ubuntu: ilustracja poglądowa](https://jsystems.pl/nowy_blog/img/postgresql_adm/10/10.png)

Domyślnie PostgreSQL w Ubuntu będzie miał pliki rozmieszczone w takich lokalizacjach:  
  
**Katalog z binariami: /usr/lib/postgresql/15/bin/  
Katalog domowy postgresa: /var/lib/postgresql**

  
![Profesjonalne wdrożenie klastra PostgreSQL na Ubuntu: ilustracja poglądowa (2)](https://jsystems.pl/nowy_blog/img/postgresql_adm/10/20.png)

Część plików konfiguracyjnych znajduje się w /etc/postgresql/15/main. W tym dwa bardzo ważne i często aktualizowane: „postgresql.conf”i „pg\_hba.conf”. Zajmiemy się nimi nieco później:

![Profesjonalne wdrożenie klastra PostgreSQL na Ubuntu: ilustracja poglądowa (3)](https://jsystems.pl/nowy_blog/img/postgresql_adm/10/30.png)

Dosyć często będziemy działać z poziomu użytkownika systemowego postgres (zostaje on utworzony w chwili instalacji PostgreSQL), dlatego warto, by miał - w swoim PATH binarki PostgreSQL. Dzięki temu nie będziemy musieli wskazywać pełnych ścieżek do binarek, które chcemy - użyć. W tym celu logujemy się na postgresa:

```
sudo su - postgres
```

Następnie już jako użytkownik systemowy postgres wykonujemy:

```
cat << EOF >> ~/.bash_profile
PATH=$PATH:/usr/lib/postgresql/15/bin
export PATH

EOF
```

Zmiana ta nie będzie widoczna od razu. Istnieją dwie możliwości. Możemy - się wylogować i zalogować na użytkownika postgres ponownie lub wykonać skrypt, który przeładuje nam zmienne środowiskowe. Aby przeładować zmienne środowiskowe, - jako użytkownik postgres musimy wykonać:

```
. ~/.bash_profile
```

Po tej operacji nasza zmienna środowiskowa PATH powinna zostać uzupełniona o katalog z binarkami PostgreSQL:

![Profesjonalne wdrożenie klastra PostgreSQL na Ubuntu: ilustracja poglądowa (4)](https://jsystems.pl/nowy_blog/img/postgresql_adm/10/40.png)

### PGDATA w wybranej lokalizacji + autostart usługi

Nie zawsze chcemy pozostawić domyślną konfigurację. Przyjmijmy, że planujemy mieć wszystkie pliki danych i konfiguracyjne PostgreSQL w innej lokalizacji, np. na innym dysku. Miejsce, w którym składowane są dane i configi, nazywamy w PostgreSQL PGDATA. Do tego usługa powinna startować automatycznie, korzystając z nowej lokalizacji plików. W tym celu musimy wykonać kilka czynności.

**Jeśli planujemy zarządzanie instancjami PostgreSQL za pomocą klastra wysokiej dostępności Patroni, to nie konfigurujemy usługi serwera PostgreSQL (poniżej), ponieważ Patroni sam zajmie się uruchamianiem i wyłączaniem usług PostgreSQL.**

Przede wszystkim trzeba zatrzymać aktualnie działającą usługę i wyłączyć jej automatyczne włączanie:

```
sudo systemctl stop postgresql@15-main.service
sudo systemctl disable postgresql@15-main.service

sudo systemctl stop postgresql.service
sudo systemctl disable postgresql.service
```

Sprawdzamy, czy usługa na pewno jest wyłączona:

```
systemctl status postgres*
```

Jeśli ta lista jest pusta, możemy przystąpić do kolejnej czynności, to jest do utworzenia katalogu na nową PGDATA w wybranym miejscu i spowodowanie, by jej właścicielem był użytkownik systemowy postgres (jest tworzony automatycznie przy instalacji PostgreSQL).

```
sudo mkdir -m 700 /data_pg
sudo chown postgres: /data_pg/
```

Teraz należy zainicjalizować klaster, tj. za pomocą postgresowego narzędzia initdb utworzyć niezbędne struktury i pliki. Następnie przechodzimy na użytkownika systemowego postgres i inicjalizujemy klaster:

```
sudo su - postgres
initdb -D /data_pg/
```

![PGDATA w wybranej lokalizacji + autostart usługi: Profesjonalne wdrożenie klastra PostgreSQL na Ubuntu](https://jsystems.pl/nowy_blog/img/postgresql_adm/10/50.png)

Jeśli otrzymamy komunikat : “command initdb not found”, - to znaczy, że nie dodaliśmy binarek PostgreSQL do zmiennej PATH lub nie przeładowaliśmy zmiennych środowiskowych użytkownika systemowego postgres. Możemy wrócić do tego punktu i go wykonać albo podawać ścieżkę bezwzględną do konkretnej binarki, np:  
**/usr/lib/postgresql/15/bin/initdb**  
Włączamy klaster, by sprawdzić, czy działa:

```
pg_ctl -D /data_pg/ start
```

![PGDATA w wybranej lokalizacji + autostart usługi: Profesjonalne wdrożenie klastra PostgreSQL na Ubuntu (2)](https://jsystems.pl/nowy_blog/img/postgresql_adm/10/60.png)

Jeśli widzimy takie informacje również u siebie (chodzi o końcowe “server started”), to znaczy, że nowy klaster działa.

Zatrzymamy teraz klaster, ponieważ za chwilę skonfigurujemy go jako usługę i uruchomimy.

```
pg_ctl -D /data_pg/ stop
```

Zadbamy też o to, by usługa PostgreSQL automatycznie się uruchamiała. Inaczej musielibyśmy startować klaster za pomocą “pg\_ctl” przy każdym restarcie maszyny.

Przechodzimy teraz do użytkownika systemowego z prawami do sudo i wykonujemy:

```
sudo nano /lib/systemd/system/postgresql-15.service
```

Powstanie nowy plik. Wklejamy do niego:

```
[Unit]
Description=PostgreSQL 15 database server
Documentation=https://www.postgresql.org/docs/15/static/
After=syslog.target
After=network-online.target

[Service]
Type=notify
User=postgres
Group=postgres
Environment=PGDATA=/data_pg/

#Wyłączenie OOM (Out Of Memory) killera dla postgresa:

OOMScoreAdjust=-1000
Environment=PG_OOM_ADJUST_FILE=/proc/self/oom_score_adj
Environment=PG_OOM_ADJUST_VALUE=0

ExecStart=/usr/lib/postgresql/15/bin/postmaster -D ${PGDATA}
ExecReload=/bin/kill -HUP $MAINPID
KillMode=mixed
KillSignal=SIGINT

# wyłączony timeout, żeby postgres mógł w spokoju wykonać crash recovery podczas startu
# inaczej linux mógłby spróbować restartować usługę jeżeli nie wystartowała w X sekund
TimeoutSec=0
TimeoutStartSec=0
TimeoutStopSec=1h

[Install]
WantedBy=multi-user.target
```

Należy dostosować ten element pliku do swojej ścieżki do PGDATA (jeśli jest inna niż tworzona w tej instrukcji):

```
Environment=PGDATA=/data_pg/
```

Zapisujemy plik, włączamy autostart i uruchamiamy usługę:

```
#włączenie autostartu:

sudo systemctl enable postgresql-15.service

#uruchomienie usługi:

sudo systemctl start postgresql-15.service
```

Możemy ponownie sprawdzić status usługi:

```
systemctl status postgresql-15.service
```

![PGDATA w wybranej lokalizacji + autostart usługi: Profesjonalne wdrożenie klastra PostgreSQL na Ubuntu (3)](https://jsystems.pl/nowy_blog/img/postgresql_adm/10/70.png)

Wykonujemy - restart serwera i sprawdzamy ponownie, czy usługa wstała:

```
sudo reboot
sudo systemctl status postgresql-15.service
```

**Jeżeli konfigurujemy PostgreSQL jako usługę, to należy startować i zatrzymać klaster już z poziomu systemctl, a nie pg\_ctl dlatego, że proces uruchomiony przez pg\_ctl i usługa nie wiedzą o sobie wzajemnie.**

[![Baner szkolenia Administracja, replikacja i tuning baz danych PostgreSQL w JSystems, terminy gwarantowane](https://jsystems.pl/new_page_resources/images/other/pgadm1.jpg)](https://jsystems.pl/szkolenia-postgresql;administracja_bazami_danych_postgresql_z_elementami_ha__optymalizacji_i_replikacji.szczegoly?utm_source=blog&utm_medium=article&utm_campaign=post245&utm_content=banner)

[Szkolenie Administracja, replikacja i tuning baz danych PostgreSQL →](https://jsystems.pl/szkolenia-postgresql;administracja_bazami_danych_postgresql_z_elementami_ha__optymalizacji_i_replikacji.szczegoly?utm_source=blog&utm_medium=article&utm_campaign=post245&utm_content=link)

To szkolenie może być [dofinansowane dla Ciebie z KFS lub BUR](https://jsystems.pl/dofinansowanie?utm_source=blog&utm_medium=article&utm_campaign=post245&utm_content=dofinansowanie).

★★★★★Średnia ocena naszych szkoleń w Google: **5/5**

## Powiązane artykuły

- ›[Kurs administracji PostgreSQL - wybór preworka](https://jsystems.pl/blog/show_post/kurs_administracji_postgresql_-_wybor_preworka)
- ›[Upgrade klastra PostgreSQL - pg\_upgrade krok po kroku](https://jsystems.pl/blog/show_post/postgresql_-_upgrade_klastra)
- ›[PostgreSQL - katalogi i pliki klastra](https://jsystems.pl/blog/show_post/postgresql_-_katalogi_i_pliki_klastra)
- ›[Kurs administracji PostgreSQL](https://jsystems.pl/blog/show_post/bezplatny_kurs_administracji_postgresql)
- ›[PG\_PREWARM - prosty i szybki tuning w PostgreSQL](https://jsystems.pl/blog/show_post/PG_PREWARM_-_prosty_i_szybki_tuning_w_PostgreSQL)
- ›[PostgreSQL - PG\_REPACK : przenoszenie, przebudowa i klastrowanie tabel i indeksów](https://jsystems.pl/blog/show_post/postgresql_-_pg_repack__przenoszenie_przebudowa_i_klastrowanie_tabel_i_indeksow_online)
