Oracle как просматривать блокировки

Обновлено: 21.11.2024

Иногда вы получаете сообщение об ошибке: «Запись не может быть зарезервирована для обновления. Она уже зарезервирована другим пользователем» или «Не удалось зарезервировать запись (2 попытки). Продолжай пытаться?» При запросе/обновлении заказа на покупку/заказ на продажу/любого другого экрана транзакции/настройки в пользовательских приложениях, связанных с Oracle EBS или Oracle DB.

Обычно вы получаете это сообщение, когда второй пользователь пытается открыть/обновить ту же транзакцию, когда другой пользователь уже открыл/обновил транзакцию, но еще не сохранил измененное и закрыл экран. Иногда user1 открывает транзакцию и оставляет сеанс без каких-либо действий с этой транзакцией. Когда второй пользователь пытается открыть ту же транзакцию, второй пользователь также получает эту ошибку.

Техническая причина: как только пользователь открыл транзакцию и внес некоторые изменения, запись будет заблокирована на уровне базы данных (блокировка на уровне строк). Пока блокировка не будет снята в базе данных, ни один другой пользователь не сможет вносить изменения в эту запись. Иногда блокировки базы данных снимаются автоматически через некоторое время. Чтобы разблокировать блокировки в экстренных ситуациях, мы можем связаться с командой dba, чтобы узнать, кто открыл транзакцию, и снять блокировки.

DBA проверит блокировки объекта(ов), а затем завершит неактивный сеанс, чтобы снять блокировку(и).

Блокировки можно узнать с помощью приведенных ниже операторов Select, если объект имеет какие-либо блокировки сеанса. Это такие объекты, как заказы на покупку (PO_HEADERS_ALL, PO_LINES_ALL, PO_LINE_LOCATIONS_ALL, PO_DISTRIBUTIONS_ALL), заказы на продажу (OE_ORDER_HEADERS_ALL, OE_ORDER_LINES_ALL, OE_PRICE_ADJUSTMENTS_ALL) и т. д.,

например, ALTER SYSTEM KILL SESSION ‘1141,417’;

После снятия блокировки сеанса запись может быть открыта и обновлена ​​другим пользователем.

Снятие блокировок с пакетов баз данных:

Следующий оператор SELECT помогает узнать блокировку пакетов базы данных.

SELECT * FROM DBA_DDL_LOCKS WHERE имя типа «PO_MOAC_UTILS_PVT%»

SELECT * FROM V$ACCESS WHERE OBJECT=’PO_MOAC_UTILS_PVT’

Сначала необходимо понять и проанализировать риски, связанные с завершением сеанса, прежде чем выполнять команду ALTER SYSTEM Kill Session. Вы потеряете все несохраненные изменения и удалите соответствующих пользователей сеанса из приложений.

Открыл сеанс 2 со Скоттом/тигером и:
обновил emp set ename='xx' where empno=7499;
> Этот сеанс заблокирован выше.

Сессия 3 открыта с sys/pw как sysdba и: HTH
Гириш Шарма

Ответы

HTH
Гириш Шарма

Вы можете проверить таблицу v$lock на предмет блокировки объектов. Следующий запрос может помочь вам найти сеанс блокировки.

SQL> выберите * из v$lock, где блок > 0;

Надеюсь, это поможет.

Используйте этот запрос для поиска замков. С уважением,
Сатиш

Вы можете узнать, используя приведенный ниже запрос.
С уважением,
Виджаярагхаван К

Привет,
Существуют различные типы блокировок. Когда я получаю доступ к запросу, я буду использовать 3 таблицы, так как я должен знать, что блокировка есть на любой из таблиц. Нужно ли мне проверять одну за другой или есть другие?

Мне известен запрос для поиска блокировок в базе данных. Я хочу знать об определенных объектах или запросах?

настроить serveroutput на
НАЧАЛО
dbms_output.enable(1000000);
для do_loop in (выберите session_id, a.object_id, xidsqn, oracle_username, b.owner owner,
b.object_name object_name, b.object_type object_type
FROM v$locked_object a, dba_objects b < br />WHERE xidsqn != 0
и b.object_id = a.object_id)
loop
dbms_output.put_line('.');
dbms_output.put_line('Блокировка сеанса: '||do_loop.session_id);
dbms_output.put_line('Объект (Владелец/Имя): '||do_loop.owner||'.'||do_loop.object_name);
dbms_output.put_line('Тип объекта: '||do_loop.object_type);
для next_loop in (выберите sid из v$lock,
где id2 = do_loop.xidsqn
и sid != do_loop.session_id)
LOOP
dbms_output.put_line(' Сеансы заблокированы: '||next_loop.sid);
конец цикла;
конец цикла;
КОНЕЦ;
/

