DATA 전문가로 가는 길

[Admin][Oracle] 오라클 시작과 종료(shutdown, no mount, mount, open) 본문

Data Architecture/Admin

[Admin][Oracle] 오라클 시작과 종료(shutdown, no mount, mount, open)

EstenPark 2016. 2. 29. 10:59

1. 오라클 시작및 종료 개념

시작 단계 : 종료(shutdown) -> 노마운트(nomount) -> 마운트(mount) -> Open(시작)
종료 단계 : Open(시작) -> 마운트(mount) -> 노마운트(nomount) -> 종료(shutdown)

각 단계별 오라클 수행하는 작업
* 종료(shutdown)
    - 데이터베이스에 대한 엑세스를 수행할 수 없는 상태, DB를 중지한 상태입니다.
      단, 데이터베이스를 오픈 하기위해서 SYS 유저로 SYSDBA, SYSOPER을 권한이 있어야 합니다.
    - 관련된 작업 : B&R에서 물리적인 백업을 보면 운영체제의 cp명령어를 이용하여 
                         cold-backup을 하거나 되돌려 줄 수 있습니다.(파일을 대상)
* 노마운트(nomount) - Instance 
    - 파라미터 파일 읽기, SGA 할당, 
      alertSID.log 파일과 추적파일(Trace) 기록을 시작, 백그라운드 프로세스 기동
    - 관련된 작업 : 컨트롤 파일 재성성, 데이터베이스 생성
* 마운트(mount) 
    - 컨트롤 파일을 읽은 후 데이터 파일과 리두 로그파일을 인지 합니다.
    - 관련된 작업 : 데이터 파일 이름/위치 변경, 데이터베이스 복구, 아카이브 로그 모드 적용 및 해제
* 시작(Open)
    - 온라인 데이터 파일과 온라인 리두 로그 파일의 존재 및 정합성을 확힌한 후 해당 파일들을 열어 
       실제 데이터베이스를 사용할 수 있는 상태로 만듭니다.
    - 관련된 작업 : 온라인 데이터 파일 확인, 온라인 리두 로그 파일 확인, hot-backup
  • 시작 단계에서는 차례대로 이행이 가능 하나 종료 단계에서는 이행이 불가능 합니다.
  • 예) startup nomount -> alter database mount -> alter database open 차례로 시작 가능하며 종료 시에는 종류에 따라서 바로 종료 처리가 가능 합니다.

2. 종료 단계

* 종료 단계는 데이터베이스를 이용하여 어떠한 작업도 수행할 수 없는 단계이다.


3. 노마운트 단계 

노마운트 단계에서 수행하는 작업을 확인 

# 인스턴스 상태를 확인 해본 결과 아직 데이터베이스를 기동하지 않았습니다.
SQL> select status from v$instance;
select status from v$instance
*
ERROR at line 1:
ORA-01034: ORACLE not available


# 노마운트 단계 시작
SQL> set line 150
SQL> set pagesize 2000
SQL> startup nomount;
ORACLE instance started.

# 파라미터 파일 읽기 시작 
Total System Global Area  289406976 bytes
Fixed Size                  1279820 bytes
Variable Size              79694004 bytes
Database Buffers          205520896 bytes
Redo Buffers                2912256 bytes

# 파라미터 파일 확인 
SQL> show parameter processes
NAME                                 TYPE       VALUE
------------------------------------ ---------- ------------------------------
aq_tm_processes                      integer    0
db_writer_processes                 integer    1
gcs_server_processes              integer    0
job_queue_processes               integer    10
log_archive_max_processes       integer    2
processes                               integer    200

# 기본적으로 파라미터 파일의 존재 확인 순서는 spfileSID.ora -> spfile.ora -> initSID.ora  
# 파일이 존재 해야 하며 없을 경우에는 에러가 발생 됩니다.
SQL> !
bash-3.00$ ls
hc_testdb.dat     init.ora          orapwtestdb
initdw.ora        lkTESTDB          spfiletestdb.ora
bash-3.00$ grep '^\*\.processes' spfiletestdb.ora
*.processes=200

