프린트 하기

OS환경 : Oracle Linux 7.6 (64bit)

 

DB 환경 : Oracle Database 19.10.0.0

 

방법 : 오라클 19c 컨트롤파일 maxdatafiles와 파라미터 파일의 db_files 파라미터

db 생성시 컨트롤파일에서 datafile의 최대값을 설정하는 maxdatafiles 파라미터를 설정할수 있음

그리고 파라미터 파일의 db_files 파라미터로 datafile의 최대값을 설정할수도 있음

오라클 8.1.5버전의 오라클 문서를 보면 "만약 컨트롤파일의 maxdatafiles보다 크지만 파라미터 파일의 db_files 보다 작거나 같은 datafile을 추가하려고 하면 maxdatafile이 더 많은 datafile을 수용할 수 있도록 컨트롤 파일이 자동으로 확장된다" 라고 나와있음

 

 

8.1.5 버전 docs

MAXDATAFILES Clause
Specify the initial sizing of the data files section of the control file at CREATE DATABASE or CREATE CONTROLFILE time. An attempt to add a file whose number is greater than MAXDATAFILES, but less than or equal to DB_FILES, causes the control file to expand automatically so that the data files section can accommodate more files.

 

19c 버전 docs

14.1.2.3 Consider Possible Limitations When Adding Data Files to a Tablespace

When you issue CREATE DATABASE or CREATE CONTROLFILE statements, the MAXDATAFILES parameter specifies an initial size of the data file portion of the control file. However, if you attempt to add a new file whose number is greater than MAXDATAFILES, but less than or equal to DB_FILES, the control file will expand automatically so that the data files section can accommodate more files.

 

 

이렇게 변경이 잘되는지 테스트를 해봄

초기 테스트 db 설치시 컨트롤파일의 maxdatafiles 파라미터를 15로 설정하고 파라미터 파일의 db_files 파라미터를 10으로 설정하였음

datafile을 하나씩 늘려가며 테스트해봄

 

 

파라미터 파일의 db_files 파라미터 확인

1
2
3
4
5
SQL> show parameter db_files
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_files                             integer     10

파라미터 파일의 db_files는 10으로 설정되어 있음

 

 

컨트롤파일의 MAXDATAFILES 파라미터 확인(RECORDS_TOTAL 컬럼)

1
2
3
4
5
6
7
SQL>
select * from v$controlfile_record_section 
where type='DATAFILE';
 
TYPE                         RECORD_SIZE RECORDS_TOTAL RECORDS_USED FIRST_INDEX LAST_INDEX LAST_RECID     CON_ID
---------------------------- ----------- ------------- ------------ ----------- ---------- ---------- ----------
DATAFILE                             520            15            4           0          0          4          0

컨트롤파일의 MAXDATAFILES 파라미터는 15로 설정되어 있음

 

 

현재 datafile 확인

1
2
3
4
5
6
7
8
9
10
11
SQL>
col tablespace_name for a10
col file_name for a50
select tablespace_name, file_id, file_name from dba_data_files order by file_id;
 
TABLESPACE    FILE_ID FILE_NAME
---------- ---------- --------------------------------------------------
SYSTEM              1 /oracle/app/oracle/oradata/TEST/system01.dbf
SYSAUX              2 /oracle/app/oracle/oradata/TEST/sysaux01.dbf
UNDOTBS1            3 /oracle/app/oracle/oradata/TEST/undotbs01.dbf
USERS               4 /oracle/app/oracle/oradata/TEST/users01.dbf

datafile이 4개만 존재함

 

 

샘플 테이블 스페이스 생성

1
2
3
SQL> create tablespace dbftest datafile '/oracle/app/oracle/oradata/TEST/dbftest01.dbf' size 10m autoextend off;
 
Tablespace created.

 

 

샘플 테이블스페이스에 데이터 파일 추가(5번)

1
2
3
4
5
6
7
8
SQL> 
alter tablespace dbftest add datafile '/oracle/app/oracle/oradata/TEST/dbftest02.dbf' size 10m autoextend off;
alter tablespace dbftest add datafile '/oracle/app/oracle/oradata/TEST/dbftest03.dbf' size 10m autoextend off;
alter tablespace dbftest add datafile '/oracle/app/oracle/oradata/TEST/dbftest04.dbf' size 10m autoextend off;
alter tablespace dbftest add datafile '/oracle/app/oracle/oradata/TEST/dbftest05.dbf' size 10m autoextend off;
alter tablespace dbftest add datafile '/oracle/app/oracle/oradata/TEST/dbftest06.dbf' size 10m autoextend off;
 
Tablespace altered.

 

 

datafile 재확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SQL>
col tablespace_name for a10
col file_name for a50
select tablespace_name, file_id, file_name from dba_data_files order by file_id;
 
TABLESPACE    FILE_ID FILE_NAME
---------- ---------- --------------------------------------------------
SYSTEM              1 /oracle/app/oracle/oradata/TEST/system01.dbf
SYSAUX              2 /oracle/app/oracle/oradata/TEST/sysaux01.dbf
UNDOTBS1            3 /oracle/app/oracle/oradata/TEST/undotbs01.dbf
USERS               4 /oracle/app/oracle/oradata/TEST/users01.dbf
DBFTEST             5 /oracle/app/oracle/oradata/TEST/dbftest01.dbf
DBFTEST             6 /oracle/app/oracle/oradata/TEST/dbftest02.dbf
DBFTEST             7 /oracle/app/oracle/oradata/TEST/dbftest03.dbf
DBFTEST             8 /oracle/app/oracle/oradata/TEST/dbftest04.dbf
DBFTEST             9 /oracle/app/oracle/oradata/TEST/dbftest05.dbf
DBFTEST            10 /oracle/app/oracle/oradata/TEST/dbftest06.dbf
 
