Ako nainštalovať a používať PostgreSQL na Ubuntu
Úvod
Systémy správy databáz sú základnou súčasťou mnohých webových stránok a aplikácií, poskytujúc štruktúrovaný spôsob ukladania, organizovania a prístupu k informáciám. PostgreSQL, bežne známy ako Postgres, je vedúcim open-source relačným systémom správy databáz. Poskytuje kompletnú implementáciu jazyka SQL pre dotazy a je dobre známy svojou zhodou so štandardmi a pokročilými funkciami, ako sú spoľahlivé transakcie a súbežnosť bez zamykania čítania.
Tento sprievodca demonštruje kompletný proces nastavenia PostgreSQL na serveri Ubuntu, začínajúc inštaláciou potrebných softvérových balíkov. Následne sa naučíte, ako pracovať s autentifikačným systémom Postgres, ktorý sa spravuje prostredníctvom „rolí“, vrátane vytvárania nových používateľov a databáz. Potom pokryjeme základy správy databáz: pripojenie k novej databáze, definovanie dátovej štruktúry vytváraním tabuliek a manipulácia s dátami pomocou základných SQL príkazov. Taktiež preskúmame kľúčové administratívne témy, vrátane základného nastavenia pre výkon, stratégie zálohovania a obnovy, porovnanie PostgreSQL s inými databázovými systémami a príručku riešenia bežných problémov.
Jedným kliknutím nasadíte databázu PostgreSQL pomocou spravovaných databáz Linux-Console.net. Nechajte Linux-Console.net postarať sa o škálovanie, údržbu a aktualizácie vašej databázy.
Hlavné body:
-
PostgreSQL je možné nainštalovať na Ubuntu pomocou predvolených repozitárov s balíčkovým manažérom
apt. Toto poskytuje stabilnú a bezpečnú základnú verziu databázového servera a jeho klientskych nástrojov. PostgreSQL spravuje oprávnenia pomocou konceptu „rolí“, ktoré možno považovať za používateľov alebo skupiny. Tento systém kontroluje, kto sa môže prihlásiť, k akým databázam má prístup a aké operácie môže vykonávať.
Počas inštalácie sa vytvorí predvolená rola s názvom
postgress úplnými právami superužívateľa. Obvykle sa používa na počiatočnú administráciu a nastavenie iných rolí a databáz.Predvoleným nastavením Postgres je použitie
peerautentifikácie pre lokálne pripojenia. Táto metóda umožňuje prístup k databázovej roli, ak má rovnaké meno ako aktívny používateľ systému Linux.Nové role a databázy môžete vytvárať z príkazového riadku pomocou nástrojov
createuseracreatedb. Tieto nástroje sa zvyčajne spúšťajú pod používateľom Linuxupostgres, aby sa získali potrebné oprávnenia.Nástroj
psqlje hlavný príkazový terminál na interakciu s PostgreSQL. Môžete ho použiť na pripojenie k určitej databáze ako konkrétny používateľ a vykonávanie SQL dotazov.Kým
peerautentifikácia je predvolená, môžete nakonfigurovať PostgreSQL tak, aby vyžadoval heslá pre miestne alebo vzdialené pripojenia. To zahŕňa vytvorenie roly s heslom a aktualizáciu konfiguračného súborupg_hba.conf.Článok podrobne opisuje, ako spravovať svoju dátovú štruktúru vytváraním a úpravou tabuliek. Pokrýva tiež základné príkazy SQL na manipuláciu s dátami, ako je pridávanie dát pomocou
INSERTa ich získavanie pomocouSELECT.Okrem základov sprievodca predstavuje dôležité administratívne témy. Patrí sem úprava konfigurácie servera pre lepší výkon, stratégie zálohovania a obnovy a metódy riešenia bežných problémov.
Predpoklady
Kompatibilita verzií: Tento návod bol overený na Ubuntu 20.04, 22.04, 24.04 a 25.04. Ak používate novšiu verziu, tieto kroky zostávajú platné pre väčšinu verzií Ubuntu. Ak sa verzie balíkov alebo konfiguračné cesty vo vašom systéme líšia, postupujte podľa rovnakého postupu a konzultujte poznámky k vydaniu pre vaše konkrétne verzie Ubuntu a PostgreSQL.
Aby ste mohli sledovať tento tutoriál, budete potrebovať jeden server Ubuntu, ktorý bol nakonfigurovaný podľa nášho sprievodcu Počiatočné nastavenie servera pre Ubuntu. Po dokončení tohto predbežného tutoriálu by mal mať váš server ne-root používateľa s oprávneniami sudo a základný firewall.
Krok 1 — Inštalácia PostgreSQL
Ak chcete nainštalovať PostgreSQL, najprv obnovte lokálny index balíkov vášho servera:
sudo apt updatePotom nainštalujte balík postgres spolu s balíkom -contrib, ktorý pridáva niektoré dodatočné nástroje a funkcie:
sudo apt install postgresql postgresql-contribVerziu môžete skontrolovať spustením nasledujúceho príkazu:
psql --versionUistite sa, že služba je spustená:
sudo systemctl start postgresql.serviceKrok 2 — Používanie rolí a databáz v PostgreSQL
PostgreSQL štandardne používa koncept nazývaný „role“ na správu autentifikácie a autorizácie. Tieto sú v niektorých ohľadoch podobné bežným používateľom a skupinám v štýle Unixu.
Po inštalácii je Postgres nastavený na používanie peer autentifikácie, čo znamená, že spája Postgres roly s zodpovedajúcim účtom v systéme Unix/Linux. Ak rola existuje v Postgres, používateľské meno na Unix/Linux so zhodným názvom sa môže prihlásiť ako táto rola.
Inštalačný postup vytvoril používateľský účet s názvom postgres, ktorý je spojený s predvolenou rolou Postgres. Existuje niekoľko spôsobov, ako tento účet využiť na prístup k Postgres. Jedným zo spôsobov je prepnúť sa na účet postgres na vašom serveri spustením nasledujúceho príkazu:
sudo -i -u postgresPotom môžete získať prístup k výzve Postgres spustením:
psqlTýmto sa prihlásite do PostgreSQL príkazového riadku a odtiaľ môžete okamžite začať komunikovať so systémom správy databáz.
Ak chcete ukončiť príkazový riadok PostgreSQL, spustite nasledujúce:
\qTým sa vrátite späť na príkazový riadok Linuxu postgres. Ak sa chcete vrátiť k svojmu bežnému používateľovi systému, spustite príkaz exit:
exitĎalší spôsob, ako sa pripojiť k príkazovému riadku Postgres, je spustiť príkaz psql priamo ako účet postgres pomocou sudo:
sudo -u postgres psqlTýmto sa prihlásite priamo do Postgres bez medzičlánku v podobe bash shellu.
Opäť, interaktívnu reláciu Postgres môžete ukončiť spustením nasledujúceho príkazu:
\qKrok 3 — Vytvorenie novej roly
Ak ste prihlásený ako účet postgres, môžete vytvoriť novú rolu spustením nasledujúceho príkazu:
createuser --interactiveAk však radšej chcete používať sudo pre každý príkaz bez prepínania zo svojho bežného účtu, spustite:
sudo -u postgres createuser --interactiveTak či onak, skript vám ponúkne niekoľko možností a na základe vašich odpovedí vykoná správne príkazy Postgres na vytvorenie používateľa podľa vašich špecifikácií.
Enter name of role to add: sammy
Shall the new role be a superuser? (y/n) yKrok 4 — Vytvorenie novej databázy
Ďalším predpokladom, ktorý systém overovania Postgres predvolene robí, je, že pre akúkoľvek rolu používanú na prihlásenie bude táto rola mať databázu s rovnakým názvom, ku ktorej má prístup.
To znamená, že ak používateľ, ktorého ste vytvorili v predchádzajúcej časti, sa volá sammy, táto rola sa pokúsi pripojiť k databáze, ktorá sa podľa predvoleného nastavenia volá tiež „sammy“. Príslušnú databázu môžete vytvoriť pomocou príkazu createdb.
Ak ste prihlásený ako účet postgres, zadali by ste niečo podobné:
createdb sammyAk však uprednostňujete používanie sudo pri každom príkaze bez prechodu z vášho bežného účtu, použijete:
sudo -u postgres createdb sammyKrok 5 — SQL metóda na vytvorenie nového používateľa a databázy (voliteľné)
Príkazy shellu createuser a createdb sú užitoční pomocníci. Pre väčšiu kontrolu však môžete rovnaké akcie vykonať priamo v PostgreSQL pomocou SQL príkazov. Tento prístup je často jasnejší pri nastavovaní hesiel alebo prideľovaní konkrétnych oprávnení od začiatku.
Najprv sa pripojte ako administrátorský používateľ
postgres:sudo -u postgres psqlKeď ste na výzve PostgreSQL, môžete použiť
CREATE ROLEaCREATE DATABASEna vytvorenie nového používateľa a databázy.Vytvoriť novú rolu (používateľa): Kým príkaz shell
createuserje interaktívny, príkazCREATE ROLEvám umožňuje definovať všetko v jednom vyhlásení. Ak chcete vytvoriť používateľa menom sammy, ktorý sa môže prihlásiť (LOGIN) a má heslo, spustite:CREATE ROLE sammy WITH LOGIN PASSWORD 'your_strong_password';Ak bude tento používateľ potrebovať aj vytvárať databázy, môžete mu toto oprávnenie udeliť súčasne:
CREATE ROLE sammy WITH LOGIN PASSWORD 'your_strong_password' CREATEDB;Toto poskytuje podmnožinu oprávnení superužívateľa, konkrétne umožňuje používateľovi vytvárať nové databázy. Odpoveďou 'áno' na otázku o superužívateľovi v interaktívnom sprievodcovi sa tiež udeľuje toto oprávnenie, samotná rola
SUPERUSERje však oveľa širšia a nebezpečnejšia.Vytvoriť novú databázu: Ďalej vytvorte databázu. Je dobrou praxou priradiť vlastníctvo novej databázy novej roli, ktorú ste práve vytvorili.
CREATE DATABASE sammydb OWNER sammy;Ak chcete používateľovi
sammyudeliť oprávnenie pripojiť sa k novej databáze (čo je bežný ďalší krok), môžete spustiť:GRANT ALL PRIVILEGES ON DATABASE sammydb TO sammy;Toto udeľuje oprávnenia na úrovni databázy, ako je
CONNECT, ale nie oprávnenia k konkrétnym tabuľkám. Upozorňujeme, že toto automaticky nepridelené oprávnenia na prezeranie alebo úpravu tabuliek v databáze; na to sú potrebné ďalšie príkazyGRANTna schéme (napr. public) a samotných tabuľkách.Ukončite reláciu
postgres: Teraz môžete opustiť výzvupsqlpre používateľapostgres.\q
Keďže ste nastavili heslo, tento nový používateľ sa môže autentifikovať pomocou iných metód ako ident, čo je potrebné pre vzdialené pripojenia.
Krok 6 — Otvorenie Postgres konzoly s novou rolou
Na prihlásenie pomocou autentifikácie založenej na ident budete potrebovať používateľa Linuxu s rovnakým menom ako vaša rola a databáza Postgres.
Ak nemáte k dispozícii zodpovedajúceho používateľa Linuxu, môžete si ho vytvoriť pomocou príkazu adduser. Budete to musieť urobiť zo svojho ne-root účtu s oprávneniami sudo (teda neprihlásený ako používateľ postgres):
sudo adduser sammyKeď bude tento nový účet k dispozícii, môžete sa buď prepnúť a pripojiť k databáze spustením nasledujúceho:
sudo -i -u sammy
psqlAlebo to môžete urobiť priamo v riadku:
sudo -u sammy psqlTento príkaz vás automaticky prihlási, za predpokladu, že všetky komponenty boli správne nakonfigurované.
Ak chcete, aby sa váš používateľ pripojil k inej databáze, môžete to urobiť tak, že určíte databázu nasledovne:
psql -d postgresPo prihlásení si môžete skontrolovať svoje aktuálne informácie o pripojení spustením:
\conninfoYou are connected to database "sammy" as user "sammy" via socket in "/var/run/postgresql" at port "5432".Toto je užitočné, ak sa pripájate k databázam, ktoré nie sú predvolené, alebo používate nepoužívané používateľské účty.
Krok 7 — Vytváranie a odstraňovanie tabuliek
Teraz, keď už viete, ako sa pripojiť k databázovému systému PostgreSQL, môžete sa naučiť niektoré základné úlohy správy Postgresu.
Základná syntax na vytváranie tabuliek je nasledovná:
CREATE TABLE table_name (
column_name1 col_type (field_length) column_constraints,
column_name2 col_type (field_length),
column_name3 col_type (field_length)
);Ako vidíte, tieto príkazy pridelia tabuľke názov, a potom definujú stĺpce, ako aj typ stĺpca a maximálnu dĺžku dát poľa. Voliteľne môžete tiež pridať obmedzenia tabuľky pre každý stĺpec.
Ak sa chcete dozvedieť viac o vytváraní a mazaní tabuliek, pozrite si náš článok o tom, ako vytvárať a spravovať tabuľky v Postgrese.
Na ukážkové účely vytvorte nasledujúcu tabuľku:
CREATE TABLE playground (
equip_id serial PRIMARY KEY,
type varchar (50) NOT NULL,
color varchar (25) NOT NULL,
location varchar(25) check (location in ('north', 'south', 'west', 'east', 'northeast', 'southeast', 'southwest', 'northwest')),
install_date date
);Tento príkaz vytvorí tabuľku, ktorá inventarizuje ihriskové vybavenie. Prvý stĺpec tabuľky bude obsahovať ID čísla vybavenia typu serial, čo je automaticky zvyšujúce sa celé číslo. Tento stĺpec má tiež obmedzenie PRIMARY KEY, čo znamená, že hodnoty v ňom musia byť jedinečné a nesmú byť null.
Nasledujúce dva riadky vytvárajú stĺpce pre vybavenie typ a farba, z ktorých ani jeden nemôže byť prázdny. Riadok po nich vytvára stĺpec miesto ako aj obmedzenie, ktoré vyžaduje, aby hodnota bola jednou z ôsmich možných hodnôt. Posledný riadok vytvára stĺpec dátum, ktorý zaznamenáva dátum, kedy ste vybavenie nainštalovali.
Pre dva stĺpce (equip_id a install_date) príkaz nešpecifikuje dĺžku poľa. Dôvodom je, že niektoré dátové typy nevyžadujú nastavenú dĺžku, pretože dĺžka alebo formát je predpokladaná.
Novú tabuľku si môžete pozrieť zadaním:
\d List of relations
Schema | Name | Type | Owner
--------+-------------------------+----------+-------
public | playground | table | sammy
public | playground_equip_id_seq | sequence | sammy
(2 rows)Vaša tabuľka playground je tu, ale existuje aj niečo, čo sa nazýva playground_equip_id_seq, čo je typu sequence. Toto je reprezentácia typu serial, ktorý ste priradili svojmu stĺpcu equip_id. Tento sleduje ďalšie číslo v sekvencii a je automaticky vytvorený pre stĺpce tohto typu.
Ak chcete vidieť len tabuľku bez sekvencie, môžete zadať:
\dt List of relations
Schema | Name | Type | Owner
--------+------------+-------+-------
public | playground | table | sammy
(1 row)S pripravenou tabuľkou ju využime na precvičovanie správy údajov.
Krok 8 — Pridávanie, dotazovanie a mazanie údajov v tabuľke
Teraz, keď máte tabuľku, môžete do nej vložiť nejaké údaje. Ako príklad pridajte slide a swing tak, že zavoláte tabuľku, do ktorej chcete dáta pridať, pomeníte stĺpce a potom poskytnete údaje pre každý stĺpec, napríklad takto:
INSERT INTO playground (type, color, location, install_date) VALUES ('slide', 'blue', 'south', '2017-04-28');
INSERT INTO playground (type, color, location, install_date) VALUES ('swing', 'yellow', 'northwest', '2018-08-16');Pri zadávaní údajov by ste mali byť opatrní, aby ste sa vyhli niekoľkým bežným problémom. Napríklad, názvy stĺpcov neuzatvárajte do úvodzoviek, ale hodnoty stĺpcov, ktoré zadávate, úvodzovky potrebujú.
Ďalšia vec, na ktorú si treba dávať pozor, je, že do stĺpca equip_id nezadávate žiadnu hodnotu. Je to preto, že sa táto hodnota generuje automaticky zakaždým, keď pridáte nový riadok do tabuľky.
Na získanie pridaných informácií zadajte:
SELECT * FROM playground; equip_id | type | color | location | install_date
----------+-------+--------+-----------+--------------
1 | slide | blue | south | 2017-04-28
2 | swing | yellow | northwest | 2018-08-16
(2 rows)Tu môžete vidieť, že vaše equip_id bolo úspešne vyplnené a všetky ostatné údaje sú správne usporiadané.
Ak sa šmykľavka na ihrisku pokazí a musíte ju odstrániť, môžete tiež odstrániť riadok z tabuľky tak, že zadáte:
DELETE FROM playground WHERE type = 'slide';Znova dotazujte tabuľku:
SELECT * FROM playground; equip_id | type | color | location | install_date
----------+-------+--------+-----------+--------------
2 | swing | yellow | northwest | 2018-08-16
(1 row)Všimnite si, že riadok slide už nie je súčasťou tabuľky.
Krok 9 — Pridávanie a odstraňovanie stĺpcov z tabuľky
Po vytvorení tabuľky ju môžete upravovať pridávaním alebo odstraňovaním stĺpcov. Pridajte stĺpec na zobrazenie poslednej údržbovej návštevy pre každý kus zariadenia takto:
ALTER TABLE playground ADD last_maint date;Ak si znovu pozriete informácie o svojej tabuľke, uvidíte, že nový stĺpec bol pridaný, ale žiadne údaje neboli zadané:
SELECT * FROM playground; equip_id | type | color | location | install_date | last_maint
----------+-------+--------+-----------+--------------+------------
2 | swing | yellow | northwest | 2018-08-16 |
(1 row)Ak zistíte, že váš pracovný tím používa samostatný nástroj na sledovanie histórie údržby, môžete stĺpec odstrániť zadaním:
ALTER TABLE playground DROP last_maint;Týmto sa odstráni stĺpec last_maint a všetky hodnoty v ňom, ale všetky ostatné údaje zostanú nezmenené.
Krok 10 — Aktualizácia údajov v tabuľke
Doteraz ste sa naučili, ako pridávať záznamy do tabuľky a ako ich mazat, ale tento tutoriál zatiaľ nepokryl, ako upravovať existujúce záznamy.
Hodnoty existujúceho záznamu môžete aktualizovať tak, že vyhľadáte požadovaný záznam a nastavíte stĺpec na hodnotu, ktorú chcete použiť. Môžete vyhľadať záznam swing (týmto sa zhodujú všetky hojdačky vo vašej tabuľke) a zmeniť jeho farbu na red. Toto môže byť užitočné, ak ste hojdačke dali nový náter:
UPDATE playground SET color = 'red' WHERE type = 'swing';Môžete overiť, že operácia bola úspešná, opätovným dotazovaním údajov:
SELECT * FROM playground; equip_id | type | color | location | install_date
----------+-------+-------+-----------+--------------
2 | swing | red | northwest | 2018-08-16
(1 row)Ako vidíte, snímok je teraz zaznamenaný ako červený.
Konfigurácia a tipy na výkon PostgreSQL
Správna konfigurácia PostgreSQL je nevyhnutná pre stabilnú a rýchlu databázu. Predvolené nastavenia sú navrhnuté tak, aby boli bezpečné pre akýkoľvek hardvér, čo znamená, že takmer nikdy nie sú vhodné pre produkčné zaťaženie. Ladenie výkonu zahŕňa úpravu alokácie zdrojov – najmä pamäte, I/O a spracovania pripojení – tak, aby zodpovedali hardvéru vášho servera a konkrétnym vzorom dotazov vašej aplikácie.
Poďme si prebrať niekoľko kľúčových konfiguračných parametrov a všeobecných stratégií na zlepšenie výkonu databázy.
Hlavné konfiguračné súbory
Pred ladením musíte vedieť, kde sa nachádzajú konfiguračné súbory. Na Ubuntu sú umiestnené v /etc/postgresql/[verzia]/main/:
postgresql.conf: Hlavný konfiguračný súbor servera. Tu sa nastavujú všetky parametre súvisiace s výkonom.pg_hba.conf: Tento súbor riadi autentifikáciu klientov (ktorí používatelia sa môžu pripojiť z ktorých adries). Priamo neovplyvňuje výkon dotazov, ale je základný pre bezpečnosť.
Po úprave súboru postgresql.conf môžete zmeny použiť načítaním služby PostgreSQL:
sudo systemctl reload postgresqlNiektoré parametre (označené v dokumentácii ako kontext postmaster) však vyžadujú úplné reštartovanie:
sudo systemctl restart postgresqlMôžete spustiť nasledujúci príkaz, aby ste skontrolovali, či je potrebné reštartovať alebo znovu načítať po zmene:
SELECT context FROM pg_settings WHERE name = 'parameter_name';Naopak, zmeny v súbore pg_hba.conf vyžadujú iba načítanie.
sudo systemctl reload postgresqlKonfigurácia pamäte
Pamäť je najdôležitejším faktorom pri výkonnosti databázy. PostgreSQL používa zdieľanú pamäť na ukladanie dát do vyrovnávacej pamäte a samostatnú pamäť pre každé pripojenie na operácie ako triedenie.
shared_buffers
Toto je najdôležitejšie nastavenie pamäte. Určuje množstvo pamäte, ktorú PostgreSQL vyhradí pre svoj dátový cache. Väčší cache znamená, že viac vašich pracovných dát môže byť načítaných z rýchlej pamäte namiesto pomalého disku.
Smernica: Začnite nastavením
shared_buffersna 25 % celkovej pamäte RAM vášho systému.Príklad: Na serveri s 16 GB RAM je dobrý východiskový bod
4GB.Konfigurácia (
postgresql.conf):# Default is 128MB, which is too low shared_buffers = 4GB
work_mem
Toto nastavenie určuje množstvo pamäte, ktoré môže každá jednotlivá databázová operácia (ako triedenie, hash join alebo bitmapa) použiť, než začne zapisovať do dočasných diskových súborov. Zložité dotazy môžu mať viacero operácií, z ktorých každá využíva toto množstvo pamäte.
Nastavenie tohto príliš vysoko môže viesť k vyčerpaniu pamäte, ak súčasne beží veľa zložitých dotazov. Nastavenie príliš nízko spôsobuje časté a pomalé triedenie na disku.
- Smernica: Začnite s predvolenou hodnotou (
4MB). Analyzujte svoje pomalé dotazy pomocouEXPLAIN ANALYZE. Ak vidíte „Sort Method: external merge Disk” alebo „HashAgg Disk”, znamená to, žework_memje príliš malé. Postupne ho zvyšujte (napr.16MB,32MB) pre vašu reláciu na testovanie a nastavujte ho globálne iba vtedy, ak si ste istí.
pamäť_pre_údržbu
Toto nastavenie vyhradzuje pamäť pre interné údržbové operácie, ako napríklad VACUUM, CREATE INDEX a ALTER TABLE ADD FOREIGN KEY.
- Smernica: Nastavte toto vyššie ako
work_mem(napr.128MBalebo256MB). Pretože tieto operácie sa nevykonávajú tak často ako používateľské dotazy, môžete byť pri nich štedrejší, aby ste urýchlili údržbu.
Konfigurácia kontrolného bodu a WAL
Kontrolné body sú procesy, pri ktorých PostgreSQL zapisuje všetky „špinavé“ údaje (zmeny uložené v pamäti) do trvalých súborov na disku. Ide o veľmi náročnú operáciu na vstupno-výstupné operácie. Denník Write-Ahead Log (WAL) zaznamenáva každú transakciu. Ladenie týchto procesov pomáha vyvážiť záťaž I/O a čas obnovy.
| Parameter | Odporúčaná počiatočná hodnota | Účel |
|---|---|---|
wal_bufory | | Nastavuje množstvo zdieľanej pamäte používané pre údaje WAL pred ich zápisom na disk. Predvolená hodnota je malá; 16MB je bezpečné zvýšenie. |
časový_limity_umiestnenia_bodov | 15 min (z predvolených 5 min) | Maximálny čas medzi automatickými kontrolnými bodmi. Rozloženie kontrolných bodov znižuje špičky I/O, ale zvyšuje čas obnovy po havárii. |
max_wal_size | 2GB (z predvoleného 1GB) | Mäkký limit celkovej veľkosti súborov WAL, ktorý spúšťa kontrolný bod. Zvýšenie tejto hodnoty tiež pomáha rozložiť kontrolné body. |
min_wal_size | 512MB (z predvolených 80MB) | Minimálna veľkosť pre uchovanie WAL súborov. Tým sa zabezpečí, že staré súbory nebudú recyklované príliš rýchlo. |
cieľ_dokončenia_uloženia | 0.9 (z predvoleného 0.5) | Rozkladá I/O kontrolných bodov na dlhšie obdobie (90 % času medzi kontrolnými bodmi), aby sa vyhladili výkyvy I/O. |
Spracovanie pripojenia
Každé pripojenie k PostgreSQL využíva pamäť. Vysoký počet pripojení môže vyčerpať zdroje servera.
max_connections: Maximálny počet súbežných pripojení. Predvolená hodnota je100. Aj keď je lákavé túto hodnotu zvýšiť, každé pripojenie spotrebuje pamäť.- Použite Connection Pooler: Pre aplikácie, ktoré otvárajú a zatvárajú veľa pripojení (ako väčšina webových aplikácií), nezvyšujte
max_connections. Namiesto toho použite externý connection pooler, ako je PgBouncer alebo Pgpool-II. Pooler udržiava malý súbor perzistentných pripojení k databáze a obsluhuje mnoho súbežných pripojení aplikácie, čo je oveľa efektívnejšie.
Plánovanie a analýza dotazov
Žiadne vyladenie servera nemôže opraviť neefektívny dopyt.
EXPLAIN ANALYZE: Toto je váš hlavný nástroj na ladenie dotazov. Spustite tento príkaz na svojich pomalých dotazoch, aby ste videli skutočný plán vykonávania a strávený čas.EXPLAIN ANALYZE SELECT * FROM users WHERE last_name = 'Smith';Hľadajte „Sekvenčné prehľadávanie“ (Seq Scan) na veľkých indexovaných tabuľkách. To často znamená, že vám chýba index alebo dotaz nie je dostatočne selektívny.
Vytvorte indexy: Ak často filtrujete alebo spájate podľa konkrétnych stĺpcov (napr.
user_id,email,created_at), sú vhodnými kandidátmi na index.CREATE INDEX idx_users_on_email ON users (email);Spustite
VACUUM ANALYZE: PostgreSQL používa plánovač dotazov, ktorý sa spolieha na štatistiky o dátach vo vašej tabuľke. Tieto štatistiky sú aktualizované pomocouANALYZE. Hociautovacuumtoto robí automaticky, je dobré spustiť manuálneVACUUM ANALYZE;po veľkých nahratiach dát alebo ak si všimnete, že plány dotazov sú slabé.
Poznámka: Spustenie VACUUM ANALYZE; bez názvu tabuľky prebehne na celej databáze, čo môže byť veľmi pomalé. Lepšou praxou je spustiť VACUUM ANALYZE table_name; pre konkrétne tabuľky po hromadnom načítaní údajov.
Zálohovanie a obnova databáz PostgreSQL
Ochrana vašich dát je hlavnou zodpovednosťou správy databázy. Pravidelné, overené zálohy sú najefektívnejšou obranou proti poškodeniu dát, zlyhaniu hardvéru alebo ľudskej chybe. PostgreSQL poskytuje súbor robustných nástrojov príkazového riadku na vytváranie logických záloh a obnovy.
Poznámka o mieste na disku: Pred spustením zálohy sa uistite, že máte dostatok miesta na disku. Pre zálohy v prostom texte (.sql) plánujte voľné miesto približne 100 % veľkosti databázy. Pre zálohy v komprimovanom vlastnom formáte (.dump) plánujte 30-50 % veľkosti databázy, hoci toto sa môže líšiť v závislosti od komprimovateľnosti údajov.
Existujú dve hlavné kategórie záloh:
- Logické zálohy (SQL dumpy): Tieto zálohy pozostávajú z SQL príkazov, ktoré po vykonaní znovu vytvoria databázové objekty (ako sú tabuľky a indexy) a údaje. Vytvárajú sa pomocou utilít
pg_dumpapg_dumpall. Táto metóda je flexibilná a prenosná medzi rôznymi verziami PostgreSQL. - Fyzické zálohy (na úrovni súborového systému): Táto metóda zahŕňa kopírovanie fyzických dátových súborov z dátového adresára PostgreSQL. Zvyčajne sa používa pre obnovu do konkrétneho času (PITR), čo je pokročilé nastavenie, ktoré bude podrobne diskutované neskôr v tejto časti.
Vytváranie logických záloh pomocou pg_dump
Nástroj pg_dump zálohuje jednu databázu. Nezálohuje globálne objekty, ako sú roly alebo tablespaces. Je veľmi flexibilný a môže byť spustený na aktívnej databáze bez blokovania čitateľov alebo zapisovateľov.
Bežné možnosti pg_dump
Výstup pg_dump môžete ovládať pomocou niekoľkých príkazových argumentov:
-F c(Formát: vlastný): Toto je odporúčaný formát pre väčšinu záloh. Vytvára komprimovaný binárny archív, ktorý nie je čitateľný pre človeka, ale umožňuje paralelné obnovenie a preusporiadanie alebo vylúčenie objektov počas obnovy.-F p(Formát: plain): Toto je predvolené nastavenie. Vytvára veľký súbor.sql. Hlavnou nevýhodou je, že ho treba obnoviť naraz a nepodporuje paralelné obnovovanie.-s(len schéma): Zálohuje iba štruktúru databázy (tabuľky, pohľady, indexy) bez akýchkoľvek dát.-a(Len dáta): Zálohuje iba dáta, predpokladajúc, že schéma už existuje v cieľovom prostredí.--exclude-table=TABLE_NAME: Vylúči konkrétnu tabuľku zo zálohy. Je to užitočné pri obchádzaní veľkých, dočasných alebo nie kritických tabuliek.-f FILENAME: Určuje výstupný súbor.-U USER: Určuje používateľa PostgreSQL, ku ktorému sa pripojiť.
Toto je odporúčaný príkaz pre väčšinu zálohovacích úloh. Pripája sa k databáze mydatabase ako používateľ postgres a vytvára komprimovaný súbor s názvom mydatabase.dump.
pg_dump -U postgres -F c -f mydatabase.dump mydatabaseObnova logických záloh
Nástroj, ktorý používate na obnovu, závisí od formátu vášho záložného súboru.
Obnovenie z vlastného archívu (.dump)
Použite nástroj pg_restore. Tento nástroj ponúka značnú flexibilitu, vrátane možnosti paralelného obnovovania a vykonávania predbežných kontrol.
Namiesto ručného vytvárania databázy najprv je najlepšou praxou použiť prepínač --create. Tento prepínač prikáže pg_restore, aby z archívu vykonal príkaz CREATE DATABASE. Na to sa musíte pripojiť k inému existujúcemu databázovému systému, napríklad k predvolenej databáze postgres.
Nasledujúci príkaz sa pripája k databáze postgres, zmaže a znovu vytvorí mydatabase (vďaka --clean a --create) a používa 4 paralelné úlohy na jeho obnovenie.
pg_restore -U postgres -d postgres --create --clean -j 4 mydatabase.dump-d postgres: Pripojí sa k databázepostgres, aby vykonal príkaz na vytvorenie.--create: Ukladápg_restore, aby vytvoril cieľovú databázu (napr.mydatabase) pred obnovením do nej.--clean: Keď sa používa s--create, tento prepínač odstráni a znovu vytvorí celú cieľovú databázu. Keď sa používa samostatne (pri obnove do existujúcej databázy), odstráni existujúce databázové objekty pred ich opätovným vytvorením.-j 4: Používa 4 paralelné úlohy na obnovenie.
Pripájame sa k databáze postgres, pretože pg_restore potrebuje pripojenie k existujúcej databáze na serveri na vykonanie príkazu CREATE DATABASE pre našu novú cieľovú databázu.
Poznámka k paralelným obnovám: Prepínač -j hlavne umožňuje paralelizovať načítavanie dát a budovanie indexov a je dostupný iba pre vlastný formát archívu. Niektoré operácie, ako napríklad vytváranie samotnej databázy alebo obnova objektov s komplexnými závislosťami, zostávajú sériové. Taktiež ho nie je možné použiť s voľbou --single-transaction.
Obnovenie z obyčajného textového súboru (.sql)
Použite štandardný klient psql. Táto metóda vyžaduje, aby cieľová databáza už existovala.
Vytvorte databázu:
createdb -U postgres mydatabase_newNasmerujte súbor
.sqldopsql:psql -U postgres -d mydatabase_new < mydatabase.sql
Zálohovanie všetkých databáz (pg_dumpall)
Ak chcete zálohovať všetky databázy na serveri, ako aj všetky globálne objekty (role, používateľov a tablespace), použite nástroj pg_dumpall. Tento nástroj vytvára len obyčajný textový súbor .sql.
# Run as the postgres superuser
pg_dumpall -U postgres > all_databases.sqlNa obnovenie zo súboru pg_dumpall ho nasmerujete do psql. Musíte sa pripojiť ako superužívateľ (napríklad postgres) k predvolenej databáze (napríklad k samotnej postgres). Skript obsahuje všetky potrebné príkazy CREATE ROLE a CREATE DATABASE a vykoná ich odtiaľ.
# Run as the postgres superuser
psql -U postgres -d postgres -f all_databases.sqlZálohovanie iba rolí a globálnych premenných
Bežným a užitočným vzorom je zálohovať len globálne objekty. Robí sa to pomocou prepínača --globals-only a je to efektívny spôsob, ako replikovať používateľské oprávnenia medzi servermi.
pg_dumpall -U postgres --globals-only > roles.sqlPoznámka k fyzickým zálohám a obnove do určitého bodu v čase (PITR):
Táto príručka sa síce zameriava na logické zálohy, PostgreSQL však podporuje aj fyzické zálohy. Táto pokročilá metóda, známa ako obnova do konkrétneho času (Point-in-Time Recovery, PITR), kombinuje zálohu na úrovni súborového systému (vytvorenú pomocou pg_basebackup) s kontinuálnym archivovaním súborov Write-Ahead Log (WAL).
Táto technika vám umožňuje obnoviť databázu do konkrétneho okamihu v čase (napr. „na 15:05, tesne pred tým, než boli dáta omylom vymazané“), a nie len do času, kedy bola záloha vytvorená. Ide o najspoľahlivejšiu stratégiu zálohovania pre kritické produkčné systémy, ale vyžaduje viac nastavení, vrátane nastavenia wal_level na replica alebo vyššie (nie minimal) v postgresql.conf a konfigurácie archive_command pre archiváciu WAL.
Zhrnutie stratégie zálohovania a obnovy
Nasledujúca tabuľka zhrňuje stratégiu zálohovania a obnovy:
| Nástroj | Akcia | Výstup | Prípad použitia |
|---|---|---|---|
pg_dump | Záloha | | Zálohujte jednu databázu. Vysoko flexibilné. |
pg_restore | Obnoviť | N/A | Obnoviť súbor archívu .dump. |
psql | Obnoviť | N/A | Obnoviť obyčajný súbor .sql. |
pg_dumpall | Záloha | | Zálohujte všetky databázy a globálne role. |
pg_basebackup | Záloha | Dátové súbory | Vytvára základnú zálohu pre fyzickú/PITR stratégiu. |
Najlepšie postupy pre automatizáciu a zálohovanie
Záložný plán nie je kompletný, kým nie je automatizovaný, overený a bezpečný.
- Automatizujte svoje zálohy: Použite štandardný nástroj Linuxu, ako je
cron, na naplánovanie spúšťania vašich príkazovpg_dumpalebopg_dumpallkaždú noc. - Spravujte heslá bezpečne: Ak chcete spúšťať zálohy v neinteraktívnom skripte, nezadávajte heslá priamo do kódu. Použite súbor
.pgpass. Vytvorte súbor v domovskom adresári používateľa (napr./var/lib/postgresql/.pgpass). Súbor musi mať prísne oprávnenia0600, inak ho PostgreSQL bude ignorovať. Formát jehostname:port:databáza:používateľ:heslo. Môžete použiť*ako zástupný znak pre ľubovoľné pole, napr.localhost:5432:*:postgres:your_password. - Otestujte svoje obnovenia: Záloha je užitočná len vtedy, ak ju je možné obnoviť. Pravidelne si nacvičujte obnovovanie svojich záloh na samostatnom serveri mimo produkcie, aby ste overili ich integritu.
- Overte svoje zálohy: Po vytvorení zálohy pridajte krok skriptu, ktorý skontroluje, či má súbor nenulovú veľkosť. Pre vlastné formáty môžete spustiť
pg_restore -l mydatabase.dump &> /dev/null(čo vypíše obsah do/dev/null), aby ste overili, že archív nie je poškodený kontrolou návratového kódu príkazu. - Ukladajte zálohy na diaľku: Nepokladajte svoje zálohy na rovnakom serveri ako vašu databázu. Kompletné zlyhanie servera by spôsobilo stratu oboch. Skopírujte zálohy do vzdialeného umiestnenia, ako sú Spaces od Linux-Console.net alebo iný server, ako posledný krok vášho skriptu.
Porovnanie PostgreSQL s ostatnými databázovými enginmi na Ubuntu
Ubuntu repozitáre balíkov poskytujú prístup k širokej škále databázových engineov. Najlepšia voľba závisí úplne od požiadaviek vašej aplikácie, ako je jej dátový model, potreby škálovateľnosti a záruky konzistencie.
- PostgreSQL: Táto objektovo-relačná databáza je známa svojou vysokou mierou súladu so štandardmi, integritou dát a robustnou sadou funkcií. Je plne ACID kompatibilná a dobre podporuje pokročilé dátové typy a zložité dotazy, čo z nej robí bežnú voľbu ako primárnu „systém záznamov“ databázu.
- MySQL: Ako súčasť pôvodného LAMP stacku je MySQL jednou z najpopulárnejších open-source databáz. Je známa svojou jednoduchou použiteľnosťou, historicky silným výkonom pri čítaní a silnou komunitou. Je tiež plne kompatibilná s ACID (s predvoleným enginom InnoDB) a obľúbená pre jednoduché webové aplikácie.
- MariaDB: Komunitou riadený fork MySQL. Hoci si zachováva vysokú kompatibilitu (najmä so staršími verziami), vyvíjal sa ďalej a zavádza vlastné funkcie, takže nemusí byť úplnou náhradou pre aplikácie postavené na moderných funkciách MySQL 8.0 a novších.
- SQLite: Toto nie je databáza klient-server. Je to knižnica v jazyku C, ktorá vkladá plnohodnotný databázový engine priamo do aplikácie a ukladá celú databázu do jedného súboru. Dobre zvláda viacerých súčasných čitateľov, ale nie je ideálna pre aplikácie s častými súčasnými zápismi alebo pre viacužívateľské scenáre cez sieť.
- MongoDB: Vedúca databáza NoSQL, MongoDB ukladá údaje vo flexibilných dokumentoch podobných JSON. To umožňuje flexibilnú schému a je navrhnutá pre vysokú dostupnosť a horizontálne škálovanie. Aj keď je známa svojou flexibilitou, MongoDB od verzie 4.0 podporuje aj ACID transakcie s viacerými dokumentmi, čo ju robí vhodnou voľbou pre aplikácie vyžadujúce silnú konzistenciu.
- Redis: Je to úložisko dátových štruktúr v pamäti, čo znamená, že všetky svoje dáta uchováva v RAM pre výnimočnú rýchlosť. Nie je to všeobecná náhrada databázy založenej na disku, ale takmer vždy sa používa spolu s ňou (napríklad PostgreSQL) ako vysokorýchlostná cache alebo úložisko relácií.
Tu je porovnanie PostgreSQL s ostatnými populárnymi databázovými systémami dostupnými na Ubuntu.
Porovnanie databázových enginov
| Databáza | Typ | Hlavný model | Najsilnejšia vlastnosť | Typický prípad použitia |
|---|---|---|---|---|
| PostgreSQL | ORDBMS | Vzťahový | Integrita údajov, dodržiavanie noriem, pokročilé funkcie (JSONB, PostGIS) | Komplexné aplikácie, systém záznamov, finančné systémy |
| MySQL | RDBMS | Vzťahový | Jednoduchosť použitia, historicky silný výkon pri čítaní, silná komunita | Webové aplikácie, systémy na správu obsahu (CMS) |
| MariaDB | RDBMS | Vzťahový | Kompatibilný s MySQL, open-source fork s ďalšími funkciami a optimalizáciami | Často sa používa ako náhrada MySQL, ale nemusí byť plnohodnotnou náhradou pre novšie funkcie MySQL (8.0+). |
| SQLite | Vstavaný | Relačný (súbor) | Ľahký, bez servera, bez konfigurácie | Mobilné aplikácie, vestavné zariadenia, lokálny vývoj |
| MongoDB | NoSQL | Dokument | Flexibilita schémy, horizontálna škálovateľnosť, ACID transakcie | Neštruktúrované dáta, veľké dáta, správa obsahu |
| Redis | In-Memory | Key-Value | Výnimočná rýchlosť (všetky dáta v RAM) | Ukladanie do vyrovnávacej pamäte, správa relácií, správca správ |
Bežné problémy s PostgreSQL a riešenie problémov v Ubuntu
Spúšťanie PostgreSQL na Ubuntu môže predstavovať určité výzvy, najmä pre používateľov nových v jeho architektúre na systémoch založených na Debiane. Väčšina chýb spadá do predvídateľných kategórií: konflikty pri inštalácii, pravidlá overovania, oprávnenia súborov a správa služieb.
Pred riešením problémov je vaším najdôležitejším nástrojom súbor protokolu PostgreSQL. Na štandardných inštaláciách Ubuntu ho nájdete na /var/log/postgresql/postgresql-[verzia]-main.log. Tento protokol si vždy skontrolujte ako prvý, pretože poskytuje konkrétne chybové hlásenia, ktoré vám pomôžu pri diagnostike.
Problémy s inštaláciou
Tieto problémy sa zvyčajne vyskytujú počas počiatočného procesu apt install alebo keď initdb prvýkrát skúsi vytvoriť nový databázový klaster.
Konflikty balíkov alebo nezhody verzií
Tento problém nastane, keď sa váš systém snaží nainštalovať balíky PostgreSQL z dvoch rôznych zdrojov, napríklad z predvoleného repozitára Ubuntu a oficiálneho repozitára PostgreSQL Global Development Group (PGDG). Repozitáre Ubuntu často obsahujú staršie, stabilné verzie, zatiaľ čo repozitár PGDG poskytuje najnovšie vydania. Ich miešanie môže viesť k poškodeným závislostiam.
Riešenie problémov:
- Skontrolujte svoje zdroje: Použite
apt-cache policy postgresql, aby ste videli, ktoré verzie sú dostupné a z ktorého úložiska. - Vyberte jeden zdroj: Dôrazne sa odporúča použiť repozitár PGDG pre najaktuálnejšiu verziu. Ak pridáte repozitár PGDG, môže byť potrebné použiť
aptpripnutie, aby jeho balíky mali prednosť pred predvolenými balíkmi Ubuntu. - Opraviť poškodené inštalácie: Ak sa už nachádzate v konfliktnom stave,
sudo apt-get -f installmôže problém vyriešiť. Ak nie, možno budete musieť úplne odinštalovať všetky balíky PostgreSQL (sudo apt-get purge "postgresql-*") a nainštalovať ich znova z jedného čistého zdroja.
Port 5432 je už používaný
Táto chyba znamená, že na predvolenom porte PostgreSQL (5432) už počúva iný program. Je to bežné, ak stará, odinštalovaná inštancia PostgreSQL sa nepodarila vypnúť alebo ak máte spustených viacero klastrov PostgreSQL (funkcia systému pg_ctlcluster na Ubuntu).
Riešenie problémov:
Identifikujte proces: Použite
netstatna zistenie, čo používa port.sudo netstat -tulpn | grep 5432Skontrolujte ostatné clustre: Ak je proces
postgres, použite príkazpg_lsclustersna zobrazenie všetkých nakonfigurovaných clustrov a ich stavov.pg_lsclustersVýstup môže zobraziť jeden ‚online‘ a jeden ‚offline‘.
Zastavte nežiadaný cluster: Ak nájdete starý alebo nechcený cluster, ktorý beží, zastavte ho pomocou jeho verzie a názvu.
sudo pg_ctlcluster 13 main stopZmeňte port: Ak iná služba správne používa port 5432, musíte nakonfigurovať svoj nový PostgreSQL cluster tak, aby používal iný port úpravou jeho súboru
postgresql.conf.
Chyby lokalizácie a kódovania počas initdb
Chyby ako „invalid locale name“ alebo „could not determine default locale“ počas počiatočného nastavenia klastru (initdb) znamenajú, že nastavenia lokalizácie vášho systému Ubuntu chýbajú alebo sú nesprávne nakonfigurované. PostgreSQL tieto nastavenia preberá z operačného systému, aby určoval poradie zoradenia (koláciu), klasifikáciu znakov a formátovanie.
Riešenie problémov:
Skontrolujte jazyky svojho systému: Spustite
locale -apre zobrazenie všetkých dostupných jazykov.Vygenerujte chýbajúce locale: Ak váš požadovaný locale (napr.
en_US.UTF-8) nie je uvedený, musíte ho vygenerovať.sudo locale-gen en_US.UTF-8 sudo update-localeOpätovne inicializujte klaster: Po nastavení systémových lokalizácií môže byť potrebné klaster PostgreSQL odstrániť a znova vytvoriť. Príkaz
pg_createclusterje štandardnou metódou v Ubuntu na tento účel.Upozornenie: Toto vymaže všetky údaje v klastri
sudo pg_dropcluster [version] main sudo pg_createcluster [version] main
Problémy s overením
Toto sú najčastejšie problémy, s ktorými sa používatelia stretávajú po úspešnej inštalácii.
Overenie rovnocenného uzla zlyhalo
Toto je najčastejšia chyba. Znamená to, že sa pokúšate pripojiť lokálne a vaše aktuálne prihlásené používateľské meno v Ubuntu sa nezhoduje s názvom roly PostgreSQL databázy, ktorú sa snažíte použiť.
V predvolenom nastavení PostgreSQL na Ubuntu používa peer autentifikáciu pre lokálne pripojenia. Táto metóda sa pýta operačného systému: „Aké je používateľské meno procesu, ktorý sa ku mne pripája?“ a umožní pripojenie, ak sa toto používateľské meno zhoduje s požadovanou databázovou rolou.
Napríklad, ak ste prihlásený ako myuser a spustíte psql -U postgres, zlyhá to, pretože operačný systém hlási vaše používateľské meno ako myuser, nie postgres.
Riešenie:
Správny spôsob pripojenia ako superpoužívateľ postgres je najprv prevziať identitu systémového používateľa postgres pomocou sudo.
sudo -u postgres psqlAk chcete toto správanie zmeniť, musíte nastaviť heslo pre rolu postgres a potom upraviť súbor pg_hba.conf tak, aby používal md5 alebo scram-sha-256 namiesto peer.
Zlá konfigurácia pg_hba.conf
Chyby v súbore pg_hba.conf (Host-Based Authentication) sú hlavnou príčinou zlyhania pripojenia. Tento súbor, ktorý sa nachádza na /etc/postgresql/[version]/main/pg_hba.conf, je súbor pravidiel, ktorý určuje kto sa môže pripojiť odkiaľ k ktorej databáze a akou metódou. Jedna chybná syntax alebo nesprávne poradie pravidiel vás môže zablokovať.
Riešenie problémov:
Poradie pravidiel je dôležité: PostgreSQL číta tento súbor odhora nadol a používa prvé pravidlo, ktoré zodpovedá. Konkrétnejšie pravidlá musia byť vždy umiestnené pred všeobecnejšími.
Obnoviť po zmenách: Po úprave súboru
pg_hba.confmusíte reštartovať službu PostgreSQL, aby sa zmeny prejavili:sudo systemctl reload postgresql
Tu sú bežné chyby v konfigurácii:
| Bežný problém | Príkladný riadok(y) | Vysvetlenie |
|---|---|---|
| Vzdialené pripojenia zlyhávajú | | Toto pravidlo umožňuje pripojenia iba z localhost. Musíte pridať samostatný riadok pre rozsah IP vašej vzdialenej siete. |
| Nesprávne poradie pravidiel | | Pravidlo reject všetko sa zobrazuje ako prvé, takže pravidlo 192.168.1.100 sa nikdy nedosiahne. Konkrétne pravidlo pre IP musí byť pred pravidlom reject všetko. |
| “Chyba overenia kolegu po úprave” | | Zmenili ste metódu používateľa postgres z peer na md5 (heslo), ale nenastavili ste heslo, alebo sa stále snažíte pripojiť pomocou sudo -u postgres psql. |
Problémy s povoleniami
Tieto chyby sa často objavujú v protokoloch alebo pri pokuse o pripojenie ako „Prístup zamietnutý“.
Nie je možné pristúpiť k súboru socket
Chyby ako „nedá sa pripojiť na server: Súbor alebo adresár neexistuje“ alebo „Prístup odmietnutý“ pri odkazovaní na /var/run/postgresql/.s.PGSQL.5432 zvyčajne znamenajú jednu z dvoch vecí:
- Služba nebeží: Súbor soketu sa odstráni, keď sa služba zastaví. Skontrolujte stav služby pomocou
sudo systemctl status postgresql. - Povolenia používateľa: Adresár soketu vlastní
postgresa je prístupný pre skupinupostgres. Ak váš systémový používateľ nie je v skupinepostgres, nemôžete použiť soket.
Riešenie:
Pridajte svojho používateľa do skupiny postgres. Musíte sa odhlásiť a znova prihlásiť, aby sa táto zmena prejavila.
sudo usermod -a -G postgres $USEROprávnenia priečinka s údajmi
Ak služba PostgreSQL nedokáže spustiť a v záznamoch sa objaví „Prístup zamietnutý“ súvisiaci s dátovým adresárom (napr. /var/lib/postgresql/[verzia]/main), vlastníctvo adresára alebo oprávnenia súborov sú nesprávne.
PostgreSQL vyžaduje, aby jeho dátový adresár bol výlučne vo vlastníctve systémového používateľa postgres a mal práva 0700 (iba vlastník môže čítať, zapisovať a spúšťať). Toto je bezpečnostné opatrenie. Tento problém sa často vyskytuje po obnovení zálohy alebo po manuálnom presunutí dátového adresára.
Riešenie:
Rekurzívne resetujte vlastníctvo a povolenia.
# Correct the ownership (replace 18 with your version)
sudo chown -R postgres:postgres /var/lib/postgresql/18/main
# Correct the permissions
sudo chmod 0700 /var/lib/postgresql/18/mainSpráva služieb
Tieto problémy súvisia so spúšťaním, zastavovaním a správou samotnej služby postgresql.
Služba sa nepodarí spustiť po zmenách konfigurácie
Ak sa služba po úprave súborov postgresql.conf alebo pg_hba.conf nedokáže spustiť okamžite, pravdepodobne ste zaviedli syntaktickú chybu.
Riešenie problémov:
- Skontrolujte logy: Toto je najrýchlejší spôsob, ako nájsť chybu.
sudo journalctl -u postgresqlalebo konkrétny log na/var/log/postgresql/postgresql-[version]-main.logčasto vypíše presné číslo riadku neplatného nastavenia. Bežné chyby v
postgresql.conf:- Neuvoľnené reťazcové hodnoty (napr.
log_destination=stderrje správne;log_destination=/var/log/my.logje nesprávne, malo by to byť'/var/log/my.log').
- Neuvoľnené reťazcové hodnoty (napr.
- Neplatné hodnoty nastavení (napr.
shared_buffers=10GB, keď máte k dispozícii iba 8GB RAM).
Zmätenie kvôli viacerým klasrom
Balík postgresql-common v Ubuntu obsahuje sadu obalových skriptov (pg_lsclusters, pg_ctlcluster, pg_createcluster), ktoré vám umožňujú spúšťať viaceré samostatné inštancie PostgreSQL (klastre) na rovnakom počítači, často rôznych verzií.
Toto je výkonná funkcia, ale môže byť mätúca. Môžete upravovať konfiguračný súbor pre verziu 18, ale pripojovať sa k verzii 13, čo vás môže viesť k tomu, že si myslíte, že sa vaše "zmeny neuplatňujú."
Riešenie problémov:
Zoznam všetkých klastrov: Vždy začnite tu, aby ste videli, čo beží, na ktorom porte a kde sa nachádzajú jeho konfiguračné súbory.
pg_lsclusters # Ver Cluster Port Status Owner Data directory Log file # 13 main 5432 down postgres /var/lib/postgresql/13/main ... # 18 main 5433 online postgres /var/lib/postgresql/18/main ...Spravovať konkrétne clustre: Pri spúšťaní, zastavovaní alebo načítavaní vždy uveďte cluster, ktorý chcete zmeniť:
sudo pg_ctlcluster 18 main reload
Limity zdrojov
Tieto chyby sa vyskytujú, keď PostgreSQL požaduje viac prostriedkov (napríklad pamäte), než je nakonfigurované operačným systémom.
Chyby zdieľanej pamäte
Chyby pri spustení ako „nedá sa vytvoriť segment zdieľanej pamäte: Neplatný argument“ alebo „Na zariadení nie je voľné miesto“ často znamenajú, že nastavenie shared_buffers v PostgreSQL je väčšie ako limit zdieľanej pamäte (SHMMAX) vášho operačného systému.
PostgreSQL používa veľký blok zdieľanej pamäte na kešovanie a medziprocesovú komunikáciu. Ak požiada o viac, než OS povoľuje, OS žiadosť odmietne a PostgreSQL sa nespustí. Toto je bežné v prostrediach s obmedzenou pamäťou alebo v kontajneroch.
Riešenie problémov:
Skontrolujte limity OS:
cat /proc/sys/kernel/shmmaxSkontrolujte
postgresql.conf: Pozrite sa na vaše nastavenieshared_buffers.Riešenie 1 (Odporúčané): Znížte hodnotu
shared_buffersv súborepostgresql.conftak, aby bola bezpečne pod limitomshmmax.Riešenie 2 (pokročilé): Zvýšte limit
shmmaxjadra. Upraviť/etc/sysctl.confa pridať riadok akokernel.shmmax=134217728(pre 128 MB). Použiť ho pomocousudo sysctl -p. Toto je zvyčajne potrebné len pri optimalizácii vysokého výkonu.
Často kladené otázky
1. Čo je PostgreSQL a prečo by som ho mal používať na Ubuntu?
PostgreSQL, často nazývaný Postgres, je výkonný otvorený objektovo-relačný databázový systém. Má silnú povesť spoľahlivosti, robustnosti funkcií a integrity údajov, pričom je aktívne vyvíjaný už viac ako 30 rokov.
Mali by ste zvážiť jeho použitie vo svojich aplikáciách, pretože plne podporuje súlad s ACID (Atómovosť, Konzistencia, Izolácia, Trvácnosť), dobre zvláda vysokú záťaž a podporuje širokú škálu pokročilých dátových typov a rozšírení, ako je napríklad rozšírenie PostGIS pre geopriestorové údaje.
Používanie PostgreSQL na Ubuntu je bežnou voľbou, pretože Ubuntu je populárna a stabilná linuxová distribúcia pre servery. PostgreSQL je súčasťou predvolených repozitárov balíkov Ubuntu, čo robí inštaláciu a získavanie včasných bezpečnostných aktualizácií jednoduchým procesom spravovaným správcom balíkov apt systému.
2. Ako nainštalujem PostgreSQL na Ubuntu?
PostgreSQL môžete nainštalovať priamo z predvolených úložísk Ubuntu pomocou príkazu apt.
Najprv obnovte lokálny index balíkov na vašom serveri, aby ste mali najnovšie zoznamy balíkov:
sudo apt updateĎalej nainštalujte hlavný balík PostgreSQL a balík contrib, ktorý obsahuje ďalšie nástroje a rozšírenia:
sudo apt install postgresql postgresql-contribPoznámka: Tento príkaz nainštaluje predvolenú verziu PostgreSQL dostupnú v hlavnom repozitári Ubuntu (napr. postgresql-16). Ak potrebujete inú verziu, môžete ju špecifikovať jej úplným názvom balíka, napr. sudo apt install postgresql-18 postgresql-contrib-18.
3. Ako spustím a povolím službu PostgreSQL?
Po úspešnej inštalácii by sa služba PostgreSQL mala spustiť automaticky. Jej stav môžete overiť pomocou systemctl.
sudo systemctl status postgresqlMôžete vidieť výstup ako tento:
Output
● postgresql.service - PostgreSQL RDBMS
Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
Active: active (exited) since Wed 2025-10-29 10:30:01 IST; 1min 12s ago
Main PID: 1234 (code=exited, status=0/SUCCESS)
Tasks: 0 (limit: 4662)
...Poznámka: Je normálne, že hlavná služba postgresql.service zobrazuje stav active (exited). Táto služba je obal, ktorý spúšťa konkrétnu službu pre daný cluster (napr. postgresql@18-main.service), ktorá vykonáva skutočnú prácu. Pokiaľ je služba „enabled“ a „active“, váš databázový server beží.
Ak služba nebeží, môžete ju spustiť manuálne:
sudo systemctl start postgresqlAby sa zabezpečilo, že databáza sa spustí automaticky pri každom štarte servera, musíte povoliť službu:
sudo systemctl enable postgresql4. Ako môžem vytvoriť novú databázu v PostgreSQL?
Najjednoduchšia metóda je použiť príkazový nástroj createdb. Tento príkaz musí byť spustený rolou PostgreSQL, ktorá má oprávnenie na vytváranie databáz.
Predvolene je účet používateľa Linux postgres nakonfigurovaný na pripojenie ako superpoužívateľ databázy postgres. Môžete sa prepnúť na tohto používateľa a spustiť príkaz:
sudo -i -u postgres
createdb my_databasePrípadne sa môžete prihlásiť do interaktívneho prostredia PostgreSQL (psql) a použiť SQL príkaz CREATE DATABASE.
Najprv pristúpte k výzve ako používateľ postgres:
sudo -i -u postgres
psqlPotom, z prostredia výzvy psql (ktorá vyzerá ako postgres=#, pretože postgres je superužívateľ), spustite SQL príkaz. Nezabudnite ukončiť SQL príkazy bodkočiarkou.
CREATE DATABASE my_database;Z príkazového riadku psql môžete odísť zadaním \q a potom zadajte exit, aby ste sa vrátili k bežnému používateľovi.
Poznámka o vlastníctve: Používateľ, ktorý vykoná príkaz CREATE DATABASE, sa predvoleným spôsobom stáva vlastníkom novej databázy. Toto vlastníctvo mu udeľuje všetky privilégia postgres, vlastníkom bude postgres.
5. Ako vytvárať a spravovať používateľov a roly v PostgreSQL?
V PostgreSQL sa správa používateľov rieši prostredníctvom rolí. Rola môže byť databázovým používateľom alebo skupinou používateľov, ale rola s právom LOGIN sa považuje za používateľa.
1. Vytvorenie používateľa
Môžete použiť príkazový nástroj createuser. Najlepšie je spustiť ho ako používateľ postgres.
sudo -i -u postgresOdporúčanou metódou je použiť príznak --interactive na zobrazenie výzvy na nastavenia a príznak --pwprompt na okamžité nastavenie hesla.
createuser --interactive --pwpromptToto si vyžiada názov roly, heslo a či by rola mala byť superpoužívateľom alebo mať iné vysokoúrovňové oprávnenia.
Output
Enter name of role to add: sammy
Enter password for new role:
Enter it again:
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) n
Shall the new role be allowed to create more new roles? (y/n) nPoužívateľa môžete vytvoriť aj jedným príkazom SQL z výzvy psql. Týmto spôsobom vznikne minimálny používateľ, ktorý sa môže len prihlásiť.
CREATE ROLE sammy WITH LOGIN PASSWORD 'secure_password';2. Udeľovanie privilégií
Vytvorenie používateľa mu automaticky nedáva prístup k databáze. Práva musíte udeliť výslovne. Tento proces má niekoľko krokov:
Povoliť prístup Grant Connect: Najprv povoľte novej role prístup na pripojenie k vašej databáze.
GRANT CONNECT ON DATABASE my_database TO sammy;Bežný omyl: Používanie
GRANT ALL PRIVILEGES ON DATABASE my_database TO sammy;je mätúce. Tento príkaz udeľuje len povoleniaCONNECT,CREATEaTEMPna samotnú databázu, nie na tabuľky v nej.Použitie oprávnenia k schéme: Ďalej musíte udeliť povolenie na prístup k
schémev rámci databázy. Bez toho sa používateľ môže pripojiť, ale nevidí žiadne tabuľky.GRANT USAGE ON SCHEMA public TO sammy;Udeľovanie povolení tabuľky: Teraz môžete používateľovi udeliť konkrétne povolenia, ktoré potrebuje na objektoch v rámci schémy. Na toto sa pripojte k databáze ako superpoužívateľ:
\c my_databaseTeraz ste pripojení k
my_database.Udeľte povolenia na existujúce objekty: Ak chcete roli
sammyposkytnúť prístup na čítanie/zápis ku všetkým existujúcim tabuľkám, spustite:GRANT ALL ON ALL TABLES IN SCHEMA public TO sammy; GRANT ALL ON ALL SEQUENCES IN SCHEMA public TO sammy;Ak chcete udeliť iba prístup na čítanie, mali by ste použiť
GRANT SELECTnamiestoGRANT ALL.(Nepovinné) Udeliť oprávnenia pre budúce objekty: Príkazy vyššie ovplyvňujú iba existujúce tabuľky. Ak chcete automaticky udeliť oprávnenia pre akékoľvek nové tabuľky vytvorené v budúcnosti (napr. administrátorom), musíte zmeniť predvolené oprávnenia:
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO sammy; ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON SEQUENCES TO sammy;
6. Aké sú základné príkazy PostgreSQL pre začiatočníkov?
Najdôležitejším nástrojom na učenie je interaktívny terminál psql. Keď ste prihlásený (napr. spustením sudo -i -u postgres a potom psql), môžete používať meta-príkazy (ktoré začínajú spätným lomítkom \) na navigáciu a kontrolu vašej databázy.
Tu sú niektoré z najbežnejších príkazov psql:
| Príkaz | Účel |
|---|---|
| Zoznam všetkých databáz na serveri. |
| Pripája sa k inej databáze. |
| Zobrazuje informácie o aktuálnom pripojení (používateľ, databáza, hostiteľ). |
| Zoznam všetkých tabuliek v predvolenej schéme aktuálnej databázy. |
| Vypisuje všetky role (používateľov) a ich atribúty. |
| Opisuje konkrétnu tabuľku (zobrazuje jej stĺpce, typy údajov a indexy). |
| Zobrazuje pomoc pre všetky psql meta-príkazy. |
| Opustí a ukončí prompt psql. |
Poznámka: Znak výzvy psql označuje vašu úroveň oprávnení. Mriežka (#) znamená, že ste pripojený ako superpoužívateľ (napríklad postgres). Znak väčšieho ako (=>) znamená, že ste bežný používateľ, nie superpoužívateľ.
7. Ako sa pripojím k databáze PostgreSQL z terminálu?
Spôsob pripojenia závisí od autentifikačnej metódy nakonfigurovanej v súbore pg_hba.conf. (Tento súbor sa zvyčajne nachádza na /etc/postgresql/<version>/main/pg_hba.conf). Predvolene PostgreSQL na Ubuntu používa peer autentifikáciu pre lokálne pripojenia.
Overovanie peer funguje tak, že získava používateľské meno operačného systému klienta z jadra a používa ho ako povolené používateľské meno databázy. Toto funguje iba pre lokálne pripojenia cez Unix socket.
1. Pripojenie ako administrátor postgres (lokálna autentifikácia peer)
Toto je najjednoduchší spôsob, ako sa pripojiť lokálne. Používate sudo na spustenie príkazov ako Linux užívateľ postgres, ktorého peer autentifikácia automaticky mapuje na superužívateľa databázy postgres.
sudo -i -u postgres
psqlTýmto sa pripájate cez lokálnu Unix socket k predvolenej databáze s názvom postgres.
2. Pripojenie ako konkrétny používateľ (lokálne overenie peer vs. TCP/IP overenie password)
Povedzme, že ste vytvorili rolu PostgreSQL s názvom sammy, ale ste prihlásený na svoj server ako iný používateľ Linuxu (napr. ubuntu).
Skúška 1: Neúspech (Nezhoda overenia peer): Ak spustíte
psql -U sammy -d my_database, pravdepodobne to zlyhá. Tento príkaz sa pokúša použiť lokálny Unix socket, takže overeniepeersa snaží zosúladiť váš OS používateľa (ubuntu) s databázovým používateľom (sammy). Keďže sa nezhodujú, pripojenie je odmietnuté.Pokus 2: Úspech (Overenie heslom): Ak chcete obísť autentifikáciu
peer, môžete vynútiť TCP/IP (sieťové) pripojenie pomocou-h localhost. Predvolene je súborpg_hba.confv Ubuntu nakonfigurovaný na použitie autentifikácie pomocoumd5aleboscram-sha-256(heslo) pre lokálne TCP/IP pripojenia.psql -U sammy -d my_database -h localhostTerminál vás potom vyzve na zadanie hesla, ktoré ste nastavili pre rolu
sammy.Tip: Aby ste sa vyhli zadávaniu hesla pri každom pripojení, môžete si vytvoriť súbor
.pgpassvo svojom domovskom adresári. Tento súbor bezpečne uchováva vaše prihlasovacie heslá. Uistite sa, že jeho oprávnenia sú nastavené na0600(čítanie/zápis len pre váš účet).Pokus 3: Úspech (zhoda overenia cez Peer): Ak máte tiež na Linuxe používateľa systému s menom
sammy, môžete použiťsudona spusteniepsqlako tento používateľ. Overeniepeerby potom bolo úspešné.sudo -i -u sammy psql -d my_database
Záver
Tento návod poskytol kompletný postup na inštaláciu a správu PostgreSQL na serveri s Ubuntu. Začali ste s počiatočnou inštaláciou softvéru, nastavili autentifikáciu používateľov vytváraním rolí a založili nové databázy. Následne sme prešli základné SQL príkazy na manipuláciu s dátami a preskúmali podstatné administratívne úlohy, vrátane konfigurácie výkonu, postupov zálohovania a obnovy, a riešenia bežných problémov.
Teraz máte funkčný databázový server a základné zručnosti potrebné na jeho bezpečnú a efektívnu údržbu. Schopnosť spravovať údaje, riadiť prístup používateľov a zabezpečiť integritu databázy vás pripravuje na podporu zložitých aplikácií.
Ak sa chcete dozvedieť viac o Postgrese a o tom, ako ho používať, odporúčame vám pozrieť si nasledujúce návody:
- SQLite vs MySQL vs PostgreSQL: Porovnanie relačných databázových systémov
- Cvičte spúšťanie dotazov pomocou SQL
Ďakujeme, že sa učíte s komunitou Linux-Console.net.