본문 바로가기

IT/Linux

리눅스 테이블 스페이스 변경

■ 정리한 내용 요약


1. D1 서버에서 'A' 테이블 스페이스에 있는 DATA를 'B' 테이블 스페이스로 이동

1) 'B' 테이블 스페이스 생성(CREATE TABLESPACE 이용)

2) 'B' 테이블 스페이스 유저 생성 및 권한 부여

3) 'A' 테이블 스페이스 exp하여 dump 파일 생성

4) dump 파일을 'B' 테이블스페이스로 imp


2. D2 서버에 있는 'C' 테이블 스페이스를 'A' 테이블 스페이스로 이동

1) 'A' 테이블 스페이스 있는 table, procedure, sequence 등등 drop

2) 'C' 테이블 스페이스 exp하여 dump 파일 생성

3) D1서버에서 dba 권한이 있는 user/pw를 몰랐기 때문에, 일반 계정으로 dump파일 D2서버로 복사

4) 일반 계정 권한으로 되어 있는 dump 파일을 dba 권한 계정으로 파일 소유권 변경(chown 이용) 후 파일 이동

5) dump 파일을 'A' 테이블 스페이스로 imp



1. D1 서버에서 'A' 테이블 스페이스에 있는 DATA를 'B' 테이블 스페이스로 이동


* sqlplus id/pw@ip:port/sid CMD 창에서 원격지 DB에 접속: sqlplus 아이디/패스워드@D1서버ip주소:1521/KFP


1) 'B' 테이블 스페이스 생성(CREATE TABLESPACE 이용)

  CREATE TABLESPACE B

  DATAFILE '/oracle/TEST/webdata/B.DBF' SIZE 1024M AUTOEXTEND ON NEXT 5M

  MAXSIZE UNLIMITED;


테이블 스페이스 생성 예제

[ tablespace 생성 first example ]

create tablespace [테이블 스페이스명]

datafile 'test.dbf 파일 경로'

size 10M ==> 여기까지 작성하면 기본적인 사항에 대해서만 생성된다.

autoextend on next 10M ==> (옵션)데이타 파일 용량초과시 자동증가설정

maxsize 100M ==> (옵션)데이타파일 최대크기지정

extent management local ==> (옵션)

uniform size 1M ==> (옵션)

 

[ tablespace 생성 second example]

create tablespace [테이블 스페이스명]

datafile 'test.dbf 파일 경로'

size 10M

default storage(

   initial 80k  ==> 테이블 스페이스의 맨 첫번째 extents의 크기

   next 80k  ==> 다음 extents의 크기

   minnextents 1  ==> 생성할 extents의 최소값

   maxnextents 121  ==> 생성할 extents의 최대값

   pctincrease 80  ==> extents의 증가율. (Default값은 50%)

) online ;


2) 'B' 테이블 스페이스 유저 생성 및 권한 부여

CREATE USER TESTUSER IDENTIFIED BY TESTPW

DEFAULT TABLESPACE TESTB

PROFILE DEFAULT 

QUOTA UNLIMITED ON TESTB;  // TESTB 테이블스페이스의 내용을 모두 쓸 수 있다


GRANT "CONNECT" TO TESTB WITH ADMIN OPTION; 

GRANT "DBA" TO TESTB WITH ADMIN OPTION; 

GRANT "RESOURCE" TO TESTB WITH ADMIN OPTION; 

ALTER USER TESTB DEFAULT ROLE "CONNECT", "DBA", "RESOURCE"; 


3) 'A' 테이블 스페이스 exp하여 dump 파일 생성(특정 user 소유의 오브젝트들을 export)

exp userid=아이디/패스워드 file='덤프파일 이름'

ex) exp userid=testid/testpw1234 file='TEST.DMP'


참고로 전체 데이터베이스를 export하는 구문은 아래와 같다. 모든 테이블스페이스, 모든 사용자, 모든 객체, 그리고 데이터들이 포함된다. 'full=y'를 넣어주면 됨.

exp userid=system/manager file='C:\full.dmp' full=y

ex) exp testid/testpw1234@D1서버ip주소::1521/KFP FILE='/oracle/KFP/TEST.DMP' FULL=Y


4) dump 파일을 'B' 테이블스페이스로 imp

imp userid=testb/testpw1234 file='TEST.DMP' fromuser=testa touser=testb



2. D2 서버에 있는 'C' 테이블 스페이스를 'A' 테이블 스페이스로 이동

1) 'A' 테이블 스페이스 있는 table, procedure, sequence 등등 drop

아래 SQL문을 이용해서 모든 객체를 drop 해준다.

select 'drop '||object_type||' '|| object_name|| DECODE(OBJECT_TYPE,'TABLE',' CASCADE CONSTRAINTS;',';')

