데이터베이스 블록 내용
헤더는 transaction slot을 저장한다.
블록은 I/O의 최소 단위라서 블럭을 통째로 읽기때문에 순서가 상관 없다. 왜냐하면 데이터가 공간이 있는데 저장을 못하는 절편현상이 일어났을경우 compress를 통해 공간을 확보하기 때문이다.
블록 공간을 활용하는 매개변수중 INITRANS는 transaction을 미리 생성하는데 몇개를 생성할것인지를 정하는 값이다. MAXTRANS는 블럭에 transaction을 몇개 까지 생성할것인지를 정하는 것이다. 따라서 MAXTRANS에 따라서 동시에 수행할 수 있는 작업량이 결정된다. PCTFREE는 일정공간 반드시 남아야 하는 크기로 퍼센테이지로 적는다. 만약 PCTFREE의 공간이 없다면 insert는 사용이 불가능 하고 delete나 update만 가능하다. 하지만 update를 수행할때 수정되는 데이터가 기존 값보다 커진다면 행을 여러블록에 걸쳐서 저장하는 row chaining현상또는 행을 다른 테이블에 저장하는 상황이 발생한다. 오라클에서는 1행을 1블록에 저장하는 것이 원칙이지만 예외로 기본 저장 블록크기인 8k를 넘어가는 테이블을 저장할경우에는 rowchaining현상이 발생할수밖에 없다. 행을 이전하는 row mygration을 수행하고 rowID를 변경한다. 그리고 인덱스도 수정해주어야 한다.
따라서 그런 상황을 방지하기 위해서 PCTFREE크기를 미리 설정하는 것이다.
PCTUSED는 사용할 공간을 퍼센테이지로 설정한다. segment의 헤드에는 bitmap을 통해 테이블이 저장되어있는 extent 정보를 저장해 놓는다. extent의 첫번째 블록에는 extent 헤드로서 bitmap을 통해 어떤 블록이 pctfree에 도달하면 insert를 더이상 하지 못하게 막는 작업을 수행한다. bitmap정보는 확인할수없지만 예를 들어 0은 사용가능 1은 사용불가능 으로 표시한다고 가정했을때 처음 세그먼트로 부터 익스텐츠를 할당받게되면 00000블록 상태이다.3번째 블록이 pctfree에 도달해서 데이터를 insert하지 못한다면 00100으로 변경된다. 이때 전부 11111로 변경되면 high water mark를 뒤로 이동시켜 데이터 추가 저장이 가능하게 만든다.
만약 00100인 상황에서 3번째 블록의 데이터를 delete해서 pctfree의 이상으로 빈공간이 있다면 바로 00000이 될까? 답은 아니다. 3번째 블록의 데이터 공간이 pctused가 60으로 설정되었다고 한다면 계속 00100으로 유지되다가 블록 사용 가능 공간이 61퍼센트가 되었을때부터 00000으로 변경된다.
다시 언급하지만 우리는 bitmap정보를 확인하지 못한다.
실행취소 데이터 관리
예전에는 rollback으로 사용되었고 최근 undo라는 용어를 사용하기 시작했다. 실행취소데이터 관리는 과거에는 수동으로 해주어야 했지만 최근에는 default값이 automatic이다.
실행취소 세그먼트는 4extent로 이루어져 있다.
transaction이 발생하게 되면 해당 블록이 실행취소 세그먼트의 trancsation slot에 저장된다. 오라클은 행단위 락으로 독점락이라고 한다. SQL에서는 페이지단위락이 생기고 공유락이라고 한다.
트랜잭션 롤백은 rollback작업을 수행하여 데이터를 수정되기 전으로 돌리는 것이다. 읽기 일관성은 사용자가 SELECT문을 사용하여 데이터를 출력하고 있는데 다른 사용자가 출력되기 전의 데이터를 수정하고 commit하는경우 SCN(시스템변경번호)를 참조하여 새로운 정보 대신 수정되기 전의 데이터를 출력한다. 이를 출력할때 수정되기 전의 데이터가 사라진 경우에는 snapshot오류를 발생시키고 그대로 종료한다.
트랜잭션 복구는 DBWn가 undosegment를 참조하여 있어서는 안될 데이터를 지우는 것이다. 참고로 SMON이 insert를 하고 commit수행했는데 비정상 종료되어 수정이 되지 않았을 경우 undosegment를 보고 수정을 수행하는 것을 instance recovery라고 한다.
undo테이블 스페이스는 system테이블 스페이스, undo용 테이블 스페이스에만 생성되며 undo segment는 자동으로 생성된다. undo segment는 여러개 생성이 가능하지만 1작업에 1개만 사용하므로 추가 생성에 의미가 없다. 또한 여러 작업이 생겨 여러개의 undo segment가 필요하다면 자동으로 생성되기 때문에 수동으로 생성할 필요가 없다. UNDO_RETENTION 매개변수는 commit이나 rollback후 변경전의 데이터를 유지하려고 하는 초단위 시간인데 보장성이 없다.
V$UNDOSTAT를 참조하면 startup시점 부터 10분단위로 undo정보가 발생한 횟수를 기록한다.
UNDO테이블 스페이스의 크기는 [UR * (UPS * DBS)]보다는 커야 한다. UR은 UNDO_RETENTION 매개변수의 값이고, UPS는 초당 생성되는 실행 취소 데이터 블록수이다. DBS는 확장 영역 및 파일 크기에 따라 달라지는 오버헤드값이다.
CREATE UNDO TABLESPACE undo
DATAFILE '/app/ora12c/oradata/disk3/undo01.dbf' SIZE 50M; // undo tablespace를 생성한다.
'교육 > Oracle' 카테고리의 다른 글
Day 41 (DB - User, Quota) (0) | 2020.01.15 |
---|---|
Day 40 (DB) (0) | 2020.01.14 |
Day 37(Oracle) (0) | 2020.01.09 |
Day 36(Oracle) (0) | 2020.01.08 |
Day 35 (Oracle DB) (0) | 2020.01.07 |