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

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

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

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

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

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

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

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

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

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

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

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

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

pg_ctl start -l logfile

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

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

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

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

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

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

  • На 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 в исходном дистрибутиве Tantor SE.

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

    [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 секунд на момент написания этого текста и прекратит работу процесса, который не сообщает о готовности в течение этого времени. Однако Tantor SE сервер, который может выполнять восстановление после сбоя при запуске, может потребовать гораздо больше времени для готовности. Рекомендуемое значение 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 в каталоге данных. Это используется для предотвращения запуска нескольких экземпляров сервера в одном каталоге данных и также может использоваться для выключения сервера.

18.3.1. Сбои при запуске сервера

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

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).

Вероятно, ограничение ядра на размер общей памяти меньше, чем рабочая область Tantor SE пытается создать (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 меньше, чем количество, которое Tantor SE хочет создать. Как и ранее, вы можете попытаться обойти проблему, запустив сервер с уменьшенным количеством разрешенных соединений (max_connections), но в конечном итоге вам понадобится увеличить ограничение ядра.

Подробности о настройке System V средств IPC приведены в Раздел 18.4.1.

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

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

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 в этом контексте не означает, что сервер получил ваш запрос на подключение и отклонил его. В этом случае будет выведено другое сообщение, как показано в Раздел 20.15). Другие сообщения об ошибках, такие как Connection timed out может указывать на более фундаментальные проблемы, такие как отсутствие сетевого подключения или блокировка соединения брандмауэром.