2016-10-10 4 views
0

Я сделал ALTER TABLE DISABLE TABLE LOCK на одной из наших таблиц, и теперь я не могу включить блокировку таблицы. Когда я выполнение этой таблицы:Oracle - ALTER TABLE ENABLE TABLE LOCK

ALTER TABLE x ENABLE TABLE LOCK; 

Я получаю:

SQL Error: ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired

Я проверил, что есть блокировка сеанс от другого пользователя, но он убил свою сессию и теперь я до сих пор могу» t включить блокировку таблицы. Существует новый сеанс блокировки, похожий на какой-то системный сеанс (OSUSER = SYSTEM, PROGRAM = ORACLE.EXE (DIA0), TYPE = BACKGROUND).

Не могли бы вы помочь мне с этой блокировкой блокировки стола?

Редактировать: После перезапуска базы данных мы смогли включить блокировку таблицы.

+0

Это диагностический процесс: https://docs.oracle.com/cloud/latest/db112/REFRN/bgprocesses.htm#REFRN104 –

+0

Другие убили сеанса пользователя, но если сеанс обновления или вставки откат выполняется. – Kacper

+0

Попробуйте 'ALTER SESSION SET DDL_LOCK_TIMEOUT = 600;' перед тем, как попытаться заблокировать таблицу. Oracle будет ждать до 10 минут, пока вы не получите эту ошибку, когда другие сессии могут закончить работу. –

ответ

0

Выполнить этот запрос для определения сеансов, которые блокирующие ваш объект:

select 
    c.owner, 
    c.object_name, 
    c.object_type, 
    b.sid, 
    b.serial#, 
    b.status, 
    b.osuser, 
    b.machine 
from 
    v$locked_object a , 
    v$session b, 
    dba_objects c 
where 
    b.sid = a.session_id 
and 
    a.object_id = c.object_id; 

С результатами этого запроса вы можете запустить ALTER SYSTEM KILL SESSION 'sid,serial#';, который должен очистить замки, и вы можете повторить попытку получения блокировки.

Если у вас есть процесс, который повторно запускается и получает блокировку до вашего сеанса, вы можете написать цикл while, который проверяет, можно ли заблокировать блокировку, поймав ошибку ORA-00054 и повторите попытку до блокировки могут быть размещены с помощью LOCK TABLE x IN EXCLUSIVE MODE NOWAIT;

+0

Моя таблица не существует в v $ locked_object. Я вижу только BLOCKING_SESSION в сеансе v $, когда я пытаюсь включить блокировку таблицы. После блокировки сеанса я все равно не могу включить блокировку, потому что всегда следующий сеанс блокирует мой сеанс. –

+0

Быстрое обходное решение состоит в том, чтобы запустить CTAS: 'CREATE TABLE new_table AS (SELECT * FROM old_table);' и изменить новую созданную таблицу, а затем отбросить old_table и переименовать вновь созданный [oracle doc about table reame] (https://docs.oracle.com/javadb/10.8.3.0/ref/rrefsqljrenametablestatement.html) – Sebz

+0

Еще одна идея может заключаться в том, что у вас что-то застряло в текущем сеансе, и вы должны попробовать запустить его снова с новой чистой сессии , – Sebz