from user_objects;


2) 'C' 테이블 스페이스 exp하여 dump 파일 생성

exp userid=testc/testpw1234 file='TESTAC.DMP' full=y


3) D1서버에서 dba 권한이 있는 user/pw를 몰랐기 때문에, 일반 계정으로 dump파일 D2서버로 복사

- 파일질러를 통해 generaluser 계정으로 dump 파일을 /home/generaluser 폴더에 복사

그리고 나서 

- sudo -i

를 이용하여 어드민 계정으로 로그인

- su - dba 권한가진계정 ex) su - dbauser


4) 일반 계정 권한으로 되어 있는 dump 파일을 dba 권한 계정으로 파일 소유권 변경(chown 이용) 후 파일 이동

chown dba권한가진계정id:dba TESTC.DMP   (chown 사용자명:그룹대상)

mv TESTC.DMP /home/dbauser/   (mv 현재파일경로 이동할경로)


플러스) 파일 이름 변경: mv test.dmp /home/temp/test2.dmp


5) dump 파일을 'A' 테이블 스페이스로 imp

 imp userid=testa/testpw1024 file='TEST.DMP' full=y



** 작업 시 겪었던 시행 착오


(1) 오라클 리스너가 죽었을 때

ORA-01034: ORACLE not available

ORA-27101: shared memory realm does not exist

Linux-x86_64 Error: 2: No such file or directory


1) PING은 되지만, PL-SQL에서 접속이 안될 때, TNSPING으로 리스너가 올라와 있는지 확인한다.

tnsping SID  or  tnsping IP주소

ex) tnsping KFP


2) 먼저 접속된 유저를 끊는다(리스너 종료)

lsnrctl stop


3) 오라클 종료

shutdown immediate


4) 오라클 재가동

startup


5) 리스너 시작

lsnrctl start


6) 2)~5)을 실행했지만 계속해서 plsql로 접속이 불가했음.. 그리고 다시 오라클을 접속하려 했지만 접속이 되지 않음

conn sys/as sysdba

'ORA-01109 database not open' 다음과 같은 에러 발생


7) 다음과 같은 사이트를 참고하여 오라클 재가동에 성공!

참고 사이트 1) http://www.gurubee.net/lecture/1086
참고 사이트 2) https://asktom.oracle.com/pls/apex/f?p=100:11:::NO:RP:P11_QUESTION_ID:9533870500346801323


SQL> shutdown abort;    // 종료 명령을 수행한 시점에 처리되던 SQL을 취소시키고 롤백을 수행하지 않고 데이터베이스를 종료

ORACLE instance shut down.


SQL> startup mount    // 오라클 데이터베이스 복구 수행은 MOUNT단계에서만 가능

ORACLE instance started.


Total System Global Area 1.8522E+10 bytes

Fixed Size                  2933544 bytes

Variable Size            9261026520 bytes

Database Buffers         9193914368 bytes

Redo Buffers               64172032 bytes

Database mounted.


SQL> alter database open;    // 모든 데이터베이스 파일이 열려 오라클 DB 서버 사용할 수 있음

alter database open

*

ERROR at line 1:

ORA-01157: cannot identify/lock data file 42 - see DBWR trace file

ORA-01110: data file 42: '/oracle/TTT/webdata/TEST.DBF'


SQL> alter database datafile '/oracle/TTT/webdata/TEST.DBF' OFFLINE DROP;    //Offline drop the datafile

Database altered.


SQL> ALTER DATABASE OPEN;    //If the database is at mount, open it.

Database altered.


SQL> DROP TABLESPACE TEST INCLUDING CONTENTS;    //Drop the user tablespace.

Tablespace dropped.


  - INCLUDING CONTENTS : TABLESPACE에 Data가 이미들어있을 경우 들어있는 내용을 포함해서 모두 삭제

  - CASECADE CONSTRAINTS : PRIMARY KEY가 설정되어 있는 경우에 child 의 FORIEGN KEY를 삭제하고 TABLESPACE를 삭제


  DROP TABLESPACE tablespace_name 

  INCLUDING CONTENTS [CASCADE CONSTRAINTS]




# MOUNT 단계란?

생성된 인스턴스를 사용할 데이터베이스를 찾는다.

parameter 파일에서 CONTROL_FILES에 기록된 위치의 control 파일을 읽고 데이터베이스의 물리적 아키텍쳐를 확인한다.

이때, data 파일, redo log 파일의 정보도 확인한다.

이때, 데이터베이스의 물리적 아키텍쳐를 변경하거나, data 파일의 이름 변경, ARCHIVE Mode 변경, 데이터베이스의 전체 복구를 수행한다.