+7 (812) 325 84 00

+7 (499) 322 07 96

Блог системного интегратора

  • Архив

    «   Февраль 2020   »
    Пн Вт Ср Чт Пт Сб Вс
              1 2
    3 4 5 6 7 8 9
    10 11 12 13 14 15 16
    17 18 19 20 21 22 23
    24 25 26 27 28 29  

Опыт решения проблемы нестартующего сервера Oracle IRM License Service в составе системы Oracle IRM под управлением Windows

Проблема возникла в связи с внедрением системы Oracle IRM, а именно компонента License Server версии 10gR3, при использовании в качестве
базы данных бесплатной версии СУБД Oracle 10 - Oracle 10 XE (если можно так выразиться, это аналог SQL Express от Microsoft), на платформе Windows Server 2003 R2 SP2. Заключалась проблема в том, что при старте службы (как при загрузке системы, так и при последующих попытках старта вручную) сервис завершался с ошибкой 7003 (Service-specific error). Какая-либо иная информация в логах ОС не регистрировалась.

Ошибки 7003 service-specific error в ОС Windows обычно специфичны для конкретного приложения, поэтому предварительный поиск по открытым ресурсам каких-либо вразумительных результатов не дал. Однако, изучение статей на Oracle Metalink (теперь My Oracle Support), а именно "451541.1: License server startup procedure" и "451859.1: What is license server error 7003", навело на мысль, что проблема могла заключаться в именно в базе данных, хотя обе службы БД - как слушатель (OracleXETNSListener), так и сама БД (OracleServiceXE), в системе значились как стартовавшие.

При попытке запустить Licensing Service интерактивно (из консоли сервера IRM) служба выдавала следующую ошибку:

SealedMedia Exception
Description: Database Failure
Code: 7003
Comment: The database reported the error '[Oracle][ODBC][Ora]ORA-12514:
TNS:listener does not currently know of service requested in connect descriptor'

Это было уже "теплее", и исследования по данной ошибке явили на свет давно существовавшую проблему, описанную в том числе и в Microsoft Technet Support Knowledge Base, в статье "841180: Oracle database service startup process stops responding", http://support.microsoft.com/kb/841180

Проблема освещалась и независимыми источниками, для примера:
http://entertheit.blogspot.com/2007/09/oracle-service-doesnt-autostart.html
http://ora-12514.ora-code.com/

Суть проблемы сводится к тому, что Oracle Database, начиная еще с версии 8, имеет проблему с инициализацией на ОС Windows Server 2003 и R2 с установленным патчем из бюллетеня MS04-011 и его производными, причем, насколько удалось выяснить, хотфикса, решающего данную проблему, не существует.

Коротко говоря, при этой проблеме БД не запускается и не может корректно обслуживать клиентские запросы, несмотря на успешный с точки зрения Service Control Manager старт обеих служб, пока с достаточными правами (в начальной конфигурации - с правами создателя БД) не будет выполнен инициализационный скрипт самого
Oracle, в случае Oracle XE это "C:\oraclexe\app\oracle\product\10.2.0\server\BIN\StartDB.BAT" (для пути инсталляции по умолчанию).

Таким образом, проблему можно решить, синхронизировав выполнение данного скрипта со стартом системы; однако, при этом, он должен отрабатывать до запуска самого License Server. Последовательность выполнения должна быть такой:

- старт служб Oracle (OracleXETNSListener и OracleServiceXE); старт скрипта StartDB.BAT;
- старт IRM License Server (служба Oracle_Information_Rights_Management_Server).

При этом, службы должны (по крайней мере в конфигурации по умолчанию - которая, кстати, в производственном внедрении не рекомендуется), запускаться из контекста ОС - либо (рекомендуется) из контекста специально назначенной для этого учетной записи службы. В то же время, скрипт StartDB.BAT должен выполняться с правами администратора БД Oracle XE. На платформе Microsoft по умолчанию это пользователь Windows, установивший БД (хотя такая конфигурация опять-таки не рекомендуется, мы рассмотрим именно ее в целях упрощения примера). Попытка же исполнить скрипт из-под NT Authority\SYSTEM просто выдает ошибку вида Oracle ERROR: ORA-01031: insufficient privileges.

Варианты процедуры старта (по крайней мере самые распространенные) могут быть такими:

1. Задача Task Scheduler, запускаемая по событию ОС System Start (будет исполняться с правами заданного в свойствах задания пользователя, он должен дополнительно иметь в системе привилегию "Log On As A Batch Job";

2. Установка дополнительного параметра в ключе реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run (будет исполняться с правами операционной системы);

3. Создание специального сервиса, синхронизирующего запуск в нужной последовательности,с помощью утилиты Srvany из Windows 2003 Resource Kit. Похожая методика описана в статье Technet "841180: Oracle database service startup process stops responding". использование связки srvany + Instsrv описано в статье Microsoft Technet Knowledge Base "How To Create a User-Defined Service", http://support.microsoft.com/kb/137890 . Мы остановимся именно на этом варианте.

Рабочее решение может быть, к примеру, таким:
- службы OracleXETNSListener, OracleServiceXE, Oracle_Information_Rights_Management_Server переводятся с типа старта Automatic на тип старта Manual (Demand);
- С помощью InstSrv/Srvany создается новая служба OracleStartup,запускаемая с правами, достаточными для запуска StartDB.BAT (в простом случае пользователь, установивший Oracle XE, в реальном случае - специальный пользователь с минимально необходимым набором прав).

Пример пакетного файла для конфигурирования служб:

rem Работает с Oracle XE, для большого Oracle изменить названия служб
"C:\Program Files\Windows Resource Kits\Tools\instsrv.exe" OracleStartup "C:\Program Files\Windows Resource Kits\Tools\SRVAny.exe"
sc config "OracleServiceXE" start= demand
sc config "OracleXETNSListener" start= demand
sc config "Oracle_Information_Rights_Management_Server" start= demand

Параметры новой службы, прописаные в ключе Parameters сервиса, будут такими:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\OracleStartup\Parameters]
"Application"="C:\\Admin\\Scripts\\Ora_Start\\ORAStart.CMD"
"AppDirectory"="C:\\Admin\\Scripts\\Ora_Start"

Полностью ставить пакет Windows Server 2003 Resource Kit на сервер нет необходимости, достаточно взять два требуемых файла - Instsrv.exe и Srvany.exe.
Скрипт, синхронизирующий старт License Service (ORAStart.CMD) выглядит следующим образом:

c:
cd C:\oraclexe\app\oracle\product\10.2.0\server\BIN
call C:\oraclexe\app\oracle\product\10.2.0\server\BIN\StartDB.BAT
net start Oracle_Information_Rights_Management_Server

При этом, службы OracleXETNSListener и OracleServiceXE стартуют внутри StartDB.BAT.

Последний момент - в зависимости службы Oracle_Information_Rights_Management_Server (параметр реестра DependOnService) прописывается служба OracleStartup. Этим обеспечивается корректный старт службы License Service в случае необходимости ее ручного перезапуска при работающей системе.

P.S. В процессе тестирования системы Oracle IRM под Windows установлено, что проблема имеет "плавающий" характер (по крайней мере, на виртуальных стендах VMware), и может возникать внезапно и эпизодически. Однако, приведенная методика является универсальной и позволяет гарантированно застраховаться от неприятностей.

Семинар по построению эффективной и безопасной инфраструктуры на базе технологий Oracle