상세 컨텐츠

본문 제목

2023년 12월 8일 3교시 노마운트 단계와 오픈 단계, read only 모드로 DB 열기

오라클 아키텍처

by 병아리 엔지니어 2023. 12. 11. 07:40

본문



2. mount 단계에서 하는 일

- control file을 open

- (control file 은 이 단계에서 여는데, 만약 control file 이 깨졌다면 1 단계 nomount 까지밖에 못 올라가므로)

- (nomount 단계에서 control file 을 복구해주어야 한다.)

 

 

- mount 단계에서만 할 수 있는 작업

    - Data file 이름 바꾸기
    - no archive log mode 를 archive log mode 로 바꾸기

    - full database recovery (전체 DB 가 깨져 버린 경우의 복구 작업)
    - RMAN 을 이용한 close backup (닫힌 백업 / 운영 중에 하는 백업이 아닌, DB 를 내리고 난 다음에 하는 백업)

 

3. open 단계
- Data file과 redo log file 을 오픈하는 단계

 

실습을 한번 해보자.

 

 

alert log file 을 띄워 놓은 채로

또다른 퍼티 창에서 sql+ 로 들어가기

 


[oracle@oracle dbs]$ exit
exit

 

 

DB 셧다운시키기


SQL> shutdown immediate
ORA-01012: not logged on

 

어... 이미 셧다운이 되어 있었네?...

원래는 셧다운하러 들어온 건데 이미 셧다운이 되어 있으니까

그냥 나가자!


SQL> exit

 

그리고 나서

 



[oracle@oracle ~]$ sqlplus / as sysdba

다시 SQL+ 로 접속하면

 


SQL*Plus: Release 11.2.0.4.0 Production on Thu Dec 7 21:58:37 2023

Copyright (c) 1982, 2013, Oracle.  All rights reserved.

Connected to an idle instance.
(DB 가 내려감)

 

alert log 에도 보면 DB가 내려간 마지막 시간이 찍혀서 나온다 ↓

 

 

(지금은 복습 중이라 시간이 2023년 12월 15일로 찍혀 있는 것)


이제 스타트업 시켜야 하는데

 


SQL> startup nomount
startup nomount 해서 DB를 nomount 단계까지만 올리면

1. instance 까지만 만들고

2. 초기 파라미터 파일을 본다.

 


SQL> startup nomount
ORACLE instance started.

Total System Global Area  711430144 bytes
Fixed Size                  1367004 bytes
Variable Size             469763108 bytes
Database Buffers          234881024 bytes
Redo Buffers                5419008 bytes

QUESTION. 나 근데 왜 또 alert log 안돌아가?...
ANSWER. 안 돌아가? 나는 복습 중인데 지금 돌아가는데...

너 혹시 또

[oracle@oracle trace]$ tail -f alert_ora11g.log
이거 안해서 그랬던 거 아니니? ...

 

 

이제 nomount 까지 열렸으므로 상태 정보를 한번 확인해보자.

 


SQL> select status from v$instance;
DB의 상태 정보를 보면 : started 라고 되어 있다.

 

아까는 상태 정보가 open 이라고 되어 있었는데

지금은 started 라고 되어 있음,

status 가 started 라고 되어 있으면 nomount 단계까지 올라온 것

이제 DB를 mount 까지 올려보자.

 


SQL> alter database mount;

DB 마운트 단계까지 올리기

 

 

 

이제 다시 아까 그 select status from v$instance; 문장을 수행해서 상태를 보면

 


SQL> select status from v$instance;

STATUS
------------
MOUNTED

상태가 mounted 라고 나옴,

즉 현재 DB 의 상태는 mount 단계까지 올라와 있는 것

 

그럼 이제 데이터베이스를 오픈해 보자.

 

 


SQL> alter database open;

DB 오픈 단계까지 올리기

이 문장을 수행하는 순간 위의 alert log 에 뭐가 막 쭈루룩 올라가면서
아래의 퍼티 창에 


Database altered.
라고 기록된다.

 

그리고 나서 아까 그 select status from v$instance; 문장을 수행해보면

 



SQL> select status from v$instance;

STATUS
------------
OPEN

DB 가 오픈됐다고 나온다.

 

DB 를 단계별로 올리는 경우 이렇게 하나씩 해야 한다.

1단계 nomount 다음에 3단계 open 으로 바로 가면 안된다.

2단계에서 control 파일을 여는 작업이 꼭 필요하다.

 

여기서 다시 DB 를 닫고

 


SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.

 

DB 를 이렇게 닫아 놓은 상태에서

