datafile 개수 제한 설정 변경에 따른 고정 관념
데이터베이스의 data file의 개수가 설정 값보다 개수가 많아지면 이후에 데이터 파일의 추가 시 다음과 같은 에러메세지를 받게 된다.
ORA-00059: maximum number of DB_FILES exceeded
현재 실무에서 위의 문제를 해결하기 위해 많은 사람이 초기화 파라미터의 db_files의 값과 컨트롤파일의 설정 중 maxdatafiles의 값에 대해 변경을 해 줘야 한다고 생각을 한다. 그래서 작업 절차에 컨트롤 파일에 대한 재생성 과정을 고려한다. 하지만 오라클 버전 8 이상부터는 컨트롤 파일의 maxdatafiles의 값은 더 이상 특별하게 고려할 필요가 없다. 버전 8 이상부터 오라클이 maxdatafiles의 값을 동적으로 변경해 준다.
이에 대한 테스트를 아래에서 수행해 보도록 하겠다.
Test
현재 DB의 설정 사항을 파악
SQL> SELECT COUNT( * ) FROM V$DATAFILE; COUNT(*) ---------- 4 SQL> SELECT TYPE 2 ,RECORD_SIZE 3 ,RECORDS_TOTAL 4 ,RECORDS_USED 5 FROM V$CONTROLFILE_RECORD_SECTION 6 WHERE TYPE = 'DATAFILE'; TYPE RECORD_SIZE RECORDS_TOTAL RECORDS_USED ------------------------------------------- ----------- ------------- ------------ DATAFILE 428 10 4 SQL> COL NAME FOR A20 SQL> COL VALUE FOR A10 SQL> COL DISPLAY_VALUE FOR A10 SQL> COL DESCRIPTION FOR A50 SQL> SELECT NAME 2 ,VALUE 3 ,DISPLAY_VALUE 4 ,DESCRIPTION 5 FROM V$PARAMETER 6 WHERE NAME = 'db_files'; NAME VALUE DISPLAY_VA DESCRIPTION -------------------- ---------- ---------- ---------------------------- db_files 10 10 max allowable # db files SQL> |
현재 datafile의 개수는 4이고 파라미터의 db_files 설정 값은 10으로 되어 있으며 컨트롤 파일에 설정되어 있는 maxdatafiles 값은 10이며 4개의 entry가 사용중이란 결과를 보게된다.
데이터 파일의 개수를 증가시키면서 테스트를 진행해 보자.
SQL> CREATE TABLESPACE NO_FILE_TEST 2 DATAFILE 'D:\9.DATABASE\ORADORI\NO_FILE_TEST01.DBF' SIZE 1M, 3 'D:\9.DATABASE\ORADORI\NO_FILE_TEST02.DBF' SIZE 1M, 4 'D:\9.DATABASE\ORADORI\NO_FILE_TEST03.DBF' SIZE 1M, 5 'D:\9.DATABASE\ORADORI\NO_FILE_TEST04.DBF' SIZE 1M, 6 'D:\9.DATABASE\ORADORI\NO_FILE_TEST05.DBF' SIZE 1M; 테이블스페이스가 생성되었습니다. SQL> |
현재 datafile이 9개가 되도록 작업을 수행했으며 다시 설정을 확인하고 10개까지 만드는 작업을 진행해 보자
SQL> SELECT COUNT( * ) FROM V$DATAFILE; COUNT(*) ---------- 9 SQL> COL NAME FOR A20 SQL> COL VALUE FOR A10 SQL> COL DISPLAY_VALUE FOR A10 SQL> COL DESCRIPTION FOR A50 SQL> SELECT NAME 2 ,VALUE 3 ,DISPLAY_VALUE 4 ,DESCRIPTION 5 FROM V$PARAMETER 6 WHERE NAME = 'db_files'; NAME VALUE DISPLAY_VA DESCRIPTION -------------------- ---------- ---------- ---------------------------- db_files 10 10 max allowable # db files SQL> SELECT TYPE 2 ,RECORD_SIZE 3 ,RECORDS_TOTAL 4 ,RECORDS_USED 5 FROM V$CONTROLFILE_RECORD_SECTION 6 WHERE TYPE = 'DATAFILE'; TYPE RECORD_SIZE RECORDS_TOTAL RECORDS_USED ------------------------------------- ----------- ------------- ------------ DATAFILE 428 10 9 SQL> ALTER TABLESPACE NO_FILE_TEST 2 ADD DATAFILE 'D:\9.DATABASE\ORADORI\NO_FILE_TEST06.DBF' SIZE 1M; 테이블스페이스가 변경되었습니다. SQL> |
datafile의 개수가 10개로 제한 값에 도달하였다. 이후 datafile 추가시 에러가 나오는지 확인
SQL> ALTER TABLESPACE NO_FILE_TEST 2 ADD DATAFILE 'D:\9.DATABASE\ORADORI\NO_FILE_TEST07.DBF' SIZE 1M; ALTER TABLESPACE NO_FILE_TEST * 1행에 오류: ORA-00059: maximum number of DB_FILES exceeded SQL> |
11번째 datafile 추가 시 위와 같은 에러를 받게 된다. 이제 테스트 환경이 구축된 것이다. 이제 우리가 확인하고자 하는 maxdatafiles의 값이 동적으로 변경되는 것을 확인해 보자
파라미터의 db_files의 값을 변경해 보자
SQL> shutdown immediate 데이터베이스가 닫혔습니다. 데이터베이스가 마운트 해제되었습니다. ORACLE 인스턴스가 종료되었습니다. SQL> 초기화 파라미터 변경 *.sessions=1105 *.sga_target=612368384 *.undo_management='AUTO' *.undo_tablespace='UNDOTBS1' *.user_dump_dest='C:\oracle\product\10.2.0\admin\ORADORI\udump' *.db_files=15 # 위 환경에서 10으로 10개 제한했으나 15로 늘려본다. |
설정 변경 후 DB restart 후 설정을 확인하고 11번째 datafile을 추가하여 상태 체크를 수행한다.
SQL> startup ORACLE 인스턴스가 시작되었습니다. Total System Global Area 612368384 bytes Fixed Size 1250428 bytes Variable Size 255855492 bytes Database Buffers 348127232 bytes Redo Buffers 7135232 bytes 데이터베이스가 마운트되었습니다. 데이터베이스가 열렸습니다. SQL> SQL> SELECT COUNT( * ) FROM V$DATAFILE; COUNT(*) ---------- 10 SQL> COL NAME FOR A20 SQL> COL VALUE FOR A10 SQL> COL DISPLAY_VALUE FOR A10 SQL> COL DESCRIPTION FOR A50 SQL> SELECT NAME 2 ,VALUE 3 ,DISPLAY_VALUE 4 ,DESCRIPTION 5 FROM V$PARAMETER 6 WHERE NAME = 'db_files'; NAME VALUE DISPLAY_VA DESCRIPTION -------------------- ---------- ---------- -------------------------- db_files 15 15 max allowable # db files SQL> SELECT TYPE 2 ,RECORD_SIZE 3 ,RECORDS_TOTAL 4 ,RECORDS_USED 5 FROM V$CONTROLFILE_RECORD_SECTION 6 WHERE TYPE = 'DATAFILE'; TYPE RECORD_SIZE RECORDS_TOTAL RECORDS_USED ------------------------------ ----------- ------------- ------------ DATAFILE 428 10 10 SQL> ALTER TABLESPACE NO_FILE_TEST 2 ADD DATAFILE 'D:\9.DATABASE\ORADORI\NO_FILE_TEST07.DBF' SIZE 1M; 테이블스페이스가 변경되었습니다. SQL> SELECT COUNT( * ) FROM V$DATAFILE; COUNT(*) ---------- 11 SQL> SELECT NAME 2 ,VALUE 3 ,DISPLAY_VALUE 4 ,DESCRIPTION 5 FROM V$PARAMETER 6 WHERE NAME = 'db_files'; NAME VALUE DISPLAY_VA DESCRIPTION -------------------- ---------- ---------- -------------------------- db_files 15 15 max allowable # db files SQL> SELECT TYPE 2 ,RECORD_SIZE 3 ,RECORDS_TOTAL 4 ,RECORDS_USED 5 FROM V$CONTROLFILE_RECORD_SECTION 6 WHERE TYPE = 'DATAFILE'; TYPE RECORD_SIZE RECORDS_TOTAL RECORDS_USED ----------------------------- ----------- ------------- ------------ DATAFILE 428 42 11 SQL> |
maxdatafiles에 대한 변경을 하지 않아도 11번째 datafile 추가 전에는 변경이 없지만 추가가 된 후의 maxdatafiles의 설정 값이 42로 늘어난 것을 확인할 수 있다.
결론
현재 실무에서 많은 엔지니어분들이 해당 작업시 maxdatafiles의 설정 값 때문에 컨트롤 파일의 재생성을 권고하고 있다. 하지만 이는 8버전 이전에 필요한 작업이지 이후 버전에는 필요 없는 작업이다. 굳이 한다고 하면 잘못된 방법은 아니다. 하지만 굳이 risk를 안을 만한 작업을 할 필요가 있을까? 또 추가적으로 확인해 볼만한 사항은 records_total 값이 15가 되는 것이 아니라 42이가 된다는 것이다. 오라클 내부적으로 늘어나는 값들이 어떠한 규칙으로 설정되어 있는 듯하다. 이것 또한 트레이스를 통해서 내부적인 동작 방식을 더 깊게 고찰해 볼 필요가 있을 것 같다.
참고
Oracle Metalink ID : 119507.1
댓글 없음:
댓글 쓰기