오라클 DB - (open, close)상태에서 tablespace이동

2022. 11. 15. 17:13데이터베이스

오라클 관리자 실습과정

 


실습 5.7 OPEN 상태에서 tablespace 이동 (필)


사용 명령어

SQL> ALTER TABLESPACE <tablespace명> OFFLINE;
 - 지정된 tablespace OFFLINE 한다.
 - Offline된 tablespace는 더 이상 접근이 불가능하다.
SQL> ALTER TABLESPACE <tablespace> RENAME DATAFILE
 2       <원래 data file명> TO <이동한 data file>;
          - Data file 등록 정보 수정(rename 한다.)
SQL> ALTER TABLESPACE <tablespace> ONLINE;
          - 지정된 tablespace를 ONLINE한다.
필요하다면 DATA FILE 레벨에서도 OFFLINE 가능하다.

SQL> ALTER DATABASE DATAFILE '<data file>' OFFLINE [DROP];
                                                 - DROP은 데이터 파일 손상시 사용한다.

SQL> ALTER TABLESPACE users OFFLINE; ← 이동 하고자 하는 tablespace를 먼저 OFFLINE 시킨다. (step1)
tablespace altered.
SQL> SELECT tablespace_name, status, contents, 
 2 extent_management, segment_space_management
 3 FROM dba_tablespaces 
 4 ORDER BY 1;                                                                  ← tablespace의 OFFLINE을 확인한다. (step2)
TABLESPACE_NAME STATUS CONTENTS EXTENT_MAN SEGMEN
---------------- --------- --------- ---------- ------
SYSAUX ONLINE PERMANENT LOCAL AUTO
SYSTEM ONLINE PERMANENT LOCAL MANUAL
TEMP ONLINE TEMPORARY LOCAL MANUAL
UNDOTBS1 ONLINE UNDO LOCAL MANUAL
USERS OFFLINE PERMANENT LOCAL AUTO
SQL> SELECT tablespace_name, bytes, file_name FROM dba_data_files;
                                                                    ← OFFLINE 된 tablespace는 data file의 크기가 표시되지 않는다.
TABLESPACE_NAME BYTES FILE_NAME
---------------- ---------- ----------------------------------------
SYSAUX 482344960 /app/ora19c/oradata/DB19/sysaux01.dbf
SYSTEM 838860800 /app/ora19c/oradata/DB19/system01.dbf
UNDOTBS1 68157440 /app/ora19c/oradata/DB19/undotbs01.dbf
USERS /app/ora19c/oradata/DB19/users01.dbf
SQL> SELECT t.name tablespace_name, d.bytes, d.name file_name 
 2 FROM v$tablespace t, v$datafile d 
 3 WHERE t.ts#=d.ts# 
 4 ORDER BY 1; ← OFFLINE 된 tablespace는 data file의 크기가 0으로 표시된다.
TABLESPACE_NAME BYTES FILE_NAME
---------------- ---------- ----------------------------------------

SYSAUX 482344960 /app/ora19c/oradata/DB19/sysaux01.dbf
SYSTEM 838860800 /app/ora19c/oradata/DB19/system01.dbf
UNDOTBS1 68157440 /app/ora19c/oradata/DB19/undotbs01.dbf
USERS /app/ora19c/oradata/DB19/users01.dbf
SQL> !ls /app/ora19c/oradata/DB19/
system01.dbf undotbs01.dbf sysaux01.dbf temp01.dbf users01.dbf
SQL> !mv /app/ora19c/oradata/DB19/users01.dbf /app/ora19c/oradata/disk3/
                                             ← data file을 이동한다. (step3)
SQL> !ls /app/ora19c/oradata/disk3/
users01.dbf
SQL> SELECT tablespace_name, bytes, file_name FROM dba_data_files;
TABLESPACE_NAME BYTES FILE_NAME
---------------- ---------- ----------------------------------------
SYSAUX 482344960 /app/ora19c/oradata/DB19/sysaux01.dbf
SYSTEM 838860800 /app/ora19c/oradata/DB19/system01.dbf
UNDOTBS1 68157440 /app/ora19c/oradata/DB19/undotbs01.dbf
USERS /app/ora19c/oradata/DB19/users01.dbf             ← data file이 이동 되었으나 dictionary 
                                                         정보는 수정 되지 않았다.