Блокирующий сеанс: 10
Объект (владелец/имя): SCOTT.EMP
Тип объекта: TABLE
Блокируемые сеансы: 11

Процедура PL/SQL успешно завершена.

HTH
Гириш Шарма

Привет, Гириш,
Моя база данных stage не отображает никаких результатов. Я хочу проверить это в моей локальной базе данных. Как создать ситуацию, когда должна произойти блокировка пользователя scott для таблиц emp,dept.

У меня все работает нормально. См. ниже:

Открыл сеанс 1 со Скоттом/тигером и:
обновил emp set ename='xx', где empno=7499;

Открыл сеанс 2 со Скоттом/тигером и:
обновил emp set ename='xx' where empno=7499;
> Этот сеанс заблокирован выше.

Я объясню, как найти заблокированные объекты Oracle | Удалите блокировку таблицы в Oracle в этом сообщении.

Заблокированные объекты Oracle

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

Удалить блокировку таблицы в Oracle

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

Администратору базы данных Oracle (администратору базы данных) нужны полезные сценарии для мониторинга, анализа и проверки базы данных Oracle на предмет рутинных операций с базой данных и мониторинга.

Найти заблокированные сеансы в Oracle

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

Вы можете найти мгновенную блокировку сеанса и заблокировать его с помощью приведенных ниже сценариев.

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

Изменить сеанс уничтожения системы

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

Завершить заблокированный сеанс

Иногда разработчики приложений или клиент предлагают вам закрыть любой сеанс или группу сеансов, таких как SQL Net Client, сеансы клиента JDBC или сеансы RMAN.

Клиент предлагает вам закрыть группу сеансов, такую ​​как SQL Net Client, сеансы клиента JDBC или сеансы RMAN. Вы можете создать сценарий сеанса уничтожения, как показано ниже. Вы можете изменить событие, чтобы закрыть любые другие сеансы группы событий.

Иногда у вас есть только SQL_ID, и вам нужно найти сеансы, связанные с этим SQL_ID, тогда вы можете найти, как показано ниже, и вы можете создать сценарий уничтожения, как показано ниже.

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

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

Скрипт завершения сеанса

Возможно, вы захотите закрыть некоторые сеансы пользователей, которые все еще выполняются более 300 секунд, тогда вы можете использовать следующий полезный скрипт Oracle DBA.

Возможно, вы захотите завершить сеансы некоторых пользователей, которые все еще выполняются более 720 секунд и без пользователя SYS и типа пользователя (не фоновые сеансы), тогда вы можете использовать следующий полезный скрипт Oracle DBA.

Вы можете получить доступ ко вторым сценариям Oracle DBA, связанным с Dataguard, по следующей ссылке.
Если вы хотите подробно изучить настройку производительности базы данных Oracle, щелкните эту ссылку.

1212 просмотров в прошлом месяце, 1 просмотр сегодня

О Мехмете Салихе Деведжи

Я являюсь основателем SysDBASoft IT and IT Tutorial и сертифицированным экспертом по базам данных Oracle и SQL Server, Goldengate, Exadata Machine, администратором Oracle Database Appliance с более чем 10-летним опытом работы. У меня есть сертификаты экспертов OCA, OCP, OCE RAC. Я работал. Более 100 банковских, страховых, финансовых, телекоммуникационных и т. д. клиентов в качестве консультанта, Insource или Outsource. Я выполнил более 200 операций в этих клиентах, таких как установка Exadata, PoC, миграция и обновление, обновление базы данных Oracle и SQL Server, Oracle RAC Установка, установка SQL Server AlwaysOn, миграция базы данных, аварийное восстановление, восстановление резервной копии, настройка производительности, периодические проверки работоспособности. Я выполнил более 2000 репликаций таблиц с помощью Goldengate или инструмента репликации SQL Server для баз данных DWH во многих клиентах. Если вам нужен Oracle DBA, SQL Администратор баз данных серверов, администратор баз данных приложений, Exadata, Goldengate, консультации и обучение EBS, вы можете отправить мой адрес электронной почты [email protected] .- - Oracle DBA, администратор баз данных SQL Server, администратор баз данных приложений, Exadata, Goldengate, EBS и linux Danışmanl ık ve Eğitim için [email protected] a mail atabilirsiniz.

