Database/ORACLE

4일차 - 9장. 데이터 동시성 관리

99iberty 2013. 12. 5. 10:20

sysdba로 접속

select username,account_status
from dba_users;

alter user scott
identified by scott
account unlock;


하면 sqlplus scott/scott 으로 접속 가능해짐.

 

 

동일한 사용자로 동일한 데이터를 둘이서 두 세션 다르게 조작을 하려고 한다.

1번이 먼저 조작했다. commit은 안 날리고,

1번이 조작하는 데이터에 대해서 과거의 데이터를 2번이 조작하려고 하면

오라클은 프롬프트가 안 뜬다. (graphical한 환경에서는 모래시계가 뜨면서 안 끝남.)

1번의 트랜잭션이 끝날때까지.

조작이 일어나는 row에 lock을 건다.

테이블이나 블럭이 아니라.

 

--1번 사용자

SQL> update dept
  2  set dname='IT'
  3  where deptno=10;

1 row updated.

--2번 사용자

SQL> update dept
  2  set dname='IT'
  3  where deptno=10;

 

1번이 rollback; 해 버리면 트랜잭션 끝나서 2번의 프롬프트도 끝남.

 

 

 

테이블에 LOCK을 거는 경우 -> 다른 사용자가  어떤 테이블을 조작할 때

해당 테이블 drop 못하게 LOCK.

 

 

 

데드락 발생하면 이렇게 오라클이 에러 해줌.

ERROR at line 1:
ORA-00060: deadlock detected while waiting for resource

유저가 데드락 상황을 유도했던 문장 하나를 실패시킴.

트랜잭션을 실패시키는 게 아니라.

1번 사람 순서

10번 바꾸고 20번 바꾸고

2번 사람 순서

20번 바꾸고 10번 바꾸고

 

2번이 10번을 1번의 20번보다 나중에 쳤다..

처음에 친 애만 deadlock 이 떨어지네.

1번이 롤백을 하든가 커밋을 하든가 해야함..

 

-> 데드락 발생하고 1번 사람이 SELECT 를 했을 땐 IT로 보이게 됨.

SQL> select * from dept;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 IT1            NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON

 

근데 1번 사용자에게만 데드락이 떨어지네.. 2번도 같이 떨어져야 하지 않는가?

lock 을 선점하고 있던 트랜잭션을 실패시켜서 원활하게 해줘야 한다 DBA가...

 

 

V$뷰로 일일이 쿼리하기 힘드므로 EM을 실행해서 확인.

V$SESSION 에서 누가 락을 걸고 있는지 확인.

해당 서버프로세스를 먼저 찾아..

SID와 SERIAL# 두개를 찾아야 해당 서버 프로세스를 찾을 수 있음.

 

 

 

롤백 = 언두 같은 말.

Rollback segment        --->        UNDO Segment

DBA관리            9i            오라클 관리

 

<FLASHBACK 기능>

UNDO_RETENTION = 900초 (15분)

저장공간 및 CPU 타임에 의해서 저장함.

항상 15분마다 저장하는 게 아님.

 

 

* 관련 파라미터

UNDO_Management : Auto (오라클 관리)

Manual

 

UNDO_TABLESPACE    ; 어느 테이블스페이스 쓸건지. UNDOTBS1

 

before 이미지가 사용될 공간에 크기 갯수를 오라클이 결정.

문제가 없어지느냐? 아니다.

TBS크기는 DBA가 지정하게 되는데.....

해당 UNDOTBS의 공간이 작으면 땅(TBS)이 작은 데 창고를 더 지을 수 있겠느냐

충분한 UNDO용 크기가 뭔지 내가 모르겠다면?

 

언두테이블스페이스의 크기를 계속 줄여주면서..

오라클의 10G부터 다시 바뀐다.

 

Automatic Workload Repository  + Advisor

메모리에서 일어났떤 유저들의 작업정보를 다 보관.

내가 DB를 구동한 이후에 업무에 대한 유저들의 작업을 갖고 있다가

걔를 가지고 Advisor 기능들이 생김.

문장에 대해 체크해주는 거, 메모리에 대해 체크해주는거 등등 advisor 많은데

그 중 UNDO 체크하는 advisor 불러서 체크

얼마만큼의 비포 이미지가 쌓이는지를 분석.

 

 

가끔씩 내가 해당 기능을 이용해서 분석해서

얼마만큼의 UNDO가 사용되는지, 거기에 대해서 UNDO 적절하게 바꿔주면 관리가 용이해짐.

 

 

FLASHBACK : 논리적 작업에 대해 데이터 손상이 발생했을 때 커맨드의 FLASHBACK 기능을 이용해서

복구하는 방법.

 

 

FLASHBACK ...

 

 

Database    ; DB 다 과거...로 돌아가는듯.

 

Table    ; 하나의 테이블만 과거로 돌리고 싶다. 이 기능을 사용. 잘못 조작한 데이터 살려내게

 

Drop        ; 윈도우 휴지통의 기능.

DROP 기능으로 테이블 드롭 했을 때,

DDL 이어서 auto commit 이 들어가 있기땜에 rollback 해서 살릴 수 없었지만

Recycle bin에 들어가서 FLASHBACK DROP 기능으로 데이터 살려낼 수 있다.

 

위 세개는 데이터 복구 진행 임.

별도의 권한 필요. 셋팅도 필요함.

 

 

아래 세개는 과거의 데이터를 보여줌.

Query    : SELECT 문장으로 1시간 전, 10분전 등 과거의 데이터가 뭐였는지 확인..

이건 포인트를 찍어줌. 딱 시점의 데이터.

 

Version Q ; 만약 자주 변경되는 경우 해당 쿼리 .

한시간전부터 두시간 사이 변경된 거 다 보여줘.

두 시점 사이 변경된 거 다 보여줌.

 

Transaction Q    ; 특정한 트랜잭션이 건드렸던 모든 이미지를 나에게 보여줌.

이 중 내가 뭘 잘못했는지 확인해서 내가 DML 문장 수행해서 다시 조작하면 됨.

 

 

FLASHBACK 은 물리적인 손상에 대해서는 복구 못 해 줌.

(블록 corruption 이라든가, dbf 파일 지워짐에 대해서는 복구 안 됨.)

 

 

원래는 commit이나 rollback 했을 때 언두블럭 지우지만, 비포이미지 안 지우겠다 오라클이.