본문 바로가기

DB/DBA

오라클의 tablespace 관리하기



오라클의 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의 공간을 확장하기 위해서는 두가지 방법이 있는데

  1. tablespace에 할당된 datafile 사이즈를 확장하거나
  2. 새로운 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 이동을 위해서는 다음의 순서를 따른다.

  1. 데이터베이스를 종료(shutdown)한다.
  2. 운영체제 명령을 이용해서 파일을 이동시킨다.
  3. 데이터베이스를 마운트(mount)시킨다.
  4. alter database rename file file1 to file2를 이용해서 파일을 rename한다.
  5. 데이터베이스를 오픈(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를 삭제하는 방법인데 과연 이 명령어를 쓸 일이 있을까 싶다. 삭제 방법은 다음을 따른다.
  1. tablespace를 offline으로 둔다 (선택사항이지만 권장내용이다)
  2. drop tablespace tablespace_name including contents를 이용해서 삭제한다. tablespace안에 data가 존재하는 경우 꼭 including contents를 이용한다.
  3. 이는 오라클 데이터베이스에서만 삭제될 뿐 실제 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

출처 : Tong - woosung님의 Oracle/C#/ASP통