Oracle отключить всех пользователей

Обновлено: 07.07.2024

  • Главная /
  • Статьи /
  • Oracle /
  • Дублирование базы данных с помощью RMAN. Часть 2.

Практическое администрирование Oracle - Экземпляр - Уничтожение сеансов

С еанс – это специфическое соединение пользователя к экземпляру Oracle через пользовательский процесс. При работе с выделенным сервером для каждого такого сеанса создается отдельный серверный процесс. Обмен пользователя с экземпляром базы данных происходит через пользовательский процесс на клиентской машине, который в свою очередь через драйвер клиента Oracle Net работает с выделенным серверным процессом, взаимодействующим непосредственно с самим экземпляром Oracle. Иногда возникают ситуации, когда требуется уничтожить какие либо сеансы. Такое обычно такое происходит, когда требуется прервать долго выполняющийся сеанс или возникает необходимость в проведении административных работ с отключением всех сеансов. Так же может понадобиться и просто откатить незафиксированную транзакцию, если за данным сеансом выстроилась большая очередь. Бывают и так называемые “потерянные сеансы”, нуждающиеся в уничтожении. В этой главе мы научимся идентифицировать такие сеансы, уничтожать их, а так же рассмотрим сложности, возникающие при этом процессе.

Идентифицируем сеанс

Параметры получены. Теперь можно приступить к уничтожению сеанса.

Уничтожаем неактивный сеанс

Выполним команду ALTER SYSTEM KILL SESSION для указанного выше сеанса:

Посмотрим состояние сеанса:

Если сеанс неактивный и не содержит незавершенных транзакций, то он помечается со статусом KILLED . Поле PADDR уже не указывает на адрес структуры выделенного серверного процесса. Но серверный процесс не освобождается:

Информация при этом о сеансе из представления v$session исчезает:

Но остаётся в таблице x$ksuse:

Серверный процесс при этом всё ещё существует:

Если пользователь продолжит пытаться выполнять команды, то экземпляр на все дальнейшие попытки будет отвечать ошибкой ORA-01012: not logged on:

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

Уничтожаем сеанс с незафиксированными транзакциями

Если в сеансе имеются незафиксированные транзакции, то при выдаче команды ALTER SYSTEM KILL SESSION происходит откат этих транзакций. Занимается откатом мертвых транзакции фоновый процесс Oracle SMON . Убедимся в этом, выполнив следующий пример:

Теперь попытаемся уничтожить этот сеанс:

Сеанс уничтожается, не дожидаясь окончания отката транзакции. Через некоторое время в каталоге, определяемом параметром background_dump_dest, появится трассировочный файл процесса SMON, который будет содержать строку примерно следующего вида:

Это означает, что мёртвая транзакция 0x0006.00a.00000091 была восстановлена процессом SMON. Если же в экземпляре используется параллельное восстановление, то функции отката берёт на себя вновь образующийся от SMON дочерний процесс. Его можно увидеть, если выполнить следующий запрос сразу после уничтожения сеанса:

Выбрано: 1 строка

В данном случае трассировочного файла не образуется, но в журнальном файле Oracle появляется запись вида о попытке параллельного восстановления:

Так как фоновый процесс SMON обладает низким приоритетом обработки, то при большой загрузке он может длительное время откатывать транзакции. Поэтому надо с осторожностью уничтожать такие сеансы.

Уничтожаем серверный процесс

