Учетная запись 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
>>> ОЖИДАЕТСЯ СЛИШКОМ ДОЛГО ДЛЯ ЗАКРЫТИЯ LOW COWE ROWE! PID =37
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
Состояние системы выгружено в файл трассировки [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;
хотя я бы не оставил много надежды...