--현재 상태 확인
SQL> SELECT force_logging FROM v$database;
FORCE_LOGGING
---------------------------------------
NO
-- 활성화
SQL> ALTER DATABASE FORCE LOGGING;


--패스워드 파일 경로에서 찾아보기
$ 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