독까의 이야기

 
# 오라클 운영 DB 를 복사하여 테스트 및 개발 DB 로 사용하고자 할 때 방법!!!!

리눅스 환경의 인스턴스 복사 관련은 자료가 좀 나오는데 윈도우는 찾을 수가 없어서 난감함.

그래서 다른 DB 서버에 덤프로 복구하고 SID 를 변경 하려고 해보았는데, 시간이 걸릴 것 같아서 포기.

다른 블로그 글 보니 SID 명을 변경하기 위해서 인스턴스를 삭제하고 변경할 SID 로 재설치 해서 SID 를 변경했다는 글을 써놔서 당황함;;;;

윈도우에서 리눅스 서버로 close backup 복구 했었던 방식 및 오라클 기술 문서를 바탕으로 테스트 진행함.

 



1.  기존 DB 에 접속하여 컨트롤 파일 생성하는 쿼리를 실행

SQL> alter database backup controlfile to trace as 'E:\CTL.sql';

정상 실행되면 CTL.sql 파일이 해당 경로에 생성 됨

 

 

2.  해당 파일을 편집기로 열어서 내용 수정

[ 편집 필요 부분 ]

STARTUP NOMOUNT    <-- 여기는 필요 없음

<--- 아래 부터 시작 --->
CREATE CONTROLFILE REUSE DATABASE "기존DB명" NORESETLOGS  NOARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 1168
LOGFILE
  GROUP 1 'E:\ORACLE\ORADATA\기존DB명\REDO01.LOG'  SIZE 50M BLOCKSIZE 512,
  GROUP 2 'E:\ORACLE\ORADATA\기존DB명\REDO02.LOG'  SIZE 50M BLOCKSIZE 512,
  GROUP 3 'E:\ORACLE\ORADATA\기존DB명\REDO03.LOG'  SIZE 50M BLOCKSIZE 512
-- STANDBY LOGFILE

DATAFILE
  'E:\ORACLE\ORADATA\기존DB명\SYSTEM01.DBF',
  'E:\ORACLE\ORADATA\기존DB명\SYSAUX01.DBF',
  'E:\ORACLE\ORADATA\기존DB명\UNDOTBS01.DBF',
  'E:\ORACLE\ORADATA\기존DB명\USERS01.DBF',
CHARACTER SET AL32UTF8
;
<--- 여기까지 내용을 수정 --->

 


[ 변경 완료 ]

 

CREATE CONTROLFILE SET DATABASE "TEST" RESETLOGS  NOARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 1168
LOGFILE
  GROUP 1 'E:\ORACLE\ORADATA\TEST\REDO01.LOG'  SIZE 50M BLOCKSIZE 512,
  GROUP 2 'E:\ORACLE\ORADATA\TEST\REDO02.LOG'  SIZE 50M BLOCKSIZE 512,
  GROUP 3 'E:\ORACLE\ORADATA\TEST\REDO03.LOG'  SIZE 50M BLOCKSIZE 512
-- STANDBY LOGFILE

DATAFILE
  'E:\ORACLE\ORADATA\TESt\SYSTEM01.DBF',
  'E:\ORACLE\ORADATA\TEST\SYSAUX01.DBF',
  'E:\ORACLE\ORADATA\TEST\UNDOTBS01.DBF',
  'E:\ORACLE\ORADATA\TEST\USERS01.DBF',
CHARACTER SET AL32UTF8
;

 

 

3.  변경 된 내용만을 CTL.ora 문서로 저장 

E:\CTL.ora

 

 

4.  기존 DB 의  init.ora 파일을 확인하여 신규 DB 명으로 복사

spfile 이 있는 경로에 INIT기존DB.ora 파일이 있음 (내 서버의 경우)
그러면 spfile 이 어디에 있는지 확인을 해야 함

SQL> show parameter spfile;

출력되는 경로 확인되면 해당 경로로 이동하여 파일 복사


INIT기존DB.ora 를 복사하여 INITTEST.ora 로 생성

생성 된 INITTEST.ora 를 편집기로 수정 

 

 

 

[ 변경 된 내용 ] 

TEST.__db_cache_size=671088640
TEST.__java_pool_size=33554432
TEST.__large_pool_size=16777216
TEST.__oracle_base='d:\oracle'#ORACLE_BASE set from environment
TEST.__pga_aggregate_target=1073741824
TEST.__sga_target=2147483648
TEST.__shared_io_pool_size=0
TEST.__shared_pool_size=1375731712
TEST.__streams_pool_size=33554432
*._optimizer_push_pred_cost_based=TRUE
*.audit_file_dest='d:\oracle\admin\TEST\adump'
*.audit_trail='db'
*.compatible='11.2.0.0.0'
*.control_files='E:\ORACLE\ORADATA\TEST\control01.ctl','d:\oracle\flash_recovery_area\TEST\control02.ctl'
*.db_block_size=8192
*.db_domain=''
*.db_name='TEST'
*.db_recovery_file_dest='d:\oracle\flash_recovery_area'
*.db_recovery_file_dest_size=4102029312
*.diagnostic_dest='d:\oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=TESTXDB)'
*.nls_language='KOREAN'
*.nls_territory='KOREA'
*.open_cursors=500
*.pga_aggregate_target=1073741824
*.processes=1000
*.remote_login_passwordfile='EXCLUSIVE'
*.sec_case_sensitive_logon=FALSE
*.sessions=555
*.sga_target=2147483648
*.undo_tablespace='UNDOTBS1'
 

 

