상세 컨텐츠

본문 제목

2024년 3월 6일 5교시

카테고리 없음

by 병아리 엔지니어 2024. 3. 6. 16:23

본문

 

★ 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