# PostgreSQL (Русский)

Эта статья описывает как настроить PostgreSQL и интегрировать ее с PHP и Apache. Она также описывает, как сделать PostgreSQL доступным из клиента удалённого доступа. Считаем, что PHP и Apache уже установлены. Если вам нужна помощь настройки любой из этих программ, смотрите LAMP и следуйте всем разделам, кроме связанного с MySQL.

## Установка PostgreSQL

- Устанавливаем postgresql

    $ sudo pacman -S postgresql

- Создаём конфигурационный файл из готовых шаблонов systemd (они находятся по адресу /usr/lib/tmpfiles.d/)

    $ systemd-tmpfiles --create postgresql.conf

- Инициализируем кластер с нужной локалью (она должна быть доступна в системе)

    $ sudo su - postgres -c "initdb --locale ru_RU.UTF-8 -E UTF8 -D '/var/lib/postgres/data'"

- Запускаем сервер PostgreSQL

    $ systemctl start postgresql

- Допонительно его можно добавить в автозагрузку

    $ systemctl enable postgresql

## Создание Вашей первой базы данных

- Становимся пользователем postgres (этот пользователь был создан при запуске "/etc/rc.d/postgresql start".)

    su root
    su - postgres

- Добавляем нового пользователя базы данных

    createuser -DRSP <username>

-D Пользователь не может создавать базы данных
-R Пользователь не может создавать аккаунты
-S Пользователь не является суперпользователем
-P Запрашивать пароль при создании

С другой стороны, вы можете использовать команду createuser без параметров. Вывод в терминале выглядит так::

    # createuser <username>
    Shall the new role be a superuser? (y/n)  n
    Shall the new role be allowed to create databases? (y/n)  y
    Shall the new role be allowed to create more new roles? (y/n)  y

- Если имя созданного пользователя совпадает с именем пользователя ($ USER) вы получите доступ к базе данных оболочки PostgreSQL без указания имени пользователя (что весьма удобно).

- Создайте новую базу даных от пользователя, имеющего разрешение на чтение и запись (read/write).

    createdb -O username databasename [-E database_encoding]

- Вот и всё! Ваша база данных создана.

## Знакомство с PostgreSQL

### Доступ к оболочке базы данных

- Становимся postgres пользователем, чтобы иметь возможность задать ваши права (как у основного пользователя)

    $ sudo su postgres

- Запускаем основную оболочку базы данных, в которой мы сможем создавать, удалять базы данных/таблицы, задавать права и запускать команды SQL.

    $ psql

  --Вы также можете использовать `psql <database_name>` для редактирования конкретной базы данных.

- Подключаем базу данных

    => \c <database>

Configure Postgre*Список всех пользователей и их уровни доступа

    => \du

- Краткая информация о всех таблицах в текущей базе данных

    => \dt

Есть, конечно, много других мета-команд, но именно эти должны помочь вам начать работу.

## Настройка удалённого доступа к PostgreSQL

Файл настроек сервера баз данных PostgreSQL `postgresql.conf`. Этот файл находится в папке данных сервера, обычно `/var/lib/postgres/data`. В этой же папке находятся основные файлы настроек включая и `pg_hba.conf`. Замечание | По умолчанию эта папка не доступна даже для просмотра (или поиска) от лица обычного пользователя.

1. Из-под пользователя root редактируем файл

       $ sudo nano /var/lib/postgres/data/postgresql.conf

2. В разделе connections and authentications раскомментируйте или исправьте строку`listen_addresses` по вашему желанию

       listen_addresses = '*'

   и внимательно просмотрите другие строки.
3. Далее добавляем следующую строку в основной файл настройки проверки подлинности `/var/lib/postgres/data/pg_hba.conf`. Этот файл определяет, каким хостам разрешено подключаться, так что будьте осторожны.

       # IPv4 local connections: <br>host   all   all   your_desired_ip_address/32   trust

   где `your_desired_ip_address` ip адрес клиента.
4. После этого необходимо перезапустить демон, чтобы изменения вступили в силу

       $ systemctl restart postgresql

Замечание | Postgresql по умолчанию использует порт 5432 для удалённого доступа. Поэтому убедитесь, что этот порт открыт и может принимать входящие соединения

Если возникли проблемы взгляните на лог-файл сервера

    $ journalctl -u postgresql

## Настройка PostgreSQL для работы с PHP

1. Установите модуль PHP-PostgreSQL

       $ pacman -S php-pgsql

2. Откройте файл `/etc/php/php.ini` в удобном для вас текстовом редакторе, например,

       # sudo nano /etc/php/php.ini

3. Найдите строку, начинающуюся с, ";extension=pgsql.so" и исправьте её так: "extension=pgsql.so". (Только уберите ";"). Если вы используете PDO, сделайте то же самое с ";extension=pdo.so" and ";extension=pdo_pgsql.so". Если этих строк нет, добавьте их. Эти строки находятся в разделе файла "Dynamic Extensions", или в самом конце файла.
4. Перезапустите веб сервер Apache

       # systemctl restart httpd

## Изменение кодировки новой базы данных на UTF-8 (По вашему усмотрению)

Когда создаётся новая база данных (например, `createdb blog`) PostgreSQL просто копирует шаблон базы данных. Есть два стандартных шаблона: template0 - ваниль, и template1 используемый по умолчанию. Один из вариантов изменения кодировки новой базы данных, заключается в изменении шаблона template1. Для этого, заходим в оболочку PostgresSQL (psql) и делаем вот что:

1. Первое, мы должны сбросить template1. Шаблоны не могут быть сброшены, так что мы сначала изменим его, как обычную базу данных:

    UPDATE pg_database SET datistemplate = FALSE WHERE datname = 'template1';

2. Сейчас уже можно сбросить её:

    DROP DATABASE template1;

3. Создаём новую базу данных, с новой кодировкой по умолчанию из template0:

    CREATE DATABASE template1 WITH TEMPLATE = template0 ENCODING = 'UNICODE';

4. Теперь снова сделаем template1 шаблоном:

    UPDATE pg_database SET datistemplate = TRUE WHERE datname = 'template1';

5. (Рекомендация) Документация по PostgreSQL advises рекомендует "замораживать" изменения шаблона функцией VACUUM FREEZE:

    \c template1
    VACUUM FREEZE;

6. (По желанию) Если вы не хотите, чтобы кто-либо подключался к этому шаблону, присвойте параметру datallowconn значение FALSE:

    UPDATE pg_database SET datallowconn = FALSE WHERE datname = 'template1';

Теперь вы можете создать базу данных используя стандартные команды в терминале:

    su -
    su - postgres
    createdb blog;

Если снова войти в PSQL и проверить базу данных, вы должны увидеть правильную кодировку новой базы данных:

    \l

returns

                                  List of databases
      Name    |  Owner   | Encoding  | Collation | Ctype |   Access privileges
    -----------+----------+-----------+-----------+-------+----------------------
    blog      | postgres | UTF8      | C         | C     |
    postgres  | postgres | SQL_ASCII | C         | C     |
    template0 | postgres | SQL_ASCII | C         | C     | =c/postgres
                                                         : postgres=CTc/postgres
    template1 | postgres | UTF8      | C         | C     |

## Больше информации

- Официальная страница PostgreSQL

Categories:

- Русский
- Database management systems (Русский)