Search Results for 'lock'


1 POSTS

  1. 2011/01/17 Oracle Lock 유형 by clubkona

Oracle Lock 유형

LOCK의 유형
   데이타의 concurrency를 보장하기 위해 오라클은 lock과 transaction을 사용한다.
   Lock은 같은 자원을 access하는 사용자들 사이에 상호간에 해를 끼치는 것을 예방하기
   위해서 사용되는 메카니즘이다.
   Lock의 종류
      - Exclusive : lock이 걸린 자원의 공유를 허용하지 않는다.
      - Share : 자원에 대해 수행되는 명령의 유형에 따라 lock된 자원의 공유되는 것을
                허용한다.
   오라클에서의 Lock의 일반적인 범주
      - Data or DML (row locks TX and table locks TM) : 동시에 다중의 사용자에 의해
        access되는 테이블 데이타의 보호를 위해 사용된다.
      - Dictionary or DDL(TD) : 트랜잭션에서 access되는 테이블과 같은 Object의 정의를
        보호하기 위해서 사용한다.
      - Internal and Latches (RT, MR) : SGA 영역에서의 내부적인 데이타베이스와 메모리
        구조를 보호하기 위해 사용한다.
   1. TABLE LOCKS
      테이블의 특정한 row를 수정하는 문장은 항상 그러한 row에 대해 exclusive row lock
      을 획득하고 테이블 lock을 전유한다.
      (1) Row Share Table Locks (RS)
          - row를 lock 시키고 lock된 테이블을 UPDATE 할 목적이다.
          - 모든 row를 SELECT 하려는 다른 트랜잭션을 허용한다.
          - 동일 테이블에서 lock 되지 않은 row를 INSERT, UPDATE, DELETE 하는 다른
            트랜잭션을 허용한다.
          - 테이블에 대한 ROW SHARE, ROW EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE lock
            을 획득하려는 다른 트랜잭션을 허용한다.
          - EXCLUSIVE 모드에서의 테이블 locking으로부터 다른 트랜잭션을 예방한다.
      (2) Row Exclusive Table Locks (RX)
          - row를 lock 시키고 테이블에서 row를 변화시킨다.
          - 모든 row를 SELECT 하려는 다른 트랜잭션을 허용한다.
          - 동일 테이블에서 lock 되지 않은 row를 INSERT, UPDATE, DELETE 하는 다른
            트랜잭션을 허용한다.
          - 테이블에 대한 ROW SHARE, ROW EXCLUSIVE lock을 획득하려는 다른 트랜잭션을
            허용한다.
          - SHARE, EXCLUSIVE, SHARE ROW EXCLUSIVE 모드에서의 테이블 locking으로부터
            다른 트랜잭션을 예방한다.
      (3) Share Table Locks (S)
          - 다른 트랜잭션을 제공하지 않는 테이블에서 row를 INSERT, UPDATE, DELETE
            하는 것이 SHARE lock을 홀딩한다.
          - 동일 테이블에서 지정된 row를 QUERY 또는 LOCK 하려는 다른 트랜잭션을
            허용한다.
          - 테이블에 대해 더 나아가 SHARE lock을 얻으려는 다른 트랜잭션을 허용한다.
          - EXCLUSIVE 또는 SHARE ROW EXCLUSIVE 모드로 테이블을 locking 하는 것으로
            부터 다른 트랜잭션을 보호한다.
      (4) Share Row Exclusive Table Locks (SRX)
          - 테이블에 row를 INSERT, UPDATE, DELETE 한다.
          - 동일 테이블에서 지정된 row를 QUERY 또는 LOCK 하려는 다른 트랜잭션을
            허용한다.
          - SHARE, EXCLUSIVE 또는 SHARE ROW EXCLUSIVE 모드로 테이블을 locking 하는 것으로
            부터 다른 트랜잭션을 보호한다.
      (5) Exclusive Table Locks (S)
          - 테이블에 row를 INSERT, UPDATE, DELETE 한다.
          - 동일 테이블에서 지정된 row를 QUERY하는 것에 대해서만 다른 트랜잭션을
            허용한다.
          - 어떠한 lock 문장을 내리는 것으로부터 다른 트랜잭션을 보호한다.
   2. DICTIONARY LOCKS
      Dictionary lock은 Object에 대한 DDL 명령이 수행되는 동안 Object의 정의를
      보호한다.
   3. INTERNAL LOCKS 과 LATCHES
      Latches 와 Internal lock은 메모리 구조를 보호하기 위한 메카니즘이다.
      - Latches 는 SGA 영역에 있는 shared data structure를 보호하기 위한 low-level
        연속 메카니즘이다.
      - Internallock은 data dictionary entry를 보호하고 database file, tablespace,
        rollback segment를 lock한다.
      Latches 와 Internal locks는 데이타베이스 사용자에 의해 컨트롤 될 수 없다.

