0321 RAC

현스·2024년 3월 21일

RAC

목록 보기
7/12
post-thumbnail

▣ 예제 15. RAC 환경에서 인스턴스 시작과 정지

  • shutdown 옵션 4가지
  1. shutdown normal
  2. shutdown transactional --> 누군가 DML 작업을 하고 있으면 인스턴스가 안내려가고 commit 이나 rollback을 해서 transaction 을 종료해야 내려갑니다.
  3. shutdown immediate : 정상종료
  4. shutdown abort : 정전

※ rac 에만 있는 옵션

shutdown transactional local

설명: 1번 인스턴스를 shutdown transactional 로 내리려면 1번 , 2번 둘다
DML 작업을 하고 있는 세션들이 다 commit 이나 rollback 을 해야
내려갑니다. 그런데 shutdown transactional local 이라고 하면
1번 인스턴스쪽에 transaction 만 종료되었으면 인스턴스를 내립니다.

■ 실습1. rac 환경에서 shutdown transactional

#1. 1번 노드와 2번 노드에서 둘 다 scott 유져로 접속합니다.

#2. 1번 노드에서는 KING 의 월급을 9000 으로 변경하고 2번 노드에서는 ALLEN의 월급을 8000으로 변경합니다
둘 다 commit 하지 않는다.

#3. 새로운 터미널 창을 열어서 sys 유져로 1번 노드에 접속하여 shutdown transactional 을 수행한다

--> 내려가지 않음. 멈춰있음

#4. 양쪽 노드에 scott 으로 접속한 세션들에서 commit 를 수행한다.


#5. 그러면 내려가는지 확인

내려감 !!

▣ 예제16. shutdown 명령어 외에 인스턴스를 올리고 내리는 명령어

srvctl 명령어

각각의 터미널에서 인스턴스를 각각 내리거나 올리지 않고 하나의 터미널 창에서 한번에 여러개의 인스턴스를 내리거나 올릴 수 있다.

■ 실습

#1. 1번 인스턴스와 2번 인스턴스를 동시에 내리는 명령어

문법 : $ srvctl stop instance -d db 이름 -i 1번 인스턴스 이름 , 2번 인스턴스 이름

$ srvctl stop instance -d racdb -i racdb1,racdb2

$ srvctl stop database -d racdb

문제1. 책 4-24 페이지를 보고 db 올리는 것을 수동으로 변경되게 하시오
리눅스 서버를 내렸다 올려도 db 가 자동으로 올라오지 못하게 하시오

$ srvctl modify database -d racdb -y manual

$ srvctl config database -d racdb -a

문제 2. 다시 automatic 으로 변경하시오

$ srvctl modify database -d racdb -y automatic

$ srvctl config database -d racdb -a

▣예제17. RAC 환경에서 초기화 파라미터 파일 관리하는 방법

설명 : 1번 노드, 2번 노드 둘 다 동일한 spfile 을 바라봐야 합니다
1번 노드 따로 2번 노드 따로 두고 관리하게 되면 문제가 생깁니다.

■ 실습

#1. 1번 노드와 2번 노드의 인스턴스가 동일한 spfile 을 사용하고 있는지 확인

SQL#1 > show parameter spfile

SQL#2 > show parameter spfile


#2. 1번 노드와 2번 노드에서 각각 ORACLE_HOME 밑에 dbs 밑으로 이동해서 init인스턴스.ora 가 있는지 확인하고 있으면 열어서 내용을 확인하시오

[oracle@racdb1 dbs]$ pwd
/u01/app/oracle/product/11.2.0/db_1/dbs

#3. spfile 의 내용을 보면 1번 인스턴스를 위한 파라미터가 있고 또 2번 인스턴스를 위한 파라미터가 있고
모든 인스턴스를 위한 파라미터가 있다.

SQL#1 > select inst_id, name, value
from gv$parameter
where name='db_files';

SQL#2 > select inst_id, name, value
from gv$parameter
where name='db_files';

※ RAC 환경에서는 양쪽 인스턴스 둘 다 똑같은 값으로 설정해야하는 파라미터가 있고 양쪽 노드 둘 다 다르게 설정해야하는
파라미터가 있다.
이걸 안지켜주면 하나의 인스턴스는 올라오는데 다른 인스턴스가 안올라오게 되니 반드시 지켜줘야 한다.

