저도 전에 이 주제에 대해 쓴 적이 있습니다오라클11g 신규 특집 기사, 지금오라클11G가 주류가 되었습니다오라클데이터베이스 버전, 이해 및 학습오라클11G의 새로운 기능들이 매우 중요하고, 저도 마찬가지입니다오라클11G의 새로운 기능을 처음 접하는 분들을 위해 제 학습 과정과 경험을 여기서 공유하고자 합니다.
이 글은 주로 다음을 기록하고 있습니다:오라클DDL 잠금장치가 DML 잠금을 기다릴 수 있게 하는 11g의 새로운 기능은 6월 30일 ACOUG 행사에서 장 레이(카무스) 씨가 공유한 주제이기도 합니다.
11g 이전 버전에서는 기본적으로 DDL 락이 DML 락을 기다리지 않으며, DML 락이 있는 테이블에 DDL 작업을 수행하면 즉시 실패를 반환합니다(같은 SESSION을 제외하고). 간단한 실험을 해봅시다. SESSION1 테이블 STREAM에 데이터를 삽입하고 제출하지 마세요. 이 시점에 테이블 STREAM에 DML 락이 걸려 있으며, SESSION2에서 TRUNCATE 테이블 STREAM 연산을 실행하면 즉시 실패를 반환합니다:
SESSION1 >스트림 셀렉트에 삽입 * dbdream에서; 10행 생성. SESSION2 >테이블 스트림을 절단; 테이블 스트림 절단 * 1행 오류: ORA-00054: 자원 사용 중이며, NOWAIT가 지정되어 있거나 버전 11g에서 타임아웃이 만료됨,오라클DDL 락이 DML 잠금을 기다릴 수 있도록 하는 매개변수DDL_LOCK_TIMEOUT 도입되었으며, 이 잠금장치는 DDL 잠금이 DML 잠금을 기다리는 시간을 제어합니다. 초는 0입니다. 즉, DDL 잠금은 DML 잠금을 기다리지 않습니다. 최대 값은 1백만 일, 즉 11.5일입니다. 이 매개변수는 전역적으로 또는 세션 수준에서 설정할 수 있습니다.
SESSION2 >SHOW parameter ddl_lock_timeout NAME TYPE VALUE ----------------------- ----------- ------ ddl_lock_timeout 정수 0 SESSION2 >ALTER 세션 세트 ddl_lock_timeout=2000000; 오류: ORA-00068: 매개변수 ddl_lock_timeout에 대해 잘못된 값 2000000, 0에서 1000000 사이여야 합니다. 다음은 다음 DDL_LOCK_TIMEOUT 매개변수의 효과를 보여주며, 위 STREAM 테이블을 예로 들 때, 현재 STREAM 테이블은 여전히 DML 잠금이 있으며, SESSION2에서는 DDL_LOCK_ TIMEOUT은 60초로 설정된 후 TRUNCATE 작업이 실행되며, 실패는 즉시 반환되지 않고 60초간 기다립니다. STREAM 테이블의 DL 락이 60초 이내에 해제되지 않으면 실패를 반환합니다.
SESSION2 >alter session set ddl_lock_timeout=60; 세션 변경. SESSION2 >SESSION2 >트런케이트 테이블 스트림에 타이밍을 설정; --이 시점에서 SESSION2가 일시 중지, SESSION1가 60초 이내에 DML 락을 해제할 때까지 기다립니다. 60초 후 반환 실패, 테이블 스트림 절단 * 1행 오류: ORA-00054: 자원 사용 중이며, NOWAIT 지정이나 타임아웃 만료로 획득 완료: 경과: 00:01:00.01 DDL_LOCK_TIMEOUT 매개변수의 등장은 DBA 작업을 크게 단순화합니다. 예를 들어, 테이블에 필드를 추가하고 싶지만, 이 테이블에는 DML 작업이 많아 ALTER SYSTEM KILL SESSION 메서드를 사용해 이 작업을 종료할 수 없습니다. 따라서 필드를 추가하려면 필드를 수없이 추가하거나 스크립트를 작성해야 하며, 이제 DDL_ LOCK_TIMEOUT 매개변수는 값을 약간 더 크게 설정하면 되며, SQL 실행에 신경 쓸 필요가 없습니다. 아래에서 이 과정을 시연해 보겠습니다.
SESSION2 필드를 추가하기:
SESSION2 >alter table stream add jpg_path varchar2(255) default '/home/오라클/'; 此时挂起,等待STREAM表的DML锁释放,SESSION1提交释放DML锁后,SESSION2操作便成功了。
SESSION1 >커밋; 커밋 완료. SESSION2 >alter table stream add jpg_path varchar2(255) default '/home/오라클/'; Table altered. SESSION2 >select * from stream; ID IDENTIFIER PIC_NO JPG_PATH ---------- --------------- ------ --------------- 1 18-0220-003 1 /home/오라클/ 2 18-0221-003 1 /home/오라클/ 3 18-0221-003 2 /home/오라클/ 4 18-0221-003 3 /home/오라클/ 5 18-0223-005 1 /home/오라클/ 6 18-0223-005 2 /home/오라클/ 7 18-0223-005 3 /home/오라클/ 8 18-0223-005 4 /home/오라클/ 9 18-0223-005 5 /home/오라클/ 10 18-0223-005 6 /home/오라클/ 10 rows selected.
|