К вопросу о размножении слонов

(Хочется кучу кластеров на одном сервере)

Задача такая - сделать несколько папок с разными кластерами и сервисы к ним, чтобы можно было без особых усилий переключаться между ними, поскольку на одном хосте может работать только один сервер.
Зачем это нужно - я еще не придумал :) решайте сами.

Дано:
Установлен сервер постгрес.
Желание заиметь еще N кластеров на том же хосте.

Условные обозначения:
разработчики постгреса так любят название своего продукта, что называют этим словом все подряд. При этом возникает неоднозначность во всевозможных описаниях - postgres - это и база данных и суперпользователь кластера БД и пользователь ОС и утилита по конфигурированию сервера....
Поэтому
postgres - пользователь кластера БД
pg - пользователь ОС, под которым запускается сервис постгреса

Начнем.

Создадим папку для кластера C:\Program Files\PostgreSQL\8.3\cluster1
Определитесь с тем, под каким пользователем будет запускаться сервис нового кластера - от системного (SYSTEM) или от того, который был создан при установке постгреса (pg)
Проверьте, параметры доступа пользователя на папку - особенно наследованные и "особые права". У меня, например, при создании папки cluster1 в C:\Program Files\PostgreSQL\8.3\, на нее наследуются права пользователя pg, не позволяющие кластеру работать - сервис не запускается под pg.

Инициализация базы.
initdb -D "C:\Program Files\PostgreSQL\8.3\cluster1" -U postgres
при этом будет создан кластер и суперюзер postgres (если папки не было, она тоже создастся)

Если вы не хотите создавать сервис, то кластер можно стартовать и останавливать так:
pg_ctl -D "C:/Program Files/PostgreSQL/8.3/cluster1" -l logfile start
pg_ctl -D "C:/Program Files/PostgreSQL/8.3/cluster1" -l logfile stop

Но мы еще прикрутим к этому делу сервис.
Если вы еще не остановили работающий сервис постгреса, сделайте это сейчас.

Создаем сервис, запускаемый от пользователя pg
sc create pgsql-8.3_cluster1 displayname= "PostrgeSQL_Cluster1" obj= ".\pg" password= "123" binPath= "C:\Progra~1\PostgreSQL\8.3\bin\pg_ctl.exe runservice -w -N pgsql-8.3_cluster1 -D C:\Progra~1\PostgreSQL\8.3\cluster1\"
Если нужно создать сервис от системной записи, то параметры obj и password не указываем.

Запускаем сервис из консоли управления или командой
net start pgsql-8.3_cluster1
(если вы запускали кластер, перед запуском сервиса он должен быть остановлен)
(если сервис не запустился - смотрите сообщения об ошибках в системном журнале)

Если вы хотите сделать новый кластер основным, то нужно поменять его тип запуска на Авто, а у сервиса текущего кластера - на Вручную

Удалить сервис можно командой
sc delete pgsql-8.3_cluster1

С новым синим слоном!

ЗЫ:
В максимально упрощенной форма все вышесказанное сводится к трем командам:

  1. Инициализация базы. initdb может и сам создать папку, если ее нет
  2. Создание сервиса.
  3. Запуск сервиса.

Комментарии

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

вопрос по

вопрос по доступам который лично мне не понятен:
Проверьте, параметры доступа пользователя на папку - особенно наследованные и "особые права". У меня, например, при создании папки cluster1 в C:\Program Files\PostgreSQL\8.3\, на нее наследуются права пользователя pg, не позволяющие кластеру работать - сервис не запускается под pg.
Кроме:
postgres - пользователь кластера БД
pg - пользователь ОС, под которым запускается сервис постгреса. виртуальный пользователь ОС.
есть еще user_domain - реальный доменный (user_domain\DOMAIN) и локальный пользователь (user_local\LOCALHOST) под которыми и выполняется инсталяция кластера.
При выполнении initdb -D data - в отчете пишется что "все файлы будут принадлежать именно user_domain". И действительно - для
user_domain\DOMAIN есть доступ к созданным initdb папкам. И вопросы:
- доступ user_domain\DOMAIN, user_local\LOCALHOST к папкам кластера не препятствует работе сервера?
- после initdb -D data под user_domain\DOMAIN надо добавить на папки кластера полный доступ pg пользователю
- папке \bin доступ pg пользователю отстается - только чтение.
- какой доступ должен быть к kernel32.dll и прочим у user_local\LOCALHOST для нормальной работы
?