☆ 양쪽 노드 둘 다 똑같은 값으로 설정해야하는 파라미터

책 4-32

☆ 양쪽 노드 다르게 설정해야하는 파라미터

책 4-33 쪽

■ 실습

#1. 1번 노드와 2번 노드 에서 각각 db_files 가 어떻게 세팅되어있는지 확인 합니다.

SQL#1 > show parameter db_files
SQL#2 > show parameter db_files

SQL#1 > select inst_id, name, value
from gv$parameter
where name='db_files';

설명 : value 에 값이 없으면 default 값으로 세팅되어 있는 것

중요해 집중해

#2. db_files 를 200 에서 2000으로 수정합니다.

SQL#1 > alter system set db_files=2000 scope=spfile sid='*';

sid='*' - 모든 인스턴스에 전부 반영하겠다는 뜻 / 특정 인스턴스 이름을 쓸 수도 있음.

#3. 양쪽 노드를 shutdown immediate 로 내렸다가 올립니다.

SQL#1 > shutdown immediate

SQL#2 > shutdown immediate

#1

#2

#4.

※ 그럼 어떤 파라미터가 양쪽 다 똑같이 변경해줘야 하는 파라미터이고 다르게 잡아줘야하는 파라미터인가 ?

select inst_id, name, value, ordinal <---- ordinal 이 1 은 양쪽 다 똑같이 세팅
from gv$parameter 0은 양쪽 다르게 세팅
where name='파라미터 이름';

양쪽 똑같이 세팅하려면 아래처럼 sid='*' 을 써야 함.

SQL#1 > alter system set db_files=2000 scope=spfile sid='*';

다르게 한다면

SQL#1 > alter system set undo_tablespace='undotbs1' scope=spfile sid='racdb1';

SQL#2 > alter system set undo_tablespace='undotbs2' scope=spfile sid='racdb2';

점심시간 문제
현재 db 에 띄울 수 있는 프로세서의 개수가 150개 밖에 안된다.
이 수를 300개로 늘려라...

parameter 는 processes 입니다.

양쪽 노드 둘 다 300개로 늘리세요 ~

SQL#1 > alter system set processes=300 scope=spfile sid='*';

SQL#2 > alter system set processes=300 scope=spfile sid='*';

shutdown immediate

startup

확인

select inst_id, name, value
from gv$parameter
where name='processes';

▣ 예제18. 만약에 rac 환경에서 spfile 의 내용을 잘못설정했을때 조치방법

1. 파라미터를 하나 더 추가한 경우

#1. 양쪽 인스턴스에 셋팅된 db_files 파라미터 값을 조회하시오 !

SQL#1> select inst_id, name, value
from gv$parameter
where name='db_files';

SQL#1> select inst_id, name, value
from gv$spparameter
where name='db_files';

문제1. 다음과 같이 장애상황을 만들어 놓고 해결하시오 !

  • spfile 안의 내용을 확인
    SQL#1> select inst_id, name, value, sid
    from gv$spparameter
    where name='processes';

SQL#1> alter system set processes=400 scope=spfile sid='racdb1';

SQL#1> shutdown immediate
SQL#2> shutdown immediate

SQL#1> startup
SQL#2> startup
Database mounted.
Database opened.
값이 달라도 데이터베이스 오픈함.

SQL#1> select inst_id, name, value, sid
from gv$spparameter
where name='processes';

processes 파라미터는 반드시 양쪽 인스턴스가 똑같지 않아도 되는 파라미터 입니다.
그래서 startup 할 때 에러가 나지 않는다.

SQL#1 > show parameter processes : 400


SQL#2 > show parameter processes : 300

※ 인스턴스 이름으로 설정된 파라미터가 * 보다 우선 순위가 높아서 1번 인스턴스에서 show parameter processes 했을 때 300 으로 보이지 않고 400 으로 보이는 것.

문제2. 아래의 내용을 spfile 에서 지우시오 !

답 : alter system reset processes scope=spfile sid='racdb1';

