오라클의 tablespace 관리하기
먼저, tablespace는 하나 이상의 물리적인 데이터파일들로 구성된 논리적인 데이터 저장 장소이다. 실제로 tablespace를 생성해보도록 한다.
SQL> create tablespace test
2 datafile 'c:\oracle\oradata\orcl\test_01.dbf' size 10M;
테이블 영역이 생성되었습니다.
SQL> create user test identified by test
2 default tablespace test
3 temporary tablespace temp;
사용자가 생성되었습니다.
SQL> grant connect, resource to test;
권한이 부여되었습니다.
일단 tablespace를 만들고나서는 이제 관리의 문제다. 그럼, 사용되고 있는 tablespace와 그에 해당하는 datafile을 확인해본다. 이와 같은 것을 확인하기 위해서는 data dictionary를 사용한다.
SQL> select file_name, tablespace_name from dba_data_files
2 order by tablespace_name;
FILE_NAME TABLESPACE_NAME
---------------------------------------- --------------------
C:\ORACLE\ORADATA\ORCL\CWMLITE01.DBF CWMLITE
C:\ORACLE\ORADATA\ORCL\DRSYS01.DBF DRSYS
C:\ORACLE\ORADATA\ORCL\EXAMPLE01.DBF EXAMPLE
C:\ORACLE\ORADATA\ORCL\INDX01.DBF INDX
C:\ORACLE\ORADATA\ORCL\ODM01.DBF ODM
C:\ORACLE\ORADATA\ORCL\SYSTEM01.DBF SYSTEM
C:\ORACLE\ORADATA\ORCL\TEST_01.DBF TEST
C:\ORACLE\ORADATA\ORCL\TOOLS01.DBF TOOLS
C:\ORACLE\ORADATA\ORCL\UNDOTBS01.DBF UNDOTBS1
C:\ORACLE\ORADATA\ORCL\USERS01.DBF USERS
C:\ORACLE\ORADATA\ORCL\XDB01.DBF XDB
그렇다면, 할당된 tablespace의 공간 크기와 사용 가능한 공간 크기를 알아보자. 각각은 dba_data_files와 dba_free_space에서 알 수 있다.
SQL> select tablespace_name, bytes
2 from dba_data_files
3 where tablespace_name = 'TEST';
TABLESPACE_NAME BYTES
-------------------- ----------
TEST 5242880
SQL> select tablespace_name, bytes
2 from dba_free_space
3 where tablespace_name = 'TEST';
TABLESPACE_NAME BYTES
-------------------- ----------
TEST 5111808
네이버 |
tablespace의 공간을 확장하기 위해서는 두가지 방법이 있는데
- tablespace에 할당된 datafile 사이즈를 확장하거나
- 새로운 datafile을 생성하여 tablespace에 add하는 방법이다.
먼저 첫번째 방법을 해보면,
SQL> alter database
2 datafile 'c:\oracle\oradata\orcl\test_01.dbf' resize 15M;
데이타베이스가 변경되었습니다.
SQL> select file_name, tablespace_name, bytes
2 from dba_data_files
3 where tablespace_name = 'TEST';
FILE_NAME TABLESPACE_NAME BYTES
---------------------------------------- -------------------- ----------
C:\ORACLE\ORADATA\ORCL\TEST_01.DBF TEST 15728640
이를 보면 10M에서 15M로 확장되었음을 알 수 있다. 이 resize를 이용하면 늘일 수도, 줄일 수도 있는데 이 경우 실제 사용할 수 있는 HDD 용량이나(늘일 경우) 혹은 사용하고 있는 데이터 용량(줄일 경우)이 결과에 영향을 미칠 수 있음을 생각해야 한다.
두번째 방법을 해보면,
SQL> alter tablespace test
2 add datafile 'c:\oracle\oradata\orcl\test_02.dbf' size 10M;
테이블 영역이 변경되었습니다.
SQL> select file_name, tablespace_name, bytes
2 from dba_data_files
3 where tablespace_name = 'TEST';
FILE_NAME TABLESPACE_NAME BYTES
---------------------------------------- -------------------- ----------
C:\ORACLE\ORADATA\ORCL\TEST_01.DBF TEST 10485760
C:\ORACLE\ORADATA\ORCL\TEST_02.DBF TEST 10485760
SQL> select tablespace_name, sum(bytes)
2 from dba_free_space
3 where tablespace_name = 'TEST'
4 group by tablespace_name;
TABLESPACE_NAME SUM(BYTES)
-------------------- ----------
TEST 20774912
이때 SUM을 사용했는데 datafile 갯수가 늘어나서 각각이 dba_free_space에 입력되므로 최종적인 사용 가능 영역을 확인하려면 SUM 연산을 사용해야 한다. 그렇지 않으면, 각각이 나오므로, 관리자 입장에서 합산을 해서 생각해야 한다.
tablespace에 할당된 datafile의 갯수가 늘어나면 사용 영역과 사용 가능 영역들을 한번에 볼 수 있는 질의문이 아쉬울 수 있다. 이 질의문을 잠깐 짚고 넘어가자.
SQL> select a.tablespace_name tablespace, sum(a.bytes) space, sum(b.bytes) free
2 from dba_data_files a, dba_free_space b
3 where a.file_id = b.file_id
4 group by a.tablespace_name
5 order by a.tablespace_name;
TABLESPACE SPACE FREE
------------------------------ ---------- ----------
CWMLITE 20971520 2621440
DRSYS 20971520 10813440
EXAMPLE 156631040 524288
INDX 26214400 26148864
ODM 20971520 11141120
SYSTEM 880803840 1114112
TEST 20971520 20774912
TOOLS 10485760 4128768
UNDOTBS1 4.1508E+10 347799552
USERS 26214400 26148864
XDB 196608000 2752512
11 개의 행이 선택되었습니다.
이 질의문을 보면 alias라는 별명 붙이기를 사용했음을 알 수 있다. 만약 alias를 사용하지 않았다면, 질의문 결과값이 무엇을 의미하는 것인지 질의문을 확인하기 전까지 알 수 없기 때문에 sum(a.bytes)가 할당된 전체 크기를 의미하고자 space라고 붙인 것이다. alias를 만들기 위해서는 옆에 콤마(,)를 찍지 않은채 alias 이름을 붙여주기만 하면 된다.
네이버 |
이번에는 datafile을 이동하는 경우이다. datafile 이동을 위해서는 다음의 순서를 따른다.
- 데이터베이스를 종료(shutdown)한다.
- 운영체제 명령을 이용해서 파일을 이동시킨다.
- 데이터베이스를 마운트(mount)시킨다.
- alter database rename file file1 to file2를 이용해서 파일을 rename한다.
- 데이터베이스를 오픈(open)한다.
SQL> connect /as sysdba
연결되었습니다.
SQL> shutdown immediate
데이터베이스가 닫혔습니다.
데이터베이스가 마운트 해제되었습니다.
ORACLE 인스턴스가 종료되었습니다.
화일을 move한다
SQL> startup mount
ORACLE 인스턴스가 시작되었습니다.
Total System Global Area 135339844 bytes
Fixed Size 454468 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
데이터베이스가 마운트되었습니다.
SQL> alter database rename file
2 'c:\oracle\oradata\orcl\test_01.dbf' to
3 'c:\oracle\oradata\orcl\test\test_01.dbf';
데이타베이스가 변경되었습니다.
SQL> alter database rename file
2 'c:\oracle\oradata\orcl\test_02.dbf' to
3 'c:\oracle\oradata\orcl\test\test_02.dbf';
데이타베이스가 변경되었습니다.
SQL> alter database open;
데이타베이스가 변경되었습니다.
SQL> col file_name format a40
SQL> select file_name from dba_data_files where tablespace_name = 'TEST';
FILE_NAME
----------------------------------------
C:\ORACLE\ORADATA\ORCL\TEST\TEST_01.DBF
C:\ORACLE\ORADATA\ORCL\TEST\TEST_02.DBF
네이버 |
- tablespace를 offline으로 둔다 (선택사항이지만 권장내용이다)
- drop tablespace tablespace_name including contents를 이용해서 삭제한다. tablespace안에 data가 존재하는 경우 꼭 including contents를 이용한다.
- 이는 오라클 데이터베이스에서만 삭제될 뿐 실제 datafile은 삭제되지 않기 때문에 운영체제에서 삭제한다.
SQL> select tablespace_name, status from dba_tablespaces = tablespace_name = 'TEST';
TABLESPACE_NAME STATUS
--------------- ------------------
TEST ONLINE
1 개의 행이 선택되었습니다.
SQL> alter tablespace test1 offline;
테이블 영역이 변경되었습니다.
SQL> select tablespace_name, status from dba_tablespaces = tablespace_name = 'TEST';
TABLESPACE_NAME STATUS
--------------- ------------------
TEST OFFLINE
1 개의 행이 선택되었습니다.
SQL> drop tablespace test including contents;
테이블 영역이 삭제되었습니다.
c:\oracle\oradata\orcl\ remove test_01.dbf