ADG -2 RMAN DUPLICATE

현스·2025년 10월 23일

ADG

목록 보기
2/2
post-thumbnail

1. primary 데이테베이스에 필요한 사항 변경

a. force logging을 활성화

--현재 상태 확인

SQL> SELECT force_logging FROM v$database;

FORCE_LOGGING
---------------------------------------
NO

-- 활성화

SQL> ALTER DATABASE FORCE LOGGING;

b. 만약 존재하지 않는다면 패스워드 파일 생성

--패스워드 파일 경로에서 찾아보기

$ cd $ORACLE_HOME/dbs
$ ls -alrt orapw*
orapwprm06     <<< 패스워드 파일

--패스워드 파일 복제 후 2노드로 보내기

cp orapwprm06 orapwstb06
로컬 → 원격
scp -p ./orapwstb06 oracle@192.168.30.46:/u01/app/oracle/product/19.0.0.0/dbhome_1/dbs/

--확인
$ srvctl config database -d prm06 | egrep -i 'Password file|pwfile'
Password file:
--등록
$ srvctl modify database -d prm06 -pwfile /u01/app/oracle/product/19.0.0.0/dbhome_1/dbs/orapwprm06
--등록 확인
$ srvctl config database -d prm06 | egrep -i 'Password file|pwfile'
Password file: /u01/app/oracle/product/19.0.0.0/dbhome_1/dbs/orapwprm06

-- 아카이브 모드인지 확인

-- Primary DB 의 bash_profile 수정

ORACLE_SID 를 Primary DB 의 DB name 으로 바꾼다.

-- Primary DB 의 LISTENER 확인



-- Primary DB 의 Instance 확인

-- Primary DB 의 tnsnames.ora

-- Standby DB 의 bash_profile 수정

--

c. standby redologs를 생성 // 리두로그 +1 개

--기존 리두 로그 확인

-- 멤버 경로(ASM/파일시스템), 사이즈(MB), 그룹/스레드별 정렬
SELECT l.thread#, l.group#, l.status, l.sequence#,
       l.bytes/1024/1024 AS size_mb,
       l.members, lf.member   
FROM   v$log l
JOIN   v$logfile lf
  ON   l.group# = lf.group#
ORDER  BY l.thread#, l.group#, lf.member;

standby logfile 생성

ALTER DATABASE ADD STANDBY LOGFILE '+DATAC6' SIZE 200M; << 크기 확인하고 만들어야돼
ALTER DATABASE ADD STANDBY LOGFILE '+DATAC6' SIZE 200M; 
ALTER DATABASE ADD STANDBY LOGFILE '+DATAC6' SIZE 200M; 
ALTER DATABASE ADD STANDBY LOGFILE '+DATAC6' SIZE 200M; 

확인

SET PAGES 100 LINES 220 TRIMSPOOL ON
COL member_list FOR A140
SELECT s.thread#,
       s.group#,
       s.status,                       -- UNUSED / ACTIVE / UNASSIGNED
       s.bytes/1024/1024 AS size_mb,
       LISTAGG(lf.member, ', ') WITHIN GROUP (ORDER BY lf.member) AS member_list
FROM   v$standby_log s
JOIN   v$logfile lf
       ON s.group# = lf.group#
WHERE  lf.type = 'STANDBY'
GROUP  BY s.thread#, s.group#, s.status, s.bytes
ORDER  BY s.thread#, s.group#;

SELECT process, status, thread#, sequence#
FROM   v$managed_standby
ORDER  BY process;

ALTER SYSTEM ARCHIVE LOG CURRENT;

--확인
SELECT sequence#, thread#, dest_id, name
FROM   v$archived_log
ORDER  BY first_time DESC FETCH FIRST 5 ROWS ONLY;
-- 아무것도 안나오면 로그스위치
ALTER SYSTEM ARCHIVE LOG CURRENT;


d. 파라미터 파일을 데이터가드에 적합하게 변경

--primary 의 데이터가드를 위해 primary 초기 파라미터 수정

dbname prm06, stb06

