MAXDATAFILES, DB_FILES(ORA-01118, ORA-00059)

2011. 3. 10. 11:30Oracle/Oracle Study

반응형
디비 생성시 초기 설정 해줄수 있는 MAXDATAFILES와 
구동되고 있는 디비에서 spfile or pfile에서 수정해 줄수 있는 db_files 파라미터가 있다.

1. MAXDATAFILES에 값이 부족하여 데이터 파일을 만들 수 없을 때 ORA-01118 에러를 뿌려주게 되어있는데 
   controlfile에 있는  MAXDATAFILES가 자동 증가 하는 것을 확인 하였다.
   (MAXDATAFILES 4000 -> 8000으로 증가됨)
   언제 이 에러가 발생되는지 찾지 못했다.
   ORA-01118: cannot add any more database files: limit of string exceeded

2.. db_files의 값을 초과하여 데이터 파일을 만들 수 없을때 ORA-00059 에 대한 에러 메세지가 출력된다.
    ORA-00059: maximum number of DB_FILES exceeded

예제 1) MAXDATAFILES가 자동 증가된다는 것을 확인.
SQL> select type, records_total, records_used
  2  from v$controlfile_record_section
  3  where type='DATAFILE';

TYPE                  RECORDS_TOTAL  RECORDS_USED
---------------- ------------------ ----------------
DATAFILE                                4000                   3001

SQL> show parameter db_files

NAME                           TYPE        VALUE
------------------ ----------- -----------
db_files                         integer          4000

다량의 데이터 파일을 생성하는 중 한계치가 도달하여 ORA-00059 에러가 발생.

TYPE                  RECORDS_TOTAL  RECORDS_USED
---------------- ------------------ ----------------
DATAFILE                                4000                   4000

SQL> alter system set db_files=4001 scope=spfile;
SQL> shutdown immediate;
SQL> startup;
SQL> show parameter db_files --> MAXDATAFILES가 4000이 되고 db_files는 4001이 된다.
                                                   데이터파일이 생성이 될 것인지 에러메세지를 뿌려줄것인지 확인하였다.

NAME                           TYPE        VALUE
------------------ ----------- -----------
db_files                         integer          4001

SQL> create tablespace test3996 datafile '/media/sda1/PROD/Disk3/ test3996.dbf' size 500k;

MAXDATAFILES가 변경되면서 정상적으로 생성됨.
alert file에는 다음과 같은 메세지가 뿌려진다.

Expanded controlfile section 4 from 4000 to 8000 records
Requested to grow by 4000 records; added 105 blocks of records

SQL> select type, records_total, records_used
  2  from v$controlfile_record_section
  3  where type='DATAFILE';

TYPE                  RECORDS_TOTAL  RECORDS_USED
---------------- ------------------ ----------------
DATAFILE                                8000                   4001

자동증가되어있는 것을 알수 있다. 혹시나 하는 마음에 trace 파일로 떨궈서 보았지만 똑같다.

예제 2) MAXDATAFILES 수정.

SQL> show parameter user_dump_dest

NAME                               TYPE VALUE
--------------------- ---------- -----------------------------------
user_dump_dest                 string  /media/sda1/PROD/admin/udump

SQL> alter database backup controlfile to trace; OR alter database backup controlfile to trace as '경로명';

user_dump_dest에 있는 경로명으로 가서 trace 파일을 확인.

CREATE CONTROLFILE REUSE DATABASE "PROD" NORESETLOGS  ARCHIVELOG
    MAXLOGFILES 5
    MAXLOGMEMBERS 3
    MAXDATAFILES 4000
    MAXINSTANCES 1
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 (
    '/media/sda1/PROD/Disk4/redo1a.log',
    '/media/sda1/PROD/Disk5/redo1b.log'
  ) SIZE 25M,
  GROUP 2 (
    '/media/sda1/PROD/Disk4/redo2a.log',
    '/media/sda1/PROD/Disk5/redo2b.log'
  ) SIZE 25M
-- STANDBY LOGFILE
DATAFILE
  '/media/sda1/PROD/Disk1/system01.dbf',
  '/media/sda1/PROD/Disk1/undotbs01.dbf',
.
.
CHARACTER SET KO16MSWIN949
;

이부분을 스크립트 파일로 복사한다.(control.sql 생성하여 복사)
MAXDATAFILES를 현재 설정된 4000의 값을 8000으로 수정하였다. 

cf.
스크립트 복사시 주위할 점은 NORESETLOGS와 RESETLOGS가 있어서 같은 
스크립트가 trace로 떨궜을 경우 두번 출력이 된다. 
나는 데이터파일을 워낙 많이 생성하여 처음부터 끝까지 긁어서 미처 생각지 못하고
noresetlogs와 resetlogs가 같이 실행되었다.(나만 바보짓함?)
noresetlogs가 실행되었기 때문에 resetlogs 쪽 스크립트는 에러를 발생시켜 실행은 되지 않았지만
에러가 났다는 것 자체가 찝찝하기 때문에.....

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup nomount;
ORACLE instance started.

Total System Global Area  612368384 bytes
Fixed Size                  1220868 bytes
Variable Size             188747516 bytes
Database Buffers          419430400 bytes
Redo Buffers                2969600 bytes
SQL> @/media/sda1/PROD/Script/control.sql

Control file created.

SQL> select status from v$instance;

STATUS
------------
MOUNTED

SQL> recover database;
Media recovery complete.
SQL> alter system archive log all;

System altered.

SQL> alter database open;

Database altered.

SQL> select status from v$instance;

STATUS
------------
OPEN

위와 했던 방식으로 controlfile을 trace로 떨구거나
v$controlfile_records_section 테이블을 select 하여 수정되었는지 다시 한번 확인해보자.
반응형

'Oracle > Oracle Study' 카테고리의 다른 글

UTL_URL 함수  (0) 2011.08.01
UNDO tablespace 변경  (0) 2011.07.26
characterset 변경 및 주의할 점.  (0) 2011.01.06
오라클 10.2.0.1.0 설치  (0) 2010.09.08
Oracle Analytic Function(분석함수)  (0) 2010.05.24