Oracle

게시글 보기
작성자 유건데이타 등록일 2015-05-20
제목 ORA-1118 조치방법(MAXDATAFILES 와 DB_FILES)
ORA-01118 조치방법(MAXDATAFILES 와 DB_FILES)
===========================================

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

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

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

데이타베이스를 처음 만들 때 사용되는 CREATE DATABASE 명령에서
MAXDATAFILES 라는 파라미터를 찾아볼 수 있다.
여기서 지정된 값(명시를 안하면 디폴트로 설정)은 콘트롤 화일에 기록된다.
이 값은 데이타 베이스에 대해서 설정된 최대 데이타화일 갯수이다.
이 값을 변경하려면 콘트롤 화일을 다시 만들어야 한다.

한편, ora-59 에러는 init.ora(UNIX 에서는 init.ora, VMS 에서는
_init.ora)에는 DBFILES 라는 파라미터가 있는데 이 값은
해당 인스턴스에 대해서 지정된 최대 데이타화일 갯수이다.
DB_FILES는 단순히 initSID.ora 화일에서 db_files를 늘린 다음에 DB를
Restartup 하면 새로운 값이 적용된다.


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

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

V6 V7
--------------------------------------------
UNIX 62 1022
VMS 254 1022
DOS 254 NA

[참조]일부 Unix Platform 상의 V7.0.16 이전 버전의 경우 1022보다 작은
경우도 있다.

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

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

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

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

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

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

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

-> SQLDBA>show parameter control_files;

또는

SQLDBA>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. V6.0.33 이전 버젼을 사용 중이라면 MAXDATAFILES를 늘리기 위해서는 DB를
새로 만들어야 하며 그 이후 버젼을 사용 중이라면 콘트롤 화일을 새로 만들어서
MAXDATAFILES를 늘릴 수 있다.




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

SQLDBA>alter database backup controlfile to trace;

와 같은 명령을 내리면 에 지정된 디렉토리 -

7.3 이하 버젼 :
$ORACLE_HOME/rdbms/log -

7.3 이상 버젼 :
svrmgrl> show parameter user_dump_dest

<확인결과>
...app/oracle/admin/SID/udump

에 Trace 화일이 하나 생긴다. 이 화일을 찾으려면 해당 디렉토리에서 가장
최근에 생긴 Trace 화일을 찾으면 된다.

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


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


3. 최소한 ORCACLE_HOME/dbs 에 있는 Control file 만이라도 백업을 받는다.


4. 다음을 실행한다.

SQLDBA>startup nomount
SQLDBA>@newctl
SQLDBA>alter database open;

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


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

SQLDBA> STARTUP NOMOUNT

SQLDBA> CREATE CONTROLFILE
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 100;

SQLDBA> ALTER DATABASE OPEN NORESETLOGS;


(참고) rdbms 7.2 이상에서는 datafile 갯수를 추가하는 대신 기존의 화일의
크기를 늘려주는 resize 기능이 있습니다.

사용 방법 (7.2 에서는 sqldba lmode=y)

1) svrmgrl> connect internal;
svrmgrl> show parameter compatible
NAME TYPE VALUE
----------------------------------- ------- ---------------------------
compatible string 7.2

위와 같이 compatible 이 7.2 이상이어야 합니다.
(만약, 아닐 경우에는 $ORACLE_HOME/dbs/initSID.ora 에 compatible 이 정의되어
있는지 확인한 다음, 없으면 다음 라인을 추가하십시오.)

compatible = 7.2.0.0.0

그 다음 re-startup 하시면 됩니다.


2) /users/oracle/dbs/usrORACLE.dbf를 100M 에서
200M 으로 resize 하는 명령 :
alter database datafile '/users/ora/dbs/usrORACLE.dbf' resize 200M;
Comment
등록된 코멘트가 없습니다.