ORACLE/Backup & Recovery2009. 10. 19. 13:57
반응형

오라클 10g 에서 기존에 올라온 DB 복제 하는 방법입니다..

 

핫백업 받아 둔것과  트레이스로 컨트롤 파일을 떠서

 

기존 데이타 파일 복사와 컨트롤 파일 재생성으로 디비 복제 하는 방법입니다.

 

테스트 완료 된 내용입니다. 참고하시어 업무에 도움 되시길 바래요

 

+ Clone DB Creation with Hot Backup on HP-UX oracle10g +

 

1. 기존 DB가 noarchive mode 라면  archive log mode로 변경 작업

 

  1.0     init$ORACLE_SID.ora 파일에
          log_archive_dest='/oradata1/$ORACLE_SID/arch'
          log_archive_format='arch_%t_%s_%r.arc'
          #log_archive_start=TRUE -- under 9i 추가
  
  1.1     col host_name for a20
             col instance_name for a20
            col status for a10
         
      select host_name,instance_name, status from v$instance;
             >> status = open 확인 
      archive log list;
             >> archive log status 확인
      or

      select db_unique_name, log_mode from v$database;


       DB_UNIQUE_NAME               LOG_MODE
       ----------------------- ----------------------     확인
       ORA102                                 NOARCHIVELOG
 
  1.2     SQL> shutdown immediate >> DB 내려간 상태 확인후
            SQL> startup mount 로 디비 올림
           select host_name,instance_name, status from v$instance;
             >> status = mounted 확인
          

          아카이브 모드로 변경

          alter database archivelog; 
          archive log list; 로 아카이브 모드로 변경되었는지 확인후
          alter database open; 으로 디비 올림.       
  
   -----------------------------   or   ---------------------------------------
  
          만약 접속된 세션이 없다면 , 
          Database Open  상태에서
           select host_name,instance_name, status from v$instance;
             >> status = open 확인
          SQL> alter database close immediate; 로 내린다.
          select host_name,instance_name, status from v$instance;
             >> status = mounted 확인

          아카이브 모드로 변경
          alter database archivelog; 

          archive log list; 로 아카이브 모드로 변경되었는지 확인 후
          shutdown immediate
          startup     
  
   ----------------------------------------------------------------------------
  
  1.3     select host_name,instance_name, status from v$instance;
               >> status = open 확인
            archive log list;
               >> archive log mode 확인.

 

2. 간단한 test용 user를 만들어서 간단한 table 및 data를 넣는다.
 
  2.1 test user 생성
  create user test identified by test
  default tablespace users
  temporary tablespace temp; 
  
  2.2 권한 부여
  SQL> grant resource, connect to test; 로 권한 부여
 
  2.3 table & data 생성
  SQL> conn test/test 로 접속
 
  SQL> create table test_table (
    num number
    );
  
  SQL> begin
    for i in 1.. 10000 loop
            insert into test_table (num) values (i);
    end loop;
    commit;
    end;
    /

  SQL> select count(*) from test_table;

      COUNT(*)
      ----------
      10000

 

>> 복제된 DB에서 위 데이타 확인을 위한 사항.

 

3. Log swich를 일으킨다.

 SQL> alter system switch logfile;
 SQL> /
 SQL> /
 
4. Online backup을 받아 놓는다.
   
 -- Controlfile Backup

 ALTER DATABASE BACKUP CONTROLFILE TO '/oradata1/CLONE/control.bak' REUSE

 alter session set tracefile_identifier='ORA102_CONTROLFILE_BACKUP'

 ALTER DATABASE BACKUP CONTROLFILE TO TRACE

 $] cd $ORACLE_HOME/admin/$ORACLE_SID/udump
 $] ls *ORA102_CONTROLFILE_*
 ...
 ora102_ora_6948_ORA102_CONTROLFILE_BACKUP.trc

 $] vi ora102_ora_6948_ORA102_CONTROLFILE_BACKUP.trc

하여 내용을 확인하자. (내용인 즉슨 create controlfile... 문이 있어야 된다.)

 

 -- 조회 결과문의 헤더,피드백,시간,조회시간,번복 값 끄기   >>  조회 결과 값만 출력되게 하기위해..
 set head off
 set feedback off
 set time off
 set timing off
 set echo off

 

 -- 테이블 스페이스 비긴 백업 구문 조회로 명령어 얻기
 select 'alter tablespace '||tablespace_name||' begin backup;' from dba_tablespaces
 where status='ONLINE' and contents <> 'TEMPORARY'

 

 alter tablespace SYSTEM begin backup;
 alter tablespace UNDOTBS1 begin backup;
 alter tablespace SYSAUX begin backup;
 alter tablespace USERS begin backup;
 alter tablespace YBJ_TBS begin backup;
 alter tablespace JYS_TEST begin backup;
 alter tablespace HKH_TEST begin backup;
 alter tablespace TEST_JYS begin backup;

 

 또는

 

 alter database begin backup;  10g 부터..

 

 -- 복사할 데이타 파일 조회로 명령어 얻기
 select '!cp '||name||' /oradata1/ORA102_backup/' from v$datafile;

 

 !cp /oradata1/ORA102/system01.dbf /oradata1/ORA102_backup/
 !cp /oradata1/ORA102/undotbs01.dbf /oradata1/ORA102_backup/
 !cp /oradata1/ORA102/sysaux01.dbf /oradata1/ORA102_backup/
 !cp /oradata1/ORA102/users01.dbf /oradata1/ORA102_backup/
 !cp /oradata1/ORA102/ybj01.dbf /oradata1/ORA102_backup/
 !cp /oradata1/ORA102/ybj02.dbf /oradata1/ORA102_backup/
 !cp /oradata1/ORA102/ybj03.dbf /oradata1/ORA102_backup/
 !cp /oradata1/ORA102/ybj04.dbf /oradata1/ORA102_backup/
 !cp /oradata1/ORA102/jys01.dbf /oradata1/ORA102_backup/
 !cp /oradata1/ORA102/jys02.dbf /oradata1/ORA102_backup/
 !cp /oradata1/ORA102/jys03.dbf /oradata1/ORA102_backup/
 !cp /oradata1/hkh_test01.dbf /oradata1/ORA102_backup/
 !cp /oradata1/ORA102/test_jys.dbf /oradata1/ORA102_backup/

 

 -- 테이블 스페이스 엔드 백업 구문 조회로 명령어 얻기
 select 'alter tablespace '||tablespace_name||' end backup;' from dba_tablespaces
 where status='ONLINE' and contents<>'TEMPORARY'

 

 alter tablespace SYSTEM end backup;
 alter tablespace UNDOTBS1 end backup;
 alter tablespace SYSAUX end backup;
 alter tablespace USERS end backup;
 alter tablespace YBJ_TBS end backup;
 alter tablespace JYS_TEST end backup;
 alter tablespace HKH_TEST end backup;
 alter tablespace TEST_JYS end backup;
  
 또는

 

 alter database end backup; 10g 부터..

 

5. Log swich 5번을 일으킨다.

 SQL> alter system switch logfile;
 SQL> /
 SQL> /
 SQL> /
 SQL> /
   

6. Backup 받은 파일과 controlfile의 trace를 이용하여 SID가 CLONE인 clone db를 하나 더 생성한다.
  (datafile 위치는 임의 지정)

 

 6.1. Backup 받은 데이타 파일들과 초기화파일을 CLONE DB에서 데이타 파일과 초기화 파일을 지정할 위치에 카피해서 넣어둔다.
        $] cp /oradata1/ORA102_backup/*.dbf /oradata1/CLONE/
        $] cp $ORACLE_HOME/dbs/initORA102.ora cp /oradata1/CLONE/init.ora
 
 6.2. CLONE DB 의 덤프 디렉토리를 생성한다.
 $] cd $ORACLE_BASE/admin
 $] mkdir CLONE
 $] cd CLONE
 $] mkdir adump bdump cdump udump
 
 6.3. CLONE DB 생성 시작

 

 6.3.0 /etc/oratab 파일에 다음과 같이 추가하자.(기존 DB SID 아래 붙이면 된다.)

    $] vi /etc/oratab

     ....

     CLONE:/oracle10/app/oracle/product/102:N   # ORACLE_SID:$ORACLE_HOME:<system boot 시 자동시작 여부 Y/N>

     ....

    

     :wq

  
  6.3.1 CLONE DB 용 orapwd 생성
 $] cd $ORACLE_HOME/dbs
 $] orapwd file=orapwCLONE password=oracle entries=5
 
  6.3.2 백업해둔 init.ora 파일을 CLONE DB에 맞게 경로 수정 및 db_name 바꺼주기.
 $] vi /oradata1/CLONE/init.ora
-- 확인 사항 -- 

 audit_file_dest
  background_dump_dest
  core_dump_dest
  user_dump_dest
  control_files
   log_archive_dest
   <SGA 영역들의 이름 앞에 붙는 SID : 있을경우만>
 
   6.3.3 sqlplus 접속 후 sys 접속
 $] sqlplus /nolog
 SQL> conn sys as sysdba
 password : oracle
 Connected.
 
  6.3.4 백업해둔 init.ora 파일로 DB nomount : 컨트롤 파일 재생성을 위해
 SQL> startup nomount pfile='/oradata1/CLONE/init.ora'

   6.3.5 controlfile을 백업한 trace 파일을 열어 resetlogs 에 해당하는 부분의 sql 구문을 복사한다.
   6.3.6 복사한 후 실행하 sql 문 생성.
   6.3.7 복사한 구문 붙여넣기 한 후 데이타 파일 의 디비 이름을 클론db 이름으로 갱신을 위해
         set DATABASE "CLONE" 을 써준다. 노아카이브로 올리기.(NOARCHIVELOG 옵션을 붙여준다.)

  $] vi ctl.sql
  CREATE CONTROLFILE SET DATABASE "CLONE" RESETLOGS NOARCHIVELOG
  MAXLOGFILES 16
  MAXLOGMEMBERS 3
  MAXDATAFILES 100
  MAXINSTANCES 8
  MAXLOGHISTORY 2920
  LOGFILE
   GROUP 1 '/oradata1/ORA102/redo01.log'  SIZE 50M,
   GROUP 2 '/oradata1/ORA102/redo02.log'  SIZE 50M,
   GROUP 3 '/oradata1/ORA102/redo03.log'  SIZE 50M
  -- STANDBY LOGFILE
  DATAFILE
   '/oradata1/ORA102/system01.dbf',
   '/oradata1/ORA102/undotbs01.dbf',
   '/oradata1/ORA102/sysaux01.dbf',
   '/oradata1/ORA102/users01.dbf',
   '/oradata1/ORA102/ybj01.dbf',
   '/oradata1/ORA102/ybj02.dbf',
   '/oradata1/ORA102/ybj03.dbf',
   '/oradata1/ORA102/ybj04.dbf',
   '/oradata1/ORA102/jys01.dbf',
   '/oradata1/ORA102/jys02.dbf',
   '/oradata1/ORA102/jys03.dbf',
   '/oradata1/hkh_test01.dbf',
   '/oradata1/ORA102/test_jys.dbf'
  CHARACTER SET KO16KSC5601
  ;
 :wq
 
 SQL> @ctl.sql
 
 6.3.8 아카이브 로그 복구 < 아카이브가 모두 있을 시 >
 SQL> RECOVER DATABASE USING BACKUP CONTROLFILE;
 
 6.3.9 불완전 복구 < 아카이브가 부족한 부분이 있을 시 >
 SQL> RECOVER DATABASE USING BACKUP CONTROLFILE UNTIL CANCEL;
 
 6.3.10 Resetlogs 옵션으로 데이터베이스 OPEN
 SQL> alter database open resetlogs;

 Database altered.

 SQL> select host_name,instance_name, status from v$instance; 로 디비 상태 확인.

 

 6.3.11 Temp 는 가져오지 않았기 때문에 따로 생성 해준 후 디폴트로 설정.
 SQL> create temporary tablespace temp
       Tempfile ‘/oradata1/CLONE/temp01.d b f’ size 100M;
      
 SQL> select name,bytes,status from v$tempfile;
 
 NAME                                                            BYTES               STATUS
---------------------------------- ------------- --------------
/oradata1/CLONE/temp01.dbf             104857600        ONLINE

SQL> alter database default temporary tablespace temp;

 

 Set linesize 200
 Col property_name for a30
 Col property_value for a15
 Col description for a40
 
SQL> select * from database_properties
              Where property_name like ‘%TEMP%’;
             
 PROPERTY_NAME                                     PROPERTY_VALUE            DESCRIPTION
--------------------------------- ---------------------- ----------------------------------------------
DEFAULT_TEMP_TABLESPACE                  TEMP01                              Name of default temporary tablespace

 

7. Clone db가 Noarchive log mode로 되었는지 확인
 
 SQL> archive log list;

 

8. DB 정상 open 확인 후 2번에서 만든 test용 table의 data를 확인한다.

 SQL> conn test/test

 Connected.
 SQL> select * from tab;
 SQL> select count(*) from test_table;

    COUNT(*)
    ----------
     10000

 

9. 리스너를 생성한다. Port는 1527로 사용한다.
 $]cd $TNS_ADMIN or cd $ORACLE_HOME/network/admin
        $]vi listener.ora
 
 SID_LIST_LISTENER =
   (SID_LIST =
     (SID_DESC =
       (SID_NAME = PLSExtProc)
       (ORACLE_HOME = /oracle10/app/oracle/product/102)
       (PROGRAM = extproc)
     )
   )

 LISTENER =
    (DESCRIPTION_LIST =
      (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP)(HOST = hp_host_name)(PORT = 1521))
        (ADDRESS = (PROTOCOL = TCP)(HOST = hp_host_name)(PORT = 1527))
       (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
      )
    )  
:wq

 

다음과 같이 차례대로 실행 한다.
   $] lsnrctl
Lsnrctl > stop -> start -> status

 

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=inno-hp)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for HPUX: Version 10.2.0.4.0 - Production
Start Date                19-JAN-2009 19:59:50
Uptime                    0 days 0 hr. 6 min. 2 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /oracle10/app/oracle/product/102/network/admin/listener.ora
Listener Log File         /oracle10/app/oracle/product/102/network/log/listener.log
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=inno-hp.innolime.com)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=inno-hp.innolime.com)(PORT=1527)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC0)))
Services Summary...
Service "CLONE" has 1 instance(s).
  Instance "CLONE", status READY, has 1 handler(s) for this service...
Service "CLONE_XPT" has 1 instance(s).
  Instance "CLONE", status READY, has 1 handler(s) for this service...
Service "ORA102" has 1 instance(s).
  Instance "ORA102", status READY, has 1 handler(s) for this service...
Service "ORA102_XPT" has 1 instance(s).
  Instance "ORA102", status READY, has 1 handler(s) for this service...
Service "PLSExtProc" has 1 instance(s).
  Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
  

10. 두 DB 간  test 를 해보자.

 

$]export ORACLE_SID=ORA102
$]sqlplus sys/oracle@CLONE as sysdba
SQL> show parameter db_name
db_name : CLONE 으로 뜨면 성공 

 

$]export ORACLE_SID=CLONE
$]sqlplus sys/oracle@ORA102 as sysdba
SQL> show parameter db_name
db_name : ORA102 로 뜨면 성공


반응형
Posted by [PineTree]