Иногда бывает, что пользовательское приложение завершается аварийно, вместе с ним аварийно завершается и пользовательский процесс. К примеру, отключите сеть, выгрузите приложение, затем снова включите сеть. Для того чтобы уничтожить такие сеансы, Oracle с периодичностью в минутах задаваемой параметром sqlnet.expire_time, который находится в файле sqlnet.ora посылает по всем соединениям пустые пакеты, которые игнорируются работающими пользовательскими процессами. Если физического соединения нет, то Oracle помечает сеанс как убитый и приступает к его уничтожению. В некоторых случаях данный механизм не срабатывает, и возникают так называемые “потерянные сеансы”, то есть сеансы не связанные с пользовательскими процессами. Такие сеансы могут находиться в неопределённом состоянии долгое время. Обычно они легко уничтожаются с помощью команды ALTER SYSTEM KILL SESSION. Но если выполнение команды не приносит результатов, и сеанс продолжает долгое время, находится в статусе KILLED, то придется вмешаться в уничтожение такого сеанса на уровне операционной системы, то есть уничтожить серверный процесс средствами ОС. Операция эта опасная и делать её надо очень аккуратно, чтобы случайно не уничтожить фоновые процессы экземпляра. Для этого желательно всегда запоминать значение идентификатора SPID серверного процесса относящегося к сеансу. Если же значение поля PADDR в представлении v$session уже не соотноситься с адресом в поле ADDR представления v$process , то серверный процесс придется искать приблизительно. В Unix это можно сделать с помощью команды ps , примерно сравнивая время соединения сеанса в поле logon_time представления v$session со временем образования процесса в колонке STARTED результата выполнения команды ps.

В системе Windows сеансы существуют в виде потоков. Поэтому определить такой сеанс будет сложнее. Чтобы облегчить задачу можно выполнить запрос к представлению v$process, который покажет все процессы, у которых значения поля ADDR не соответствует ни одному значению в поле PADDR представления v$session:

Здесь мы видим такой процесс со значением идентификатора процесса в операционной системы SPID равным 652. Попробуем уничтожить данный серверный процесс. В системе Windows это делается с помощью утилиты командной строки orakill:

В Unix с помощью команды kill -9 spid .

Уничтожаем активный сеанс

Сеансы могут быть завершены средствами SQL*Plus используя SQL предложение ALTER SYSTEM KILL SESSION.
Во-первых, идентифицируйте сеанс, который требуется завершить:

Например, для завершения сеанса пользователя TEST1 SQL предложение будет выглядеть так:

В некоторых ситуациях процесс oracle не может быть завершен немедленно. В таких случаях сеанс помечается на прерывание. И будет уничтожен, как только будет возможно.

Предложение ALTER SYSTEM KILL SESSION самый безопасный способ прекращения сеанса Oracle. Если сеанс, помеченный на завершение, не может быть завершен в течение некоторого времени, то он может быть завершен на уровне операционной системы. Завершение на уровне операционной системы может быть опасно, и может привести к неработоспособности экземпляра.
Есть возможность завершить сеанс форсировано, добавлением ключевого слова IMMEDIATE:

Например, для завершения сеанса пользователя TEST1 из вышеприведенного примера, команда будет выглядеть так:

Это позволит избежать использования orakill.exe в Windows, или использование команды kill в *NIX системах.

В операционной системе Windows

Для завершения сеанса в операционной системе Windows, определяем сеанс:

C:> orakill ORACLE_SID spid

Например, для завершения сеанса пользователя TEST1, команда будет выглядеть так:

C:> orakill 43 410

Сеанс будет завершен немедленно, и ресурсы системы будут освобождены для использования другими сеансами.

В операционных системах семейства *NIX

Для завершения сеанса средствами операционной системы семейства *NIX, во-первых, идентифицируйте сеанс, аналогично способу, описанному для Windows, выполнив SQL команду. Далее запоминаем значение SPID сеанса, который требуется завершить, и выполняем команду:

Например, для завершения сеанса пользователя TEST1, команда будет выглядеть так:

Завершенный сеанс будет завершен немедленно и освободит используемые ресурсы.
Если, вы сомневаетесь, то проверить SPID на соответствие PROCESSID в UNIX можно выполнив:

Как удалить - отменить - убить сессию в Oracle

Существует множество способов убить (отменить / удалить) "зависшие" сессии как изнутри Oracle, так и внешними инструментами. Все эти методы мы и обсудим в данной статье.