Я рассматривал

Я рассматривал установку кластера на локальной машине без доменов. Тем не менее большой разницы не вижу и в случае использования доменных пользователей.

Еще раз поясню, кто такой pg - это как раз LOCALHOST\pg. Когда постгрес при установке попросил ввести имя пользователя ОС, под которым будет запускаться сервис, я ввел вместо postgres - pg. И конечно после установки у меня появился новый пользователь (на локальной машине) pg и сервис, запущенный от его имени.
Когда же вы создаете кластер и сервис к нему вручную, то это ваше право - выбирать, от какого пользователя вы будете запускать сервис, однако в этом случае вам самим придется и контролировать, чтобы сервис мог выполнять свои задачи - т.е. имел доступ к папкам и файлам кластера.

Какой нужен доступ. При запуске сервера, он (естественно) перезаписывает в папке кластера некоторые файлы, например postmaster.* (а также, собственно, базу данных), поэтому пользователь, от имени которого запускается сервис должен иметь разрешения на изменение - т.е. на изменение, создание и удаление файлов папки кластера (что должно наследоваться и на вложенные папки).

Почему я уделил отдельное внимание папке C:\Program Files\PostgreSQL\8.3\. Потому что на папку, созданную в C:\Program Files\PostgreSQL\8.3\, наследуются (на пользователя pg) в том числе и "особые" разрешения, которые как раз запрещают изменение и удаление файлов в этой папке - это будет препятствовать запуску сервера, что, в прочем, видно в системном журнале после неудачного запуска сервиса.

Меня вот что

Меня вот что интересует:
Когда же вы создаете кластер и сервис к нему вручную, то это ваше право - выбирать, от какого пользователя вы будете запускать сервис, однако в этом случае вам самим придется и контролировать, чтобы сервис мог выполнять свои задачи - т.е. имел доступ к папкам и файлам кластера.
- выполнить initdb можно под любым пользователем имеющем права на запись в папку кластера. входить под LOCALHOST\pg в систему не надо, но после этого надо
- дать в папку кластера право запись пользователю LOCALHOST\pg
?

если вы

если вы сделаете initdb под пользователем pg, то пользователь pg будет владельцем всех созданных объектов и, следовательно, будет иметь доступ к ним.
У вас какая-то конкретная проблема возникла или вам не понятны принципы назначения прав на объекты системы?

есть и проблема

есть и проблема и не понятно. вот что я сделал:
- установил постгрес заново с кластером
- создал папку второго кластера и дал полный доступ .\pg
- initdb -D "C:\Program Files\PostgreSQL\8.3\cluster1" -U postgres
- pg_ctl -D "C:/Program Files/PostgreSQL/8.3/cluster1" -l logfile start
- остановил работающую службу PostgreSQL которая установлена инсталятором
- sc create pgsql-8.3_cluster1 displayname= "PostrgeSQL_Cluster1" obj= ".\pg" password= "123" binPath= "C:\Progra~1\PostgreSQL\8.3\bin\pg_ctl.exe runservice -w -N pgsql-8.3_cluster1 -D C:\Progra~1\PostgreSQL\8.3\cluster1\"
- net start pgsql-8.3_cluster1