# SGA 할당(인스턴스 상태 확인)
SQL> SELECT status FROM v$instance;
STATUS
------------------------
STARTED

SQL> !

# alert_SID.log 파일과 추적(trace) 파일 기록 시작
bash-3.00$ pwd
/export/home/oracle/product/10g/admin/testdb/bdump
bash-3.00$ ls -alt *.trc
-rw-r-----   1 oracle   dba          716 11월 10일  04:01 testdb_mmon_1164.trc
-rw-r-----   1 oracle   dba          706 11월 10일  04:01 testdb_lgwr_1154.trc
-rw-r-----   1 oracle   dba          765 11월  9일  00:23 testdb_lgwr_1029.trc
-rw-r-----   1 oracle   dba          706 11월  5일  16:24 testdb_lgwr_1207.trc
-rw-r-----   1 oracle   dba          678 11월  5일  16:20 testdb_lgwr_1162.trc
-rw-r-----   1 oracle   dba          678 11월  5일  15:26 testdb_lgwr_1014.trc
-rw-r-----   1 oracle   dba          655 11월  5일  00:01 testdb_mmon_1329.trc
-rw-r-----   1 oracle   dba          706 11월  5일  00:01 testdb_lgwr_1319.trc
-rw-r-----   1 oracle   dba          706 11월  4일  23:46 testdb_lgwr_1264.trc
-rw-r-----   1 oracle   dba          706 11월  4일  00:52 testdb_lgwr_1102.trc
-rw-r-----   1 oracle   dba          765 11월  4일  00:45 testdb_lgwr_1057.trc
-rw-r-----   1 oracle   dba          678 11월  4일  00:20 testdb_lgwr_1145.trc
-rw-r-----   1 oracle   dba          793 11월  4일  00:19 testdb_lgwr_1086.trc


bash-3.00$ pwd
/export/home/oracle/product/10g/admin/testdb/bdump
bash-3.00$ ls -alt alert_*.log
총 156
-rw-r-----   1 oracle   dba        66364 11월 10일  02:59 alert_testdb.log
bash-3.00$ tail -f alert_testdb.log

# 백그라운드 프로세스 기동 (alert_testdb.log에서 백그라운드 프로세스 참고)
bash-3.00$ ps -ef |grep -v grep |grep 1152
  oracle  1152     1   0 03:05:37 ?           0:00 ora_dbw0_testdb
bash-3.00$ ps -ef |grep -v grep |grep 1154
  oracle  1154     1   0 03:05:37 ?           0:00 ora_lgwr_testdb
[참고사항]
 alter_SID.log파일을 확인해보면 백그라운드 프로세스가 보입니다. 그 중에 마지막 id는 실제 OS에서 사용하는 프로세스를 의미하므로 위와 같이 조회하면 됩니다. 또한 자세히 살펴보면 프로세스 이름의 패턴이 ora_백그라운드 프로세스_SID로 정의 되어 있어서 Perl을 이용하여  정규표현식을 간단하게 사용하면 모두 출력됩니다.

bash-3.00$ ps -ef |grep -v grep |perl -ne 'print if /ora_.+_testdb/'
  oracle  1168     1   0 03:05:38 ?           0:00 ora_d000_testdb
  oracle  1156     1   0 03:05:37 ?           0:00 ora_ckpt_testdb
  oracle  1150     1   0 03:05:37 ?           0:00 ora_mman_testdb
  oracle  1146     1   0 03:05:37 ?           0:00 ora_pmon_testdb
  oracle  1148     1   0 03:05:37 ?           0:00 ora_psp0_testdb
  oracle  1152     1   0 03:05:37 ?           0:00 ora_dbw0_testdb
  oracle  1154     1   0 03:05:37 ?           0:00 ora_lgwr_testdb
  oracle  1166     1   0 03:05:37 ?           0:00 ora_mmnl_testdb
  oracle  1162     1   0 03:05:37 ?           0:00 ora_cjq0_testdb
  oracle  1164     1   0 03:05:37 ?           0:00 ora_mmon_testdb
  oracle  1160     1   0 03:05:37 ?           0:00 ora_reco_testdb
  oracle  1158     1   0 03:05:37 ?           0:00 ora_smon_testdb
  oracle  1170     1   0 03:05:38 ?           0:00 ora_s000_testdb