SQL> ALTER TABLESPACE users RENAME DATAFILE ← data file의 등록 정보를 수정 한다. (step4)
 2 '/app/ora19c/oradata/DB19/users01.dbf'
 3 TO '/app/ora19c/oradata/disk3/users01.dbf';
Tablespace altered.
SQL> SELECT tablespace_name, bytes, file_name FROM dba_data_files;
TABLESPACE_NAME BYTES FILE_NAME
---------------- ---------- ----------------------------------------
SYSAUX 482344960 /app/ora19c/oradata/DB19/sysaux01.dbf
SYSTEM 838860800 /app/ora19c/oradata/DB19/system01.dbf
UNDOTBS1 68157440 /app/ora19c/oradata/DB19/undotbs01.dbf
USERS /app/ora19c/oradata/disk3/users01.dbf                          ← data file의 경로가 수정 되었다.
SQL> ALTER TABLESPACE users ONLINE;                  ← 이동된 tablespace를 ONLINE 한다. (step5)
Tablespace altered.
SQL> SELECT tablespace_name, bytes, file_name FROM dba_data_files;
TABLESPACE_NAME BYTES FILE_NAME
---------------- ---------- ----------------------------------------
SYSAUX 482344960 /app/ora19c/oradata/DB19/sysaux01.dbf
SYSTEM 838860800 /app/ora19c/oradata/DB19/system01.dbf
UNDOTBS1 68157440 /app/ora19c/oradata/DB19/undotbs01.dbf
USERS 5242880 /app/ora19c/oradata/disk3/users01.dbf                  ← 이제 정상적으로 사용 가능하다.
SQL> ALTER TABLESPACE system OFFLINE;                 ← System이나 undo용 tablespace는 OFFLINE되지 않는다.
ALTER TABLESPACE system OFFLINE
*
ERROR at line 1:
ORA-01541: system tablespace cannot be brought OFFLINE; shut down if necessary
SQL> ALTER TABLESPACE undotbs1 OFFLINE;
ALTER TABLESPACE undotbs1 OFFLINE 
*
ERROR at line 1:
ORA-30042: cannot OFFLINE the undo tablespace

 


실습 5.8 Close 상태에서 tablespace 이동 (필)


MOUNT 상태에서 data file을 이동하는 과정
step 1. DB SHUTDOWN
step 2. DATA FILE 이동
step 3. DB MOUNT
step 4. ALTER DATABASE 명령으로 DATA FILE 등록
step 5. DB OPEN

 

사용 명령어
SQL> ALTER DATABASE RENAME FILE
 2 <원래 data file명> TO <이동한 data file명>;
 - Data file 등록 정보 수정
 - ALTER TABLESPACE ~ RENAME DATAFILE 명령과 동일한 효과가 있다.

SQL> SELECT tablespace_name, bytes, file_name FROM dba_data_files;
TABLESPACE_NAME BYTES FILE_NAME
---------------- ---------- ----------------------------------------
SYSAUX 482344960 /app/ora19c/oradata/DB19/sysaux01.dbf
SYSTEM 838860800 /app/ora19c/oradata/DB19/system01.dbf
UNDOTBS1 68157440 /app/ora19c/oradata/DB19/undotbs01.dbf
USERS 5242880 /app/ora19c/oradata/disk3/users01.dbf
SQL> SHUTDOWN IMMEDIATE ← DB를 SHUTDOWN 한다.(step1)
Database closed.
Database dismounted.
Oracle instance shutdown.

                                                                         
SQL> !mv /app/ora19c/oradata/DB19/sysaux01.dbf /app/ora19c/oradata/disk3/   ← DATA FILE을 이동한다. (step 2)
SQL> !mv /app/ora19c/oradata/DB19/system01.dbf /app/ora19c/oradata/disk3/   ← DATA FILE을 이동한다. (step 2)
SQL> !mv /app/ora19c/oradata/DB19/undotbs01.dbf /app/ora19c/oradata/disk3/  ← DATA FILE을 이동한다. (step 2)
SQL> !mv /app/ora19c/oradata/DB19/temp01.dbf /app/ora19c/oradata/disk3/     ← DATA FILE을 이동한다. (step 2)
SQL> STARTUP MOUNT ← DB를 MOUNT 한다. (step3) 
ORACLE instance started.
Total System Global Area 523108352 bytes
Fixed SIZE 1337632 bytes
Variable SIZE 318768864 bytes
Database Buffers 197132288 bytes
Redo Buffers 5869568 bytes
Database mounted.
SQL> SELECT t.name tablespace_name, d.bytes, d.name file_name 
 2 FROM v$tablespace t, v$datafile d 
 3 WHERE t.ts#=d.ts# 
 4 ORDER BY 1; ← Data file은 이동했으나 아직 오라클은 파일이 이전 경로에 위차하는 것으로 알고 있다.
