ERP Галактика — не пускает пользователей (ORA-20001: RECORD LOCKED)

  • В моем случае ERP Галактика на базе Oracle 11g

Произошел разрыв по сети между сервером ERP Галактика и сервером СУБД Oracle. После сбоя новые подключения от пользователей (кроме администраторов) к ERP Галактика перестали устанавливаться. В логе моей базы Oracle alert_[db_name].log стали появляться сообщения подобного вида:

Errors in file x:\oracle\11.2.0\diag\rdbms\gal\trace\gal_ora_3688.trc:
ORA-00604: error occurred at recursive SQL level 1
ORA-20001: RECORD LOCKED AAALsvAAFAAAACHAAB
ORA-06512: at «GAL.ALX$ACTIVEUSERS», line 1
ORA-04088: error during execution of trigger ‘GAL.ALX$ACTIVEUSERS’
ORA-06512: at «GAL.GAL_SYSFUNC_PKG», line 1
ORA-06512: at line 1

где GAL — это схема базы Oracle, где хранятся все данные ERP Галактика.
Триггер GAL.ALX$ACTIVEUSERS установлен на таблицу GAL.X$ACTIVEUSERS, через которую отслеживаются и устанавливаются новые подключения пользователей ERP Галактики. Следовательно строка с ROWID AAALsvAAFAAAACHAAB заблокирована в таблице GAL.X$ACTIVEUSERS. Чтобы найти, кто из подключенных пользователей заблокировал эту строку, я написал и выполнил следующий запрос:

SELECT GAL.INTTOHEX (ss.SID, 4) || GAL.INTTOHEX (ss.SERIAL#, 4)
          L_SESS,
       ss.SID,
       ss.SERIAL#,
       ss.USERNAME,
       loc.ADDRESS
  FROM V$SESSION ss, GAL.SYS#LOCKS loc
 WHERE     STATUS <> 'KILLED'
       AND loc.dbsessionid =
                 GAL.INTTOHEX(ss.SID, 4)
              || GAL.INTTOHEX(ss.SERIAL#, 4)
       AND loc.address = 'AAALsvAAFAAAACHAAB';

Определив Sid и Serial# блокирующей сессии по результатам запроса, я смог убить эту сессию, чтобы строка AAALsvAAFAAAACHAAB стала достуной.

ALTER SYSTEM KILL SESSION 'sid, Serial#' IMMEDIATE;

После того, как сессия была убита, новые пользовательские сессии к ERP Галактика стали устанавливаться.

Реклама