4. 마운트 단계

마운트 단계에서 수행하는 작업을 확인 

# mount 시작
SQL> ALTER DATABASE mount;
Database altered.

SQL> SELECT status FROM v$instance;
STATUS
------------
MOUNTED

# alert_testdb.log파일에서 control_files 경로의 컨트롤 파일을 확인 
SQL> !
bash-3.00$ pwd
/export/home/oracle/product/10g/oradata/testdb
bash-3.00$ ls -alt
총 1887396
-rw-r-----   1 oracle   dba      7061504 11월 10일  03:50 control01.ctl
-rw-r-----   1 oracle   dba      7061504 11월 10일  03:50 control02.ctl
-rw-r-----   1 oracle   dba      7061504 11월 10일  03:50 control03.ctl
-rw-r-----   1 oracle   dba      5251072 11월  9일  01:40 users01.dbf
-rw-r-----   1 oracle   dba      251666432 11월  9일  01:40 sysaux01.dbf
-rw-r-----   1 oracle   dba      26222592 11월  9일  01:40 undotbs01.dbf
-rw-r-----   1 oracle   dba      503324672 11월  9일  01:40 system01.dbf
-rw-r-----   1 oracle   dba      52429312 11월  9일  01:40 redo03.log
-rw-r-----   1 oracle   dba      52429312 11월  9일  00:23 redo02.log
-rw-r-----   1 oracle   dba      52429312 11월  9일  00:23 redo01.log
-rw-r-----   1 oracle   dba      20979712 11월  4일  23:47 temp01.dbf
bash-3.00$ date
2010년 11월 10일 수요일 오전 03시 51분 42초

# alert_testdb.log 파일에서 컨트롤 파일 내의 데이터 파일 및 리두 로그 파일 인지 확인하지
 않고 상태 정보만 확인 하는 것입니다. 그래서 mount 단계에서 리두 로그 파일과 데이터 파일이 없어도 정상 작동 되고 오픈 단계에서 에러가 발생 됩니다.



5. 시작(Open) 단계

데이터베이스 오픈 단계에서 수행하는 작업을 확인 

# 데이터베이스 open 시작
SQL> ALTER DATABASE open;
Database altered.

SQL> SELECT status FROM v$instance;
STATUS
------------
OPEN

# 온라인 데이터 파일 확인
# 온라인 리두 로그 파일 확인
# alert_testdb.log 파일을 이용하여 기록된 로그 확인

# 리두 로그 그룹 검색 결과를 통해서 log sequence 4 맞는지 확인
SQL> SELECT GROUP#, SEQUENCE#, MEMBERS,
  2  BYTES/1024/1024 "SIZE", STATUS
  3  FROM V$LOG;
    GROUP#  SEQUENCE#    MEMBERS       SIZE STATUS
---------- ---------- ---------- ---------- ----------------
         1          2          1         50 INACTIVE
         2          3          1         50 INACTIVE
       3        4        1       50 CURRENT
[참고사항]
 컨트롤 파일을 확인하여 새로운 리두 로그 그룹을 CURRENT 상태표시 합니다. 이전 리두 로그 그룹은 ACTIVE로 표시하며, 이전 리두 로그 파일에 대한 체크포인트를 수행한다. 체크포인트가 완료되면 INACTIVE로 표시 합니다.


Comments