TABLESPACE_NAME BYTES FILE_NAME
---------------- ---------- ----------------------------------------
SYSAUX 482344960 /app/ora19c/oradata/DB19/sysaux01.dbf
SYSTEM 838860800 /app/ora19c/oradata/DB19/system01.dbf
UNDOTBS1 68157440 /app/ora19c/oradata/DB19/undotbs01.dbf
USERS 5242880 /app/ora19c/oradata/disk3/users01.dbf
SQL> ALTER DATABASE RENAME file
 2 '/app/ora19c/oradata/DB19/sysaux01.dbf'
 3 TO '/app/ora19c/oradata/disk3/sysaux01.dbf';
Database altered.
SQL> ALTER DATABASE RENAME file
 2 '/app/ora19c/oradata/DB19/system01.dbf'
 3 TO '/app/ora19c/oradata/disk3/system01.dbf';
Database altered.
SQL> ALTER DATABASE RENAME file
 2 '/app/ora19c/oradata/DB19/undotbs01.dbf'
 3 TO '/app/ora19c/oradata/disk3/undotbs01.dbf';
Database altered.
SQL> ALTER DATABASE RENAME file
 2 '/app/ora19c/oradata/DB19/temp01.dbf'
 3 TO '/app/ora19c/oradata/disk3/temp01.dbf';
Database altered.
SQL> SELECT t.name tablespace_name, d.bytes, d.name file_name 
 2 FROM v$tablespace t, v$datafile d 
 3 WHERE t.ts#=d.ts# 
 4 ORDER BY 1;
TABLESPACE_NAME BYTES FILE_NAME
---------------- ---------- ----------------------------------------
SYSAUX 482344960 /app/ora19c/oradata/disk3/sysaux01.dbf
SYSTEM 838860800 /app/ora19c/oradata/disk3/system01.dbf
UNDOTBS1 68157440 /app/ora19c/oradata/disk3/undotbs01.dbf
USERS 5242880 /app/ora19c/oradata/disk3/users01.dbf
SQL> SELECT t.name tablespace_name, d.bytes,d.name file_name      ← temporary tablespace의 파일은 data file이 
 2 FROM v$tablespace t, v$tempfile d                                아니라 temp file로 9i 버전부터 별도로 
 3 WHERE t.ts#=d.ts# 관리 된다.
 4 ORDER BY 1;
TABLESPACE_NAME BYTES FILE_NAME
---------------- ---------- ----------------------------------------
TEMP 22020096 /app/ora19c/oradata/disk3/temp01.dbf

 

SQL> SELECT name FROM v$controlfile;            ← data file이외에 컨트롤 파일이나 리두 로그 파일이 어디에 
NAME                                              위치하는 확인하고 불필요한 DB19 디렉토리를 삭제한다.
----------------------------------------
/app/ora19c/oradata/disk4/control.ctl
/app/ora19c/oradata/disk5/control.ctl
SQL> SELECT member FROM v$logfile;
MEMBER
--------------------------------------
/app/ora19c/oradata/disk4/redo01.log
/app/ora19c/oradata/disk5/redo01.log
/app/ora19c/oradata/disk4/redo02.log
/app/ora19c/oradata/disk5/redo02.log
/app/ora19c/oradata/disk4/redo03.log
/app/ora19c/oradata/disk5/redo03.log
SQL> !rm -rf /app/ora19c/oradata/DB19
SQL> !ls /app/ora19c/oradata/
disk1 disk2 disk3 disk4 disk5
SQL> ALTER DATABASE OPEN; ← DB를 OPEN 한다. (step5)
Database altered.