※ rac 에만 있는 옵션
shutdown transactional local

설명: 1번 인스턴스를 shutdown transactional 로 내리려면 1번 , 2번 둘다
DML 작업을 하고 있는 세션들이 다 commit 이나 rollback 을 해야
내려갑니다. 그런데 shutdown transactional local 이라고 하면
1번 인스턴스쪽에 transaction 만 종료되었으면 인스턴스를 내립니다.
#1. 1번 노드와 2번 노드에서 둘 다 scott 유져로 접속합니다.
#2. 1번 노드에서는 KING 의 월급을 9000 으로 변경하고 2번 노드에서는 ALLEN의 월급을 8000으로 변경합니다
둘 다 commit 하지 않는다.
#3. 새로운 터미널 창을 열어서 sys 유져로 1번 노드에 접속하여 shutdown transactional 을 수행한다
--> 내려가지 않음. 멈춰있음
#4. 양쪽 노드에 scott 으로 접속한 세션들에서 commit 를 수행한다.


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

내려감 !!
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

설명 : 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';


#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. 다음과 같이 장애상황을 만들어 놓고 해결하시오 !
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 )

반드시 양쪽이 다른값이어야하는 파라미터 실습
■ 실습
#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='*';

지금 중요한 상황이 발생해서 DB 에 그 누구도 접속하지 못하게 막고 싶을 때가 있습니다.
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;

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


#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;
.
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개
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';

오늘의 마지막 문제
alter system set db_files=2500 scope=spfile sid='*';
SQL#1 > select sid, name, value
from v$spparameter
where name='db_files';


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';