LOCK에 대한 모니터
   lock contention 과 병목현상은 시스템의 효능을 저하시킨다.
   1. 모니터 방법
      (1) SQL*DBA 모니터 lock display
      (2) V$LOCK view
      (3) utllockt.sql 이라는 스크립트 화일의 내용을 확인
          (lock이 된 자원을 기다리는 사용자가 있는지를 보여줌)
   2. SQL*DBA lock monitor 를 사용한 모니터 방법
      Lock 모니터의 Resource ID 1 필드는 DBA_OBJECTS 에서의 object_id 이다.
      Lock 모니터의 특정한 Resource ID 1 과 일치하는 테이블명을 찾기 위해서는
      다음 Query를 사용한다.
      SQL> SELECT owner, object_id, object_name, object_type
           FROM dba_objects
           WHERE object_id = resource id #;
      ▶ LOCK monitor의 컬럼들
      Username : 연결된 사용자의 명
      Session ID : 사용자 연결을 식별하기 위해 오라클에서 제공되는 ID
      Serial Number : 세션의 시리얼 번호로 각각의 세션을 유일한 번호로 지정하기 위해
         Session ID를 함께 사용한다.
      Lock Type : TM은 데이타 조작에 대해 dictionary lock을 표시한다.
                  Resource ID 1 필드는 lock이 걸린 테이블의 ID이다.
                  테이블명을 찾아보려면 DBA_OBJECTS 쿼리를 사용한다.
                  TM lock은 트랜잭션 lock이다.
                  지시하는 row는 lock이 걸리거나 lock 되기 위해 요청된다.
      Resource ID 1 : TM 형태의 lock에 대해 DBA_OBJECTS view로 찾은 테이블 ID를
         보여준다. 다른 값은 무시될 수 있다.
      Resource ID 2 : 내부적으로 lock의 형태를 식별하기 위해 사용한다.
      Mode Held : 자원을 쥐고 있는 lock의 모드를 나타낸다.
      Mode Requested : 자원에게 요청된 lock의 모드를 나타낸다.

CONTEXT SIZE & CURSORS
   1. Context size 에 관련한 error message
      .ora-1046 :can't acquire space to extend context area.
      .ora-1050 :can't acquire space to open context area.
      .ora-1051 :maximum context area extents exceeded.

   2. Context size란 무엇인가?
      (1) Cursor의 initial size이다 . 즉, Cursor 에 allocate 되는 user memory이다.
      (2) 이는 init.ora 의 CONTEXT_SIZE 에 의해 결정된다.
      (3) Cursor 에 할당되는 additional space 는 CONTEXT_INCR 에 의하며 50 extents를
          갖는다.
      (4) Recommended context size increment 는 4096 bytes(4K)이다.
      (5) SQL statement가 수행시마다 cursor 가 open 되며, 같은 cursor가 reuse 되도록
          design 되어 SQL*PLUS session은 2-3 개 이상 open 되어지지 않는다.
          그러나 SQL*FORMS 는 여러 다른 task 를 수행하므로 많은 cursor를 open한다.
          (100 or more)
      (6)Cursor 가 hold 하는 item
         * the SQL statement
         * the parsed SQL statement
         * one row of the result

   3. ORA-1051 은 무엇이 문제인가?
      (1) cursor 의 size 를 줄인다.
      (2) CONTEXT_SIZE,CONTEXT_INCR 를 늘린다.

   4.  OPEN_CURSORS 수를 줄이는 전략
      (1) Commit을 자주한다.
      (2) Synonym이나 view 를 사용하지 않음으로써 implicit cursor 수를 줄인다.
      (3)SQL*FORMS 에서 select 문대신 #COPY 로 바꿔 사용한다.
      (4)SQL*FORMS 에서 large forms를 여러개의 작은 forms 로 나눈다.
      (5)ASAP, EXEC  SQL CLOSE C1; 을 수행한다.
      (6)HOLD_CURSOR=NO  & RELEASE_CURSOR=YES 를 사용한다.

