Guidelines for Managing Datafiles
데이터파일이란 데이터베이스의 논리적 구조와 모든 데이터가 저장되어 있는 운영체제의 물리적인 파일을 뜻합니다. 오라클은 각각의 데이터파일에 절대번호(absolute)와 상대번호(relative)를 부여하여 각각의 식별자로 사용합니다.
- Absolute
데이터베이스에서 유일한 번호를 부여합니다. 이전 버전에서는 절대번호는 간단히 "파일 번호"로 써 참조하였습니다. - Relative
테이블스페이스에서 데이터파일을 구분하기 위한 유일번호 입니다. 중소형 데이터베이스에서 상대번호는 종종 절대번호와 같은 값을 가지기도 합니다. 하지만 데이터베이스의 데이터파일이 거진 최대값에 다다르게 되면 (일반적으로 1023) 상대번호는 절대번호와 다른 값을 가지게 됩니다.
파일 번호는 많은 딕셔너리 뷰에서 확인 할 수 있습니다. SQL 구문에서 파일 번호는 파일 이름 대신으로 사용할 수도 있습니다. 파일 번호를 사용할때 파일 번호의 정의는 V$DATAFILE, V$TEMPFILE 뷰에서 FILE# 컬럼에 되어 있습니다. 이 파일 번호는 또한 DBA_DATA_FILES, DBA_TEMP_FILES 뷰의 FILE_ID 컬럼에서도 확인 가능합니다.
Determine the Number of Datafiles
최소한 데이터베이스에는 SYSTEM 테이블스페이스를 저장할 하나의 데이터 파일이 필요합니다. 작은 시스템에서는 하나의 데이터 파일만 가질 것 입니다.
Determine the Value of the DB_FILES Initialization Parameter
오라클 인스턴스가 시작될때 인스턴스가 만들 수 있는 최대 데이터 파일 갯수는 DB_FILES 초기화 파라메터가 SGA의 공간에 데이터 파일의 최대 갯수를 미리 할당하게 합니다. DB_FILES 파라메터 값을 변경할 수 있습니다만 새로운 값은 인스턴스가 재시작 되기 전까지 적용되지 않습니다.
DB_FILES 값을 정의할때 다음 사항을 고려하도록 하십시요.
- DB_FILES 값이 너무 낮을경우 DB_FILES 값을 늘린후 인스턴스를 재가동 하기 전까지는 데이터 파일을 만들 수 없습니다.
- DB_FILES 값이 너무 높을경우, 쓸데없이 메모리를 많이 차지하게 됩니다.
Limitations When Adding Datafiles to a Tablespace
다음 제한사항 아래 테이블스페이스에 데이터파일을 추가할 수 있습니다.
- 운영체제는 종종 한번에 열 수 있는 파일의 갯수를 제한하기도 합니다. 운영체제의 최대 파일 열기 갯수를 초과할 경우 데이터파일은 더이상 생성되지 않습니다.
- 운영체제는 데이터파일의 갯수와 크기를 제한합니다.
- 오라클은 어떤 오라클데이터베이스의 어떤 인스턴스라도 데이터파일 갯수의 제한을 가지고 있습니다. 이 제한은 운영체제가 설정한 제한값입니다.
- DB_FILES 초기화 파라메터에 설정된 값 보다 더 많은 수의 데이터파일을 만들 수 없습니다.
Consider the Performance Impact
수개의 데이터파일이 하나의 테이블스페이스를 포함하고 있다면 성능에 문제를 야기할 수 있습니다.
오라클은 운영체자가 제한하는 파일 갯수보다 좀더 많은 파일을 가질 수 있으며. DBWn 프로세스는 온라인된 모든 데이터 파일을 열 수 있습니다. 오라클은 오픈 파일 디스크립터(open file discriptor)를 캐쉬처럼 사용하며 오픈 파일 디스크립터가 운영체제의 제한에 닿게 되면 자동으로 파일을 닫습니다. 이는 데이터베이스의 성능에 악영향을 미칩니다.
Determine the Size of Datafiles
첫번째 데이터 파일은 (시스템 테이블스페이스) 반드시 최소 150메가가 되어야 데이터 딕셔너리를 초기화 하고 롤백 세그먼트를 생성할 수 있습니다.
Places Datafiles Appropriately
테이블 스페이스의 위치는 테이블 스페이스를 구성하는 데이터파일의 물리적인 위치에 의해 결정됩니다.
예를들어, 몇몇의 디스크가 데이터베이스를 저장할 수 있다면, 다른 디스크가 데이터파일을 저장할 수 있게 고려하도록 하십시요. 이 방법을 사용하면 사용자들이 정보를 얻기위한 쿼리를 수행시 각각의 디스크가 각자 일을하며, 같은 시간에 데이터를 반환할 수 있습니다.
Store Datafiles Spearate from Redo Log Files
데이터파일이 저장되는 위치는 리두로그 파일이 저장되는 디스크와 절대 같이 저장하지 말기를 권고합니다. 두 데이터파일이 한 디스크에 같이 저장되고 있을때 디스크 에러가 발생하면 그 파일은 데이터베이스 복구에 사용될 수 없습니다.
리두 로그파일을 멀티플렉싱으로 구성했을시 모든 리두로그 파일을 잃을 가능성은 매우 낮습니다. 따라서 같은 드라이브에 이 경우는 데이터파일을 몇몇의 리두 로그 파일과 같이 저장할 수 있습니다.
Creating Datafiles and Adding Datafiles to Tablespace
테이블스페이스를 작성시 오브젝트에 대한 크기를 계산하여야 하고 특정 데이터 파일을 만들어 주어야 합니다. 후에 필요시 데이터 파일을 추가함으로써 디스크에 테이블 스페이스의 크기를 좀더 할당할 수 있습니다. 데이터파일을 여러개의 드라이브에 나눠서 저장하는 방식을 권장합니다.
- CREATE TABLESPACE
테이블 스페이스와 포함되는 데이터파일을 만듭니다. - CREATE TEMPORARY TABLESPACE
LMT 방식의 임시 테이블스페이스를 만들며 포함되는 데이터파일을 만듭ㄴ디ㅏ. - ALTER TABLESPACE ... ADD DATAFILE
테이블스페이스에 데이터파일을 만들고 추가시킵니다. - ALTER TABLESPACE ... ADD TEMPFILE
임시 테이블스페이스에 데이터파일을 만들고 추가시킵니다. - CREATE DATABASE
데이터베이스를 만들고 연관된 데이터파일을 작성합니다. - ALTER DATABASE ... CREATE DATAFILE
백업하지 않은 데이터파일의 분실시 비어있는 새로운 데이터 파일을 작성후 새로운 데이터 파일에 연동시킵니다.
Changing a Datafile's Size
Enabling and Disabling Automatic Extention for a Datafile
데이터 파일을 새로 작성하거나 기존에 있는 데이터파일을 변경하여 데이터베이스에서 좀더 용량이 필요할때 자동으로 용량이 늘어나게 할 수 있습니다.
자동으로 크기를 확장시키게 하면 다음과 같은 이점이 있습니다.
- 테이블스페이스의 공간부족시 즉시 사용자가 이를 해결해야하는 수고로움을 버릴 수 있습니다.
- 익스텐트를 확보하지 못해 어플리케이션이 죽는 일이 없습니다.
데이터파일이 자동확장을 하는지 아닌지는 DBA_DATA_FILES뷰의 AUTOEXTENSIBLE 컬럼을 참조하면 됩니다.
자동확장을 사용하려면 다음과 같은 SQL 구문을 사용하여 데이터 파일을 만들때 적용시킬 수 있습니다.
- CREATE DATABASE
- CREATE TABLESPACE
- ALTER TABLESPACE
기존에 있는 데이터파일의 자동확장을 키거나 끌 수 있습니다. 혹은 ALTER TABLESAPCE 구문을 통해 수동으로 크기를 조절할 수도 있습니다.
다음 구문은 users 테이블에 데이터파일을 추가하며 해당 데이터파일이 자동 확장을 할 수 있게 하는 구문입니다.
ALTER TABLESPACE users ADD DATAFILE '/u02/oracle/rbdb1/users03.dbf' SIZE 10M
AUTOEXTEND ON
NEXT 512K
MAXSIZE 250M;
NEXT 옵션의 값은 데이터파일 확장시 늘어나는 최소 용량을 뜻합니다. MAXSIZE는 해당 데이터파일이 늘어날 수 있는 최대 용량을 뜻합니다. 자동 확장 기능을 끄기 위해서는 다음의 구문을 사용합니다.
ALTER DATABASE DATAFILE '/u02/oracle/rbdb1/users03.dbf' AUTOEXTEND OFF;
Manually Resizing a Datafile
ALTER DATABASE 구문을 이용하여 수동으로 데이터파일을 늘리거나 줄일 수 있습니다.
데이터파일의 크기를 재조정함으로써 데이터파일을 추가하지 않고 데이터베이스에 좀더 많은 공간을 확보할 수 있게 합니다. 이 방법은 데이터베이스가 사용하는 데이터파일의 갯수가 최대치에 근접해 있을 경우 사용하면 좋습니다.
수동으로 크기를 줄일 경우 사용하지 않는 데이베이스의 빈 공간을 반환할 수 있습니다.
다음 예제에서 '/u02/oracle/rbdb1/stuff01.dbf' 파일이 250M 까지 확장하였다고 가정합니다. 하지만 테이블스페이스가 작아졌을 경우 데이타파일의 크기를 줄일 수 있습니다.
다음 구문을 통해 해당 데이터파일의 크기를 줄여봅시다.
ALTER DATABASE DATAFILE '/u02/oracle/rbdb1/stuff01.dbf' RESIZE 100M
Altering Datafile Availability
Bringing Datafiles Online or Taking Offline in ARCHIVELOG Mode
개인 데이터파일을 온라인시키려면 ALTER DATABASE DATAFILE 구문을 이용합니다. 다음 구문은 특정한 데이터파일을 온라인 시키는 명령 입니다.
ALTER DATABASE DATAFILE '/u02/oracle/rbdb1/stuff01.dbf' ONLINE;
반대로 오프라인 시키려면 다음 명령을 수행합니다.
ALTER DATABASE DATAFILE '/u02/oracle/rbdb1/stuff01.dbf' OFFLINE;
* 이 형식의 ALTER DATABASE 구문을 사용하기 위해 반드시 ARCHIVELOG 여야 합니다. 이는 데이터파일이 OFFLINE 될때 생기는 사고로 데이터파일이 손상되는 것을 막기 위합입니다. NOARCHIVELOG 상태에서 수행시 데이터파일에 손상이 됬다면 데이터파일을 잃는 결과를 초래할 수 있습니다.
Taking Datafiles Offline in NOARCHIVELOG Mode
NOARCHIVELOG 상태에서 데이터파일을 오프라인 시킬때도 ALTER DATABASE DATAFILE ... OFFLINE DROP 구문을 사용합니다. 이는 데이터파일을 오프라인시키고 즉시 드롭할 수 있게 해 줍니다. 데이터파일이 임시 세그먼트의 데이터만 가지고 있고 아직 백업이 되지 않은 상태며 데이터베이스가 NOARCHIVELOG 일때 유용합니다.
ALTER DATABASE DATAFILE '/u02/oracle/rbdb1/stuff01.dbf' OFFLINE DROP;
Altering the Availability of All Datafiles and Tempfiles in Tablespace
ALTER TABLESPACE 구문을 이용하여 테이블스페이스가 가진 데이터파일을 온라인 혹은 오프라인 시킬 수 있습니다.
- ALTER TABLESPACE ... DATAFILE {ONLINE | OFFLINE}
- ALTER TABLESPACE ... TEMPFILE {ONLINE | OFFLINE}
대부분의 경우 위 ALTER TABLESPACE 구문은 데이터베이스가 오픈상태가 아닌 마운트 상태에서 수행할 수 있습니다. 다만 해당 테이블스페이스가 시스템 테이블스페이스, 언두 테이블스페이스, 혹은 기본 임시 테이블 스페이스일 경우 반드시 마운트 상태에서만 수행해야 합니다. ALTER DATABASE DATAFILE 과 ALTER DATABASE TEMPFILE 구문 역시 ONLINE/OFFLINE 옵션을 가지고 있습니다. 다만 이 경우의 구문은 테이블스페이스의 파일이름을 전부 적어주어야 합니다.
테이블스페이스의 상태를 변경하는 ALTER TABLESPACE .... ONLINE | OFFLINE 과의 다른 이유는 다른 행동을 취하기 때문입니다. ALTER TABLESPACE 구문은 해당 테이블이 가진 모든 데이터파일에 유효하지만 임시 테이블스페이스나 템프파일의 상태는 변경할 수 없습니다.
Renaming and Relocating Datafiles
Renaming and Relocating Datafiles for a Single Tablespace
하나의 테이블스페이스에 포함된 데이터 파일의 이름 혹은 위치를 변경시킬 수 있습니다. ALTER TABLESPACE 시스템 권한이 요구됩니다.
Renaming Datafiles in a Single Tablespace
한 테이블스페이스의 데이터파일명을 변경할때 다음 단계를 따르도록 하십시요.
- 시스템 테이블스페이스를 가지고 있지 않는 데이터파일을 오프라인 시킵니다.
ALTER TABLESPACE users OFFLINE NORMAL; - OS 명령을 통해 데이터파일의 이름을 변경합니다.
- ALTER TABLESPACE ... RENAME DATAFILE 구문을 이용하여 오라클에게 변경된 파일 명을 새로 지정하여 줍니다.
- ALTER TABLESPACE .. RENAME FILE 구문을 이용해 변경하여 줍니다. 다음 예제는 /u02/oracle/rbdb1/user1.dbf 파일을 /u02/oracle/rbdb1/user01.dbf 로 변경하는 예시 입니다.
ALTER TABLESPACE users RENAME FILE '/u01/oracle/rbdb1/user1.dbf' TO
/u01/oracle/rbdb1/user01.dbf';
새로운 파일은 반드시 미리 존재해 있어야 합니다. 이 구문으로는 새로운 데이터 파일을 만들지 않습니다. - 데이터베이스를 백업니다. 데이터베이스의 구조가 변경되면 항상 완전백업을 받도록 하십시요.
Relocating and Renaming Datafiles in a Single Tablespaces
다음은 데이터파일의 위치를 변경하는 방법입니다. 우선 다음 상황을 가정합니다.
- 운영중인 데이터베이스가 모든 데이터파일이 같은 디스크에 위치한 users 라는 테이블 스페이스를 가지고 있습니다.
- users 테이블스페이스의 데이터파일은 각각 다른 디스크로 옮겨져야 합니다.
- 데이터베이스에 대한 관리자 권한을 가지고 있습니다.
- 데이터베이스를 백업해야 합니다.
다음 절차를 따라 하세요.
- 관련된 데이터파일의 이름을 확인합니다.
DBA_DATA_FILES 뷰에 질의하여 파일 이름과 크기를 확인할 수 있습니다.
SELECT FILE_NAME, BYTES FROM DBA_DATA_FILES
WHERE TABLESPACE_NAME='users'; - 해당 데이터 파일을 오프라인 시키거나 데이터베이스를 셧다운 시키고 마운트 상태로 둡니다.
- 해당 데이터 파일을 새로운 디스크에 복사합니다.
- 이제 오라클에게 해당 데이터파일이 변경되었다는 사실을 알려주어야 합니다.
users 테이블스페이스가 가진 데이터파일의 위치정보는 콘트롤 파일에 기록되어 있습니다. 따라서 예전 이름을 새로운 위치와 이름으로 콘트롤 파일을 업데이트 하도록 합니다.
데이터베이스가 온라인이고 테이블스페이스만 오프라인일 경우 ALTER TABLESPACE .. RENAME DATAFILE 구문을 이용합니다. 데이터베이스가 마운트 상태일 경우 ALTER DATABASE RENAME DATAFILE 구문을 사용합니다.
ALTER TABLESPACE users RENAME DATAFILE
'/u02/oracle/rbdb1/users01.dbf', '/u02/oracle/rbdb1/users02.dbf' TO
'/u03/oracle/rbdb1/users01.dbf', '/u04/oracle/rbdb1/users02.dbf'; - 테이블스페이스를 온라인시키거나 데이터베이스를 오픈상태로 만듭니다.
이미 데이터베이스가 오픈상태이고 테이블스페이스만 오프라인일 경우 테이블스페이스를 온라인으로 바꿉니다. - 데이터베이스를 백업합니다. 데이터베이스의 구조가 변경된 후에는 반드시 완전백업을 받아두는 것이 좋습니다.
Renaming and Relocating Datafiles for Multiple Tablespaces
ALTER DATABASE .. RENAME FILE 구문을 통해 하나 혹은 그이상의 테이블스페이스의 데이터파일명을 변경하거나 재위치 시킬 수 있습니다. 이 방법은 몇몇 테이블스페이스의 데이터파일과 위치를 한번에 변경하고자 할 때 사용할 수 있는 유일한 방법 입니다.
여러개의 테이블스페이스의 데이터파일을 한번에 변경하거나 시스템 테이블스페이스의 데이터파일을 변경하고자 할 시 반드시 ALTER DATABASE 권한이 존재해야 합니다.
- 데이터베이스를 마운트 상태로 둡니다.
- 데이터파일을 OS 명령을 통해 원하는 위치에 원하는 이름으로 복사합니다.
- ALTER DATABASE RENAME FILE 구문을 이용하여 데이터파일이 변경되었음을 오라클에게 알립니다.
예를들어 /u02/sort01.dbf 와 /u02/user3.dbf 를 /u02/temp01.dbf 와 /u02/users03.dbf 로 변경하기 위해서는 다음을 수행하면 됩니다.
ALTER DATABASE RENAME FILE '/u02/sort01.dbf', '/u02/user3.dbf' TO
'/u02/temp.dbf', '/u02/users03.dbf'; - 데이터베이스를 백업합니다.
Dropping Datafiles
데이터파일을 드롭하는 특정 SQL 명령문은 없습니다. 데이터파일을 드롭한다는 것은 해당 데이터파일을 소유하고 있는 테이블스페이스를 드롭한다는 의미입니다. 테이블스페이스의 데이터파일을 드롭하고 싶다면 다음 예제를 따르도록 하십시요.
- 새로운 테이블스페이스를 작성합니다.
- 예전 테이블스페이스의 데이터를 새로운 테이블스페이스로 옮깁니다.
- 예전 테이블스페이스를 드롭합니다.
반면, ALTER DATABASE 구문으로 템프파일을 드롭할 수 있습니다. 다음 예제를 참고하세요.
ALTER DATABASE TEMPFILE '/u02/oracle/data/lmtemp02.dbf' DROP INCLUE DATAFILES;
Verifying Data Blocks in Datafiles
데이터 블록의 체크섬을 검사하고 싶다면 DB_BLOCK_CHECKSUM 초기화 파라메터를 TRUE 로 세팅하면 됩니다. 이 값은 동적으로 바꿀 수 있으며(인스턴스 재가동 불필요) 파라메터의 세팅 상태와 상관없이 시스템 테이블스페이스에 대해서는 항상 데이터 블록을 검사합니다.
블록 검사를 수행하게 하면 오라클은 디스크에 기록된 각각의 데이터 블록에 대한 체크섬 값을 계산합니다. 체크섬은 템프파일도 포함하여 모든 데이터 블록에 적용됩니다.
DBWn 프로세스는 각 블록에 대한 체크섬 값을 구한 후 그 정보를 블록의 헤더에 기록합니다. 체크섬은 다이렉트 로더에 의해서도 계산됩니다.
다음번에 데이터 블록을 읽을때 블록에 문제가 있는지는 체크섬 값을 이용해 확인합니다. 문제가 발생하게 되면 ORA-01578 메세지를 반환하게 되고 문제가 된 사항을 추적 파일에 기록합니다.
Viewing Datafile Information
다음 딕시너리 뷰들은 데이터베이스의 데이터파일에 대한 유용한 정보를 제공해 줍니다.
- DBA_DATA_FILES
테이블 스페이스가 가지고 있는 데이터파일에 대한 정보와 파일 번호에 대한 정보를 제공합니다. 파일 번호는 좀더 상세한 정보를 얻고자 할때 다른 뷰와 조인하여 사용할 수 있습니다. - DBA_EXTENTS, USER_EXTENTS
DBA 뷰는 데이터베이스의 모든 세그먼트를 포함한 익스텐트의 정보를 보여줍니다. USER 뷰는 현 사용자가 소유한 오브젝트의 정보만 보여줍니다. - DBA_FREE_SPACE, USER_FREE_SPACE
DBA 뷰는 모든 테이블스페이스의 여유 공간을 보여주며 USER 뷰는 현 사용자가 소유한 오브젝트의 정보만 보여줍니다. - V$DATAFILE
콘트롤파일에 있는 데이터파일의 정보를 보여줍니다. - V$DATAFILE_HEADER
데이터파일 헤더의 정보를 보여줍니다.
Fin.
REF) Oracle Documents (server.920/a96521)
댓글 없음:
댓글 쓰기