10 rows selected.

db_files 갯수인 10개만큼 datafile이 존재함

 

 

datafile 하나 더 추가 시도

1
2
3
4
SQL> alter tablespace dbftest add datafile '/oracle/app/oracle/oradata/TEST/dbftest07.dbf' size 10m autoextend off;
*
ERROR at line 1:
ORA-00059: maximum number of DB_FILES exceeded

에러가 발생하면서 실패함

 

 

db_files 파라미터 20으로 변경

1
2
3
SQL> alter system set db_files=20 scope=spfile;
 
System altered.

 

 

db 재기동

1
2
SQL> shutdown immediate
SQL> startup

 

 

db_files 파라미터 확인

1
2
3
4
5
SQL> show parameter db_files
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_files                             integer     20

db_files가 정상적으로 20으로 변경됨

 

 

컨트롤파일에 있는 MAXDATAFILES 파라미터 확인(RECORDS_TOTAL 컬럼)

1
2
3
4
5
6
7
SQL>
select * from v$controlfile_record_section 
where type='DATAFILE';
 
TYPE                         RECORD_SIZE RECORDS_TOTAL RECORDS_USED FIRST_INDEX LAST_INDEX LAST_RECID     CON_ID
---------------------------- ----------- ------------- ------------ ----------- ---------- ---------- ----------
DATAFILE                             520            15           10           0          0         10          0

controlfile에는 여전히 15로 설정되어 있음(RECORDS_TOTAL 값)

 

 

데이터 파일 추가(5번)

1
2
3
4
5
6
7
8
SQL> 
alter tablespace dbftest add datafile '/oracle/app/oracle/oradata/TEST/dbftest07.dbf' size 10m autoextend off;
alter tablespace dbftest add datafile '/oracle/app/oracle/oradata/TEST/dbftest08.dbf' size 10m autoextend off;
alter tablespace dbftest add datafile '/oracle/app/oracle/oradata/TEST/dbftest09.dbf' size 10m autoextend off;
alter tablespace dbftest add datafile '/oracle/app/oracle/oradata/TEST/dbftest10.dbf' size 10m autoextend off;
alter tablespace dbftest add datafile '/oracle/app/oracle/oradata/TEST/dbftest11.dbf' size 10m autoextend off;
 
Tablespace altered.

 

 

컨트롤파일에 있는 MAXDATAFILES 파라미터 재확인(RECORDS_TOTAL 컬럼)

1
2
3
4
5
6
7
SQL>
select * from v$controlfile_record_section 
where type='DATAFILE';
 
TYPE                         RECORD_SIZE RECORDS_TOTAL RECORDS_USED FIRST_INDEX LAST_INDEX LAST_RECID     CON_ID
---------------------------- ----------- ------------- ------------ ----------- ---------- ---------- ----------
DATAFILE                             520            15           15           0          0         15          0

RECORDS_USED도 15가 됨

 

 

이 상태에서 datafile 하나 더 추가 시도

1
2
3
SQL> alter tablespace dbftest add datafile '/oracle/app/oracle/oradata/TEST/dbftest12.dbf' size 10m autoextend off;
 
Tablespace altered.

정상적으로 추가가 됨

 

 

컨트롤파일에 있는 MAXDATAFILES 파라미터 재확인(RECORDS_TOTAL 컬럼)

1
2
3
4
5
6
7
SQL>
select * from v$controlfile_record_section 
where type='DATAFILE';
 
TYPE                         RECORD_SIZE RECORDS_TOTAL RECORDS_USED FIRST_INDEX LAST_INDEX LAST_RECID     CON_ID
---------------------------- ----------- ------------- ------------ ----------- ---------- ---------- ----------
DATAFILE                             520            45           16           0          0         16          0

controlfile의 MAXDATAFILES 값인 RECORDS_TOTAL 컬럼값이 15에서 45로 자동으로 증가됨

 

 

alert log 확인

1
2
3
4
5
6
7
$ vi alert.log
2023-02-09T17:16:26.888590+01:00
alter tablespace dbftest add datafile '/oracle/app/oracle/oradata/TEST/dbftest12.dbf' size 10m autoextend off
2023-02-09T17:16:27.001664+01:00
Expanded controlfile section 4 from 15 to 45 records
Requested to grow by 30 records; added 1 blocks of records
Completed: alter tablespace dbftest add datafile '/oracle/app/oracle/oradata/TEST/dbftest12.dbf' size 10m autoextend off

자동으로 30개가 증가되었다는 메세지가 남음

 

 

결론 : 컨트롤파일의 MAXDATAFILES 를 작게 잡아놔도 db_files 파라미터값만큼 datafile을 추가할수 있다.
만약 MAXDATAFILES 값이 db_files 보다 적을 경우 자동으로 컨트롤파일의 MAXDATAFILES 값을 증가시킨다.
30개씩 증가시키는것으로 보인다.

 

 

참조 : 

https://blog.naver.com/darkturtle/50023297184

https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:83612348058 

https://docs.oracle.com/cd/F49540_01/DOC/server.815/a67779/ch4f.htm

https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/managing-data-files-and-temp-files.html#GUID-2C546AA6-6CDF-404B-8820-1541BC1EB6BD