Oracle DBF : data file 즉, 물리적인 저장 구조

data file은 Oracle이 실제 Data를 저장하는데 사용되는 파일이다. OS 수준에서 일반 file을 다루듯이 Oracle의 data file을 임의의 장소에 이동하거나, 삭제하게 되면 oracle DATABASE가 정상적으로 운영되지 않는다.
-- Data file의 가장 작은 단위는 Data BLOCK이며, 이러한 Data BLOCK이 몇개가 모여서 이루어지는 EXTENTS라는 단위로 데이터베이스의 저장공간이 관리된다.
-- Data BLOCK의 크기는 Oracle DATABASE 생성시 정해지며, parameter file에 설정된 크기가 명시되어 있다
-- 관계형 데이터베이스에서 모든 데이터는 TABLE이라는 2차원적 저장단위에 Row(행) 단위로 저장되며, 이 TABLE이 물리적 저장소인 Data file에 저장되는 것이다.
-- Data file은 DATABASE에 반드시 한 개 이상 존재해야 한다.
SQL> select tablespace_name,file_name from dba_data_files;
TABLESPACE_NAME FILE_NAME
--------------- -----------------------------------------------------------
USERS /export/home/oracle/app/oracle/oradata/orcl/users01.dbf
SYSAUX /export/home/oracle/app/oracle/oradata/orcl/sysaux01.dbf
UNDOTBS1 /export/home/oracle/app/oracle/oradata/orcl/undotbs01.dbf
SYSTEM /export/home/oracle/app/oracle/oradata/orcl/system01.dbf
SQL> select name,enabled from v$datafile;
NAME ENABLED
------------------------------------------------------------ ----------
/export/home/oracle/app/oracle/oradata/orcl/system01.dbf READ WRITE
/export/home/oracle/app/oracle/oradata/orcl/undotbs01.dbf READ WRITE
/export/home/oracle/app/oracle/oradata/orcl/sysaux01.dbf READ WRITE
/export/home/oracle/app/oracle/oradata/orcl/users01.dbf READ WRITE
SQL>
MAXDATAFILES와 DB_FILES의 차이점 |
|
datafile의 최대 개수는 MAXDATAFILES와 DB_FILES 파라미터에 의해서 제한 받는다.
1) MAXDATAFILES는
CREATE DATABASE 문으로 database 생성시 지정해 주며, database가 가질 수 있는 최대 datafile의 개수를 지정한다.
이때, 이 값은 control file에 기록이 되므로 이 값을 변경하기 위해서는 control file을 다시 생성해야 한다.
2) DB_FILES는
해당 INSTANCE에 대해서 지정된 datafile의 최대 개수 이며, 초기화 파일인 init<SID>.ora에서 설정된다.
datafile의 개수가 DB_FILES에 도달하면 간단히 init<SID>.ora에서 값을 늘려 주면 된다.
이 때, MAXDATAFILES의 값을 넘으면 않된다.
그리고 datafile의 개수가 MAXDATAFILES에 도달하면 다음 두 가지 방법을 사용한다.
하나. control file을 다시 생성하면서 설정 값을 늘려 준다.
두울. 여러 개의 datafile로 이루어진 tablespace를 찾아서 이를 export받고
tablespace를 drop한 다음에 하나의 큰 datafile을 갖도록 tablespace를 생성한 후에 import한다.
Data file 확장하는 방법
방법1) | Data file 추가 | ALTER TABLESPACE <tablespace명> ADD DATAFILE '파일 경로' SIZE |
방법2) | AUTOEXTEND로 추가 | ALTER TABLESPACE <tablespace명> ADD DATAFILE '파일 경로' SIZE AUTOEXTEND on |
방법3) | RESIZE | ALTER DATABASE [database명] DATAFILE '파일 이름' RESIZE 크기 [K|M] |
TABLESPACE가 공간이 부족하여 TABLESPACE에 data file을 추가할 수 있다.
1) TABLESPACE에 data file 추가
【형식】
ALTER TABLESPACE <tablespace명>
ADD DATAFILE 'filespec' [, 'filespec', ...]
2) TABLESPACE에 AUTOEXTEND 옵션으로 data file 추가
【형식】
ALTER TABLESPACE <tablespace명>
ADD DATAFILE '경로와 이름' SIZE [AUTOEXTEND on]
【예제】
$ sqlplus '/as sysdba'
SQL> select t.name, d.status, d.enabled
2 from v$datafile d, v$tablespace t
3 where t.ts# = d.ts#;
NAME STATUS ENABLED
------------------------------ ------- ----------
SYSTEM SYSTEM READ WRITE
UNDOTBS1 onLINE READ WRITE
SYSAUX onLINE READ WRITE
USERS onLINE READ WRITE
SQL> select tablespace_name,file_name from dba_data_files;
TABLESPACE FILE_NAME
---------- ------------------------------------------------------------
USERS /export/home/oracle/app/oracle/oradata/orcl/users01.dbf
SYSAUX /export/home/oracle/app/oracle/oradata/orcl/sysaux01.dbf
UNDOTBS1 /export/home/oracle/app/oracle/oradata/orcl/undotbs01.dbf
SYSTEM /export/home/oracle/app/oracle/oradata/orcl/system01.dbf
SQL> create tablespace users2
2 datafile '/export/home/oracle/app/oracle/oradata/orcl/users201.dbf' size 500k,
3 '/export/home/oracle/app/oracle/oradata/orcl/users202.dbf' size 500k
4 minimum extent 10k
5 default storage (initial 40k
6 next 40k
7 maxextents 50
8 pctincrease 0);
Tablespace created.
SQL> select tablespace_name,file_name from dba_data_files;
TABLESPACE FILE_NAME
---------- ------------------------------------------------------------
USERS /export/home/oracle/app/oracle/oradata/orcl/users01.dbf
SYSAUX /export/home/oracle/app/oracle/oradata/orcl/sysaux01.dbf
UNDOTBS1 /export/home/oracle/app/oracle/oradata/orcl/undotbs01.dbf
SYSTEM /export/home/oracle/app/oracle/oradata/orcl/system01.dbf
USERS2 /export/home/oracle/app/oracle/oradata/orcl/users201.dbf
USERS2 /export/home/oracle/app/oracle/oradata/orcl/users202.dbf
6 rows selected.
SQL> select t.name, d.status, d.enabled
2 from v$datafile d, v$tablespace t
3 where t.ts# = d.ts#;
NAME STATUS ENABLED
------------------------------ ------- ----------
SYSTEM SYSTEM READ WRITE
UNDOTBS1 onLINE READ WRITE
SYSAUX onLINE READ WRITE
USERS onLINE READ WRITE
USERS2 onLINE READ WRITE
USERS2 onLINE READ WRITE
6 rows selected.
SQL> ALTER TABLESPACE users2
2 ADD DATAFILE '/export/home/oracle/app/oracle/oradata/orcl/users203.dbf' SIZE 300k;
Tablespace altered.
SQL> select tablespace_name,file_name from dba_data_files;
TABLESPACE FILE_NAME
---------- ------------------------------------------------------------
USERS /export/home/oracle/app/oracle/oradata/orcl/users01.dbf
SYSAUX /export/home/oracle/app/oracle/oradata/orcl/sysaux01.dbf
UNDOTBS1 /export/home/oracle/app/oracle/oradata/orcl/undotbs01.dbf
SYSTEM /export/home/oracle/app/oracle/oradata/orcl/system01.dbf
USERS2 /export/home/oracle/app/oracle/oradata/orcl/users201.dbf
USERS2 /export/home/oracle/app/oracle/oradata/orcl/users202.dbf
USERS2 /export/home/oracle/app/oracle/oradata/orcl/users203.dbf
7 rows selected.
SQL> select t.name, d.status, d.enabled
2 from v$datafile d, v$tablespace t
3 where t.ts# = d.ts#;
NAME STATUS ENABLED
------------------------------ ------- ----------
SYSTEM SYSTEM READ WRITE
UNDOTBS1 onLINE READ WRITE
SYSAUX onLINE READ WRITE
USERS onLINE READ WRITE
USERS2 onLINE READ WRITE
USERS2 onLINE READ WRITE
USERS2 onLINE READ WRITE
7 rows selected.
SQL> ALTER TABLESPACE users2
2 ADD DATAFILE '/export/home/oracle/app/oracle/oradata/orcl/users204.dbf' size 200k
3 AUTOEXTEND on NEXT 10k MAXSIZE 400k;
Tablespace altered.
SQL> select tablespace_name,file_name from dba_data_files;
TABLESPACE FILE_NAME
---------- ------------------------------------------------------------
USERS /export/home/oracle/app/oracle/oradata/orcl/users01.dbf
SYSAUX /export/home/oracle/app/oracle/oradata/orcl/sysaux01.dbf
UNDOTBS1 /export/home/oracle/app/oracle/oradata/orcl/undotbs01.dbf
SYSTEM /export/home/oracle/app/oracle/oradata/orcl/system01.dbf
USERS2 /export/home/oracle/app/oracle/oradata/orcl/users201.dbf
USERS2 /export/home/oracle/app/oracle/oradata/orcl/users202.dbf
USERS2 /export/home/oracle/app/oracle/oradata/orcl/users203.dbf
USERS2 /export/home/oracle/app/oracle/oradata/orcl/users204.dbf
8 rows selected.
SQL> select t.name, d.status, d.enabled
2 from v$datafile d, v$tablespace t
3 where t.ts# = d.ts#;
NAME STATUS ENABLED
------------------------------ ------- ----------
SYSTEM SYSTEM READ WRITE
UNDOTBS1 onLINE READ WRITE
SYSAUX onLINE READ WRITE
USERS onLINE READ WRITE
USERS2 onLINE READ WRITE
USERS2 onLINE READ WRITE
USERS2 onLINE READ WRITE
USERS2 onLINE READ WRITE
8 rows selected.
SQL>
RESIZE로 TABLESPACE의 data file을 늘리는 방법 |
|
RESIZE 옵션을 사용하여 수동으로 data file의 크기를 변경할 수 있다.
【형식】
ALTER DATABASE <database명>
DATAFILE 'filename' [, 'filename', ...]
RESIZE 크기 [K|M];
【예제】
SQL> column file_name format a60;
SQL> column tablespace_name format a10;
SQL> SELECT tablespace_name,file_name,bytes from DBA_DATA_FILES;
TABLESPACE FILE_NAME BYTES
---------- ------------------------------------------------------------ ----------
USERS /export/home/oracle/app/oracle/oradata/orcl/users01.dbf 5242880
SYSAUX /export/home/oracle/app/oracle/oradata/orcl/sysaux01.dbf 335544320
UNDOTBS1 /export/home/oracle/app/oracle/oradata/orcl/undotbs01.dbf 26214400
SYSTEM /export/home/oracle/app/oracle/oradata/orcl/system01.dbf 471859200
SQL> ALTER DATABASE
2 DATAFILE '/export/home/oracle/app/oracle/oradata/orcl/users01.dbf'
3 RESIZE 10M;
Database altered.
SQL> SELECT tablespace_name,file_name,bytes from DBA_DATA_FILES;
TABLESPACE FILE_NAME BYTES
---------- ------------------------------------------------------------ ----------
USERS /export/home/oracle/app/oracle/oradata/orcl/users01.dbf 10485760
SYSAUX /export/home/oracle/app/oracle/oradata/orcl/sysaux01.dbf 335544320
UNDOTBS1 /export/home/oracle/app/oracle/oradata/orcl/undotbs01.dbf 26214400
SYSTEM /export/home/oracle/app/oracle/oradata/orcl/system01.dbf 471859200
SQL>
data file의 위치나 이름을 변경하고자 할 경우에 대하여 살쳐보자
Data file 이동 방법 두 종류
ALTER TABLESPACE 문 | 이동하고자 하는 tablespace를 offline으로 변경한 다음 복사 이동 후 tablespace를 online시킴 |
---|
ALTER DEATABASE 문 | 이동하고자 하는 file을 복사하기 전 반드시 DB 종료 후 복사 이동 후 DATABASE를 OPEN 시킴 |
1)ALTER TABLESPACE 문을 사용하여 이동하는 경우
【형식】
ALTER TABLESPACE <tablespace명>
RENAME DATAFILE '기존 file경로와 이름' [,'file명',...]
TO '이동하고자하는 file경로와 이름' [,'file명'...];
이동 순서
a) TABLESPACE를 OFFLINE 상태로 전환한다.
b) 운영체제 상에서 data file을 이동하거나 복사한다.
c) ALTER TABLESPACE ... RENAME DATAFILE ... TO ...문을 실행한다.
d) OFFLINE의 TABLESPACE를 onLINE 상태로 전환한다.
【예제】
SQL> sqlplus '/as sysdba'
SQL> column tablespace_name format a10;
SQL> column file_name format a60;
SQL> select tablespace_name,file_name from dba_data_files;
TABLESPACE FILE_NAME
---------- ------------------------------------------------------------
USERS /export/home/oracle/app/oracle/oradata/orcl/users01.dbf
SYSAUX /export/home/oracle/app/oracle/oradata/orcl/sysaux01.dbf
UNDOTBS1 /export/home/oracle/app/oracle/oradata/orcl/undotbs01.dbf
SYSTEM /export/home/oracle/app/oracle/oradata/orcl/system01.dbf
SQL> CREATE TABLESPACE users2
2 DATAFILE '/export/home/oracle/app/oracle/oradata/orcl/users201.dbf' SIZE 300k;
Tablespace created.
SQL> select tablespace_name,file_name from dba_data_files;
TABLESPACE FILE_NAME
---------- ------------------------------------------------------------
USERS /export/home/oracle/app/oracle/oradata/orcl/users01.dbf
SYSAUX /export/home/oracle/app/oracle/oradata/orcl/sysaux01.dbf
UNDOTBS1 /export/home/oracle/app/oracle/oradata/orcl/undotbs01.dbf
SYSTEM /export/home/oracle/app/oracle/oradata/orcl/system01.dbf
USERS2 /export/home/oracle/app/oracle/oradata/orcl/users201.dbf
SQL> ALTER TABLESPACE users2 OFFLINE;
Tablespace altered.
SQL> SELECT tablespace_name,status FROM DBA_TABLESPACES;
TABLESPACE STATUS
---------- ---------
SYSTEM onLINE
UNDOTBS1 onLINE
SYSAUX onLINE
TEMP onLINE
USERS onLINE
USERS2 OFFLINE
6 rows selected.
SQL> !
$ mv /export/home/oracle/app/oracle/oradata/orcl/users201.dbf \
> /export/home/oracle/app/oracle/oradata/user201.dbf
$ exit
SQL> ALTER TABLESPACE users2
2 RENAME DATAFILE '/export/home/oracle/app/oracle/oradata/orcl/users201.dbf'
3 TO '/export/home/oracle/app/oracle/oradata/user201.dbf';
Tablespace altered.
SQL> select tablespace_name,file_name from dba_data_files;
TABLESPACE FILE_NAME
---------- ------------------------------------------------------------
USERS /export/home/oracle/app/oracle/oradata/orcl/users01.dbf
SYSAUX /export/home/oracle/app/oracle/oradata/orcl/sysaux01.dbf
UNDOTBS1 /export/home/oracle/app/oracle/oradata/orcl/undotbs01.dbf
SYSTEM /export/home/oracle/app/oracle/oradata/orcl/system01.dbf
USERS2 /export/home/oracle/app/oracle/oradata/user201.dbf
SQL> ALTER TABLESPACE users2 onLINE;
Tablespace altered.
SQL> SELECT tablespace_name,status FROM DBA_TABLESPACES;
TABLESPACE STATUS
---------- ---------
SYSTEM onLINE
UNDOTBS1 onLINE
SYSAUX onLINE
TEMP onLINE
USERS onLINE
USERS2 onLINE
6 rows selected.
SQL>
2)ALTER DATABASE 문을 사용하여 이동하는 경우
【형식】
ALTER DATABASE [database명]
RENAME FILE '기존 file경로와 이름' [,'file명',...]
TO '이동하고자하는 file경로와 이름' [,'file명'...];
이동 순서
a) 반드시 DATABASE를 종료한다.
b) 운영체제 상에서 data file을 이동하거나 복사한다.
c) DATABASE를 MOUNT한다.
d) ALTER DATABASE RENAME FILE...TO...문을 실행한다.
e) DATABASE를 OPEN한다.
【예제】
SQL> sqlplus '/as sysdba'
SQL> column tablespace_name format a10;
SQL> column file_name format a60;
SQL> SELECT tablespace_name,file_name FROM dba_data_files;
TABLESPACE FILE_NAME
---------- ------------------------------------------------------------
USERS /export/home/oracle/app/oracle/oradata/orcl/users01.dbf
SYSAUX /export/home/oracle/app/oracle/oradata/orcl/sysaux01.dbf
UNDOTBS1 /export/home/oracle/app/oracle/oradata/orcl/undotbs01.dbf
SYSTEM /export/home/oracle/app/oracle/oradata/orcl/system01.dbf
SQL> CREATE TABLESPACE test
2 DATAFILE '/export/home/oracle/app/oracle/oradata/orcl/test01.dbf' SIZE 300K;
Tablespace created.
SQL> SELECT tablespace_name,file_name FROM dba_data_files;
TABLESPACE FILE_NAME
---------- ------------------------------------------------------------
USERS /export/home/oracle/app/oracle/oradata/orcl/users01.dbf
SYSAUX /export/home/oracle/app/oracle/oradata/orcl/sysaux01.dbf
UNDOTBS1 /export/home/oracle/app/oracle/oradata/orcl/undotbs01.dbf
SYSTEM /export/home/oracle/app/oracle/oradata/orcl/system01.dbf
TEST /export/home/oracle/app/oracle/oradata/orcl/test01.dbf
SQL> SHUTDOWN IMMEDIATE
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> !
$ mv /export/home/oracle/app/oracle/oradata/orcl/test01.dbf \
> /export/home/oracle/app/oracle/oradata/test02.dbf
$ exit
SQL> STARTUP MOUNT
ORACLE instance started.
Total System Global Area 289406976 bytes
Fixed Size 778796 bytes
Variable Size 99360212 bytes
Database Buffers 188743680 bytes
Redo Buffers 524288 bytes
Database mounted.
SQL> ALTER DATABASE RENAME FILE
2 '/export/home/oracle/app/oracle/oradata/orcl/test01.dbf'
3 TO '/export/home/oracle/app/oracle/oradata/test02.dbf';
Database altered.
SQL> ALTER DATABASE OPEN;
Database altered.
SQL> SELECT tablespace_name,file_name FROM dba_data_files;
TABLESPACE FILE_NAME
---------- ------------------------------------------------------------
USERS /export/home/oracle/app/oracle/oradata/orcl/users01.dbf
SYSAUX /export/home/oracle/app/oracle/oradata/orcl/sysaux01.dbf
UNDOTBS1 /export/home/oracle/app/oracle/oradata/orcl/undotbs01.dbf
SYSTEM /export/home/oracle/app/oracle/oradata/orcl/system01.dbf
TEST /export/home/oracle/app/oracle/oradata/test02.dbf
SQL>
SQL> select DF.TOTAL/1048576 "DataFile Size Mb",
2 LOG.TOTAL/1048576 "Redo Log Size Mb",
3 CONTROL.TOTAL/1048576 "Control File Size Mb",
4 (DF.TOTAL + LOG.TOTAL + CONTROL.TOTAL)/1048576 "Total Size Mb" from dual,
5 (select sum(a.bytes) TOTAL from dba_data_files a where tablespace_name in ('SYSTEM','UNDOTBS1', 'SYSAUX', 'USERS')) DF,
6 (select sum(b.bytes) TOTAL from v$log b) LOG,
7 (select sum((cffsz+1)*cfbsz) TOTAL from x$kcccf c) CONTROL;
DataFile Size Mb Redo Log Size Mb Control File Size Mb Total Size Mb
---------------- ---------------- -------------------- -------------
1560 150 18.59375 1728.59375
SQL>
http://radiocom.kunsan.ac.kr/lecture/oracle/what_is/data_file.html