위의 내용 보충 설명 ( 책 4-27 )

▣ 예제19. 반드시 양쪽 인스턴스 간의 값을 다르게 해줘야 하는 파라미터

반드시 양쪽이 다른값이어야하는 파라미터 실습

■ 실습

#1. 다음과 같이 undo tablespace 를 2개를 생성합니다.

SQL#1 > create undo tablespace undotbs3 datafile '+data' size 20m;
SQL#2 > create undo tablespace undotbs4 datafile '+data' size 20m;

#2. 1번 인스턴스는 undotbs3 을 쓰게 하고 2번 인스턴스는 undotbs4 를 쓰게 합니다.

SQL#1 > alter system set undo_tablespace = 'undotbs3' scope=both sid='racdb1';
SQL#2 > alter system set undo_tablespace = 'undotbs4' scope=both sid='racdb2';

SQL#1 > show parameter undo_tablespace
SQL#2 > show parameter undo_tablespace

문제1. 다음과 같이 장애를 일으키고 해결하시오

SQL#1 > alter system set undo_tablespace = 'undotbs1' scope=spfile sid='racdb1';
SQL#2 > alter system set undo_tablespace = 'undotbs1' scope=spfile sid='racdb2';

양쪽에 startup force

2번 인스턴스가 올라오지 않는다 - 장애 발생

해결 방법 :

alter system reset undo_tablepsace scope=spfile sid='racdb2';

alter system set undo_tablespace = 'undotbs2' scope=spfile sid='racdb2';

2번 인스턴스 다시 열림.

문제2. PL/SQL 의 커서의 개수를 충분히 열 수 있도록 open_cursors 라는 파라미터를 기존의 두배로 늘리시오 !

SQL#1> select inst_id, name, value, sid
from gv$spparameter
where name='open_cursors';

alter system set open_cursors=600 scope=spfile sid='*';

▣ 예제20. RAC 데이터 베이스 정지 (P 4-34)

지금 중요한 상황이 발생해서 DB 에 그 누구도 접속하지 못하게 막고 싶을 때가 있습니다.

  1. RAC 가 아닌 standard alone 일때

    select logins from v$instance;

LOGINS
----------
ALLOWED  <----  누구든지 접속이 가능한 상태 

alter system enable restricted session;

select logins from v$instance;

LOGINS
----------
RESTRICTED  <-- dba 권한이 있는 유져 외에는 접속이 불가능한 상태가 된것 입니다.

create user smith
identifed by tiger;

grant connect to smith;

connect smith/tiger

ORA-01035: ORACLE only available to users with RESTRICTED SESSION privilege

SQL#2> connect smith/tiger

1번 노드에는 접속이 안되는데 2번 노드는 접속이 됩니다.
rac 환경에서는 다른 방법으로 접속이 안되게 해줘야합니다.

SQL#1> connect / as sysdba
SQL#1> alter system disable restricted session;
SQL#1> select logins from v$instance;

#2. RAC 환경일 때

1번 노드에서 sys 유져에서 아래의 작업을 합니다.

SQL#1> alter system quiesce restricted ;

새로운 터미널 창을 열고 1번노드에서 smith 유져로 접속시도
새로운 터미널 창을 열고 2번노드에서 smith 유져로 접속시도

둘 다 접속 안됨

다시 풀어주기

SQL#1> alter system unquiesce;

하자마자 바로 접속 되는 것을 확인

▣ 예제21. RAC 환경에서 특정 세션을 kill 시키는 방법 (p4-35)

#1. 1번 인스턴스에 scott 유져로 접속해서 smith 유져의 월급을 2900 으로 수정
#2. 2번 인스턴스에 scott 유져로 접속해서 smith 유져의 월급을 0으로 변경

LOCK 걸림 !!
서로 다른 인스턴스 이지만 !! 락 걸렸다 !

#3. 위의 상황에서 누가 LOCK Holder 이고 누가 LOCK Waiter 인지 확인하시오
(별도의 sys 창을 열어서 확인)

SQL#1> select inst_id, sid, lmode, request
from gv$lock
where type in ('TX', 'TM');

SQL#1> select sid, serial#, inst_id
from gv$session
where sid=128;