5.  D:\oracle\admin\기존DB 를 복사하여 D:\oracle\admin\TEST 를 생성한다. (하위 폴더 포함)

4번에서 INITTEST.ora 를 생성하긴 하였지만, 아래에서 진행되는 ORADIM을 이용한  인스턴스 생성시 pfile 을 지정한 경로에 맞춰야 할 수도 있으므로 기존 DB 와 동일하게 설정을 진행함

D:\oracle\admin\TEST\pfile 에 등록되어 있는 init.ora.~~~ 를 수정

기존DB명 으로 되어 있는 부분 수정 및 파일 경로 수정하고 init.ora 로 저장 

dispatchers="(PROTOCOL=TCP) (SERVICE=TESTXDB)"

db_name=TEST

audit_file_dest=d:\oracle\admin\TEST\adump

control_files=("E:\ORACLE\ORADATA\TEST\control01.ctl", "d:\oracle\flash_recovery_area\TEST\control02.ctl")
 

 

6.  기존DB 에 접속하여 인스턴스를 중지하고 해당 인스턴스의 데이터를 신규 DB 가 저장 될 경로에 복사한다. 

SQL> shutdown immediate

E:\ORACLE\ORADATA\기존DB명 폴더에 등록되어 있는 모든 파일들을 

E:\ORACLE\ORADATA\TEST 폴더에 복사 


D:\oracle\flash_recovery_area\TEST\ 폴더 생성 

[  여기서 Control File 은 복사를 하지 않는다. 왜냐하면 아래에서 진행되는 작업을 통해 컨트롤 파일들을 새로 생성 할 것이기 때문임.  ]

컨트롤 파일이 위치하는 경로 확인하고 해당 파일들은 복사 하지 않음

SQL> select name from v$controlfile;

신규DB 의 컨트롤 파일 경로에 해당 파일들이 존재할 경우 컨트롤 파일 재생성시에 오류 발생 

복사가 완료 되었으면 기존 DB 의 인스턴스 시작 

 

7.  ORADIM 을 이용하여 신규 인스턴스를 생성

C:\> ORADIM -NEW -SID 신규DB -INTPWD 패스워드 -STARTMODE AUTO -PFILE D:\oracle\admin\신규DB\pfile\init.ora

C:\> ORADIM -NEW -SID TEST -INTPWD manager -STARTMODE AUTO -PFILE D:\oracle\admin\TEST\pfile\init.ora

명령어가 잘 실행되면 서비스에 신규 DB 인스턴스 생성 된 것이 확인 됨 

 

8.  생성 된 신규 DB 에 접속하여 인스턴스 종료 후 마운트해제하여 시작 진행 

C:\> set oracle_sid=TEST
C:\> sqlplus /nolog

SQL> conn sys /as sysdba
SQL> shutdown immediate
SQL> startup nomount

 

 

 9.  컨트롤파일 재생성을 위해 3번에서 만들어 두었던 CTL.ora 를 실행 


SQL> @E:\CTL.ora

컨트롤 파일이 정상 생성 되었음은 해당 경로에 가서 확인 가능


E:\ORACLE\ORADATA\TEST\CONTROL01.CTL
D:\oracle\flash_recovery_area\TEST\CONTROL02.CTL

 


10.  인스턴스를 정상 오픈 시킨 후 쿼리문 이용하여 기존DB 와 동일한 데이터를 갖고 있는지 확인

SQL> alter database open resetlogs;

SQL> SELECT * FROM DBA_USERS;

기존 DB 와 동일한 데이터를 가지는 것이 확인 되었으므로 테스트 종료함 

1. 오라클 데이타베이스명을 확인하는 방법

SELECT NAME, DB_UNIQUE_NAME FROM v$database;

 

2. 오라클 SID를 확인하는 방법

SELECT instance FROM v$thread;

1.  컨트롤 파일 경로 확인

select name from v$controlfile;

 

2.  데이타 파일 경로 확인

select file_name from dba_data_files;

 

3.  템프 파일 경로 확인

select file_name from dba_temp_files;

 

4.  로그 파일 경로 확인

select group#,member from v$logfile;

 

5.  spfile 경로 확인

show parameter spfile;