Учетная запись Oracle не отвечает

У меня есть экземпляр Oracle, который имеет учетные записи user1, user2 и user3. Вчера я смог войти во все три аккаунта. Сегодня я могу войти в user1 и user3, но user2 полностью "заморожен" каким-то образом, который я не понимаю.

Если я пытаюсь войти в user2 с sqlplus, он просто вращается навсегда. Он не подключается, не прерывается, ничего не происходит, пока я не нажму CTRL+C, чтобы завершить процесс. Подключение как user1 или user3 происходит мгновенно.

Я думал, что попробую заблокировать user2, а затем попытаться разблокировать его. Запрос на блокировку пользователя выполнялся в течение 25 минут, прежде чем я сдался! Блокировка user1 затем разблокировка user1 запустилась мгновенно.

Используя TOAD и подключаясь как администратор баз данных, я использовал Session Browser для исследования. Я нашел 11 подключений к базе данных как user2. Пять из них, похоже, мои неудачные попытки подключения с использованием sqlplus. Ни одно из этих соединений не показывает открытых курсоров, текущего оператора или каких-либо блокировок. На вкладке 10 ожидающих соединений отображается "блокировка кэша строк" ​​с:

  • секунд ожидания от 3000 до 60000
  • P1 = 7
  • P1 Text = "идентификатор кэша"
  • P2 = 0
  • P2 Text = "mode"
  • P3 = 3
  • P3 Text = "запрос"

Одно из соединений выделяется, поскольку оно выглядит очень старым. Он показывает "SQL*Net сообщение от клиента" с:

  • секунд ожидания> 600 000
  • P1 = 1413697536
  • P1 Text = "идентификатор водителя"
  • P2 = 1
  • P2 Text = "#bytes"
  • P3 = 0
  • P3 Text = ""

Я не могу убить ни одного из этих 11 сеансов. После того, как я выполнил команду kill (с использованием TOAD, с или без немедленной опции), она выполняется в течение 45-60 секунд, после чего появляется сообщение "Сессия помечена для уничтожения". но сессия никогда не проходит.

Любые идеи, что это значит или как я могу убить эти сеансы и восстановить доступ к учетной записи user2?

Обновление: в журнале предупреждений было несколько интересных строк:

Вт дек 29 09:37:45 2009
ВНИМАНИЕ: тайм-аут входящего соединения (ORA-3136)
Вт дек 29 10:25:45 2009
>>> WAITED TOO LONG FOR A ROW CACHE ENQUEUE LOCK! pid=17
System State dumped to trace file [snip]\udump\ora_1988.trc
Tue Dec 29 10:54:17 2009
WARNING: inbound connection timed out (ORA-3136)
Tue Dec 29 10:55:47 2009
WARNING: inbound connection timed out (ORA-3136)
Tue Dec 29 10:56:47 2009
WARNING: inbound connection timed out (ORA-3136)
Tue Dec 29 10:57:47 2009
WARNING: inbound connection timed out (ORA-3136)
Tue Dec 29 11:12:17 2009
WARNING: inbound connection timed out (ORA-3136)
Tue Dec 29 12:06:17 2009
WARNING: inbound connection timed out (ORA-3136)
Tue Dec 29 12:26:47 2009
WARNING: inbound connection timed out (ORA-3136)
Tue Dec 29 12:27:47 2009
WARNING: inbound connection timed out (ORA-3136)
Tue Dec 29 13:46:17 2009
WARNING: inbound connection timed out (ORA-3136)
Wed Dec 30 10:02:16 2009
>>> ОЖИДАЕТСЯ СЛИШКОМ ДОЛГО ДЛЯ ЗАКРЫТИЯ LOW COWE ROWE! PID =37
Состояние системы выгружено в файл трассировки [snip]\udump\ora_2860.trc
Ср 30 дек. 11:55:59 2009
orakill: пытается убить tid=436
Ср 30 дек. 11:56:04 2009
orakill: ssthreadkill (tid=436) не может получить мьютекс списка потоков: err=0

Решение: похоже, что это ошибка 10.2.0.3, и мне нужно перезапустить экземпляр, на что у меня нет разрешения, поэтому мне придется подождать несколько дней.

1 ответ

Решение

Попробуйте следующее:

select s.username, s.sid, p.spid 
  from v$session s join v$process p on addr=paddr
where s.username = 'USER2';

Используя значение spid из вышеприведенного запроса, войдите на сервер и введите в командной строке DOS следующую команду:

orakill YOURSID spid

YOURSID - это SID экземпляра базы данных, с которым вы имеете дело.

orakill часто работает, когда инструменты GUI не могут убить процессы. Вот хороший обзор Orakill. Обратите внимание на причину № 1 для использования orakill - это может объяснить, почему вы не можете использовать инструмент GUI:

Оператор alter system не удаляет существующие блокировки. Вместо этого сеанс будет оставаться подключенным до истечения времени ожидания, затем сеанс будет завершен, а блокировки сняты. Команда orakill немедленно убьет поток и блокировки.

Обновить:

Вы также можете попробовать:

select sid, serial#, program from v$session;
alter system kill session '<SID>,<SERIAL#>' immediate;

хотя я бы не оставил много надежды...

Другие вопросы по тегам