다시 SQL> startup nomount 해서 DB 를 nomount 단계까지만 올려 보자.

 

 

SQL> startup nomount
ORACLE instance started.

이렇게 해서 DB 를 1 단계 nomount 단계까지만 올리고


여기서 바로

SQL> alter database open; 해서 3 단계 open 단계로 올리려고 하면

 

 

오류가 난다.

(1단계 nomount 에서 3단계 open 으로 바로 올리려고 했기 때문)

1단계로 올라갔으면 반드시 2단계를 거친 다음에 3단계로 올라가야 한다.

 

그래서 꼭 아래와 같이

 

 

DB 가 현재 nomount 단계까지 올라왔으면

그 다음으로는 ↓

 

SQL> alter database mount;
Database altered.
database 를 먼저 mount 단계까지 올려 놓고

 

그 다음에

SQL> alter database open;
Database altered.

 

DB 를 open 단계로 올려야 한다.

(!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 단계를 건너뛰면 절대 안된다 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)

 

 

★ DB 의 모드

- DB 를 읽기만 가능하게 하기

(다른 사람이 내용을 바꾸지 못하도록)

 

 

DB 먼저 셧다운하기

 

 

그리고 나서

SQL> startup open read only;

DB를 open 단계까지 열되, 읽기만 가능하도록 열기

 

 

 



Total System Global Area  711430144 bytes
Fixed Size                  1367004 bytes
Variable Size             469763108 bytes
Database Buffers          234881024 bytes
Redo Buffers                5419008 bytes
Database mounted.
Database opened.


SQL> select open_mode from v$database;

DB가 어떤 모드로 열려 있는지 보기

 

 

OPEN_MODE
--------------------
READ ONLY
read only 모드가 되어있는 것이 보인다.

 

이제 select 문장을 하나 던져 보자.

 


SQL> select salary from hr.employees where employee_id = 100;

    SALARY
----------
     24000

 

hr.employees 테이블에서 100 번 사원의 월급을 조회했더니

결과가 정상적으로 나옴,

테이블을 읽는 것까지는 아무 문제가 없다.

 

그런데 저기서 100번 사원의 월급을 1000으로 업데이트를 한번 해보려고 하면 오류가 발생함. ↓

 

 


SQL> update hr.employees set salary = 1000 where employee_id = 100;


update hr.employees set salary = 1000 where employee_id = 100
          *
ERROR at line 1:
ORA-16000: database open for read-only access
read only 모드이기 때문에 w 할 수 없다고 하면서 오류가 발생한다.

(QUESTION. 이거 업데이트만 막히는 게 아니고 DML 다 막히는 거 맞지? DDL도 DCL도?)

(ANSWER. 그러하다.)

 

DB 가 read only 일 경우 write가 불가능하다.

DDL 조작도 안된다.

 

(https://cbw1030.tistory.com/71 이 블로그도 참고해봐!)


★ DB 를 읽기 모드로 시작해야 할 때

 

 

SQL> shutdown immediate
정상적인 DB 종료 후

SQL> startup open read only
읽기 모드로 시작하면 된다.

 

 

★ DB 를 읽고 쓰기 모드로 시작해야 할 때는

 

 



SQL> shutdown immediate
다시 DB 내리고

SQL> startup
다시 startup 하면: DB가 open read write 모드로 열린다.

(스타트업을 하되 따로 어떤 모드로 시작할지 적어놓지 않으면 기본이 read write 모드)

 

만약 read only 모드로 DB 를 잘못 시작했을 경우에는

DB 를 내리지 않고는 read write 모드로 바꿀 방법이 없다.

그래서 이건 절대 실수하면 안된다.


SQL> select open_mode from v$database;

OPEN_MODE
--------------------
READ WRITE
확인해보면: DB 가 read write 모드로 되어 있다.

SQL> rollback;

 

Rollback complete.

 

QUESTION. rollback 을 했는데도

 

 

DB 의 모드는 read write 로 그대로 남아 있는데...?

방금 그 rollback 은 뭐에 대해서 수행된 거야?

 

ANSWER. rollback은 모드와 상관 없다.

rollback 은 DML 조작 취소하는 것

아 맞다... 그렇지...

 


DB를 내리기 전에는 꼭 공지해야 한다!
공지 안하고 내리면 인생 끝났다고 생각하면 됨.

그래서 회사 내 메신저를 항상 꼭 모니터링하고 있어야 한다.

(그리고 공지를 하더라도 최소 한두 시간 전에는 해야 한다.)

오후 시간에는 shutdown 과 close에 대해 배워 보자!

관련글 더보기