# PostgreSQL

## Установка

Установка `PostgreSQL` в `Ubuntu`:

```sh
sudo apt update
sudo apt install postgresql postgresql-contrib
```

Установка в `Solus`:

```sh
sudo eopkg it postgresql postgresql-contrib
```

Пакет `postgresql-contrib` содержит дополнительные утилиты и функциональные возможности.

В процессе установки создаётся учётная запись `postgres`, которая связана с используемой по умолчанию ролью `postgres`.

## Использование

После установки, чтобы подключиться к СУБД PostgreSQL необходимо открыть `shell` из под пользователя `postgres`:

```sh
sudo -i -u postgres
```

где `-i` запуск оболочки входа в систему от имени целевого пользователя `-u postgres`.

После входа в оболочку под пользователем `postgres` запустить утилиту `psql`:

```sh
psql
```

Или использовать более быстрый способ:

```sh
sudo -u postgres psql
```

## Создание новой роли

После входа в оболочку под пользователем `postgres`, можно создать новую роль с помощью следующей команды:

```sh
createuser --interactive
```

При создании необходимо будет ввести имя новой роли и указать, будет ли являться новая роль суперпользователем:

```sh
Enter name of role to add: user
Shall the new role be a superuser? (y/n) y
```

Для любой роли, используемой для входа, существует база данных с тем же именем, к которой роль может получить доступ. Это означает, что если созданный пользователь будет иметь имя `user`, эта роль попытается подключиться к базе данных, которая также называется `"user"` по умолчанию. Необходимо создать соответствующую базу данных:

```sh
createdb user
```

При этом должен существовать пользователь Linux с тем же именем, что и имя роли и базы данных в Postgres.

## Смена пароля

Для установки/смены пароля выполнить в `psql` команду:

```sh
\password user
```

где `user` - имя пользователя, у которого необходимо сменить пароль.

## Удалённый доступ

Для открытия удалённого доступа необходимо отредактировать файл `/etc/postgresql/14/main/postgresql.conf`, где `14` - версия PostgreSQL:

```sh
sudo nano /etc/postgresql/14/main/postgresql.conf
```

Раскомментировать параметр `listen_addresses` и установить в качестве значения звёздочку (`*`):

```sh
listen_addresses = '*'
```

Сохранить и перезагрузить сервер PostgreSQL, в `Ubuntu`:

```sh
sudo systemctl restart postgresql.service
```

в других дистрибутивах:

```sh
sudo service postgresql restart
```

## Создание бэкапа

Создание бэкапа `tar` архива:

1. Выгрузка только схемы БД

```sh
pg_dump -h 192.168.1.2 -U user -W -d dbname -sn schemename -F t -f db.tar
```

или

```sh
pg_dump --host=192.168.1.2 --username=user --password --dbname=dbname --schema-only --schema=schemename --format=tar --file=db.tar
```

2. Выгрузка только данных указанной схемы БД

```sh
pg_dump -h 192.168.1.2 -U user -W -d dbname -an schemename -F t -f db.data.tar
```

или

```sh
pg_dump --host=192.168.1.2 --username=user --password --dbname=dbname --data-only --schema=schemename --format=tar --file=db.data.tar
```

## Восстановление бэкапа

1. Восстановление бэкапа из файла `*.sql`.

```sh
psql -f backup.sql
```

2. Восстановление из `tar` архива.

Экспортировать переменную `PGPASSWORD` с указанным паролем для подключения к БД:

```sh
export PGPASSWORD=password
```

Выполнить импорт данных из архива:

```sh
pg_restore -h 192.168.1.2 -U user -d dbname -v "/path/to/tar/archive"
```

## Возможные ошибки

При подключении к удалённой БД может возникнуть ошибка:

```sh
FATAL: no pg_hba.conf entry for host "192.168.56.1", user "user", database "user", SSL encryption
```

где `192.168.56.1` - адрес компьютера, с которого происходит подключение, `user` - имя пользователя, от которого происходит подключение, а также имя базы данных.

Необходимо отредактировать файл `/etc/postgresql/14/main/pg_hba.conf`, где 14 - версия PostgreSQL:

```sh
sudo nano /etc/postgresql/14/main/pg_hba.conf
```

и добавить запись:

```sh
host    all             user            192.168.56.1/32         scram-sha-256
```

которая разрешает доступ логина `user` к любой базе данных с IP-адреса `192.168.56.1`.
