ORACLE DATA GUARD 10g INSTALLATION (SINGLE HOST)
From
*주의 사항… 이대로 진행하면 생성에 실패할 확률이 매우 높음 ;;*
*특히 log_archive_dest_n 에 대해서는 추후 따로 이야기할 예정이니 참고
1. DATA GUARD (10g) INSTALLATION
환경정보
-SINGLE HOST, PHYSICAL STANDBY, USING SQL(수동구성)
테스트용으로 같은 PC 에 구축하며 SQL 을 이용해 수동으로 구축한다. 여기서 구축하는 STANDBY 는 PHYSICAL STANDBY 이다.
PRIMARY DB 의 정보는 다음과 같다.
NO ARCHIVE LOG
NO FLASHBACK
SID : ORCL
2. INSTALLATION OUTLINE
시간순서대로 나열한 목록이다.
PHYSICAL STAND BY DB 의 DB_UNIQUE_NAME 은 STBY 로 명명했다.
-PRIMARY DB SHUTDOWN
-PRIMARY DB MOUNT
-ARCHIVE 설정
-FLASHBACK 설정
-기타 PARAMETER 설정(*다수설정*)
-TNS : LOCAL NAMING 설정
-STAND BY CONTROLFILE 생성
-PRIMARY DB PFILE 생성
-PRIMARY DB SHUTDOWN
-DB 복사(cold backup 이용)
-CONTROL FILE 복사
-INIT PARAMETER 설정
-PHYSICAL STANDBY DB MOUNT
-PRIMARY DB OPEN
-LOG 전송 확인
3. PRACTICE
-PROFILE 설정
ORACLE_SID=stby 를 export 했다. DB 엔진이 동일하기 때문에
다른설정은 건드리지 않았다.
-PRIMARY DB SHUTDOWN
SHUTDOWN IMMEDIATE
-PRIMARY DB MOUNT
STARTUP MOUNT
-ARCHIVE 설정
ALTER DATABASE ARCHIVELOG
*log_archive_dest_n 에 설정가능한 내용은 상당히 많다. 여기서는 단순히 돌아갈수 있게만 정의 했고 내용을 뜯어보면 잘못 된 부분도 있을 수 있다. (있을거란 확신이 든다;;)*
ALTER SYSTEM SET LOG_ARCHIVE_DEST_1=
’LOCATION=/u01/oradata/flash_recovery_area/ORCL/archivelog VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=ORCL’ SCOPE=BOTH
*문서의 ‘ 는 LINUX 상에서 다른 문자로 인지된다. 수정해야함*
ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=STBY VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=STBY' SCOPE=BOTH
-FLASHBACK 설정
db_recovery_file_dest 설정
db_recovery_file_dest_size 설정
ALTER DATABASE FLASHBACK ON
-기타 PARAMETER 설정(*다수설정*)
DB_UNIQUE_NAME 확인
alter system set db_file_name_convert=
'/u01/oradata/orcl','/u01/oradata/stby' scope=spfile
alter system set log_file_name_convert=
'/u01/oradata/orcl','/u01/oradata/stby' scope=spfile
-TNS : LOCAL NAMING 설정
*여기서는 같은 리스너를 사용했다. /*+ 새로운 리스너 추가 */
<<LISTENER>>
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = orcl)
(ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
)
(SID_DESC =
(SID_NAME = stby)
(ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
)
)
LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = ocp.mycorpdomain.com)(PORT = 1521))
)
<<TNSNAMES>>
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = ocp.mycorpdomain.com)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SID = orcl)
)
)
stby =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = ocp.mycorpdomain.com)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = stby)
)
)
-STAND BY CONTROLFILE 생성
alter database create standby controlfile
as '/home/oracle/control01.ctl';
-PRIMARY DB PFILE 생성
-PRIMARY DB SHUTDOWN
SHUTDOWN IMMEDIATE
-DB 복사
cp -R orcl stby
-CONTROL FILE 복사
ALTER DATABASE BACKUP CONTROLFILE 에 정의했던 경로로 이동해
해당 파일을 원하는 경로에 복사한다.
여기서는 DATA FILE 과 같은 경로에 넣었다.
ocp@orcl : /home/oracle> cp control01.ctl /u01/oradata/stby/control02.ctl
ocp@orcl : /home/oracle> cp control01.ctl /u01/oradata/stby/control03.ctl
ocp@orcl : /home/oracle> mv control01.ctl /u01/oradata/stby/
-INIT PARAMETER 설정
앞서 만들어 놓은 PRIMARY DB 의 PFILE 을 init{$ORACLE_SID}.ora 로 복사한다.
<<Initstby.ora 수정 파라미터>> *여기서는 sid 로 stby 를 사용했다.*
db_file_convert, db_log_convert, db_name 를 제외하고 기존 orcl 부분을 stby 로 변경한다.
(실제로 stand by db 의 db_file_convert 와 db_log_convert 는 optional 한 parameter 로 삭제했다. 이 파라미터는 단순히 경로를 일괄수정하기 위한 편의 제공으로 보면 된다.)
변경에 영향받는 파라미터는 아래와 같다.
각종 dest (ex: audit_dump_dest, background_dump_dest, core_dump_dest, user_dump_dest)
control_files
db_unique_name
log_archive_dest_n
*** log_archive_dest_n 은 stby 가 Primary DB 라 상정하고 셋팅한다. ***
*.log_archive_dest_1='LOCATION=/u01/oradata/flash_recovery_area/STBY/archivelog
VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=STBY' *.log_archive_dest_2='SERVICE=STBY VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=ORCL'
*위의 파라미터는 archive log directory로 동일 위치를 사용하면 log 이동을 눈으로 확인하기 어렵기에 다른 경로를 설정했다.*
PARAMETER 에 셋팅은 했지만 존재하지 않는 폴더에 대해서는 CREATE 한다.
Ex : bdump, cdump, udump
-CREATE PASSWORD FILE OF PHYSICAL STANDBY
Stby 의 password file 을 생성한다.
Remote_login_passwordfile 은 default 가 exclusive 값으로 위에선 따로 수정하지 않았다.
-PHYSICAL STANDBY DB MOUNT
ORACLE SID 를 STBY 로 변경 후 MOUNT 한다.
위 과정에서 존재하지 않는 경로가 있게되면 에러가 난다. 에러가 날 소지가 있는
OPTIONAL 한 PARAMETER 는 배제하는게 하나의 방법이 될 수 있다.
(EX : AUDIT_DUMP_DEST)
-PRIMARY DB OPEN
-LOG 전송 확인
<in Primary>
Alter system switch logfile (2~3회 반복)
select dest_id,error
from v$archive_dest
위 쿼리를 수행시 각 dest_id 에 대해 error 컬럼이 비어있으면 정상이다.
<in standby>
SQL> select process,status from v$managed_standby;
PROCESS STATUS
--------- ------------
ARCH CONNECTED
ARCH CONNECTED
SQL> /
PROCESS STATUS
--------- ------------
ARCH CONNECTED
ARCH CONNECTED
RFS IDLE
SQL> /
PROCESS STATUS
--------- ------------
ARCH CONNECTED
ARCH CONNECTED
RFS WRITING
Stand by db 에서 log 를 받아 쓰기 시작하면 위와같이 RFS 의 상태가 WRITING 으로 바뀐다. 최초 standby db 기동 후 log 전송이 아직 없을 때는 RFS 프로세스가 없다. 위와같이 필요에 의해 한번 기동된 이래로는 작동상태가 유지된다. (위의 경우엔 WRITING / IDLE )
SQL> archive log list
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /u01/oradata/flash_recovery_area/STBY/archivelog/
Oldest online log sequence 49
Next log sequence to archive 0
Current log sequence 51
SQL> show parameter log_archive_dest_1
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest_1 string location=/u01/oradata/flash_re
covery_area/STBY/archivelog/ v
alid_for=(all_logfiles,primary
_role) db_unique_name=stby
위의 경로에 이동해 확인하면 archived log file 을 확인할 수 있다.
4. ERROR INFO
A. V$archive_dest
SQL> select dest_id,error
2 from v$archive_dest;
DEST_ID ERROR
---------- -----------------------------------------------------------------
1
2 ORA-01031: insufficient privileges
3
4
5
6
7
8
9
10
10 rows selected.
위의 경우 stby 에 대해 password file 이 생성되어 있지 않으면 나타날 수 있다.