Перейти к основному содержимому

Запуск сервера баз данных

примечание

Эта страница переведена при помощи нейросети GigaChat.

Для доступа к базе данных необходимо запустить сервер базы данных. Программа сервера базы данных называется postgres.

Если используется предварительно упакованная версия PostgreSQL, она, скорее всего, включает средства для запуска сервера в фоновом режиме в соответствии с соглашениями операционной системы. Использование инфраструктуры пакета для запуска сервера потребует значительно меньше усилий, чем самостоятельное выяснение этого процесса. Подробности можно найти в документации уровня пакета.

Простой способ вручную запустить сервер — вызвать postgres напрямую, указав расположение каталога данных с помощью опции -D, например:

$ postgres -D /usr/local/pgsql/data

Это оставит сервер работающим в переднем плане. Это должно быть сделано при входе в учетную запись пользователя PostgreSQL. Без -D сервер попытается использовать каталог данных, указанный переменной окружения PGDATA. Если эта переменная также не предоставлена, произойдет сбой.

Лучше запускать postgres в фоновом режиме. Для этого используйте обычную синтаксис оболочки Unix:

$ postgres -D /usr/local/pgsql/data >logfile 2>&1 &

Важно сохранять вывод stdout и stderr сервера, как показано выше. Это поможет для целей аудита и диагностики проблем. (См. раздел 25.3 для более подробного обсуждения обработки файлов журнала.)

Программа postgres также принимает ряд других параметров командной строки. Для получения дополнительной информации см. страницу справки postgres и главу Конфигурация сервера ниже.

Использование оболочки синтаксиса может быстро стать утомительным. Поэтому предоставляется программа-оболочка pg_ctl, чтобы упростить некоторые задачи. Например:

pg_ctl start -l logfile

будет запускать сервер в фоновом режиме и выводить результаты в указанный файл журнала. Опция -D имеет то же значение здесь, что и для postgres. pg_ctl также способен останавливать сервер.

Обычно сервер баз данных запускается при загрузке компьютера. Сценарии автозагрузки зависят от операционной системы. В комплекте с PostgreSQL поставляется несколько примеров сценариев в каталоге contrib/start-scripts. Для их установки потребуются права root.

Разные системы имеют разные соглашения о запуске демонов при загрузке. Многие системы используют файл /etc/rc.local или /etc/rc.d/rc.local. Другие используют каталоги init.d или rc.d. В любом случае сервер должен быть запущен пользователем PostgreSQL, а не корнем или любым другим пользователем. Поэтому команды следует формировать с использованием su postgres -c '...'. Например:

su postgres -c 'pg_ctl start -D /usr/local/pgsql/data -l serverlog'

Вот несколько предложений, специфичных для различных операционных систем. (В каждом случае убедитесь, что используете правильный установочный каталог и имя пользователя вместо общих значений, указанных в примерах.)

  • Для FreeBSD ознакомьтесь с файлом contrib/start-scripts/freebsd в дистрибутиве исходного кода PostgreSQL.

  • В OpenBSD добавьте следующие строки в файл /etc/rc.local:

    if [ -x /usr/local/pgsql/bin/pg_ctl -a -x /usr/local/pgsql/bin/postgres ]; then
    su -l postgres -c '/usr/local/pgsql/bin/pg_ctl start -s -l /var/postgresql/log -D /usr/local/pgsql/data'
    echo -n ' postgresql'
    fi
  • В системах Linux добавьте следующую команду:

/usr/local/pgsql/bin/pg_ctl start -l logfile -D /usr/local/pgsql/data

в файл /etc/rc.d/rc.local или /etc/rc.local, или обратитесь к файлу contrib/start-scripts/linux в дистрибутиве исходного кода PostgreSQL.

При использовании systemd можно использовать следующий файл службы (например, здесь):

[Unit]
Description=PostgreSQL database server
Documentation=man:postgres(1)
After=network-online.target
Wants=network-online.target

[Service]
Type=notify
User=postgres
ExecStart=/usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data
ExecReload=/bin/kill -HUP $MAINPID
KillMode=mixed
KillSignal=SIGINT
TimeoutSec=infinity

[Install]
WantedBy=multi-user.target

Использование Type=notify требует, чтобы двоичный файл сервера был собран с использованием configure --with-systemd.

Необходимо тщательно продумать настройку тайм-аута. В systemd установлен тайм-аут по умолчанию 90 секунд на момент написания этой статьи, и он завершит процесс, который не сообщает о готовности в течение этого времени. Однако серверу PostgreSQL, которому, возможно, придется выполнить восстановление после сбоя при запуске, может потребоваться гораздо больше времени для подготовки. Рекомендуемое значение infinity отключает логику тайм-аута.

  • В NetBSD используйте сценарии запуска либо FreeBSD, либо Linux в зависимости от предпочтений.

  • В Solaris создайте файл с именем /etc/init.d/postgresql, который содержит следующую строку:

    su - postgres -c "/usr/local/pgsql/bin/pg_ctl start -l logfile -D /usr/local/pgsql/data"

    Затем создайте символическую ссылку на него в /etc/rc3.d как S99postgresql.

