среда, 2 января 2013 г.

17.3. Запуск сервера БД


Перед тем, как кто-нибудь сможет получить доступ к БД, Вы должны запустить сервер БД. Программа сервер называется postgres. Эта программа должна знать где найти необходимые ей для работы данные. Для этого используется опция -D. Так что самый простой способ запуска сервера:
$ postgres -D /usr/local/pgsql/data
В этом случае сервер будет запущен как активный процесс (не в фоне). Это должно быть сделано из под аккаунта пользователя PostgreSQL. Без опции -D сервер попытается найти данные в каталоге из переменной окружения PGDATA. Если же и этой переменной нет - то сервер не запустится.
Обычно гораздо удобнее запустить сервер в фоне. Для этого используйте обычный синтаксис оболочки Unix:
$ postgres -D /usr/local/pgsql/data >logfile 2>&1 &
Очень важно где-то хранить вывод сервера и вывод ошибок, как показано выше. Это поможет в диагностике проблем. (См раздел 23.3 где говорится об обработке лог файлов).
Программа postgres так же принимает опции командной строки. Более подробно об этом говорится в странице руководства postgres и в главе 18.
Однако эти команды оболочки могут быстро надоесть. Поэтому есть программа-обёртка pg_ctl, которая позволяет сделать всё то же самое, но гораздо проще. Например
pg_ctl start -l logfile
запустит фоновый процесс сервера и направит вывод в указаный файл. Опция -D здесь имеет то же значение. Кроме того, pg_ctl может и остановить сервер.
Обычно Вам нужно запустить сервер БД при загрузке компьютера. Скрипты для автозапуска зависят от системы. Некоторые варианты Вы можете найти в каталоге contrib/start-scripts. Для их установки могут потребоваться права суперпользователя.
Разные системы умеют разные условия для запуска демона при загрузке. Многие системы имеют файл /etc/rc.local или /etc/rc.d/rc.local. Другие системы используют каталоги init.d или rc.d. Как бы то ни было, сервер должен быть запущен от имени пользователя PostgreSQL, а не от имени суперпользователя или другого пользователя. Поэтому, возможно, Вы должны использовать такую форму команды su -c '...' postgres. Например:
su -c 'pg_ctl start -D /usr/local/pgsql/data -l serverlog' postgres
Вот несколько предположений для разных ОС (В любом случае будьте уверены, что Вы указываете правильную папку установки и имя пользователя):
  • FreeBSD смотрите на файл /contrib/start-scripts/freebsd в папке с исходниками
  • OpenBSD добавьте следующие строки в /etc/rc.local
  • if [ -x /usr/local/pgsql/bin/pg_ctl -a -x /usr/local/pgsql/bin/postgres ];
    then
        su - -c '/usr/local/pgsql/bin/pg_ctl start -l /var/postgresql/log -s' postgres
        echo -n ' postgresql'
    fi
  • Linux добавьте 
  • /usr/local/pgsql/bin/pg_ctl start -l logfile -D /usr/local/pgsql/data
  • 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"
Пока сервер запущен его PID хранится в postmaster.pid в каталоге с данными. Это используется для того, чтобы несколько экземпляров сервера не были запущены в одном и том же каталоге с данными. Его же можно использовать для остановки сервера.

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

Есть несколько общих ошибок из-за которых сервер может не запуститься. В поисках сообщения об ошибках обратитесь к логу сервера или запустите его вручную (без перенаправления стандартного вывода и вывода ошибок). Ниже мы объясним некоторые наиболее часто встречающиеся сообщения об ошибках:
LOG: could not bind IPv4 socket: 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 TCP/IP listen socket
Обычно это значит именно то, что и написано: Вы пытаетесь запустить другой сервер на том же порту, на котором уже запущен другой сервер. Однако, если порт не используется, то причина может быть в другом. Например, попытка запустить сервер на зарезервированном порту тоже приведёт к похожей ошибке.
$ postgres -p 666
LOG: could not bind IPv4 socket: Permission denied
HINT: Is another postmaster already running on port 666? If not, wait a few seconds and retry.
FATAL: could not create TCP/IP listen socket
Сообщение вида
FATAL: could not create shared memory segment: Invalid argument
DETAIL: Failed system call was shmget (key=5440001, size=4011376640, 03600).
обычно означает, что предел разделяемой памяти ядра меньше, чем пытается создать рабочая область PostgreSQL (в нашем примере 4011376640 байт). Или это может значить что ваше ядро не сконфигурировано на поддержку разделяемой памяти в стиле System-V. В качестве "костыля" Вы можете попробовать запустить сервер с меньшим количеством буферов (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), но в конце концов Вы всё равно просто переконфигурируете своё ядро.
Если Вы получили ошибку "illegal system call", то, скорее всего, разделяемая память и семафоры вообще не поддерживаются вашим ядром. В этом случае Вам остаётся только переконфигурировать ядро для включения поддержки этих возможностей.
Информация о том, как сконфигурировать возможности System V IPC находится в разделе 17.4.1

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

Хотя ошибки подключения на стороне клиента имеют разные причины и зависят от конкретного приложения, тем не менее, некоторые из них связаны напрямую с тем, запущен ли сервер. Ошибки, отличные от приведённых ниже, должны решаться с конкретным приложением.
psql: could not connect to server: Connection refused
          Is the server running on host "server.joe.com" and accepting
          TCP/IP connections on port 5432?
Это стандартная ошибка "Я не могу найти сервер, с которым я должен говорить". Она похоже на ошибку выше про TCP/IP. Скорее всего сервер забыли настроить на приём TCP/IP соединений.
Кроме того, Вы можете увидеть такую ошибку при попытке соединиться с локальным сервером через unix сокеты:
psql: could not connect to server: No such file or directory
          Is the server running locally and accepting
          connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
По последней строке Вы можете проверить, что клиент пытается подключиться туда, куда надо. Если там и правда нет сервера, то сообщение об ошибке от ядра будет либо Connection refused либо No such file or directory как в нашем примере. (Важно отметить, что Connection refused в данном случае не означает, что сервер получил ваш запрос на подключение и отклонил его. Такая ситуация приведёт к другому сообщению об ошибке, как показано в разделе 19.4). Другие сообщения об ошибках вроде Connection timed out могут означать наличие более серьёзных проблем, таких как задержки в сети.

Комментариев нет:

Отправить комментарий