Site icon DBA의 정석

ORA-1118 조치방법 ( MAXDATAFILES 와 DB_FILES )

테이블 스페이스를 만들거나 데이타 화일을 추가하다 보면

 

ORA-01118: cannot add any more database files: limit of XXX exceeded

 

와 같은 에러가 발생하는 경우가 있다.

 

오라클의 데이타 화일의 최대 갯수는 MAXDATAFILES와 DB_FILES 에 의해서 제한을 받는데 여기서는 이 에러를 해결하는 방법을 알아보기로 한다.

 

데이타베이스를 처음 만들 때 사용되는 CREATE DATABASE 명령에서 MAXDATAFILES 라는 파라미터를 찾아볼 수 있다.

 

여기서 지정된 값(명시를 안하면 디폴트로 설정)은 콘트롤 화일에 기록된다.

 

이 값은 데이타베이스에 대해서 설정된 최대 데이타화일 갯수이다. 이 값을 변경하려면 콘트롤 화일을 다시 만들어야 한다.

 

한편, init.ora(UNIX 에서는 init.ora, VMS 에서는 __init.ora)에는 DB_FILES 라는 파라미터가 있는데 이 값은 해당 인스턴스에 대해서 지정된 최대 데이타화일 갯수이다.

 

DB_FILES는 단순히 에디터 상에서 init.ora 화일을 수정한 다음에 DB를 Restartup 하면 새로운 값이 적용된다.

 

1. 왜 MAXDATAFILES 와 같은 한계값을 설정하는가?

-> O/S는 오라클 화일의 갯수를 지정하기 위하여 특정한 갯수 bit를 사용하며 이 값이 Platform에 따라 다르다. MAXDATAFILES는 이 값의 영향 하에 있게 된다.

 

일반적인 최대 값은 다음과 같다.

UNIX 62 1022

VMS 254 1022

DOS 254 NA

[참조]일부 유닉스 Platform상의 이전 버전의 경우 1022보다 작은 경우도 있다.

 

2. 왜 MAXDATAFILES 값을 가능한 최대로 설정해 두지 않는가?

-> MAXDATAFILES 를 크게 지정하면 그만큼 콘트롤 화일의 크기도 늘어나기 때문이다.

 

3. 왜 DB_FILES를 MAXDATAFILES 의 크기만큼 크게 설정해 두지 않는가?

-> DB_FILES를 늘리면 각 User Process 에 할당되는 PGA(Program Global Area) 의 크기가 커지기 때문이다.

 

4. 사용하는 시스템 MAXDATAFILES를 알 수 있는 방법은?

-> 시스템에 따라서 다르므로 Installation Guide 를 참조해야만 한다.

 

5. 콘트롤 화일의 위치를 아는 방법은?

-> SQL>show parameter control_files;

또는

SQL>select * from v$controlfile; (7.0.16 이상)

위의 Query 를 이용하거나 $ORACLE_HOME/dbs/config.ora 화일을 보면 알 수 있다.

 


[ORA-1118 해결방법]

-> ORA-1118 에러는 데이타 화일의 갯수가 MAXDATAFILES 값에 도달한 경우 발생한다. DB_FILES 값에 도달한 경우라면 ORA-59 에러가 발생한다. ORA-59 에러는 init.ora 의 DB_FILES 를 늘려주고 DB 를 Restartup 하면 해결 되지만 ORA-1118 에러는 이와같이 간단하게 해결되지는 않는다. 다음과 같은 방법이 있다.

1. 여러개의 데이타화일로 구성된 테이블 스페이스가 있으면 이를 Export 받고 테이블스페이스를 Drop한 다음 하 의 큰 데이타화일을 갖도록 테이블 스페이스를 만들고 Import를 한다.

2. MAXDATAFILES를 늘리기 위해서는 DB를 새로 만들어야 하며 그 이후 버젼을 사용중이라면 콘트롤 화일을 새로 만들어서 MAXDATAFILES를 늘릴 수 있다.

 

 

1. DB가 mount 또는 open 된 상태에서

SQL>alter database backup controlfile to trace;

와 같은 명령을 내리면 에 지정된 디렉토리 – ORACLE_HOME/rdbms/log – 에 트레이스 화일이 하나 생긴다. 이 화일 찾으려면 해당 디렉토리에서 가장 최근에 생긴 트레이스 화일을 찾으면 된다.

이 화일을 다른 이름으로 복사한 다음 에디터로 열어서 CREATE CONTROLFILE 명령 부분 외의 불필요한 부분과 ‘REUSE’ OPTION 을 지우고 MAXDATAFILES를 늘려 준다. 이 화일의 이름을 newctl.sql 로 하기로 한다.

 

2. ORCACLE_HOME/dbs 에 있는 Control file 을 다른 이름으로 MOVE 한다.

 

3. DB를 NORMAL 또는 IMMEDIATE로 Shutdown 하고, 콘트롤 화일 생성시 DB 영향을 줄 수 있기 때문에 만약을 위해서 DB 전체를 백업 받도록 한다.

 

4. 현재 사용중인 콘 롤 화일을 다른 이름으로 옮기고 다음을 실행한다.

SQL>startup nomount

SQL>@newctl

SQL>alter database open;

 

5. 이제 필요한 모든 작업은 끝났지만 여기서 다시 한번 Full Bakcup 을 받는 것이 좋다.

 

[ 참고 ] 다음은 콘트롤 화일을 생성하는 명령의 예이다.

SQL> STARTUP NOMOUNT

SQL> CREATE CONTROLFILE REUSE

DATABASE ORACLE

LOGFILE ‘/users/oracle/dbs/log1ORACLE.dbf’,

‘/users/oracle/dbs/log2ORACLE.dbf’,

‘/users/oracle/dbs/log3ORACLE.dbf’

NORESETLOGS

DATAFILE ‘/users/oracle/dbs/systORACLE.dbf’,

‘/users/oracle/dbs/rbsORACLE.dbf’,

‘/users/oracle/dbs/tempORACLE.dbf’,

‘/users/oracle/dbs/toolORACLE.dbf’,

‘/users/oracle/dbs/usrORACLE.dbf’

MAXDATAFILES 121;

SQL> ALTER DATABASE OPEN NORESETLOGS;

Exit mobile version