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 했을 때 언두블럭 지우지만, 비포이미지 안 지우겠다 오라클이.
'Database > ORACLE' 카테고리의 다른 글
11장. 오라클 데이터베이스 audit 구현 (0) | 2013.12.05 |
---|---|
4일차 - 10장. 언두 데이터 관리 (0) | 2013.12.05 |
3일차 - 8장. 유저 보안 관리 (0) | 2013.12.04 |
3일차 - 7장. 데이터베이스 저장 영역 구조 관리 (0) | 2013.12.04 |
SQLPLUS 툴 사용하기 (0) | 2013.12.04 |