Результат
-- служба не запустилась: такие ошибки:
1 Waiting for server startup...
2 LOG: could not bind IPv4 socket: No error
ПОДСКАЗКА: Is another postmaster already running on port 5432? If not,
wait a few seconds and retry.
3 WARNING: could not create listen socket for "localhost"
4 FATAL: could not create any TCP/IP sockets
-- в процессах появилось несколько postrges...

Вывод: служба не может запуститься...
вопросы:
- что не так?

что еще попробовал:
я немного изменил sc create - \"D:\PGS_CLASTER_DU\data\\"".
строка службы установленой инсталятором:
pg_ctl.exe runservice -w -N "pgsql-8.3" -D "D:\PGS_CLASTER\"
то что поставил я:
pg_ctl.exe runservice -w -N pgsql-8.3_cluster1 -D "D:\PGS_CLASTER_DU\data\"

пробовал и также как в вашем описании - результат тотже
Как будто все понятно - но ну никак

после

после инициализации кластера не нужно его запускать (pg_ctl -D "C:/Program Files/PostgreSQL/8.3/cluster1" -l logfile start) - поскольку вы это потом делаете через сервис.

Сделаю уточнения в инструкции.

ну никак не

ну никак не работает. винакаунт - winpg
initdb -D "D:\PGS_CLASTER_DU\data" -U postgres

sc create pgsql-8.3_du displayname= "PostrgeSQL_CLASTER_DU" obj= ".\winpg" password= "jnrhsdfqcz" binPath= "D:\PGS_SERVER\bin\pg_ctl.exe runservice -w -N \"pgsql-8.3_du\" -D \"D:\PGS_CLASTER_DU\data\\""

запускаю из консоли

В результате:
-служба после запуска останавливается не запустившись
- в процессах висят 4 postgres.exe
- pgAdmin-ом подключится можно. (в свойствах сервера есть поле "сервис" - там "pgsql-8.3" - я ожидал "pgsql-8.3_du")
- в журнале системы куча ошибок : "FATAL: role "winpg" does not exist" ??

где я напутал?

Самое

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

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

Попробуйте создать сервис с явным указанием пользователя
sc create pgsql-8.3_du displayname= "PostrgeSQL_CLASTER_DU" obj= ".\pg" password= "123" binPath= "D:\PGS_SERVER\bin\pg_ctl.exe runservice -U postgres -w -N \"pgsql-8.3_du\" -D \"D:\PGS_CLASTER_DU\data\\""

Поле "сервис" в pgAdmin особого значения не имеет - вы скорее всего изменили параметры старого подключения и это поле осталось от него

видимо дело в

видимо дело в initdb. файловая структура кластера созданная инсталятором и initdb - отличаются. И дело не в доступах или какихто акаунтах. Как не вертись а кластер не пускается - и как назло и инсталятором постгреса не создать второго кластера...

подскажите что делать то

как видно из

как видно из ошибки, процесс пытается запустить кластер под учетной записью с именем пользователя, под которым запускался сервис (т.е. с именем пользователя ОС, а не кластера), поэтому, как я уже упоминал, в качестве обходного решения, создайте локального (попробуйте и доменного) пользователя .\postgres и запускайте сервис от него - в этом случае проблем быть не должно, поскольку пользователь ОС и пользователь кластера будут называться одинаково.

так оно и есть -

так оно и есть - c .\postgres все работает. спасибо

в продолжение разговора вот

в продолжение разговора вот такой вопрос:
для восстановления сервера из wal устанавливаю службу по вашему совету и все работает. но нашел еще одно применение этой полезности использовать которую не получается. Делаю слейв log shipping-ом, процедура таже что и при выполнении PITR за той разницей что команда восстановления другая, но плохо то что запустить подготовленный сервер для начала перманентного восстановления службой не получается - служба вылетает - говорит программе нечего делать и она остановлена. приходится запускать pg_ctl-ом.

Не посоветуете как запустить службой сервер перманентного восстановления?

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Back to top

(С) Виктор Вислобоков, 2008-2010