★ CTF (Connect Time Failover)
이번에는 명령 프롬프트 창 1개, 퍼티 창 1개에서 수행해 보자.
tnsnames.ora 파일의 racdb 부분 다시 수정하기 > 저장
racdb =
(DESCRIPTION =
(LOAD_BALANCE = YES)
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.56.111)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.56.112)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = racdb)
)
)
<< client session >> 명령 프롬프트 창
SQL+로 접속하기
C:\Users\itwill> sqlplus sys/oracle@racdb as sysdba
SQL> select instance_name from v$instance;
INSTANCE_NAME
---------------------------
racdb2
롱 쿼리 문장 준비만 해놓기
(분명히 말했어............ '준비만' 해놓으라고........... 이거 수행 절대 하지마.......... 내가 하랄 때 해.........)
SQL> select * from all_objects;
<< server session >> 퍼티 rac1 창
(아래 명령어 붙여넣기만 하고 & 수행은 하지말고 기다리기!!!!!!!!!!!!!
client 창 먼저 수행하고 나서 그다음에 수행할거야!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)
[oracle@rac1 ~]$ srvctl stop instance -d racdb -i racdb2
(racdb2 중단시키는 명령어)
일단 이렇게 창을 위아래로 붙여서 준비를 먼저 해놓고 나서
클라이언트 쪽에서 먼저 준비해놓은 명령어 수행하고 > 바로 이어 서버 창에서 rac2 내리는 명령어 수행하기
<< client session >> 명령 프롬프트 창
SYS@racdb> select * from all_objects;
아까 준비해놓은 롱 쿼리 문장 던지기
(수행하면 > 뭐가 엄청 빨리 지나가다가 어느 순간 갑자기 멈춘다.
이건 rac2 노드가 내려간 걸 감지했기 때문에 저 순간에 잠깐 멈췄던 것)
그러다가 어느 순간 갑자기 창이 멈추면서 오류 (ORA-01089) 메시지가 뜬다.
명령 프롬프트 창이 요란했던 것에 비하면
서버 쪽 창은 매우 조용함.
한쪽 노드 (rac1) 에서는 작업을 진행하고 있었고
다른 쪽 노드 (rac2) 는 멀쩡하게 돌아가고 있었는데
한쪽 노드에서 문제 발생 > 다른 쪽 노드는 안내려가야 정상
진짜로 그런지 확인해보자.
[oracle@rac1 ~]$ srvctl status database -d racdb -v
Instance racdb1 is not running on node rac1
Instance racdb2 is not running on node rac2
어휴... 뭐 하나 조용히 넘어가는 법이 없고만?...
저렇게 노드가 둘다 내려갔을 때는 > crs_start -all 명령어로 다시 올려주고
(srvctl status database -d racdb -v 명령어로 올라왔는지 확인하기)
처음부터 다시 수행해보자.
두번째 시도
이번에는 이런 에러가 뜸.
그리고 진짜로 한쪽 노드만 내려갔는지 확인해보면
진짜로 rac2 한쪽만 내려갔다.
<< client session >> 명령 프롬프트
exit 하고 다시 접속하면: 문제 없이 잘 접속된다.
SQL> exit
C:\Users\itwill> sqlplus sys/oracle@racdb as sysdba
그리고 + 에서
SQL> select instance_name from v$instance;
수행하면 : 1번 노드로 접속된다. (2번 노드가 죽었기 때문)
INSTANCE_NAME
---------------------------
racdb1
다른 select 문장 던져보기
SQL> select * from dba_users where username = 'HR';
아무 문제도 없다.
하지만 새로 명령 프롬프트를 켜서 sqlplus sys/oracle@racdb as sysdba
를 수행하면 > 1번 노드로만 들어가진다.
SQL> select instance_name from v$instance;
SQL> select instance_name, status from gv$instance;
<< server session >> 퍼티 rac1 창
# racdb2 상태 확인
srvctl status instance -d racdb -i racdb1,racdb2
한쪽 노드는 떠있고 한쪽 노드는 내려갔다고 나온다.
[oracle@rac1 ~]$ srvctl status instance -d racdb -i racdb1,racdb2
Instance racdb1 is running on node rac1
Instance racdb2 is not running on node rac2
rac2 띄우기
[oracle@rac2 ~]$ srvctl start instance -d racdb -i racdb2
상태 확인하기
[oracle@rac2 ~]$ srvctl status instance -d racdb -i racdb1,racdb2
Instance racdb1 is running on node rac1
Instance racdb2 is running on node rac2
클라이언트 쪽에서 새롭게 접속해서
현재 상태 확인하기
<< client session >> 명령 프롬프트 창 새로 켜기
SQL+ 로 접속
sqlplus sys/oracle@racdb as sysdba
SQL> select instance_name, status from gv$instance;
INSTANCE_NAME STATUS
-------------------------------------------
racdb1 OPEN
racdb2 OPEN
<< server session >> 퍼티 rac1 창
노드들이 잘 떠있는지 확인하기
[oracle@rac1 ~]$ crs_stat -t
[oracle@rac1 ~]$ crs_stat -t
잘 떠 있다.
※ TAF (Transparent Application Failover)
다시 tnsnames.ora 파일 수정하기
racdb_taf =
(DESCRIPTION =
(LOAD_BALANCE = YES)(FAILOVER = YES)
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.56.111)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.56.112)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = racdb)
(FAILOVER_MODE = (TYPE = SESSION)(METHOD = BASIC))
)
)
tnsnames.ora 파일 맨 아랫부분에 붙여넣고 저장하기
(빨간색으로 표시한 부분 : 수정된 부분)
cmd 창 다시 켜기 > 조금 전에 만든 tns 정보 가지고 SQL+ 로 접속
<< client session >>
sqlplus sys/oracle@racdb_taf as sysdba
SYS@racdb_taf> select instance_name from v$instance;
INSTANCE_NAME
---------------------------
racdb1
아래 명령어는 아직 수행하지 말기!!!!!!!!!!!!!!!!!!!!!
얘 수행하고 나서 바로 퍼티에서 srvctl stop instance -d racdb -i racdb2 돌려야 함!!!!!!!!!!!!!!!!!!
내가 수행하랄 때 해!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 난 분명히 말했어..................
SYS@racdb_taf> select * from dba_objects;
# rac2 중단
<< server session >> 퍼티
상태 정보 확인하기
[oracle@rac2 ~]$ srvctl status instance -d racdb -i racdb1,racdb2
Instance racdb1 is running on node rac1
Instance racdb2 is running on node rac2
rac2에서 rac1 내리기 (이것도!!!!!!!!!!!!!!!!!!!!!!!!! 아직 내리지말고 준비작업만 해놓기!!!!!!!!!!!!!!!!!!!!!)
[oracle@rac2 ~]$ srvctl stop instance -d racdb -i racdb1
이렇게, 각각의 창에서 일단은 준비만 해놓은 다음에
명령 프롬프트에서
SYS@racdb_taf> select * from dba_objects;
얘 수행하는 동시에 [oracle@rac2 ~]$ srvctl stop instance -d racdb -i racdb2 얘 돌리기
명령 프롬프트 창 ORA-25401 오류 발생 (rac1 노드가 꺼진 것을 감지했기 때문에 발생한 오류)
퍼티 rac2 창에서 확인해보면 : rac1 노드가 내려가 있는 것이 보인다.
명령 프롬프트에서 접속한 인스턴스 이름을 확인해보면:
rac1 으로 자동으로 바뀌어 있는 것이 보인다.
(원래 접속해 있던 rac2 노드가 내려간 것을 감지하고 >
살아있는 rac1 쪽 노드로 자동 접속한 것)
SYS@racdb_taf> select instance_name from v$instance;
INSTANCE_NAME
----------------------------
racdb1
# racdb2 인스턴스가 내려가면서 쿼리 문장은 실패했지만
다른 살아있는 인스턴스 쪽으로 자동으로 접속이 진행되었다.
시뮬레이션 끝
# racdb2 다시 시작하기
[oracle@rac2 ~]$ svrctl start instance -d racdb -i racdb1