SQL#1> alter system kill session '128,13,@1' immediate;

다른창에서 확인

문제1. lock waiter 죽이기

SQL#2> select sid, serial#, inst_id
from gv$session
where sid=245;

다른창에서

SQL#12> alter system kill session '245,11,@2' immediate;

RAC 환경에서 특정 세션 kill 시키는 명령어

alter system kill session 'sid번호, serial번호,@인스턴스 번호' immediate;

.

▣ 예제22. RAC 환경 관리 파라미터중 가장 중요한 cluster_database 파라미터 이해하기

cluster_database 는 양쪽 다 똑같이 같은 값으로 셋팅되어져 있어야하며 이 값이 true 면 모든 인스턴스가 cluster 서비스를 지원받으면서 운영되게 하겠다 라는 뜻입니다.
그런데 이 값이 false 면 cluster 로 사용하지 않고 그냥 standard alone 으로 쓰겠다는 뜻입니다.

이 값은 항상 true 인데 false 로 해야하는 경우가 있습니다.

다음과 같은 경우에 반드시 false 로 세팅하고 작업해야 합니다.

"control file 을 재생성하는 경우 "

dba 나 db 엔지니어가 controlfile 을 재생성하는 경우는 언제인가 ?

db 설치 이후에 반드시 control file 안에 maxdatafiles 라는 파라미터값을 크게 변경해주고 재생성해야합니다

maxdatafiles 는 database 에서 생성할 수 잇는 data file 의 총 개수 입니다.

※ dba 나 db 엔지니어가 오라클 설치 이후에 반드시 변경해줘야하는 파라미터가 2개

  1. parameter file 안의 db_files
  2. controlfile 안의 maxdatafiles

rman 오토 백업 걸고 백업 받아놓고 실습 시작
SQL#1> archive log list

$ rman target sys/oracle nocatalog
RMAN> configure controlfile autobackup on;
RMAN> backup database;

#2. 1번 노드에서 control file 을 생성하는 스크립트를 생성합니다.

SQL#1> alter database backup controlfile to trace as '/home/oracle/cre_con.sql';

#3. 1번 노드, 2번 노드 둘다 shutdown immediate 를 합니다.

SQL#1> shutdown immediate
SQL#2> shutdown immediate

#4. 1번 노드에서 controlfile 을 생성하는 스크립트를 편집합니다.

SQL#1> exit

cd

ls -l cre_con.sql

vi 로 스크립트 열기

set nu 로 줄에 넘버링하기





#5. 편집한 스크립트를 1번 노드에서 수행합니다. (수행하면 open 까지 올라옵니다.)

@create_controlfile.sql

#7. 1번 노드를 shutdown immediate 로 내립니다.

#8. 1,2 번 노드를 둘 다 올립니다.

#9. 새로 생성된 controlfile 안의 maxdatafiles 가 변경된 2000 으로 보이는지 확인 합니다.

select records_total
from v$controlfile_record_section
where type='DATAFILE';

오늘의 마지막 문제

  1. 오라클 파라미터 : db_files 를 2500

alter system set db_files=2500 scope=spfile sid='*';

SQL#1 > select sid, name, value
from v$spparameter
where name='db_files';

  1. control file 의 maxdatafiles 파라미터를 2500으로 변경 ~
  1. control file 의 maxdatafiles 파라미터를 2500으로 변경 ~

alter system set cluster_database=false scope=spfile sid='*';

SQL#1> shutdown immediate
SQL#2> shutdown immediate

나가서 컨트롤 파일 수정

vi cre_con.sql

:51,186 w ct.sql

vi ct.sql
한 줄 삭제 하고 maxdata 2500으로 수정하고

창 닫고

sys로 들어감

@ct.sql
수정한 파일 실행

하면 1번 노드는 올라옴
1번 노드에서 cluster_database 를 true 로 spfile 을 변경합니다.

alter system set cluster_database=true scope=spfile sid='*';

1번 노드만 다시 셧다운 - 스타트업 함
2번노드는 스타트업 눌러줌

select records_total
from v$controlfile_record_section
where type='DATAFILE';

profile
˗ˋˏ O R A C L E ˎˊ˗

0개의 댓글