DB_FILE_MULTIBLOCK_READ_COUNT와 퍼포먼스
   db_file_multiblock_read_count  파라미터는 한번의 I/O 작업으로 읽어들이는
   최대 블럭 수를 가리키며 Multi Block I/O 에 관련된 파라미터이다. 디폴트 값은
   O/S에 따라서 다른데 보통 db_block_buffers와 Processes에 의해서 결정되며 4~32
   정도가 많이 사용된다.
   이 값을 키우고 SORT/MERGE를 이용하는 것이 Nested Loop를 이용하는 경우 보다
   퍼포먼스가 증가하는가 하는 문제는 Query의 종류와 읽어들이는 데이타의 양
   (전체에 대한 Percentage)에  따라서 달라지게 된다.

   즉, 이 값이 크면 한번의 I/O로 여러개의 블럭을 읽어오므로 Full Table Scan시
   에는 퍼포먼스가 증가한다.
   하지만 특정 블럭만이 필요한 경우에 불필요한 블럭까지 함께 읽어들이므로
   디스크를 읽는 시간이 증가할 뿐 아니라 크기가 한정된  Buffer Pool을 많이 차지해
   함으로써 자주 쓰이는 데이타를 밀어내어 오히려 Cache의 효율을 떨어뜨리는 결과를
   가져올 수도 있으므로 작업특성에 따라서 적절한 값을 세팅하여야 한다.

   오라클의 Optimizer는 이 값이 크면 작업의 효율성을 위해서 Full Table Scan을
   선택할  가능성이 커지게 된다.

CONNET INTERNAL에 대해서 PASSWORD 설정
   connect internal 시에 password 를 입력하도록 하려면 다음과 같이 하면 된다.
   DB Extender와 같은 Client Tool을 이용하여 서버에 접속하는 경우에도
   마찬가지로 적용된다.

   1. orapwd를 이용해서 password file을 만들어 준다.

      orapwd file=orapwORA7 password=manager entries=1

      이 화일은 $ORACLE_HOME/dbs 디렉토리에 만들어 주며 ORACLE SID가 ORA7인경우
      화일 이름은 orapwORA7 으로 해준다.

   2. initORA7.ora 화일에서 다음을 추가한다.

      remote_login_passwordfile=exclusive

      compatible=7.1 또는 compatible=7.2

      이렇게만 해 주면 connect internal 시의 password가 manager로 세팅된다.

      DB Extender에서 접속할 때 ORA-9910 에러가 발생하는 경우도 똑같이 이 방법대로
      password file을 만들어 주면 된다.
      이 경우에는 initORA7.ora 화일에 remote-login_passwordfile을 세팅할 필요는 없고
      compatible 만 세팅하고 password file을 만들어 주면 된다.

Posted by clubkona

2011/01/17 16:35 2011/01/17 16:35
,
Response
No Trackback , No Comment
RSS :
http://clubkona.hosting.paran.com/rss/response/288


블로그 이미지

- clubkona

Notices

Archives

Authors

  1. clubkona

Calendar

«   2012/05   »
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    

Site Stats

Total hits:
474086
Today:
35
Yesterday:
1