2 комментария

Если у нас есть три таблицы с именами оракула a, b, c, поэтому мы хотим выбрать необычные данные таблицы a, как написать запрос?

Я не мог четко понять ваш вопрос. Вы имеете в виду для заблокированных объектов для этого предложения (выберите необычные данные таблицы)?

В своих предыдущих статьях я привел очень много полезных сценариев SQL из реальной жизни. В этой статье я хотел бы дать ответ на очень распространенный вопрос: как снять блокировку таблицы оракула? с примерами. БД очень часто получает запрос на снятие блокировки таблицы оракула.

Как снять блокировку таблицы оракула? Шаг за шагом

Блокировка таблицы — очень часто используемая концепция в базе данных Oracle, где нам требуется использовать системные представления и, в частности, представление v$lock.Когда один пользователь использует указанную таблицу, и в то же время другой пользователь хочет работать с той же таблицей, он может получить сообщение об ошибке, поскольку таблица заблокирована, или иногда какое-то обновление занимает слишком много времени, и возникает взаимоблокировка, и система оракула блокирует таблицу. . В это время администратор базы данных должен действовать и снять блокировку, уничтожив сеансы, удерживающие блокировку.

Запрос 1: проверить блокировки Oracle

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

Первый шаг — узнать sid, серийный номер и процесс блокировки таблицы или объекта. Стандартный запрос для проверки этого процесса,

Синтаксис:

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

Если у вас нет привилегии dba_objects, вам нужно использовать объект GV$locked.

Запрос 2: вы можете узнать, как удерживает замок

Запрос для поиска информации о процессе:

Приведенный ниже запрос предоставит данные процесса, который блокирует объект,

Запрос 3. Чтобы проверить и узнать блокирующие блокировки в базе данных

Вам необходимо выяснить блокирующие блокировки в базе данных Oracle.

Вы можете просто использовать следующий запрос для получения SID,

выберите
session_id
из
dba_dml_locks
где
name = ‘TABLE_NAME’;

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

выбрать

(выбрать имя пользователя из v$session, где sid=a.sid) blocker_Session,

p.sid, 'блокирует',

(выберите имя пользователя из v$session, где sid=b.sid) blockee_session,

q.sid из

v$lock p, v$lock q, где

p.block = 1 и q.request > 0

и p.id1 = q.id1

и p.id2 = q.id2;

Запрос 4. Что такое запрос для определения сеанса блокировки и времени блокировки.

Запрос:

выбрать P.inst_id,P.sid, ' SID_Of_Blocking_Session ', Q.sid,P.type,Q.type,P.lmode,Q.lmode,Q.inst_id

из gv$lock P,

gv$lock Q

где P.block =1 и Q.request > 0

и P.id1=Q.id1 и P.id2=Q.id2;

Запрос 5. Как получить подробную информацию о RAC?

Запрос:

Сценарий блокировки сеанса и его уничтожения:

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

Шаг 1. Узнайте идентификатор сеанса запроса

Запрос:

выберите
session_id в качестве «ID сеанса»
из
dba_dml_locks
где
имя = «Сотрудник»;

Шаг 2. Найдите серийный номер, используя следующий запрос

Шаг 3. Использование оператора Alter для закрытия сеанса

изменить сеанс уничтожения системы ‘445,445434’;

Приведенный выше запрос используется для завершения сеансов. Это правильный способ Как снять блокировки Oracle? Если вам понравилась эта статья или у вас есть какие-либо сомнения по поводу того же, пожалуйста, оставьте комментарий в разделе комментариев.

Некоторые важные вопросы, которые следует запомнить:

Чтобы найти SQL_ID из SID:

выберите sql_id из v$session, где sid=&sid;

Чтобы найти SQL-запрос с помощью SQL_ID:

выберите sql_fulltext из gv$sql, где sql_id =”&SLQ_ID”;

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