Describe 세그먼트-익스텐트-블록의개념 here {{{ 세그먼트, 익스텐트, 블록에 관하여... 테이블스페이스, 세그먼트, 익스텐트, 블록은 오라클의 논리적인 구조를 설명합니다. 이것들이 무엇인가 낯설다고 하시는 분덜은 당장 이 페이지를 닫으시고.. 관련 자료를 참고하시고 다시 이 문서를 보시기 바랍니다.. 먼저 블럭을 야그하겠슴니다... 오라클에서 블록의 의미는 너무너무 중요합니다...왜냐하면 오라클의 최소 입출력 단위가 바로 블록이기 때문입니다... 블록에 대한 설정을 어케해주냐에 따라서 시스템의 성능이 좌지우지 되기도 합니다.. 그러므로 중요하겠죠... 이 중요한 블록은 다음과 같이 구성됩니다.. --------------------- | header | --------------------- | Table Directory | --------------------- | Row Directory | --------------------- | Free Space | --------------------- | | | Row Data | | | --------------------- 쩝...그림은 별루 안이쁘지만...저런 구조를 가지고 있습니다... 오라클에서 데이타는 바로 저 블록에 저장되게 됩니다... 오라클은 자신이 저장한 데이타가 어디있나를 알기 위해서 Header에 정보를 기록합니다.. 즉, 블록 어드레스나 세그먼트 타입과 같은 블록 정보를 Header에 기록합니다.. 여기서 세그먼트는 오라클의 객체라고 보면 되겠습니다..예를 들면...테이블 같은 것이죠.. 이 Header가 한 블록에서 차지하는 크기는 약 85~100 바이트 정도됩니다... 만약 파라미터 파일의 DB_BLOCK_SIZE에서 설정한 크기가 2K라면 2K 중에 85~100 바이트는 블록헤더가 잡고 있다는 뜻입니다... 테이블디렉토리는 클러스터로 합쳐진 테이블에 대하여 클러스터내의 테이블에 대한 정보를 갖고 있습니다.. 만약 클러스터로 합쳐지지 않았으면 여기에 대한 정보는 없겠지여... 행디렉토리는 블록내에서 실제 행에 대한 정보를 저장합니다...크기는 2바이트입니다.. 프리스페이스는 update와 같은 SQL 문이 수행될때 필요한 메모리 영역을 위한 공간입니다.. 즉, 한 블록에 데이타를 저장하는데 갱신된 데이타는 메모리의 Data Block Buffer Cache에 After Image가 있는데.. DBWR에 의해서 블록에 After Image를 기록해야할때 쓰이는 공간입니다.. 이 크기가 After Image보다 작다면 이 블록에는 저장하지 못하다 다른 블록에 기록을 하게 되겠지여... 그러면 한번에 한블록을 읽으면 되는 것을 두블럭을 읽어서 처리를 해야하기 때문에.. 결과적으로 추가적인 I/O를 필요로 하므로 성능이 저하되는 현상을 초래할 수 있습니다... 이 부분은 조금후에 다시 언급됩니다.. 암튼..그런 의미입니다.. 행데이타는 실제로 물리적인 테이블 또는 인덱스 데이타를 저장하는 공간입니다.. 이제 블록 구성파라미터들을 살펴보겠습니다.. 여기서 살펴볼 블록 구성 파라미터들은 테이블 생성시 사용되는 스토리지 파라미터들입니다.. 파라미터가 4개가 있습니다... 2개는 블록의 공간활용에 대한 파라미터구여.. 나머지 2개는 트랜잭션에 관련된 파라미터입니다.. 먼저 블록의 공간활용에 대한 파라미터를 살펴보겠습니다... 아까...블록의 구조에서 나온 프리스페이스와 관련된 내용입니다... PCTFREE 이 파라미터는 사용가능한 블록의 공간중에서 update에 대비해서 확보되는 영역입니다.. 즉, 이미 row data 에 데이타가 삽입된 상태에서...갱신을 할때 필요한 공간을 확보하기 위한 것입니다.. 여기서 주의깊에 봐야될 단어는 '확보'입니다... 즉, 딱 정해진것이 아니라 최소한 이만큼을 쓴다는 소리입니다.. 만약, 갱신된 데이타가 해당 블록에 저장할 공간이 없다면 다른 블록을 사용하게 되겠지여... 행의 헤더는 원래 블록에 있는데 갱신된 데이타는 다른 블록에 저장되었다는 소리지여.. 이 현상을 행 마이그래이션이라고 합니다... 이러한 현상은 프리스페이스가 완전히 찼거나 다음에 갱신되는 데이타가 저장될 공간이 부족하다면 생기는 현상입니다... 해결책은 pctused 파라미터의 값을 올려주는 것입니다... 테이블을 구성할때 해당 테이블이 갱신이 많이 되는 테이블로 예상된다면 PCTFREE를 좀 크게 잡아주어야 겠지여.. 아래에 있는 PCTUSED와 PCTFREE를 잘못 잡아주면 한 블럭을 읽어도 될 것을 한블록 이상을 읽게 되어서 I/O가 증가하게 되어서 결국 성능에 영향을 미치게 되는 것입니다.. 이 파라미터의 기본값은 10입니다...즉, 전체블록의 10%입니다.. 일반적으로는 20%를 설정해 준다고 합니다.... PCTUSED 이 파라미터는 데이타행을 추가할때 필요로하는 영역입니다.. 즉, INSERT문 사용시 필요로하는 것입니다... 기본값은 40% 입니다... 즉, 이 파라미터를 40%으로 잡았다는 얘기는 데이타가 업데이트시 사용하는 블록이 60%( 헤더, 테이블 디렉토리를 크기는 생략) 까지의 영역을 사용할 수 있다는 소리입니다.. 여기서 주의할 것은 설정해준값 40% 만이 INSERT에 대비해서 확보된다는 소리입니다... 즉, 최소 40% 라는 소리입니다.. PCTUSED의 값이 PCTFREE의 설정값 (20으로 설정되었다면..) 20%의 영역만 빼고 다 사용할 수 있다는 소리입니다.. 즉, 블록 크기의 최대한 80%까지 데이타가 입력되어 사용되어 질 수 있다는 소리입니다.. 만약 INSERT되는 데이타 행이 원래의 블록에 모두 저장될 수 없을때 이러한 데이타의 행은 다른 블록(들)에 저장되게 됩니다.. 이러한 현상을 행 체이닝이라고 합니다.. 역시 디스크 I/O가 증가하여 성능에 영향을 미치는 요소가 됩니다... 해결책은 pctused 값을 좀 늘려주어야 하겠지여... 근본적으로는 데이타베이스 설계시에 테이블의 각 컬럼에 대한 적절한 데이타형의 사용과 크기를 적절히 잡아주는 것이 중요합니다.. 컬럼의 데이타형의 설정은 입/출력의 토대가됩니다...또한 지금까지 살펴본 2개의 블록 구성 파라미터를 잘 잡아주는 것으로 행 마이그레이션과 행 체이닝 현상을 막아주어야 합니다.. INITRANS 이 파라미터는 블록헤더에 액세스 할 수 있는 동시 트랜잭션의 초기값을 설정하는 파라미터입니다.. 기본값은 1이며, 최대 255개 까지가 될 수 있습니다.. MAXTRANS 이 파라미터는 블록헤더에 액세스 할 수 있는 동시 트랜잭션의 최대값을 설정하는 파라미터입니다.. 범위는 역시 1~255 입니다.. 이 파라미터를 통해서 해당 블록의 트랜잭션을 설정하여 트랜잭션에 대한 조절을 할 수 있습니다.. 다음은 익스텐트에 대해서 살펴보겠습니다.. 익스텐트를 세그먼트에 할당되는 연속된 블록의 집합니다... 이미 우리는 테이블스페이스를 생성할때 이 파라미터를 접한적이 있습니다.. INITIAL 처음에 할당되는 익스텐트에 크기입니다.. 보통은 블록5개의 크기를 잡아줍니다...만약 블록의 크기가 8k라면 이 크기는 40K로 잡아줍니다.. NEXT 다음 익스텐트가 할당될때 증가되는 크기를 말합니다.. 기본값은 역시 INITIAL과 같이 블록 5개의 크기와 같습니다.. MINEXTENTS 세그먼트가 최초로 생성될때 할당되는 익스텐트의 수를 나타냅니다.. 기본값은 1이며, 롤백세그먼트의 경우는 최소 2개이어야 합니다...이유는 나중에 롤백세그먼트를 다룰때 자세히 설명하겠습니다.. MAXEXTENTS 한 세그먼트에 최대로 가질수 있는 익스텐트의 수입니다...일반적으로 121을 잡아줍니다... 주의할 점은 롤백세그먼트는 이 값이 무한대가 되어서는 안됀다는 소리입니다.. 롤백세그먼트의 순환적이어야 하는데 무한대가 된다면 허용된 저장공간을 롤백세그먼트가 다 차지하기 때문입니다.. PCTINCREASE 바로 전에 생성된 익스텐트의 바로 다음에 생성될 익스텐트의 증가되는 퍼센티지를 나타냅니다.. 계산 공식은 다음과 같습니다.. 마지막 생성된 익스텐트의 크기 * (1 + 설정값) 입니다... 만약 마지막 생성된 익스텐트의 크기가 10K이고 PCTINCREASE값을 50으로 설정해주었다면... 10K * (1 +0.5) = 15K 가 된다는 소리이지여... 롤백세그먼트의 경우는 이 값이 0이어야 합니다.. OPTIMAL 이 옵션은 롤백세그먼트에 관련된 내용입니다... 즉, 롤백세그먼트의 최적화 바이트수를 지정하는 것입니다. 기본값은 NULL입니다.. 이부분에 대해서는 롤백세그먼트에서 다루기로 합니다.. FREELIST 테이블로이 데이타 삽입을 위해서 미리 할당되는 프리 블록의 리스트수를 지정하는 것입니다.. 위의 익스텐트의 파라미터중 INITIAL과 MINEXTENT는 온라인 상태에서는 변경이 불가능합니다.. 나머지 파라미터의 경우는 다음 생성될 익스텐트부터 적용이 됩니다.. 이제 마지막 세그먼트에 대해서 살펴보도록 하겠습니다.. 세그먼트는 익스텐트의 집합입니다... 즉, 세그먼트들이 모여서 테이블스페이스를 이루고 있지여.. 이러한 세그먼트들은 오라클의 논리적 구조에 따라서 여러 이름을 가지고 나뉘게 됩니다.. 즉, 세그먼트는 특정유형의 데이타를 저장하는 공간이라고 생각하면 되겠습니다.. 데이타사전의 user_segments를 확인해보면 우리가 저장한 데이타의 실제 크기를 알 수 있습니다.. 이때 출력되는 내용은 데이타 세그먼트에 관련된 것입니다.. 다음은 각 세그먼트의 종류와 특징에 대한 설명입니다.. 데이터 세그먼트 데이터 행사이에는 빈 공간이 없이 연속적으로 이어져서 저장됩니다. 모든 데이터는 데이터의 길이를 나타내는 값을 저장하고 있으며, 이 때 0은 NULL 데이터를 의미한다. 즉, 데이터의 행을 저장할 때 NULL값은 저장되지 않고 그 크기(0)만 저장됩니다. 또 이어지는 NULL값은 저장되지 않습니다. 클러스터 클러스터는 서로 다른 테이블이 공통의 컬럼을 공유하거나 자주 함께 사용하는 경우에 물리적으로 하나로 저장되는 것을 말합니다. 이는 조인 연산시 발생하는 테이블들을 하나의 물리적인 데이터 세그먼트에 저장하여 그 성능을 향상시키는데 사용된다. -각 클러스터는 하나 또는 둘 이상의 테이블 정의를 저장한다. -클러스터는 하나 또는 그 이상의 동일한 데이터 세그먼트에 저장되며 클러스터 키와 클러스터 인덱스를 가진다. -클러스터 키 -하나 또는 그 이상의 컬럼이 될 수 있으며, 동일한 클러스터 키는 동일한 클러스터 블록에 저장 -클러스터 인덱스 -DBA만 생성할 수 있다. -클러스터 인덱스가 존재하지 않으면 클러스터 테이블로의 insert, update, delete를 수행할 수 없다. -인덱스를 먼저 생성하면 인덱스 키에 따라 물리적인 클러스터 블록이 지정된 크기로 형성된다. 인덱스 세그먼트 -인덱스 세그머트는 큰 테이블이나 클러스터에 대한 검색을 빠르게 수행하기 위해서 만들어지는 인덱스 데이터를 갖는다. -테이블 또는 클러스터에 대한 인덱스가 만들어지면 각각의 인덱스에 대한 인덱스 세그먼트가 생성되고 이렇게 생성된 인덱스 세그먼트는 B-TREE구조를 갖는다. -특징 -균형트리를 사용하여 그 키값을 빠르게 배치시킨다. -B-TREE의 행번호(ROWID) 어드레스의 사용으로 데이터 블록으로의 직접 액세스를 가능케 한다. -인덱스된 컬럼만을 참조하는 쿼리는 인덱스로만 참조할 수 있게 한다. -인덱스 검색은 전체 테이블 검색을 대신하므로 디스크 I/O를 줄여준다. -인덱스는 최적화를 위하여 테이블 또는 클러스터로부터 분리된 스토리지에 저장된다. 즉, 물리적으로 다른 테이블스페이스에 저장된다. 임시 세그먼트 -이 세그먼트는 정렬작업 또는 조인 연산에 사용되는 데이터를 임시로 보관하기 위해 사용된다. -SMON 백그라운드 프로세스에 의해서 사용된 임시 세그먼트는 다시 사용가능하게 된다. -임시 데이터를 다루는 곳이므로 리두로그에 기록되지 않는다. -만약 임시 세그먼트가 존재하지 않으면 SYSTEM 테이블스페이스내에 임시 세그먼트가 생성되므로, I/O마찰을 일으켜 시스템의 성능이 떨어지게 된다. -CREATE TABLESAPCE문에서 TEMPORARY옵션의 지정으로 만든다. 부트스트랩 세그먼트 -캐시 세그먼트라고도 불리우며, 데이터 사전 테이블들에 대한 정의를 담고 있다. -데이터베이스 OPEN시에 데이터 사전의 로드를 위해 사용된다. -SYS 사용자에 종속되며, 시스템 테이블스페이스에 저장된다. -일반 사용자 접근 금지. 롤백 세그먼트 -트랜잭션에 의해 변경되기 전의 데이터를 저장하는 순환적 세그먼트 -롤백, 읽기 읽관성, 복구에 사용된다. -롤백 세그먼트는 오라클 데이터베이스가 생성될 때 시스템 롤백세그먼트라는 특정 롤백 세그먼트를 시스템 테이블스페이스에 생성하며, 적어도 하나 이상의 롤백 세그먼트를 필요로 한다. -롤백 세그먼트의 종류 -Private :일반적으로 부르는 롤백 세그먼트, ROLLBACK_SEGMENTS파라미터에서 설정되어야만 사용 가능. -Public :오라클 병렬서버의 경우 하나 이상의 오라클 인스턴스에 의해서 그 사용이 공유될 수 있는 롤백 세그먼트 -Deferred :테이블스페이스가 오프라인으로 트랜잭션이 롤백될 수 없을 때, 시스템 테이블스테이스에 생성된다. 롤백 세그먼트의 생성은 일반 세그먼트의 생성에 비해 주의를 요하므로 생성을 해보겠다. 롤백 세그먼트의 생성 -PCTINCREASE의 값은 0이어야 한다. -MINEXTENTS의 값은 최소 2이어야 한다. a롤백 세그먼트는 순환 세그먼트 -MAXEXTENTS의 값은 UNLIMITED가 되어서는 절대 안됀다. -OPTIMAL에서 지정한 값보다 클 때, 롤백 세그먼트에 할당되었던 익스텐트들을 삭제하여 그 크기를 OPTIMAL에 맞춘다. -생성 절차 -롤백 세그먼트 생성 -ROLLBACK_SEGMENTS 파라미터에 새로 생성한 롤백 세그먼트 추가 -데이터베이스 재시작 이 세그먼트에 있던 내용은 전에 있던겁니다...헐헐~ 롤백세그먼트는 트랜잭션과 관련된 세그먼트 입니다...DBMS의 작업단위가 트랜잭션이니...그 트랜잭션을 위한 세그먼트가 상당히 중요하겠지여... 즉, 한마디로 말하자면 롤백세그먼트는 DML문장에 대한 Before Image를 간직하고 있는 세그먼트입니다... 영원히 간직하는 것은 아니구여...당연히 트랜잭션 종료시까지만 간직하고 있습니다.. 아차....빼먹을뻔 했습니다... OPTIMAL이란 익스텐트의 할당 옵션이 있었습니다... 롤백세그먼트는 트랜잭션에 따라서 계속 확장을 하게됩니다.....만약 확장을 하고...이제 트랜잭션이 종료되서 확장했던 영역이 어느 정도까지의 익스텐트가 줄어들게 됩니다....이런 현상은 오직 롤백세그먼트에서만 나타나지여.. 여기서 말한 어느정도를 나타내는 파라미터가 바로 OPTIMAL입니다... 또한가지 주의할 것은 이 OPTIMAL 파라미터는 MINEXTENTS에서 설정한 값 이상이어야 한다는 것입니다... 최소 익스텐트의 값보다 작게 줄일수가 없기 때문입니다... 즉, optimal은 initial * minextends보다는 항상 커야합니다.. 그리고...MAXEXTENTS는 반드시 설정해주어야 합니다...이 값이 무한대가 된다면...필요할때 오라클이 무한 확장하므로.. 저장공간을 모두 사용할 수 있기 때문에...반드시 설정해주어야 합니다... 이 값을 너무 작게 설정하면 필요한 롤백 세그먼트를 사용하지 못하기 때문에 에러를 발생하게 됩니다.. OLTP환경에서는 하나의 롤백세그먼트당 4개의 트랜잭션이 권장사항입니다.. 그러니까 시간당 트랜잭션을 계산후 롤백세그먼트를 선정해야합니다.. 배치작업의 경우는 롤백세그먼트의 크기는 크게...갯수는 작게 선정하는 것이 좋습니다.. 만약 트랜잭션의 크기가 크거나 많아서 롤백세그먼트가 정해준 공간만큼 모두 활용하고 있다면... 오라클은 롤백세그먼트를 차지하고 잇는 트랜잭션이 종료되지 않는 한은 작업할 수 없게됩니다.. 이것은 블록킹이나...데드락같은 문제때문일 수도 있습니다... 롤백세그먼트는 순환적이기 때문에.....처음 익스텐트의 트랜잭션이 아직 종료전이고...마지막 익스텐트를 차지하고 있는 트랜잭션이 더 많은 롤백세그먼트 공간을 요구한다면.... 그 중간의 확장영역은 쓰지 못하고...다른 확장영역을 생성해서 쓰게 됩니다... 이러한 문제로 롤백세그먼트의 공간부족이 생길수 있고...또한 에러를 발생할 수 있습니다... 롤백세그먼트는 읽기 일관성을 유지해 주는 중요한 오라클의 수단이므로 롤백세그먼트 관리도 DBA의 큰 관리 대상중 하나입니다... 읽기 일관성유지를 유해 오라클은 SCN이라는 정보를 이용합니다.... 만약 오라클이 정상정이 셧다운이 아닌 어떤 문제로 인한 셧다운이라면....오라클이 STARTUP할때... 먼저 리두로그 파일의 SCN정보와 데이타 파일과 컨트롤 파일의 SCN 정보를 비교해서.. 맞지 않는 것은 리두로그 파일의 SCN의 정보를 이용해서 롤백세그먼트에 저장된 Before Image를 쓰게 되는 것입니다... 물론 오라클이 운영중에도 여러 사용자의 세션에서 갱신이 일어나고 조회가 일어나는데... 그 명령을 수행하는 것을 요구한 시점과 commit의 시점을 비교해서 commit이전에 일어난 명령에 대해서는 롤백세그먼트의 Before Image를 적용해서 읽기 읽관성을 유지합니다.. 롤백세그먼트는 DML문장에서 쓰이게 되는데...각 DML문의 유형에 따라서도 롤백세그먼트의 사용량이 달라집니다.. 사용량은 입력 < 갱신 < 삭제 의 순입니다... 입력시는 ROWID만 저장하면 되므로 DML문중에서는 가장 적은 롤백세그먼트 사용량을 보이고...삭제시에는 삭제한 모든 데이타의 이미지를 롤백세그먼트에 저장해야 하기때문에 가장 많은 롤백세그먼트의 사용량을 보입니다.. 갱신시에는 ROWID이외에 인덱스에 대한 정보까지 가지고 있어야 합니다.. 이렇게 DML문도 생각줘서 롤백세그먼트를 어떻게 효율적으로 관리할 것인가를 생각해 줘야 합니다.. 직접 롤백세그먼트를 생성해보겠습니다.. 세그먼트에 관련된 옵션은 OPTIMAL만빼고 같습니다... SQL> select segment_name, tablespace_name, status 2 from dba_rollback_segs; SEGMENT_NAME TABLESPACE_NAME STATUS ------------------------------ ------------------------------ ---------------- SYSTEM SYSTEM ONLINE RBS0 RBS ONLINE RBS1 RBS ONLINE RBS2 RBS ONLINE RBS3 RBS ONLINE RBS4 RBS ONLINE RBS5 RBS ONLINE RBS6 RBS ONLINE 8 개의 행이 선택되었습니다. 일단 기본으로 잡혀있는 롤백세그먼트를 활성화 하기 위해서는...파라미터 파일에서 롤백세그먼트에 대한 주석처리를 풀어주어야 합니다.. 초기 설치시 풀어줬을 겁니다.. 파라미터 파일에 있는 명시된 것은 오라클이 STARTUP할때 온라인 시키는 롤백세그먼트입니다.. 확인해 봅시다.. SQL> !vi $ORACLE_HOME/dbs/initORCL.ora . . . . . # log_archive_start = true # log_archive_dest_1 = "location=/export/home/oracle/8i/admin/ORCL/arch" # log_archive_format = arch_%t_%s.arc # If using private rollback segments, place lines of the following # form in each of your instance-specific init.ora files: rollback_segments = ( RBS0, RBS1, RBS2, RBS3, RBS4, RBS5, RBS6 ) <-------- 주석표시(#)을 안풀어줬다면 풀어주자... # If using public rollback segments, define how many . . . . SQL> connect sys/change_on_install as sysdba 연결되었습니다. SQL> shutdown 데이터베이스가 닫혔습니다. 데이터베이스가 마운트 해제되었습니다. ORACLE 인스턴스가 종료되었습니다. SQL> startup ORACLE 인스턴스가 시작되었습니다. Total System Global Area 87818400 bytes Fixed Size 73888 bytes Variable Size 70795264 bytes Database Buffers 16777216 bytes Redo Buffers 172032 bytes 데이터베이스가 마운트되었습니다. 데이터베이스가 열렸습니다. SQL> 그러면...이미 있는게 확인되었으니까...롤백 세그먼트 하나를 생성해서... 파라미터 파일에 추가시키고..삭제하는 것을 해보겠습니다.. SQL> create rollback segment rbs7 2 tablespace RBS; 롤백 세그멘트가 생성되었습니다. SQL> select segment_name, tablespace_name, status 2 from dba_rollback_segs; SEGMENT_NAME TABLESPACE_NAME STATUS ------------------------------ ------------------------------ ---------------- SYSTEM SYSTEM ONLINE RBS0 RBS ONLINE RBS1 RBS ONLINE RBS2 RBS ONLINE RBS3 RBS ONLINE RBS4 RBS ONLINE RBS5 RBS ONLINE RBS6 RBS ONLINE RBS7 RBS OFFLINE <------- 오프라인인 것 확인... 9 개의 행이 선택되었습니다. SQL> !vi $ORACLE_HOME/dbs/initORCL.ora <--- 파라미터 파일에 추가시킨후...오라클을 내렸다가 다시 올려야 적용된다.. . . . . . # log_archive_dest_1 = "location=/export/home/oracle/8i/admin/ORCL/arch" # log_archive_format = arch_%t_%s.arc # If using private rollback segments, place lines of the following # form in each of your instance-specific init.ora files: rollback_segments = ( RBS0, RBS1, RBS2, RBS3, RBS4, RBS5, RBS6, RBS7 ) <-----RBS7을 추가시켰다.. # If using public rollback segments, define how many # rollback segments each instance will pick up, using the formula . . . . . SQL> shutdown 데이터베이스가 닫혔습니다. 데이터베이스가 마운트 해제되었습니다. ORACLE 인스턴스가 종료되었습니다. SQL> startup ORACLE 인스턴스가 시작되었습니다. Total System Global Area 87818400 bytes Fixed Size 73888 bytes Variable Size 70795264 bytes Database Buffers 16777216 bytes Redo Buffers 172032 bytes 데이터베이스가 마운트되었습니다. 데이터베이스가 열렸습니다. SQL> select segment_name, tablespace_name, status 2 from dba_rollback_segs 3 where segment_name = 'RBS7'; SEGMENT_NAME TABLESPACE_NAME STATUS ------------------------------ ------------------------------ ---------------- RBS7 RBS ONLINE <------- 온라인으로 바뀌었다.. SQL> alter rollback segment rbs7 <--------- 오프라인으로 설정하는 예... 2 offline; 롤백 세그멘트가 변경되었습니다. SQL> select segment_name, tablespace_name, status 2 from dba_rollback_segs 3 where segment_name = 'RBS7'; SEGMENT_NAME TABLESPACE_NAME STATUS ------------------------------ ------------------------------ ---------------- RBS7 RBS OFFLINE <-------- 오프라인 확인.. SQL> alter rollback segment rbs6 <---------------- 오프라인 일때만 가능하다.. 2 shrink to 8k; <---------------- 롤백세그먼트의 확장으로 인한 롤백세그먼트가 부족할때 관리자가 이렇게 해준다.. 롤백 세그멘트가 변경되었습니다. SQL> drop rollback segment rbs7; <--------- 롤백 세그먼트의 삭제..온라인 상태는 삭제 불가능.. 롤백 세그멘트가 삭제되었습니다. SQL> !vi $ORACLE_HOME/dbs/initORCL.ora <------------ 삭제명령뒤에 파라미터 파일도 수정해야 한다..파라미터 파일을 적용하려면 셧다운후 스타트업해야 한다.. . . . . . # log_archive_format = arch_%t_%s.arc # If using private rollback segments, place lines of the following # form in each of your instance-specific init.ora files: rollback_segments = ( RBS0, RBS1, RBS2, RBS3, RBS4, RBS5, RBS6 ) <----------- RBS7을 없애주었다.. # If using public rollback segments, define how many # rollback segments each instance will pick up, using the formula . . . . . SQL> shutdown 데이터베이스가 닫혔습니다. 데이터베이스가 마운트 해제되었습니다. ORACLE 인스턴스가 종료되었습니다. SQL> startup ORACLE 인스턴스가 시작되었습니다. Total System Global Area 87818400 bytes Fixed Size 73888 bytes Variable Size 70795264 bytes Database Buffers 16777216 bytes Redo Buffers 172032 bytes 데이터베이스가 마운트되었습니다. 데이터베이스가 열렸습니다. SQL> select segment_name, tablespace_name, status 2 from dba_rollback_segs; SEGMENT_NAME TABLESPACE_NAME STATUS ------------------------------ ------------------------------ ---------------- SYSTEM SYSTEM ONLINE RBS0 RBS ONLINE RBS1 RBS ONLINE RBS2 RBS ONLINE RBS3 RBS ONLINE RBS4 RBS ONLINE RBS5 RBS ONLINE RBS6 RBS ONLINE 8 개의 행이 선택되었습니다. SQL> select n.name, round(100 * s.waits/s.gets) <-------- 트랜잭션이 롤백세그먼트를 얻기위해 대기하는 비율(1% 이상일 경우는 롤백세그먼트 추가) 2 from v$rollname n , v$rollstat s 3 where n.usn = s.usn; NAME ROUND(100*S.WAITS/S.GETS) ------------------------------ ------------------------- SYSTEM 0 RBS0 0 RBS1 0 RBS2 0 RBS3 0 RBS4 0 RBS5 0 RBS6 0 8 개의 행이 선택되었습니다. 이제 스토리지를 관리하는 것에 대해서 알아보도록 하겠습니다.. 오라클 스토리는 고수위(High Water Mark)라는 것이 존재합니다...이것은 사용된 영역과 미사용 영역의 교차점을 말합니다.. 데이타가 삭제되어도 이 고수위는 그대로 존재하게 됩니다.. 오라클은 공간의 재사용을 위해서 재사용이 가능하도록 합니다..이작업은 고수위의 이전 공간에 대해서는 발생하지 않습니다.. 이러한 작업은 다음과 같이 수행합니다.. SQL> alter table scott.emp deallocate unused; 테이블이 변경되었습니다. 이러한 작업이 발생하여도 고수위는 변하지 않으며, 세그먼트가 완전히 비워져 있다면 다음과 같은 작업으로 세그먼트내의 모든 영역을 사용가능하게 만듭니다.. SQL> truncate drop storage; 크기가 큰 익스텐트에 블록의 단편화가 발생하거나 여러개의 연속 블록이 흩어져 있다면 익스텐스를 합칠수 있습니다.. SQL> alter tablespace users coalesce; 테이블 영역이 변경되었습니다. 스토리에 관련된 내용은 여기까지입니다.. 중요한 내용은 블록의 설정값들과...롤백세그먼트에 관련된 것이였습니다.. }}} ---- 좋은 정보 감사합니다. -- 요타바이트 2018-10-11 00:07:27 ---- 아이고... 오라클8.x.x 시절에 써 놓은겁니다. 다른 문서 보시는게 좋을 것 같습니다. -- 이재학 2018-10-12 09:19:35