2017-07-17 9 views
1

回避ORA-00054列を変更するときにNOT NULL、私は重い使用されるテーブルの上に既存の列に「NULLでない」を変更する場合は、次のまたはその他のエラーメッセージを回避したいと思い

SQL Error: ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired 
00054. 00000 - "resource busy and acquire with NOWAIT specified or timeout expired" 
*Cause: Interested resource is busy. 
*Action: Retry if necessary or increase timeout. 

のMy Oracleをバージョンは次のとおりです。Oracle Database 12c Enterprise Editionリリース12.1.0.2.0 - 64bit Production。次のように排他ロックで試しましたが、まだエラーが出ます。私は他のセッションでいくつかのDMLを行うことによって、重いテーブルをシミュレートしました。

セッション1

create table iei1731 (
    col1 varchar2(1 char), 
    col2 number(1,0) 
); 
insert into iei1731 (col1, col2) values ('1', 0); 
commit; 
update iei1731 set col1 = col1 where col1 = '1'; 

セッション2

lock table iei1731 in exclusive mode; 

セッション1

rollback; -- now session 2 gets the exclusive lock on the table 
update iei1731 set col1 = col1 where col1 = '1'; 

セッション2

alter table iei1731 modify col2 not null; -- here I get the ORA-00054 

セッション1(クリーンアップ)

rollback; 
drop table iei1731; 

すべてのエラーメッセージなしでnullではないにこの重い使用されるテーブルに列を設定するための任意の可能性が存在するのであれば、私の質問は?

+0

を多分これはhttp://dba.stackexchange.comに、より良いフィット感ですか! –

答えて

1

使用DDL_LOCK_TIMEOUTロックのセッション待ちました:

--Wait up to 10 minutes to acquire the lock. 
alter session set DDL_LOCK_TIMEOUT=600; 
alter table iei1731 modify col2 not null; 
0

排他的にロックされている場合 - いいえ - ロックは最初に解放する必要があります。

また、null以外の変更を行うとメタデータが変更されるため、このオブジェクトに大量のアクセスが発生した場合は、可能な「行キャッシュ」ロックを作成し、行キャッシュロックにより、 nullではありません。これは、忙しい生産環境で厄介な雪の球を引き起こす可能性があります。ダウンタイムやビジー時間の少ない間にメタデータを変更する方がよいでしょう。

+0

しかし排他ロックを保持するのはセッション2です。そして、セッション2は、列をヌルに設定し、エラーを取得します。また、排他ロック文を削除すると、ORA-00054が取得されます。 – Max

関連する問題