Во время работы сервера его PID хранится в файле postmaster.pid в каталоге данных. Это используется для предотвращения запуска нескольких экземпляров сервера в одном и том же каталоге данных и также может использоваться для завершения работы сервера.

Ошибки запуска сервера

Существует несколько распространенных причин, по которым сервер может не запуститься. Рекомендуется проверить файл журнала сервера или запустить его вручную (без перенаправления стандартного вывода или стандартной ошибки) и обратить внимание на появляющиеся сообщения об ошибках. В дальнейшем рассматриваются некоторые из наиболее распространенных сообщений об ошибках более подробно.

LOG:  could not bind IPv4 address "127.0.0.1": Address already in use
HINT: Is another postmaster already running on port 5432? If not, wait a few seconds and retry.
FATAL: could not create any TCP/IP sockets

Это означает, что попытка запуска другого сервера на том же порту, где уже работает один. Однако, если сообщение об ошибке ядра не является Address already in use или какой-то вариацией этого, может возникнуть другая проблема. Например, попытка запуска сервера на зарезервированном номере порта может привести к чему-то вроде:

$ postgres -p 666
LOG: could not bind IPv4 address "127.0.0.1": Permission denied
HINT: Is another postmaster already running on port 666? If not, wait a few seconds and retry.
FATAL: could not create any TCP/IP sockets

Сообщение типа:

FATAL:  could not create shared memory segment: Invalid argument
DETAIL: Failed system call was shmget(key=5440001, size=4011376640, 03600).

означает, что предел размера общей памяти ядра меньше рабочей области PostgreSQL, которую он пытается создать (4011376640 байт в данном примере). Это маловероятно, если только не установлен параметр shared_memory_type на sysv. В этом случае можно попробовать запустить сервер с меньшим количеством буферов, чем обычно (shared_buffers), или перенастроить ядро для увеличения допустимого размера общей памяти. Также это сообщение может появиться при попытке запустить несколько серверов на одной машине, если их общее запрашиваемое пространство превышает ограничение ядра.

Ошибка типа:

FATAL:  could not create semaphores: No space left on device
DETAIL: Failed system call was semget(5440126, 17, 03600).

не означает, что закончилось место на диске. Это означает, что ограничение ядра на количество семафоров System V меньше, чем количество, которое PostgreSQL хочет создать. Как и в предыдущем случае, можно попытаться обойти проблему, запустив сервер с уменьшенным количеством разрешенных подключений (max_connections), но в конечном итоге потребуется увеличить лимит ядра.

Проблемы с подключением клиента

Хотя возможные условия ошибки на стороне клиента весьма разнообразны и зависят от приложения, некоторые из них могут быть непосредственно связаны со способом запуска сервера. Условия, отличные от приведенных ниже, должны быть задокументированы для соответствующего клиентского приложения.

psql: error: connection to server at "server.joe.com" (123.123.123.123), port 5432 failed: Connection refused
Is the server running on that host and accepting TCP/IP connections?

Это общая ошибка «Не удалось установить соединение с сервером». Она возникает при попытке установить связь через TCP/IP. Одна из распространенных ошибок — забыть настроить сервер для разрешения соединений TCP/IP.

В качестве альтернативы, при попытке установить связь через сокет домена Unix с локальным сервером, может возникнуть следующее сообщение:

psql: error: connection to server on socket "/tmp/.s.PGSQL.5432" failed: No such file or directory
Is the server running locally and accepting connections on that socket?

Если сервер действительно работает, необходимо проверить, что путь к сокету, указанный клиентом (например, /tmp), совпадает с настройкой unix_socket_directories сервера.

Сообщение о сбое подключения всегда показывает адрес сервера или имя пути к сокету, что полезно для проверки того, пытается ли клиент подключиться к нужному месту. Если там действительно нет слушающего сервера, сообщение об ошибке ядра обычно будет либо Connection refused, либо No such file or directory, как показано. (Важно понимать, что Connection refused в этом контексте не означает, что сервер получил запрос на подключение и отклонил его. Этот случай приведет к другому сообщению, как показано в разделе «Проблемы с аутентификацией».) Другие сообщения об ошибках, такие как Connection timed out, могут указывать на более серьезные проблемы, например отсутствие сетевого подключения или брандмауэр, блокирующий соединение.