PostgreSQL 13, nejnovější vydání databázového softwaru Postgres, přichází s mnoha skrytými vylepšeními. Přestože jde o nejpopulárnější a nejuniverzálnější open-source RDBMS v okolí, není nejjednodušší nastavit a začít. Čtěte dále a zjistěte, jak můžete začít pracovat s nejnovější verzí Postgres na nejnovější verzi LTS Ubuntuserveru.
Instalace
Ubuntu 20.04 přichází s Postgres 12 z vesmíru úložiště. Protože chceme verzi 13, můžeme přímo používat oficiální repozitář APT projektu PostgreSQL. Toto úložiště obsahuje binární soubory pro Ubuntu 20.04 a také balíčky pro různá rozšíření, která si možná budete chtít nainstalovat později.
Nastavíme úložiště takto (všimněte si, že „focal“ je kódové jméno pro Ubuntu 20.04):
# add the repository
sudo tee /etc/apt/sources.list.d/pgdg.list <<END
deb http://apt.postgresql.org/pub/repos/apt/ focal-pgdg main
END
# get the signing key and import it
wget https://www.postgresql.org/media/keys/ACCC4CF8.asc
sudo apt-key add ACCC4CF8.asc
# fetch the metadata from the new repo
sudo apt-get update
Nyní můžeme nainstalovat server PostgreSQL a další nástroje příkazového řádku pomocí:
sudo apt-get install -y postgresql-13
Instalace provádí několik věcí:
- Nainstaluje server PostgreSQL, nástroje a klienta příkazového řádku s názvempsql .
- Vytváří uživatele systému Linux s názvem postgres . Všechny datové soubory jsou ve vlastnictví tohoto uživatele a všechny procesy běží jako tento uživatel.
- Vytváří databázový cluster (viz. níže). V tomto clusteru vytváří databázi, nazývanou také postgres .
- Vytvoří jednoho uživatele PostgreSQL (ne uživatel systému Linux), také nazývanýpostgres . Tento uživatel PostgreSQL má oprávnění superuživatele.
Můžete vidět, že to začíná být matoucí!
Databázové clustery
Z hlediska Postgresu máme nyní v provozu jeden databázový cluster. Jediný databázový cluster může obsahovat jednu nebo více databází. V databázovém clusteru, který nyní máme, je databáze nazvaná „postgres“. (Existuje také několik „šablonových“ databází, které můžeme prozatím ignorovat.)
Databázový cluster je spravován hlavním postgresovým procesem zvaným postmaster .Vytváří různé podřízené procesy, které buď provádějí různé systémové úlohy nebo se starají o příchozí připojení klientů. Podívejte se na aktuálně běžící procesy:
alice@ubu:~$ ps -o uname,pid,ppid,cmd -H -U postgres
USER PID PPID CMD
postgres 4880 1 /usr/lib/postgresql/13/bin/postgres -D /var/lib/postgresql/13/main -c config_file=/etc/postgresql/13/main/postgresql.conf
postgres 4882 4880 postgres: 13/main: checkpointer
postgres 4883 4880 postgres: 13/main: background writer
postgres 4884 4880 postgres: 13/main: walwriter
postgres 4885 4880 postgres: 13/main: autovacuum launcher
postgres 4886 4880 postgres: 13/main: stats collector
postgres 4887 4880 postgres: 13/main: logical replication launcher
Zde je postmaster proces 4880 a vytvořil 6 podřízených procesů, které se starají o různé činnosti spojené s úklidem. Můžete také vidět umístění clusteru (/var/lib/postgresql/13/main
) a umístění konfiguračního souboru (/etc/postgresql/13/main/postgresql.conf
).
Opětovné načtení a restartování
V různých časech může být nutné načíst znovu nebo restartujte váš server Postgres. Opětovné načtení způsobí, že Postgres znovu prozkoumá konfigurační soubory a použije změny. Pokud nedojde k žádným změnám v konfiguračních souborech, nic špatného se nestane. Opětovné načtení neruší aktuálně připojené klienty. Chcete-li znovu načíst server Postgres, můžete:
sudo systemctl reload postgresql
Některé změny konfigurace se projeví až po restartování serveru. To je rušivější a odpojí všechny připojené klienty. Chcete-li restartovat, můžete:
sudo systemctl restart postgresql
Soubory protokolu
Jak můžete vidět, existuje služba systemd s názvem postgresql
které můžete použít k ovládání poštmistra. Pokud se služba nespustí, můžete zkontrolovat její stav a zkontrolovat chybové zprávy:
alice@ubu:~$ sudo systemctl status postgresql
● postgresql.service - PostgreSQL RDBMS
Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
Active: active (exited) since Thu 2020-10-29 04:52:29 UTC; 25min ago
Main PID: 4557 (code=exited, status=0/SUCCESS)
Tasks: 0 (limit: 1075)
Memory: 0B
CGroup: /system.slice/postgresql.service
Oct 29 04:52:29 ubu systemd[1]: Starting PostgreSQL RDBMS...
Oct 29 04:52:29 ubu systemd[1]: Finished PostgreSQL RDBMS.
Server PostgreSQL zapisuje soubor protokolu, ve kterém můžete zkontrolovat podrobnější chybové zprávy. Tento soubor se nachází na adrese /var/log/postgresql/postgresql-13-main.log
:
alice@ubu:~$ cat /var/log/postgresql/postgresql-13-main.log
2020-10-29 04:52:34.096 UTC [4880] LOG: starting PostgreSQL 13.0 (Ubuntu 13.0-1.pgdg20.04+1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 9.3.0-10ubuntu2) 9.3.0, 64-bit
2020-10-29 04:52:34.097 UTC [4880] LOG: listening on IPv4 address "127.0.0.1", port 5432
2020-10-29 04:52:34.099 UTC [4880] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
2020-10-29 04:52:34.106 UTC [4881] LOG: database system was shut down at 2020-10-29 04:52:31 UTC
2020-10-29 04:52:34.112 UTC [4880] LOG: database system is ready to accept connections
Připojování k vašemu serveru Postgres
Nyní, když máme náš server v provozu, zkusme se k němu připojit. Ve výchozím nastavení server naslouchá pouze:
- Připojení TCP z 127.0.0.1 na portu 5432 a
- Doménové sokety Unix v /var/run/postgresql
Kvůli výchozí konfiguraci je nyní jediný způsob, jak se připojit k serveru přes Unixový soket z procesu, který běží jako systémový uživatel postgres . Spusťte standardního interaktivního klienta psql takhle:
alice@ubu:~$ sudo -u postgres psql postgres
psql (13.0 (Ubuntu 13.0-1.pgdg20.04+1))
Type "help" for help.
postgres=#
Zde spouštíme psql jako systémový uživatel postgres („sudo -u postgres psql“) a připojujeme se k databázi s názvem „postgres“ (poslední „postgres“ na příkazovém řádku.) Výzva „postgres=#“ označuje název aktuálně připojené databáze („postgres“) a že máme oprávnění superuživatele („#“ na rozdíl od „$“).
Připojení proběhlo přes Unixové sokety (toto je výchozí metoda v psql). Protože uživatel postgres ve výchozím nastavení nemá heslo a výchozí konfigurace vyžaduje ověření heslem pro připojení TCP, není možné se nyní připojit přes 127.0.0.1:5432 .
Povolení příchozích připojení z interní sítě
Nejprve změňme konfiguraci tak, aby umožňovala připojení z interní sítě. Za předpokladu, že IP našeho serveru v této síti je 10.1.2.3, můžeme upravit hlavní konfigurační soubor na /etc/postgresql/13/main/postgresql.conf
a změňte řádky:
#listen_addresses = 'localhost' # what IP address(es) to listen on;
# comma-separated list of addresses;
# defaults to 'localhost'; use '*' for all
komu:
listen_addresses = 'localhost,10.1.2.3'
Musíme také Postgres sdělit, aby používal ověřování heslem pro připojení přicházející z těchto sítí. Za tímto účelem upravte jiný konfigurační soubor s názvem /etc/postgresql/13/main/pg_hba.conf
a změňte řádek:
host all all 127.0.0.1/32 md5
komu:
host all all 127.0.0.1/32 scram-sha-256
host all all 10.1.0.0/16 scram-sha-256
(Za předpokladu, že vnitřní síť je 10.1.0.0/16.)
Změnili jsme také výchozí md5
metoda na novější a bezpečnějšíscram-sha-256
. Všechny ostatní výskyty md5
v souboru by měl být také nahrazen scram-sha-256
. Pokud vaše aplikace nebo databázový ovladač nepodporuje tuto metodu, nadále používejte md5
místo toho.
Aby se tyto změny projevily, musíte restartovat server:
sudo systemctl restart postgresql
Vytvoření běžného uživatele a databáze
Už jsme skoro tam!
Nyní můžeme vytvořit běžného uživatele, ke kterému se naše aplikace může připojit, a databázi, nad kterou má plnou kontrolu. Připojte se jako superuživatel postgres lokálně ze serveru, abyste to provedli:
alice@ubu:~$ sudo -u postgres psql postgres
psql (13.0 (Ubuntu 13.0-1.pgdg20.04+1))
Type "help" for help.
postgres=# SET password_encryption = 'scram-sha-256';
SET
postgres=# CREATE USER alice PASSWORD 's3cr3tp@ss';
CREATE ROLE
postgres=#
(Pokud chcete použít md5
, vynechejte první příkaz Místo toho.) Tím se vytvořil uživatel s názvem alice s heslem s3cr3tp@ss . Vytvořme také databázi, kterou bude tento uživatel vlastnit:
postgres=# CREATE DATABASE app1 OWNER alice;
CREATE DATABASE
postgres=#
Databáze se nazývá app1 . Od alice vlastní tuto databázi, všechny operace v rámci databáze (jako je vytváření tabulek, vkládání řádků) jsou povoleny, pokud se aplikace připojí jako uživatel alice .
Zkusme se připojit jako alka , po síti:
~$ psql -h 10.1.2.3 -U alice app1
Password for user alice:
psql (13.0 (Ubuntu 13.0-1.pgdg20.04+1))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.
app1=>
Chladný! Nyní jsme připojeni k databázi app1 jako uživatel alice .
Mazání databází, zálohování a obnova
Zde je několik triků, které vám mohou pomoci při další práci s vaším Postgresserverem:
Odstranění databáze
Databázi, kterou jste právě vytvořili ("app1"), můžete smazat takto:
alice@ubu:~$ psql -h 127.0.0.1 -U alice app1
Password for user alice:
psql (13.0 (Ubuntu 13.0-1.pgdg20.04+1))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.
app1=> \c postgres
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
You are now connected to database "postgres" as user "alice".
postgres=> DROP DATABASE app1;
DROP DATABASE
postgres=>
Všimněte si, že se musíte nejprve přepnout do jiné databáze pomocí příkazu „\c“ psql.
Chcete-li vytvořit další databázi nebo znovu vytvořit app1 , připojte se jako superuživatel a proveďte „CREATE DATABASE“ jako dříve.
Zálohujte databázi
Nejjednodušší způsob, jak zálohovat data v databázi, je použít pg_dump takhle:
alice@ubu:~$ pg_dump -h 127.0.0.1 -U alice -f backup.sql app1
Password:
Tím se vytvoří soubor SQL s názvem „backup.sql“, který obsahuje všechny příkazy SQL potřebné k opětovnému vytvoření schématu a dat v databázi app1 , v textovém formátu. Tyto příkazy můžete spustit v jakékoli databázi a schéma a data se do této databáze naplní.
Přečtěte si více o pg_dump zde.
Obnova dat
Soubor příkazu SQL, který jste vytvořili výše, lze obnovit takto:
alice@ubu:~$ psql -h 127.0.0.1 -U alice app2
Password for user alice:
psql (13.0 (Ubuntu 13.0-1.pgdg20.04+1))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.
app2=> \i backup.sql
SET
SET
(..snip..)
Všimněte si, že jsme obnovili schéma a data do jiné databáze, app2 . Příkaz „\i“ psql vám umožňuje spouštět příkazy SQL ze souboru.
Další kroky
Existuje celá řada článků, tutoriálů, videí a kurzů, které vám pomohou lépe pracovat s PostgreSQL. Věnujte však nějaký čas oficiální dokumentaci zde, která poskytuje autoritativní a rozsáhlé pokrytí všech funkcí PostgreSQL, syntaxe a přidružených utilit.