ALTER SYSTEM KILL SESSION

Ниже приведен базовый синтаксис для отмены (убийства) сеанса:

В среде Oracle RAC вы можете указать INST_ID , выполнив запрос к представлению GV$SESSION . Это позволяет убить сессию на другом узле RAC.

Команда KILL SESSION фактически не убивает сеанс. Он просто просит сеанс убить себя. В некоторых ситуациях, таких как ожидание ответа от удаленной базы данных или откат транзакций, сеанс не будет немедленно убивать себя и будет ждать завершения текущей операции. В этих случаях сеанс будет иметь статус "marked for kill" ("помечен для отмены"). Затем он будет убит как можно скорее.

В дополнение к синтаксису, описанному выше, вы можете добавить предложение IMMEDIATE .

Это не влияет на работу, выполняемую командой, но немедленно возвращает управление обратно в текущий сеанс, а не ждет подтверждения отмены сессии.

Если помеченная для отмены сессия сохраняется в течение некоторого времени, вы можете подумать о том, чтобы убить процесс на уровне операционной системы. Прежде чем делать это, стоит проверить, не выполняет ли она откат в текущее время. Вы можете сделать это, запустив этот скрипт (session_undo.sql). Если значение USED_UREC уменьшается для рассматриваемого сеанса, вы должны оставить его для завершения отката, а не убить сеанс на уровне операционной системы.

ALTER SYSTEM DISCONNECT SESSION

Предложение POST_TRANSACTION ожидает завершения текущих транзакций перед отключением сессии, в то время как предложение IMMEDIATE отключает сеанс, и текущие транзакции немедленно откатываются.

ALTER SYSTEM CANCEL SQL (18c+)

Эта команда означает, что вам не нужно переключаться в операционную систему, чтобы убивать сеансы, что уменьшает вероятность убийства неправильного процесса.

Команда ALTER SYSTEM CANCEL SQL была введена в Oracle Database 18c для отмены инструкции SQL в сеансе, что является альтернативой убийству зависших сессий.

Убийство сессии через Windows

Чтобы убить сессию в операционной системе Windows, сначала определите сеанс, требующий удаления, а затем подставьте соответствующие значения SID и SPID в следующую команду, выполняемую из командной строки.

Сессионный поток должен быть немедленно уничтожен, и все занимаемые им ресурсы будут высвобождены.

Убийство сессии Oracle в UNIX / Linux

Предупреждение! Если вы используете многопоточную модель в Oracle 12c, вы не должны пытаться убивать процессы операционной системы. Чтобы узнать, почему, прочитайте это.

Чтобы убить сессию в операционных системах UNIX или Linux, сначала определите сеанс, требующий отмены, а затем замените соответствующий SPID и выполните следующую команду:

Если через несколько минут процесс не удалится, то завершите сессию, используя следующую команду:

Сессионный поток должен быть немедленно уничтожен, и все ресурсы будут высвобождены.

Если вы сомневаетесь, убедитесь, что SPID соответствует указанному с помощью UNIX PROCESSID. Вывести запущенные процессы сервера Oracle можно следующей командой:

Как определить зависшую сессию?

Принудительное удаление сессий может быть очень разрушительными, если вы убиваете неправильный сеанс, поэтому будьте очень осторожны при определении сеанса, который нужно убить. Если вы убьете сессию, принадлежащую фоновому процессу, вы вызовете сбой экземпляра.

Определите "нашкодившую" сессию, используя представления [G]V$SESSION и [G]V$PROCESS следующим образом:


Описание : в этом руководстве вы узнаете, как использовать SHUTDOWN оператор Oracle для завершения работы Oracle Database.

Используйте SHUTDOWN IMMEDIATE команду для корректного завершения работы Oracle Database:

Введение в SHUTDOWN заявление Oracle

