PostgreSQL 13, най-новата версия на софтуера за база данни Postgres, идва с много подобрения под капака. Въпреки че е най-популярната и гъвкава RDBMS с отворен код, не е най-лесната за настройка и започване. Прочетете, за да научите как можете да започнете с най-новата версия на Postgres на най-новата LTS версия на Ubuntuserver.
Инсталиране
Ubuntu 20.04 идва с Postgres 12 от неговата вселена хранилище. Тъй като искаме версия 13, можем директно да използваме официалното хранилище APT на проекта PostgreSQL. Това хранилище съдържа двоични файлове за Ubuntu 20.04 и също така включва пакети за различни разширения, които може да искате да инсталирате по-късно.
Нека настроим хранилището по следния начин (обърнете внимание, че „focal“ е кодовото име за 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
Вече можем да инсталираме PostgreSQL сървъра и други инструменти от командния ред, използвайки:
sudo apt-get install -y postgresql-13
Инсталацията прави няколко неща:
- Той инсталира сървъра PostgreSQL, помощните програми и клиент от командния ред, нареченpsql .
- Той създава потребител на системата на Linux, наречен postgres . Всички файлове с данни са собственост на този потребител и всички процеси се изпълняват като този потребител.
- Той създава клъстер от база данни (виж отдолу). В този клъстер той създава база данни, наричана още postgres .
- Той създава един потребител на PostgreSQL (не потребителят на системата Linux), наричан ощеpostgres . Този потребител на PostgreSQL има привилегии на суперпотребител.
Виждате, че това започва да става объркващо!
Клъстери от бази данни
От гледна точка на Postgres, вече имаме един клъстер от база данни, който работи и работи. Единичен клъстер на база данни може да съдържа една или повече бази данни. В клъстера на базата данни, който имаме сега, има база данни, наречена „postgres“. (Има и няколко „шаблонни“ бази данни, които можем да игнорираме засега.)
Клъстерът от база данни се управлява от основен postgres процес, наречен postmaster .Той поражда различни дъщерни процеси, които или изпълняват различни системни задачи, или обработват входящи клиентски връзки. Разгледайте текущите процеси:
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
Тук процесът на пощенския администратор е 4880 и е породил 6 дъщерни процеса, които обработват различни домакински дейности. Можете също да видите местоположението на клъстера (/var/lib/postgresql/13/main
) и местоположението на конфигурационния файл (/etc/postgresql/13/main/postgresql.conf
).
Повторно зареждане и рестартиране
В различни моменти може да се наложи да презаредите или рестартирайте вашият Postgres сървър. Презареждането кара Postgres да преразгледа своите конфигурационни файлове и да приложи промените. Ако няма промени в конфигурационните файлове, нищо лошо не се случва. Презареждането не нарушава текущо свързаните клиенти. За да презаредите вашия Postgres сървър, можете да направите:
sudo systemctl reload postgresql
Някои промени в конфигурацията ще влязат в сила само след като рестартирате сървъра. Това е по-разрушително и ще прекъсне връзката на всички свързани клиенти. За да рестартирате, можете:
sudo systemctl restart postgresql
Регистрационни файлове
Както можете да видите, има услуга systemd, наречена postgresql
които можете да използвате, за да контролирате пощенския началник. Ако услугата не се стартира, можете да проверите състоянието й, за да проверите за съобщения за грешки:
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.
Сървърът на PostgreSQL записва регистрационен файл, който можете да проверите за по-подробни съобщения за грешки. Този файл се намира в /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
Свързване с вашия Postgres сървър
Сега, когато имаме нашия сървър, който работи, нека се опитаме да се свържем с него. По подразбиране сървърът слуша само:
- TCP връзки от 127.0.0.1 на порт 5432 и
- Сокети на Unix домейн в /var/run/postgresql
Поради конфигурацията по подразбиране, единственият начин да се свържете със сървъра в момента е чрез Unix сокета от процес, който се изпълнява като потребител на системата postgres . Нека стартираме стандартния интерактивен клиент psql като това:
alice@ubu:~$ sudo -u postgres psql postgres
psql (13.0 (Ubuntu 13.0-1.pgdg20.04+1))
Type "help" for help.
postgres=#
Тук изпълняваме psql като системния потребител postgres („sudo -u postgres psql“) и се свързваме с базата данни, наречена „postgres“ (последният „postgres“ в командния ред.) Подканата „postgres=#“ показва, име на текущо свързаната база данни („postgres“) и че имаме привилегии на суперпотребител („#“ вместо „$“).
Връзката се осъществява чрез Unix сокети (това е методът по подразбиране в psql). Тъй като по подразбиране потребителят на postgres няма парола и конфигурацията по подразбиране изисква удостоверяване с парола за TCP връзки, не е възможно да се свържете през 127.0.0.1:5432 в момента .
Разрешаване на входящи връзки от вътрешна мрежа
Първо нека променим конфигурацията, за да позволим връзки от вътрешна мрежа. Ако приемем, че IP адресът на нашия сървър в тази мрежа е 10.1.2.3, можем да редактираме основния конфигурационен файл в /etc/postgresql/13/main/postgresql.conf
и променете редовете:
#listen_addresses = 'localhost' # what IP address(es) to listen on;
# comma-separated list of addresses;
# defaults to 'localhost'; use '*' for all
до:
listen_addresses = 'localhost,10.1.2.3'
Също така трябва да кажем на Postgres да използва удостоверяване с парола за връзки, влизащи от тези мрежи. За това редактирайте друг конфигурационен файл, наречен /etc/postgresql/13/main/pg_hba.conf
и променете реда:
host all all 127.0.0.1/32 md5
до:
host all all 127.0.0.1/32 scram-sha-256
host all all 10.1.0.0/16 scram-sha-256
(Ако приемем, че вътрешната мрежа е 10.1.0.0/16.)
Също така променихме md5
по подразбиране метод към по-новия и по-сигуренscram-sha-256
. Всички други поява на md5
във файла също трябва да се замени с scram-sha-256
. Ако вашето приложение или драйвер за база данни не поддържа този метод, продължете да използвате md5
вместо това.
За да влязат в сила тези промени, трябва да рестартирате сървъра:
sudo systemctl restart postgresql
Създаване на обикновен потребител и база данни
Почти сме там!
Вече можем да създадем обикновен потребител, с който нашето приложение може да се свързва, и база данни, върху която то има пълен контрол. Свържете се като суперпотребител postgres локално от машината на сървъра, за да направите това:
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=#
(Пропуснете първата команда, ако искате да използвате md5
вместо това.) Това създаде потребител, наречен alice с парола s3cr3tp@ss . Нека също така създадем база данни, която този потребител ще притежава:
postgres=# CREATE DATABASE app1 OWNER alice;
CREATE DATABASE
postgres=#
Базата данни се нарича app1 . От алиса притежава тази база данни, всички операции в базата данни (като създаване на таблици, вмъкване на редове) са разрешени, ако приложението се свърже като потребител alice .
Нека опитаме да се свържем като alice , през мрежата:
~$ 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=>
Готино! Вече сме свързани с базата данни app1 като потребител alice .
Изтриване на бази данни, архивиране и възстановяване
Ето няколко трика, които могат да ви помогнат, докато продължавате да работите с вашия Postgresserver:
Изтриване на база данни
Можете да изтриете базата данни, която току-що създадохте („app1“), както следва:
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=>
Имайте предвид, че първо трябва да преминете към друга база данни, като използвате командата “\c” на psql.
За създаване на друга база данни или за пресъздаване на app1 , свържете се като суперпотребител и направете „СЪЗДАВАНЕ НА БАЗА ДАННИ“ както преди.
Архивиране на базата данни
Най-лесният начин да архивирате данните във вашата база данни е да използвате pg_dump като това:
alice@ubu:~$ pg_dump -h 127.0.0.1 -U alice -f backup.sql app1
Password:
Това създава SQL файл, наречен „backup.sql“, който съдържа всички SQL команди, необходими за пресъздаване на схемата и данните в базата данни app1 , в текстов формат. Можете да изпълните тези команди във всяка база данни и схемата и данните ще бъдат попълнени в тази база данни.
Прочетете повече за pg_dump тук.
Възстановяване на данни
SQL командният файл, който създадохте по-горе, може да бъде възстановен по следния начин:
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..)
Имайте предвид, че възстановихме схемата и данните в друга база данни, app2 . Командата „\i“ на psql ви позволява да изпълнявате SQL командите от файл.
Следващи стъпки
Има цял куп статии, уроци, видеоклипове и курсове, които да ви помогнат да научите по-добре с PostgreSQL. Прекарайте известно време обаче с официалната документация тук, която осигурява авторитетно и широко покритие на всички функции, синтаксис и пакетни помощни програми на PostgreSQL.