ALTER SYSTEM SET LOG_ARCHIVE_CONFIG = 'DG_CONFIG=(prm06,stb06)' ;

ALTER SYSTEM SET LOG_ARCHIVE_DEST_1 = 'LOCATION=+RECOC6 VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=prm06';

ALTER SYSTEM SET LOG_ARCHIVE_DEST_2 = 'SERVICE=stb06 LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)
   DB_UNIQUE_NAME=stb06' ;

ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_1=ENABLE;

ALTER SYSTEM SET FAL_SERVER='stb06' ;
ALTER SYSTEM SET FAL_CLIENT='prm06' ;

ALTER SYSTEM SET DB_FILE_NAME_CONVERT='/+DATAC6/STB06/' , '/+DATAC6/PRM06/' SCOPE=spfile ;
ALTER SYSTEM SET LOG_FILE_NAME_CONVERT='/+RECOC6/STB06/' , '/+RECOC6/PRM06/' SCOPE=spfile ;

---- Standby DB LISTENER

rman duplicate 방식으로 ADG 를 구성할 때 Standby DB의 LISTENER는
현재 DB 가 생성되어있지 않은 상태에서 구성을 하고 있으므로 LISTENER 의 이름과 포트번호를 명시해주어야한다.

listener.ora 파일에 HOST = VIP 주소 로 적고 PORT 번호를 Primary DB 와 다른 번호를 사용 하여 구성한다.

LISTENER_STB06 =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL=TCP)(HOST=192.168.30.48)(PORT=1523))
      (ADDRESS = (PROTOCOL=IPC)(KEY=LISTENER))
    )
  )

SID_LIST_LISTENER_STB06 =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = stb06)
      (ORACLE_HOME = /u01/app/oracle/product/19.0.0.0/dbhome_1)
      (SID_NAME = stb06)
    )
  )

---- Standby DB tnsnames.ora

PRM06 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.30.47)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = prm06)
    )
  )



STB06 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.30.48)(PORT = 1523))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = stb06)
    )
  )



STB06_SID =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.30.48)(PORT = 1523))
    (CONNECT_DATA =
      (SID = stb06)
      (SERVER = DEDICATED)
      (UR = A)
    )
  )
  

-- pfile (init.ora) 복제

primary db 의 pfile 을 복사하여 stadby db 로 옮긴다.

-- prm06 에서
CREATE PFILE='/u01/app/oracle/product/19.0.0.0/dbhome_1/dbs/initprm06.ora'
    FROM SPFILE;
-- prim --> stadby 로 scp
scp -p ./initprm06.ora oracle@192.168.30.46:/u01/app/oracle/product/19.0.0.0/dbhome_1/dbs/

mv initprm06.ora  initstb06.ora

ls -alrt
1496 Oct 22 18:05 initstb06.ora



--stb06 의 파라미터 파일 수정

1)없는 디렉토리 생성
 mkdir -p /u01/app/oracle/admin/stb06/adump

chown -R oracle:oinstall /u01/app/oracle/admin/stb06/adump
chmod 750 /u01/app/oracle/admin/stb06/adump
2)스탠바이디비 컨트롤파일 경로 설정

asmcmd mkdir +DATAC6/STB06/CONTROLFILE
ASMCMD> pwd
+DATAC6/STB06/CONTROLFILE   <<< 컨트롤파일

------ primary 컨트롤파일 rename

기존 current.* 를 두 새 경로로 복제
ASMCMD> cp +DATAC6/PRM06/CONTROLFILE/current.363.1215162885 +DATAC6/PRM06/CONTROLFILE/control01.ctl
ASMCMD> cp +DATAC6/PRM06/CONTROLFILE/current.363.1215162885 +DATAC6/PRM06/CONTROLFILE/control02.ctl

ALTER SYSTEM SET control_files =
  '+DATAC6/PRM06/CONTROLFILE/control01.ctl',
  '+DATAC6/PRM06/CONTROLFILE/control02.ctl'
SCOPE=SPFILE;

-- 반영 위해 재기동

SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
SELECT name FROM v$controlfile;   -- 두 경로 모두 보여야 정상

ALTER DATABASE OPEN;

ASMCMD> rm Current.363.1215162885   <<< 원래 있던거 삭제
ASMCMD> ls
control01.ctl
control02.ctl


만든 inin(db_unique_name).ora 파일로 startup nomount

SQL> STARTUP NOMOUNT PFILE='$ORACLE_HOME/dbs/initstb06.ora';
ORACLE instance started.

Total System Global Area 3221222440 bytes
Fixed Size                  8930344 bytes
Variable Size             603979776 bytes
Database Buffers         2566914048 bytes
Redo Buffers               41398272 bytes

--상태확인

SQL>  SHOW PARAMETER audit_file_dest;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
audit_file_dest                      string      /u01/app/oracle/admin/stb06/ad
                                                 ump

SQL> select instance_name, status from v$instance;

INSTANCE_NAME    STATUS
---------------- ------------
stb06            STARTED

--
tnsping prm06
tnsping stb06

--
sqlplus /nolog

connect sys/welcome1(비밀번호)@prm06 AS SYSDBA
connect sys/welcome1(비밀번호)@stb06 AS SYSDBA

--stand by DB 의 파라미터 파일을 모두 구성하고
primary DB 에서 RMAN 으로 접속하여 DUPLICATE TARGET DATABASE 하고 마무리.

-- RMAN 접속 
#standby 노드에서 실행
rman target sys/welcome1@prm06 auxiliary sys/welcome1@stb06


RUN {
ALLOCATE CHANNEL prmy1 TYPE DISK;
ALLOCATE CHANNEL prmy2 TYPE DISK;
ALLOCATE CHANNEL prmy3 TYPE DISK;
ALLOCATE CHANNEL prmy4 TYPE DISK;
ALLOCATE AUXILIARY CHANNEL stby TYPE DISK;
DUPLICATE TARGET DATABASE FOR STANDBY FROM ACTIVE DATABASE ;
}

--- 관리 복구

alter database recover managed standby database disconnect from session;

alter database recover managed standby database cancel;

alter database open;


alter database recover managed standby database disconnect;  << 동기화 하겠다
--테스트
SQL@prm06 > CREATE USER testdg IDENTIFIED BY "Welcome1"
  DEFAULT TABLESPACE users
  TEMPORARY TABLESPACE temp
  QUOTA UNLIMITED ON users; 

SQL@prm06 > GRANT CREATE SESSION, CREATE TABLE  TO testdg;

Grant succeeded.


-- 2) 테스트 오브젝트 생성
CREATE TABLE testdg.t_dg (
  id         NUMBER        PRIMARY KEY,
  msg        VARCHAR2(100),
  created_at TIMESTAMP     DEFAULT SYSTIMESTAMP
);

CREATE SEQUENCE testdg.s_dg START WITH 1 INCREMENT BY 1 CACHE 20;

-- 3) 샘플 데이터 적재
INSERT INTO testdg.t_dg (id, msg) VALUES (testdg.s_dg.NEXTVAL, 'hello from primary');
INSERT INTO testdg.t_dg (id, msg) VALUES (testdg.s_dg.NEXTVAL, 'second row');
COMMIT;

-- 4) 확인
SELECT * FROM testdg.t_dg ORDER BY id;

-- (선택) ADG 실시간 적용 확인을 빠르게 하려면 로그 스위치
ALTER SYSTEM ARCHIVE LOG CURRENT;
SQL> SELECT process, status, thread#, sequence#
FROM   v$managed_standby
ORDER  BY process; 

PROCESS   STATUS          THREAD#  SEQUENCE#
--------- ------------ ---------- ----------
ARCH      CONNECTED             0          0
ARCH      CONNECTED             0          0
ARCH      CONNECTED             0          0
ARCH      CONNECTED             0          0
DGRD      ALLOCATED             0          0
DGRD      ALLOCATED             0          0
MRP0      WAIT_FOR_LOG          1          2
profile
˗ˋˏ O R A C L E ˎˊ˗

0개의 댓글