Чтобы выключить работающий в данный момент экземпляр базы данных Oracle, используйте SHUTDOWN следующую команду:

Давайте рассмотрим каждый вариант SHUTDOWN команды.

SHUTDOWN NORMAL

В SHUTDOWN NORMAL опции ждет текущих пользователей , чтобы отключиться от базы данных перед выключением базы данных. Экземпляр базы данных не будет принимать дальнейшие подключения к базе данных. SHUTDOWN NORMAL Не требует восстановления экземпляра на следующей загрузке базы данных.

Использование SHUTDOWN или SHUTDOWN NORMAL не очень практично, потому что вы практически не можете дождаться, когда все пользователи вернутся к своим рабочим столам и отключатся от базы данных.

SHUTDOWN TRANSACTIONAL

В SHUTDOWN TRANSACTIONAL ждет всех незавершенных транзакций для завершения перед выключением экземпляра базы данных. Это экономит работу для всех пользователей, не требуя выхода из системы.

Экземпляр базы данных также не принимает никаких новых транзакций после SHUTDOWN TRANSACTIONAL . По завершении всех транзакций экземпляр базы данных отключает всех подключенных в данный момент пользователей от базы данных и завершает работу.

Дополнительный LOCAL режим ожидает завершения только локальных транзакций, а не всех транзакций. Затем он отключает локальный экземпляр. Эта опция полезна в некоторых случаях, например, при плановом ремонте при отключении.

SHUTDOWN ABORT

Это SHUTDOWN ABORT не рекомендуется и используется только в некоторых случаях. Эффект SHUTDOWN ABORT аналогичен отключению сервера от сети. База данных будет в несогласованном состоянии. Следовательно, вы никогда не должны использовать эту SHUTDOWN ABORT команду перед резервным копированием базы данных. Если вы попытаетесь это сделать, возможно, вы не сможете восстановить резервную копию.

Рекомендуется использовать SHUTDOWN ABORT только тогда, когда вы хотите мгновенно закрыть базу данных. Например, если вы знаете, что отключение питания произойдет через минуту или у вас возникнут проблемы при запуске экземпляра базы данных .

SHUTDOWN ABORT Протекает с максимальной возможной остановкой базы данных. Однако при следующем запуске базы данных требуется восстановление экземпляра.

SHUTDOWN IMMEDIATE

Это SHUTDOWN IMMEDIATE наиболее распространенный и практичный способ выключить базу данных Oracle.

SHUTDOWN IMMEDIATE Не ждет текущих пользователей , чтобы отключиться от базы данных или текущих операций , чтобы закончить.

Во время SHUTDOWN IMMEDIATE этого все подключенные сеансы немедленно отключаются, все незафиксированные транзакции откатываются, а база данных полностью отключается.

После выдачи SHUTDOWN IMMEDIATE заявления база данных не будет принимать никаких новых соединений. Заявление также закроет и отключит базу данных.

В отличие от SHUTDOWN ABORT варианта, этот SHUTDOWN IMMEDIATE вариант не требует восстановления экземпляра при следующем запуске базы данных.

В следующей таблице показаны различия между режимами выключения:

Режимы выключенияAbortImmediateNormalTRANSACTIONAL
Разрешить новое подключениенетнетнетнет
Дождитесь завершения всех текущих сеансовнетнетданет
Дождитесь завершения всех текущих транзакцийнетнетдада
Установить контрольную точку и закрыть файлы
нетдадада

Заметки

Чтобы оформить SHUTDOWN выключение, необходимо подключиться к базе данных , как SYSDBA , SYSOPER , SYSBACKUP , или SYSDG . Если текущая база данных является подключаемой базой данных, SHUTDOWN оператор закроет только подключаемую базу данных. Консолидированный экземпляр продолжит работу. С другой стороны, если текущая база данных является CDB, SHUTDOWN оператор закроет экземпляр CDB.

Читайте также: