Oracle9i Dataguard 기술서 작성일 : 2005년 3월 24일업데이트 : 2006년 1월 22일 v1.8 Final 작성자 : LG카드중형서버운영파트 DBA 민연홍 Phone : 016-744-0220 E-Mail : ses0124@hanmail.net 목 차 1. dataguard 개요및아키텍처...2 (1) dataguard 란무엇인가?...2 (2) switchover and failover...2 (3) standby DB의종류...2 (4) dataguard의서비스종류...2 (5) protection mode...3 (6) dataguard의시스템구성 (2가지종류 )...3 2. standby DB 기동방법...5 3. 시스템구축 ( 실습 )...6 (1) 리스너설정및기동...6 (2) tnsnames.ora 설정...7 (3) 오라클초기화파라미터설정...7 (4) primary DB를 online backup으로 standby DB 위치로 restore...9 (5) primary DB에서 standby control file을생성해서 standby DB로전송... 10 (6) standby DB에서사용할 control file을배치... 10 (7) standby DB 기동... 10 (8) standby DB에 standby redo log file 생성... 11 (9) primary DB에 standby redo log file 생성... 11 (10) standby DB를 recovery managed mode로기동... 12 (11) log switch 적용... 12 (12) primary DB 점검... 12 (13) standby DB 점검... 14 (14) primary DB 테이블스페이스생성및데이터입력... 15 (15) standby DB예데이터입력여부확인... 15 (16) takeover 하기... 16 (17) 서비스원복 (takeover)... 18 (18) failover 하기... 19
1. dataguard 개요및아키텍처 (1) dataguard 란무엇인가? - primary DB와 standby DB를동기화시켜, primary DB가하드웨어장애등의문제가생겼을경우 standby DB로 failover 또는 switchover 시킬수있는시스템구성을말한다. - Oracle Net을통해서 primary DB의변경정보를 standby DB로적용시켜운영된다. (2) switchover and failover 1 자동실행이아니라 DBA가 action을취해야한다. 2 switchover - OS 작업또는서버 PM작업시사용 (primary -> standby, standby -> primary) 3 failover - 디스크 fail 등긴급상황에서사용, dataguard 재구성필요 (3) standby DB의종류 1 Physical standby database - block 대 block 기반으로 primary DB의 redo log를적용시켜 standby DB를동기화 2 Logical standby database - 같은 schema 정의로공유 - primary DB의 sql 문장을 standby DB에적용 (4) dataguard의서비스종류 1 Log transport Services - primary DB에서 standby DB로 redo log 정보를자동으로전송 2 Log Apply Services - redo log를 standby DB에적용 3 Role Management Service
- 데이터베이스는 primary/standby로두가지의상대적으로배타적인 role을가진다. Role Management Service는 log transport service와 log apply service를 failover 또는 switchover의상황에동적으로변경할수있다. (5) protection mode 1 Maximum Protection - primary DB와 standby DB의 redo log를동기화시킨다. standby DB가네트워크이상등의이유로 standby로의전송이안될경우 primary DB를 halt시킨다. 데이터는서로동기화되어 primary DB에서 commit을하게되면 standby DB에서 commit이완료될때까지 primary DB에서 commit 완료를하지않는다. 성능에는문제를줄소지가있으나 failover 상황이오더라도데이터손실은없다. physical standby DB에만가능하다. 2 Maximum availability - Maximum Protection 과마찬가지로 primary DB와 standby DB를동기화시킨다. 단 standby DB가네트워크문제등의이유로전송이안될지라도 halt되지는않는다. 데이터는 maximum protection 과마찬가지로 primary DB에서 commit을하게되면 standby DB 에서 commit이완료될때까지 primary DB에서 commit 완료를하지않는다. 만약 standby DB가 unavailable상태일경우임시로불일치시킨다. 또다시 standby DB가 available하면자동으로동기화시킨다. 성능에는문제를줄소지가있으나 failover 상황이오더라도데이터손실은거의없다. physical standby, logical standby DB 모두가능하다. 3 Maximum Performance - default protection mode이다. primary data에대한 protection 이가장낮다. primary database에 transaction이수행되면이것을 asynchronous 하게 standby DB에적용한다. 즉, maximum protection, maximum availability의경우에는 standby DB에적용 (commit) 될때까지 primary db의 transaction 이적용 (commit) 되지않았으나, Maximum Performance 모드에서는비동기화시키므로 primary DB에서 standby DB가 transaction 적용이끝날때까지기다리지않는다. 즉 standby db의문제로인해서 primary DB에성능영향이가지않는다. 단, failover시에는약간의데이터손실을가져올수있다. (6) dataguard의시스템구성 (2가지종류 ) 1 physical standby database 구성 (LGWR processes를사용한 Physical standby DB) Archiving to a Physical standby Destination Using the Logwriter Process
- primary db의 LGWR 프로세스가 standby DB로 redo log를보내고, standby db의 RFS 프로세스가이 redo log를 standby redo log에적용시킨다. archiving되면 archived redo logs가되고이것을 MRP process가 standby DB에적용시킨다. 2 logical standby DB 구성 Archiving to a Logical standby Destination Using the Logwriter Process - logical standby DB는 primary DB에서수행된 SQL문장을 LGWR프로세스가 standby DB로보내고 RFS 프로세스가받아서 Archived redo logs에쓴다. LSP (Logical standby process) 가 standby DB에적용시킨다. - primary DB에서 log switch가일어나게되면 standby DB의 RFS 프로세스에이를알려주어 log switch가되도록한다.
2. standby DB 기동방법 - 주의 standby db 의 startup 방식을보면아래와같다. 아래그림을기억해두면편하다. recovery managed mode open read only mount standby db nomount shutdown 1 standby DB를 read only mode에서 managed recovery mode로변경 - 그대로명령또는 shutdown immediate 이후재기동 - 첫번째방법 SQL> alter database open read only; SQL> recover managed standby database disconnect; SQL> - 두번째방법 SQL> shutdown immediate Database dismounted. SQL> startup nomount SQL> alter database mount standby database; SQL> recover managed standby database disconnect; 2 shutdown 에서 managed recovery mode 로변경 SQL> startup nomount SQL> alter database mount standby database; SQL> recover managed standby database disconnect; 3 managed recovery mode 에서 read only mode 로변경 SQL> recover managed standby database cancel; SQL> alter database open read only; 4 read only standby DB 에서 managed recovery mode 로변경
( 먼저 standby DB에연결된모든세션을종료 ) SQL> recover managed standby database disconnect; - 만약유저의세션때문에실패할경우 SQL> shutdown immediate SQL> startup nomount SQL> alter database mount standby database; SQL> recover managed standby database disconnect; 3. 시스템구축 ( 실습 ) - primary db이름은 MIN 이고, standby db이름은 STBY 이다. - 여기서는하나의서버에서 2개 DB를구성하는방법으로수행한다. - 2개서버에서도똑같이수행할수있다. - primary DB는 /data1/oradata/min 에구성되어있다. - standby DB는 /data1/oradata/stby에구성되어있다. (1) 리스너설정및기동아래와같은네트워크설정을해준다. 각서버마다설정해준다. - MIN DB에서설정 (primary DB) vi $ORACLE_HOME/network/admin/listener.ora smsvr1_min = (ADDRESS_LIST = (ADDRESS= (PROTOCOL= TCP)(Host= smsvr1)(port=2001)) ) SID_LIST_smsvr1_MIN = (SID_LIST = (SID_DESC = (ORACLE_HOME= /u/pkg/oracle/ora9i/app/oracle/product/9.2.0) (SID_NAME = MIN) ) ) - STBY DB 에서설정 (physical standby DB) vi $ORACLE_HOME/network/admin/listener.ora smsvr1_stby = (ADDRESS_LIST = (ADDRESS= (PROTOCOL= TCP)(Host= smsvr1)(port=2002)) ) SID_LIST_smsvr1_STBY =
(SID_LIST = (SID_DESC = (ORACLE_HOME= /u/pkg/oracle/ora9i/app/oracle/product/9.2.0) (SID_NAME= STBY) ) ) (2) tnsnames.ora 설정 tnsnames.ora 파일을설정한다. 서로네트워크가가능하도록하는데이름을재대로써야한다. log_archvie_dest_2='service=stby LGWR SYNC AFFIRM' 일경우 STBY 는 tnsnames.ora 에서의접속이름을말한다. - MIN DB 설정 primary DB에서설정 ( standby DB로가는네트워크구성 ) vi $ORACLE_HOME/network/admin/tnsnames.ora STBY = (DESCRIPTION = (ADDRESS = (PROTOCOL= TCP)(Host= smsvr1)(port= 2002)) (CONNECT_DATA = (SID = STBY)) ) - STBY DB 설정, standby DB에서설정 (primary DB로가는네트워크구성 ) vi $ORACLE_HOME/network/admin/tnsnames.ora MIN = (DESCRIPTION = (ADDRESS = (PROTOCOL= TCP)(Host= smsvr1)(port=2001)) (CONNECT_DATA = (SID = MIN)) ) (3) 오라클초기화파라미터설정 - MIN DB (primary DB) vi $ORACLE_HOME/dbs/initMIN.ora db_name=min compatible=9.2.0 control_files=('/data1/oradata/min/control01.ctl','/data1/oradata/min/control02.ctl') shared_pool_size=64m db_cache_size=16m undo_management=auto background_dump_dest=/data1/oradata/min/bdump
user_dump_dest=/data1/oradata/min/udump core_dump_dest=/data1/oradata/min/cdump log_archive_start=true log_archive_dest_1="location=/data1/oradata/min/archive1" log_archive_format=%t_%s.arc #### 데이터가드를위해서변경하지말것 remote_archive_enable=true dg_broker_start=true log_archive_dest_state_1=enable log_archive_max_processes=3 standby_file_management=auto db_file_name_convert='/data1/oradata/stby','/data1/oradata/min' log_file_name_convert='/data1/oradata/stby','/data1/oradata/min' standby_archive_dest='/data1/oradata/min/archive2' ##### standby DB이면열고, primary DB이면닫는다. #fal_server=stby #fal_client=min #lock_name_space=stby ## primary DB이면열고, standby DB이면닫는다. log_archive_dest_2='service=stby LGWR SYNC' - STBY DB (standby DB) - 주의할것은 DB 이름은 MIN 이다. instance 이름만 STBY 이다. vi $ORACLE_HOME/dbs/initSTBY.ora db_name=min compatible=9.2.0 control_files=('/data1/oradata/stby/control01.ctl','/data1/oradata/stby/control02.ctl') shared_pool_size=64m db_cache_size=16m undo_management=auto background_dump_dest=/data1/oradata/stby/bdump user_dump_dest=/data1/oradata/stby/udump core_dump_dest=/data1/oradata/stby/cdump log_archive_start=true log_archive_dest_1="location=/data1/oradata/stby/archive1" log_archive_format=%t_%s.arc
### 데이터가드를위해서변경하지말것 remote_archive_enable=true dg_broker_start=true log_archive_dest_state_1=enable log_archive_max_processes=3 standby_file_management=auto db_file_name_convert='/data1/oradata/min','/data1/oradata/stby' log_file_name_convert='/data1/oradata/min','/data1/oradata/stby' standby_archive_dest='/data1/oradata/stby/archive2' ## standby DB일경우아래를열기, primary DB일경우닫기 fal_server=min fal_client=stby lock_name_space=stby ##primary DB이면열고, standby DB이면닫는다. #log_archive_dest_2='service=min LGWR SYNC' - 파라미터설정에서주의해야할것을먼저보면, standby_file_management=auto 로되어있어야 primary DB에서수행한물리적인테이블스페이스추가및데이터파일추가시 standby DB에자동으로생성이된다. standby_file_management=auto로되어있을경우 db_file_name_convert='/data1/oradata/stby','/data1/oradata/min' log_file_name_convert='/data1/oradata/stby','/data1/oradata/min' 의파라미터에서 ' A 부분 ','B 부분 ' 에서 B부분이자신의 primary DB의경로를말하고 A부분이변환할 standby DB의경로를말한다. 파라미터를확인해보자. fal_server, fal_client 는 standby DB에서만사용한다. fal_server는 primary DB를설정하고 fal_client는 standby DB를설정해둔다. 이것을설정할경우 primary DB와 standby DB에 redo log 의 gap이발생했을경우자동으로맞추어주는역할을한다. fal_server=min fal_client=stby lock_name_space는한대의서버에서 primary, standby DB를운영할경우사용한다. primary, standby DB 모두 db_name은같다. 단 instance_name만다를뿐이며똑같은 DB이름을가진 instance가 startup 하기위해서는 lock_name_space를지정해주어야한다. 이것은 standby DB에서만지정해둔다. lock_name_space=stby (4) primary DB를 online backup으로 standby DB 위치로 restore <MIN DB primary DB> - primary DB를 DB를 online backup으로이동. online backup을하는것이므로 primary DB의 redo log는 standby DB로전송하지않는다. standby DB구성시자동으로 redo log가생성된다.
- primary DB는 24시간서비스이므로 shutdown 이불가능한것을가정하에구성한다. SQL> select tablespace_name, file_name, bytes/1024/1024 mega from dba_data_files; TABLESPACE_NAME FILE_NAME MEGA ---------------- ------------------------------------------------------------ ---------- SYSTEM /data1/oradata/min/system01.dbf 250 UNDOTBS /data1/oradata/min/undotbs.dbf 100 USERS /data1/oradata/min/users01.dbf 100 SQL> select name, bytes/1024/1024 mega from v$tempfile; NAME MEGA ------------------------------ ---------- /data1/oradata/min/temp01.dbf 100 - 여기서는 cp 명령이 standby DB로전송하는것을뜻한다. ftp로 primary db의백업을전송한다. SQL> alter tablespace system begin backup; SQL>!cp /data1/oradata/min/system01.dbf /data1/oradata/stby/system01.dbf SQL> alter tablespace system end backup; SQL> alter tablespace undotbs begin backup; SQL>!cp /data1/oradata/min/undotbs.dbf /data1/oradata/stby/undotbs.dbf SQL> alter tablespace undotbs end backup; SQL> alter tablespace users begin backup; SQL>!cp /data1/oradata/min/users01.dbf /data1/oradata/stby/users01.dbf SQL> alter tablespace users end backup; - tempfile은그대로복사를한다. begin backup, end backup 이필요없다. 단 tempfile 이어야한다. SQL>!cp /data1/oradata/min/temp01.dbf /data1/oradata/stby/temp01.dbf (5) primary DB에서 standby control file을생성해서 standby DB로전송 <MIN DB primary DB> primary DB에서 standby control file을생성해서 standby DB로전송 SQL> alter database create standby controlfile as '/data1/oradata/stby/stbyctl.ctl'; (6) standby DB에서사용할 control file을배치 <STBY DB standby DB의 control file에서 > standby DB에서사용할 control file을 initstby.ora 파일에있는 control file 위치에배치를한다. SQL>!cp /data1/oradata/stby/stbyctl.ctl /data1/oradata/stby/control01.ctl SQL>!cp /data1/oradata/stby/stbyctl.ctl /data1/oradata/stby/control02.ctl (7) standby DB 기동 <STBY DB standby DB 에서수행 > standby DB를기동시킨다. startup mount standby database 라는명령은없다.
nomount까지기동한후 standby DB로 mount를하고 recovery managed mode로 MRP 프로세스를기동시켜야한다. SQL> startup nomount SQL> alter database mount standby database; (8) standby DB에 standby redo log file 생성 <STBY DB standby DB 에서수행 > 우리는처음으로 standby DB를구성하였으므로 standby redo log를확인해서넣어주어야한다. 이후에는새로만들필요가없다. SQL> select * from v$logfile; GROUP# STATUS TYPE MEMBER ---------- ------- ------- ---------------------------------------- 1 ONLINE /data1/oradata/stby/log01a.log 2 ONLINE /data1/oradata/stby/log02a.log 3 ONLINE /data1/oradata/stby/log03a.log SQL> alter database add standby logfile '/data1/oradata/stby/stbylog01a.log' size 10M; SQL> alter database add standby logfile '/data1/oradata/stby/stbylog02a.log' size 10M; SQL> alter database add standby logfile '/data1/oradata/stby/stbylog03a.log' size 10M; SQL> select * from v$logfile; GROUP# STATUS TYPE MEMBER ---------- ------- ------- ---------------------------------------- 1 ONLINE /data1/oradata/stby/log01a.log 2 ONLINE /data1/oradata/stby/log02a.log 3 ONLINE /data1/oradata/stby/log03a.log 4 STANDBY /data1/oradata/stby/stbylog01a.log 5 STANDBY /data1/oradata/stby/stbylog02a.log 6 STANDBY /data1/oradata/stby/stbylog03a.log (9) primary DB에 standby redo log file 생성 <MIN DB primary DB 에서수행 > 서버문제가발생했을경우 takeover를해야하므로 primary db도 standby DB가될수있기때문에미리 standby redo log를만든다. SQL> select * from v$logfile; GROUP# STATUS TYPE MEMBER ---------- ------- ------- ----------------------------------------
1 ONLINE /data1/oradata/min/log01a.log 2 ONLINE /data1/oradata/min/log02a.log 3 ONLINE /data1/oradata/min/log03a.log SQL> alter database add standby logfile '/data1/oradata/min/stbylog01a.log' size 10M; SQL> alter database add standby logfile '/data1/oradata/min/stbylog02a.log' size 10M; SQL> alter database add standby logfile '/data1/oradata/min/stbylog03a.log' size 10M; SQL> select * from v$logfile; GROUP# STATUS TYPE MEMBER ---------- ------- ------- ---------------------------------------- 1 ONLINE /data1/oradata/min/log01a.log 2 ONLINE /data1/oradata/min/log02a.log 3 ONLINE /data1/oradata/min/log03a.log 4 STANDBY /data1/oradata/min/stbylog01a.log 5 STANDBY /data1/oradata/min/stbylog02a.log 6 STANDBY /data1/oradata/min/stbylog03a.log (10) standby DB를 recovery managed mode로기동 <STBY DB standby DB 에서수행 > standby DB를 recovery managed mode로변경한다. MRP 프로세스가생긴다. SQL> recover managed standby database disconnect; (11) log switch 적용 <MIN DB primary DB 에서수행 > standby DB를구성하는동안 primary DB와 gap이생겼을것이다. Current redo log를적용시킨다. SQL> alter system archive log current; (12) primary DB 점검 SQL> select i.instance_name, i.status instance_status, d.name dbname, d.database_role db_role, d.switchover_status switchover_status, d.protection_mode from v$database d, v$instance i; => 중요한점검포인트이다. Switchover_Status가 TO_STANDBY 이어야한다. INSTANCE_NAME INSTANCE_STA DBNAME DB_ROLE SWITCHOVER_STATUS PROTECTION_MODE ---------------- ------------ --------- ---------------- ------------------ -------------------- MIN OPEN MIN PRIMARY TO STANDBY MAXIMUM PERFORMANCE
SQL> select dest_id id,database_mode db_mode,recovery_mode, protection_mode,standby_logfile_count "SRLs", standby_logfile_active ACTIVE, archived_seq# from v$archive_dest_status; ==> 2번째로설정한곳에 mounted_standby 이어야하고 MANAGED MODE 이어야한다. ID DB_MODE RECOVER PROTECTION_MODE SRLs ACTIVE ARCHIVED_SEQ# --- --------------- ------- -------------------- ---- ------ ------------- 1 OPEN IDLE MAXIMUM PERFORMANCE 0 0 99 2 MOUNTED-STANDBY MANAGED RESYNCHRONIZATION 3 0 96 3 OPEN IDLE MAXIMUM PERFORMANCE 0 0 0 SQL> select process, status from v$managed_standby; ==> 우리는파라미터에서 LGWR 프로세스가 standby DB로전송하도록하였다. PROCESS STATUS ------- ------------ ARCH CLOSING ARCH CLOSING LGWR WRITING SQL> select dest_id "ID",destination,status,target, schedule,process,mountid mid from v$archive_dest order by dest_id; => destination 2번에우리는 service=stby로설정하였다. STBY는 tnsnames.ora 에나오는접속이름이었다. STATUS=VALID 상태이고 STANDBY 이어야한다. ID DESTINATION STATUS TARGET SCHEDULE PROCESS MID --- ----------------------------------- --------- ------- -------- ------- --- 1 /data1/oradata/min/archive1 VALID PRIMARY ACTIVE ARCH 0 2 STBY VALID STANDBY ACTIVE LGWR 0 3 INACTIVE PRIMARY INACTIVE ARCH 0 SQL> select dest_id,status,error from v$archive_dest; => archive dest 가유효해야한다. 1번 2번 destination 모두 valid상태이어야한다. DEST_ID STATUS ERROR -------- --------- ------------------------------------------------------- 1 VALID 2 VALID 3 INACTIVE
SQL> select message, timestamp from v$dataguard_status where severity in ('Error','Fatal') order by timestamp; => 아무런에러도나와서는안된다. 여기에서에러가났다면 primary DB를먼저기동하고 standby DB를기동했을경우발생할수도있으나, standby로전송이안된것일수도있으므로다른것도확인을해보아야한다. 만약 standby DB를먼저기동하고 recovery managed mode에서 MRP 프로세스를띄우고그리고나서야 primary DB를기동시켰다면아래에서는아무런메세지도나와서는안된다. 예제에서는 primary DB를먼저기동했으므로메세지가발생했을것이다. MESSAGE TIMESTAMP ------------------- -------------------- SQL> select dest_id id,database_mode db_mode,recovery_mode, protection_mode,standby_logfile_count "SRLs", standby_logfile_active ACTIVE, archived_seq# from v$archive_dest_status; ==> db_mode가 MOUNTED_STANDBY 이어야한다. recovery_mode 가 managed가되어있어야 primary DB에서전송된 redo log정보를 standby DB에적용시킬수있다. ID DB_MODE RECOVER PROTECTION_MODE SRLs ACTIVE ARCHIVED_SEQ# --- --------------- ------- -------------------- ---- ------ ------------- 1 OPEN IDLE MAXIMUM PERFORMANCE 0 0 45 2 MOUNTED-STANDBY MANAGED MAXIMUM AVAILABILITY 2 0 45 3 OPEN IDLE MAXIMUM PERFORMANCE 0 0 0 (13) standby DB 점검 SQL> select i.instance_name, i.status instance_status, d.name dbname, d.database_role db_role, d.switchover_status switchover_status, d.protection_mode from v$database d, v$instance i; => STANDBY 이어야한다. INSTANCE_NAME INSTANCE_STA DBNAME DB_ROLE SWITCHOVER_STATUS PROTECTION_MODE ---------------- ------------ --------- ---------------- ------------------ -------------------- STBY MOUNTED MIN PHYSICAL STANDBY NOT ALLOWED MAXIMUM PERFORMANCE SQL> select process, status from v$managed_standby; => 꼭 MRP 프로세스가띄워져있어야한다. PROCESS STATUS ------- ------------ ARCH CONNECTED
ARCH ARCH MRP0 RFS RFS CONNECTED CONNECTED WAIT_FOR_LOG RECEIVING ATTACHED (14) primary DB 테이블스페이스생성및데이터입력 <MIN DB primary DB> test 테이블스페이스를만들고테이블을만들고데이터를넣어본다. 주의할것은 db_file_name_convert 에서나오는것처럼 /data1/oradata/min 안에만생성을해야한다. 그래야 standby DB에데이터파일이자동으로생기게된다. 또한파라미터에서 standby_file_management=auto로되어있어야 standby DB에테이블스페이스의데이터파일이생긴다. SQL> create tablespace test datafile '/data1/oradata/min/test01.dbf' size 10M; SQL> select tablespace_name, file_name, bytes/1024/1024 mega from dba_data_files; TABLESPACE FILE_NAME MEGA ---------- ---------------------------------------- ---------- SYSTEM /data1/oradata/min/system01.dbf 250 UNDOTBS /data1/oradata/min/undotbs.dbf 100 USERS /data1/oradata/min/users01.dbf 100 TEST /data1/oradata/min/test01.dbf 10 SQL> create table test (id number(10),name varchar2(30)) tablespace users; SQL> insert into test values (1,'min1'); SQL> commit; - archive를적용시킨다. SQL> alter system archive log current; SQL> alter system archive log current; (15) standby DB예데이터입력여부확인 <STBY DB standby DB> - primary DB에서만든테이블스페이스가있는지데이터는들어갔는지확인한다. recovery managed mode를해제하고 read only로 open한다. SQL> recover managed standby database cancel; SQL> alter database open read only; ==> 정상적으로 primary DB에서만든테이블스페이스가적용되었으며, test 라는테이블에데이터 insert가정상적으로된것을확인할수있다.
SQL> select tablespace_name, file_name, bytes/1024/1024 mega from dba_data_files; TABLESPACE FILE_NAME MEGA ---------- ---------------------------------------- ---------- SYSTEM /data1/oradata/stby/system01.dbf 250 UNDOTBS /data1/oradata/stby/undotbs.dbf 100 USERS /data1/oradata/stby/users01.dbf 100 TEST /data1/oradata/stby/test01.dbf 10 SQL> select * from test; ID NAME ---------- ------------------------------ 1 min1 - 다시 recovery managed mode로만들어서 primary 에서전송된 redo log 정보가 standby DB에 적용되도록한다. fal_server, fal_client 파라미터가설정되어있으므로자동으로 gap이생긴부분을맞 추어준다. DB를 open 상태에서도 recovery managed mode로변경이가능하다. SQL> recover managed standby database disconnect; (16) takeover 하기시스템문제가발생하였다. takeover를수행한다. 1 <MIN DB primary DB> 가장먼저 primary DB에서 standby로변경을한후 standby DB를 standby DB로변경해야한다. 왜냐하면 standby DB를 primary로변경하면 hang 상태로 primary DB가 standby DB가될때까지기다리게된다. primary DB를 shutdown 한다. SQL> alter database commit to switchover to physical standby with session shutdown wait; SQL> shutdown immediate 2 <STBY DB standby DB> standby DB를 primary DB로바꾸고 shutdown 한다. 유저접속은없으므로 with session shutdown 절은안들어가도된다. SQL> alter database commit to switchover to primary; SQL> shutdown immediate 3 파라미터를변경한다. # 을붙인것을빼거나추가해서설정해준다. 실환경에서는파라미터를따로만들어서스크립트로수행하는것도좋겠다. <MIN DB primary DB> vi $ORACLE_HOME/dbs/initMIN.ora < 변경전 > #####standby DB이면열고, primary DB이면닫는다. #fal_server=stby #fal_client=min #lock_name_space=stby
##primary DB이면열고, standby DB이면닫는다. log_archive_dest_2='service=stby LGWR SYNC' < 변경후 > #####standby DB이면열고, primary DB이면닫는다. fal_server=stby fal_client=min lock_name_space=stby ##primary DB이면열고, standby DB이면닫는다. #log_archive_dest_2='service=stby LGWR SYNC' <STBY DB standby DB> vi $ORACLE_HOME/dbs/initSTBY.ora < 변경전 > ##standby 이면열고, primary DB이면닫는다. fal_server=min fal_client=stby lock_name_space=stby ##primary DB이면열고, standby DB이면닫는다. #log_archive_dest_2='service=min LGWR SYNC' < 변경후 > ##standby 이면열고, primary DB이면닫는다. #fal_server=min #fal_client=stby #lock_name_space=stby ##primary DB이면열고, standby DB이면닫는다. log_archive_dest_2='service=min LGWR SYNC' 4 < MIN DB, new standby DB > - 새롭게 standby DB가된 MIN DB를 recovery managed mode로변경한다. SQL> startup nomount SQL> alter database mount standby database; SQL> recover managed standby database disconnect; SQL> select process, status from v$managed_standby; ==> MRP 프로세스기동확인
PROCESS STATUS ------- ------------ ARCH ARCH MRP0 RFS RFS CONNECTED CONNECTED WAIT_FOR_LOG WRITING ATTACHED 5 < STBY DB, new primary DB > - new primary DB를기동한다. SQL> startup - 확인하기 SQL> select i.instance_name, i.status instance_status, d.name dbname, d.database_role db_role, d.switchover_status switchover_status, d.protection_mode from v$database d, v$instance i; => 중요한점검포인트이다. TO_STANDBY 인지확인한다. INSTANCE_NAME INSTANCE_STA DBNAME DB_ROLE SWITCHOVER_STATUS PROTECTION_MODE ---------------- ------------ --------- ---------------- ------------------ ------------------- STBY OPEN MIN PRIMARY TO STANDBY MAXIMUM PERFORMANCE SQL> select dest_id id,database_mode db_mode,recovery_mode, protection_mode,standby_logfile_count "SRLs", standby_logfile_active ACTIVE, archived_seq# from v$archive_dest_status; ID DB_MODE RECOVER PROTECTION_MODE SRLs ACTIVE ARCHIVED_SEQ# --- --------------- ------- -------------------- ---- ------ ------------- 1 OPEN IDLE MAXIMUM PERFORMANCE 0 0 109 2 MOUNTED-STANDBY MANAGED MAXIMUM AVAILABILITY 3 0 109 3 OPEN IDLE MAXIMUM PERFORMANCE 0 0 0 (17) 서비스원복 (takeover) 다시원복을시킨다. STBY DB를 standby DB로변경한후 MIN DB를 primary DB로변경한다. <STBY DB new primary DB> - primary DB를 standby DB로만들고나서 standby DB를 physical standby 만든다. 순서를잊지말자. SQL> alter database commit to switchover to physical standby with session shutdown wait; SQL> shutdown immediate <MIN DB new standby DB> - MIN DB를 primary DB로변경한다.
SQL> alter database commit to switchover to primary ; SQL> shutdown immediate <MIN DB primary DB> - 초기화파라미터를변경한다. vi $ORACLE_HOME/dbs/initMIN.ora < 원복시킨다 > #####standby DB이면열고, primary DB이면닫는다. #fal_server=stby #fal_client=min #lock_name_space=stby ##primary DB이면열고, standby DB이면닫는다. log_archive_dest_2='service=stby LGWR SYNC' <STBY DB standby DB> vi $ORACLE_HOME/dbs/initSTBY.ora < 원복시킨다 > ##standby 이면열고, primary DB이면닫는다. fal_server=min fal_client=stby lock_name_space=stby ##primary DB이면열고, standby DB이면닫는다. #log_archive_dest_2='service=min LGWR SYNC' <STBY DB standby DB> - standby DB를먼저기동시킨다. SQL> startup nomount SQL> alter database mount standby database; SQL> recover managed standby database disconnect; <MIN DB primary DB> - primary DB를기동시킨다. SQL> startup (18) failover 하기 primary DB가디스크이상으로인해서 DB 데이터파일이손상되었다. standby DB를긴급하게기동시켜야한다. MIN DB를 shutdown abort로 Down시키고, standby DB를 primary DB로기동시킨다. Failover을한후에시스템을복구해서 MIN DB를 primary DB, STBY DB를 standby DB로
원래대로구성하려면 Dataguard를재구성해야한다. 즉, failover을했다면 failover이후에 New primary DB인 STBY DB를통해서 MIN DB를 standby DB로구성하고 takeover 시키면되겠다. <MIN DB primary DB> SQL> shutdown abort <STBY DB standby DB> - recovery managed mode를해제가아닌끝내도록한다. primary DB로변경한다. SQL> recover managed standby database finish; SQL> alter database commit to switchover to primary; - 파라미터를변경후 startup 시킨다. < 주의 > 만약 New standby DB인 STBY DB까 failover가정상적으로수행되지않으면서 recovery 하라고나온다면? 이럴경우엔아래와같은명령을쓰도록한다. standby redo log가 gap이많이있는데 standby DB에적용하지못한경우에발생할수있다. 이때에는 skip하는만큼의 gap을 DB에적용하지못할수있다. SQL> alter database recover managed standby database finish skip wait; SQL> alter database commit to switchover to primary; $ORACLE_HOME/dbs/initSTBY.ora 파일에서 primary DB로파라미터를설정하고기동한다. SQL> startup ------------------------- 끝 -----------------------