오늘은 개인 노트북을 챙겨서 수업을 들을 준비를 하고 왔는데 웬열...?

DB Statrup이 안됩니다.

ORA-00845: MEMORY_TARGET not supported on this system
이라는 메시지와 함께 DB가 올라가지 않습니다.

http://www.dblancer.com/2013/08/oracle-ora-00845-memorytarget-not.html

위의 사이트와 같이 해당 Error문을 검색하여 해결책을 찾았는데 문제가 발생한 원인이 기억이 났습니다. VM ware이미지의 Memory를 설정할 때  4G를 추천하였지만 제가 512MB로 설정을 하였기 때문에 발생 한 것으로 추정하고 있습니다.

VM ware안의 운영체제(저의 경우는 리눅스입니다.)를 일시정지 말고 완전  종료시키고 VM설정을 변경한 후 다시 시작하여 DB를 올리니 올라갔습니다.

 

SQL> SELECT count(*) FROM scott.emp;

  COUNT(*)
----------
        14

scott의 emp table을 모두 지우고 비정상적인 종료 후 다시 시작하여 인스턴스 복구가 일어나는 것을 확인할 예정입니다.

SQL> DELETE FROM scott.emp;

SQL> SELECT count(*) FROM scott.emp;

다시확인

SQL> shutdown abort

//DB를 비 정상적으로 종료하는 명령입니다. 정전과 같은 효과를 줄 수 있습니다.

commit을 하지 않는 내용은 자동으로 롤백이 되기 때문에 아래를 다시 조회 해 보면 확인을 할 수 있습니다.

SQL> SELECT count(*) FROM scott.emp;

 

SQL> show parameter recovery_p

 

하나가 조회됩니다. rollforward작업을 도와주는? 개념이라고 설명해주셨습니다.

 

이번엔 rollback관련하여 조회를 해 보겠습니다.


SQL> show parameter FAST_START

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
fast_start_io_target                 integer     0
fast_start_mttr_target               integer     0
fast_start_parallel_rollback         string      LOW

해당 파라미터를 바꾸면 병렬처리하여 속도를 높일 수 있습니다. (책 36apge참고)

 

SQL> alter system set FAST_START_MTTR_TARGET=300;

 

 

DATABASE의 Archive mode와 No Archive mode가 있습니다. 두가지 차이는

 

Archive mode를 변경하는 것을 해 보겠습니다. 해당내용은 책의 41페이지에 설명되어있습니다.

실습 3장 5번!

SQL> show parameter log_archive_format

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
log_archive_format                   string      %t_%s_%r.dbf

log_archive_format을 조회하였습니다.

%t : thread number

%s : redo log number

%r : reset log ID???????

불안정 복구를 하고나면 reset log ID가 변경됩니다.

확장자명이 DBF인데 이걸써도 되고 다른걸 써도 됨. 이 확장자는 데이터파일의 확장자와 같으므로 변경하는것을 추천 해 주셨습니다.

SQL> alter system set log_archive_format='%t_%s_%r.arc'
  2  scope=spfile;

System altered.
위의 명령을 통해 변경을 하였습니다. 동적으로 변경이 되지 않는 파라미터이기 때문에 DB를 다시 내렸다 올려야 적용이 됩니다.


SQL> desc v$database_incarnation
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 INCARNATION#                                       NUMBER
 RESETLOGS_CHANGE#                                  NUMBER
 RESETLOGS_TIME                                     DATE
 PRIOR_RESETLOGS_CHANGE#                            NUMBER
 PRIOR_RESETLOGS_TIME                               DATE
 STATUS                                             VARCHAR2(7)
 RESETLOGS_ID                                       NUMBER
 PRIOR_INCARNATION#                                 NUMBER
 FLASHBACK_DATABASE_ALLOWED                         VARCHAR2(26)

Reset Log ID에 대한 질문을 했더니 위의 V$뷰를 조회 해 보라고 하셨고 조회를 해 보니 위와 같이 tab이 밪지 않아서 아래에 다시 화면을 캡쳐하였습니다.

 

또한 쉬는시간에 수업 처음 발견했던 문제에 대해 질문을 하였는데 솔직히 잘 이해가 가지 않는 답변을 받았습니다. Max memory target을 변경하여서도 DB를 올릴 수 있다고 하셨습니다.

 

===================================    2    =========================================

 

아까 내용을 다시 정리 해 주신다고 하셨습니다.

 

위의 화면은 v$log를 조회한 화면으로 블럭 씌운 부분을 보면 아까 log_archive_format에서 설정하는 것들을 확인할 수 있습니다.

SQL> show parameter log_archive

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
log_archive_config                   string
log_archive_dest                     string
log_archive_dest_1                   string
log_archive_dest_10                  string
log_archive_dest_11                  string
log_archive_dest_12                  string
log_archive_dest_13                  string
log_archive_dest_14                  string
log_archive_dest_15                  string
log_archive_dest_16                  string
log_archive_dest_17                  string
log_archive_dest_18                  string
log_archive_dest_19                  string
log_archive_dest_2                   string
log_archive_dest_20                  string
log_archive_dest_21                  string
log_archive_dest_22                  string
log_archive_dest_23                  string
log_archive_dest_24                  string
log_archive_dest_25                  string
log_archive_dest_26                  string
log_archive_dest_27                  string
log_archive_dest_28                  string
log_archive_dest_29                  string
log_archive_dest_3                   string
log_archive_dest_30                  string
log_archive_dest_31                  string
log_archive_dest_4                   string
log_archive_dest_5                   string
log_archive_dest_6                   string
log_archive_dest_7                   string
log_archive_dest_8                   string
log_archive_dest_9                   string
log_archive_dest_state_1             string      enable
log_archive_dest_state_10            string      enable
log_archive_dest_state_11            string      enable
log_archive_dest_state_12            string      enable
log_archive_dest_state_13            string      enable
log_archive_dest_state_14            string      enable
log_archive_dest_state_15            string      enable
log_archive_dest_state_16            string      enable
log_archive_dest_state_17            string      enable
log_archive_dest_state_18            string      enable
log_archive_dest_state_19            string      enable
log_archive_dest_state_2             string      enable
log_archive_dest_state_20            string      enable
log_archive_dest_state_21            string      enable
log_archive_dest_state_22            string      enable
log_archive_dest_state_23            string      enable
log_archive_dest_state_24            string      enable
log_archive_dest_state_25            string      enable
log_archive_dest_state_26            string      enable
log_archive_dest_state_27            string      enable
log_archive_dest_state_28            string      enable
log_archive_dest_state_29            string      enable
log_archive_dest_state_3             string      enable
log_archive_dest_state_30            string      enable
log_archive_dest_state_31            string      enable
log_archive_dest_state_4             string      enable
log_archive_dest_state_5             string      enable
log_archive_dest_state_6             string      enable
log_archive_dest_state_7             string      enable
log_archive_dest_state_8             string      enable
log_archive_dest_state_9             string      enable
log_archive_duplex_dest              string
log_archive_format                   string      %t_%s_%r.dbf
log_archive_local_first              boolean     TRUE
log_archive_max_processes            integer     4
log_archive_min_succeed_dest         integer     1
log_archive_start                    boolean     FALSE
log_archive_trace                    integer     0

많이 나오네요..

log_archive_dest는 경로명을 바로 지정할 수 있습니다.

그리고 바로 위에 보이는 log_archive_format은 아직 변경된 것이 적용되지 않은 것도 확인할 수 있습니다.

log_archive_duplex_dest는 이중으로 복사할 경로명을 정할 수 있습니다.

log_archive_dest_31.. 31까지 있는데 31개가 필요하지도 않고 보통은 1개만 있으면 되지만 2개 그 이상을 사용해야 하는 경우는 스텐바이 DB즉, 재난이 발생할 경우에 대비하는 DB라고 생각하시면 될 것 같습니다. HW적인 복사본을 다른 물리적 위치에서 사용할 수 있게 현재 DB를 그대로 복사하여 스텐바이 DB를 만듭니다.

스텐바이 DB는 Redo archive를 받아 계속 복구를 하는 개념으로 동작을 시켜 동기화를 시키고 원본 DB가 손상이 될 경우 connect을 스텐바이DB로 바꾸어 사용하는 개념입니다. 물론 제난복구 이외에도 사용할 수 있습니다. 즉 31번까지 31개까지 스텐바이 DB를 사용할 수 있습니다. 국내사례는 여러곳으로 보내는 경우가 없지만 외국의 경우에는 여러곳으로 보내는 구축을 한 경우도 있습니다.

log_archive_dest_state_29            string      enable
enable이 되있는곳만 사용이 가능하다고 보시면 됩니다.

 

플레시 리커버리 에어리어를 없에야 한다고 하셨습니다.

SQL> show parameter db_recovery

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest                string      /u01/app/oracle/flash_recovery
                                                 _area
db_recovery_file_dest_size           big integer 3852M

위의 항목이 플레시 리커버리 에어리어(fast recovery area)라고 합니다. 위의 위치에 backup이나 archive가 생깁니다.

 

3장 실습 1번


SQL> alter system set log_archive_dest_1=
  2  "location=/u01/app/oracle/oradata/arch1";

SQL> show parameter log_archive_dest_1

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest_1                   string      location=/u01/app/oracle/orada
                                                 ta/arch1
log_archive_dest_10                  string
log_archive_dest_11                  string
log_archive_dest_12                  string
log_archive_dest_13                  string
log_archive_dest_14                  string
log_archive_dest_15                  string
log_archive_dest_16                  string
log_archive_dest_17                  string
log_archive_dest_18                  string
log_archive_dest_19                  string

log_archive_dest_1이 설정되어 있는것을 확인하였습니다.

SQL> shutdown immediate

Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> SQL>
SQL> startup mount
ORACLE instance started.

Total System Global Area  849530880 bytes
Fixed Size                  1339824 bytes
Variable Size             511708752 bytes
Database Buffers          331350016 bytes
Redo Buffers                5132288 bytes
Database mounted.

3장 실습 5번)

SQL> archive log list
Database log mode              No Archive Mode
Automatic archival             Disabled
Archive destination            /u01/app/oracle/oradata/arch1
Oldest online log sequence     4
Current log sequence           6

3장 실습 6번 (실습 6페이지)

SQL> alter database archivelog;

Database altered.

SQL> alter database open;

Database altered.

SQL> archive log list
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            /u01/app/oracle/oradata/arch1
Oldest online log sequence     4
Next log sequence to archive   6
Current log sequence           6

SQL PLUS에서 host명령어를 쓸 수 있습니다. host 또는 ! 기호를 명령의 앞에 사용하면 됩니다.


SQL> !ps -ef | grep arc
oracle    9994     1  0 20:26 ?        00:00:00 ora_arc0_orcl
oracle    9996     1  0 20:26 ?        00:00:00 ora_arc1_orcl
oracle    9998     1  0 20:26 ?        00:00:00 ora_arc2_orcl
oracle   10000     1  0 20:26 ?        00:00:00 ora_arc3_orcl
oracle   10206  9396  0 20:28 pts/3    00:00:00 /bin/bash -c ps -ef | grep arc
oracle   10208 10206  0 20:28 pts/3    00:00:00 grep arc


SQL> alter system switch logfile;

System altered.

위의 문장을 한번 더 수행하고 아카이브 로그파일이 잘 생겼나 확인하면

 

flash_recovery_area/에 생성된 것 확인을 못하였습니다.

SQL> alter system set
  2  log_archive_dest_1='';

System altered.

 

위의 화면은 아카이브 행 이라는 것입니다. 더이상 아카이브를 할 수 없을 경우에 발생하는 현상으로 이런 상황에서는 log archive dest를 지정해주면 됩니다. 그러면 지정된 위치에 아카이빙이 진행됩니다.

 

 

다른 창에서 경로를 새로 지정해 주고

alter system archive log all;
 

이 명령은 수동으로 처리를 해주는 것입니다. 아카이브 데스티네이션이 가득차서 풀이나면 보통 당황해서 아카이브로그파일을 지우는 경우가 있는데 그러면 행이 풀려서 DB가 복구가 되지 않고 DB가 죽어버리면 골치아픈 일이 생깁니다.

그것을 그 전에 사용하던 파일을 지웠기 때문에 복구를 하더라도 불안정 복구를 할 수 밖에 없게 됩니다. 따라서 그럴 경우에는 위와 같이 디스크 공간이 있는 쪽으로 경로를 바꾸어 주고 그 후에도 안풀리면 위의 명령을 수행하면 됩니다. 실습 과정에서도 해결되는 것을 확인하였습니다.

위의 실습에서 검정바탕에 흰 글씨의 접속기는 행이 걸린 창 외에 다른 창에서 작업을 하여 행을 풀었던 작업을 수행 한 창입니다.

 

위의 화면은 Archive log를 해당 경로에 가서 확인을 해 본 화면입니다.

SQL> show parameter log_archive
를 해 보면 아래의 내용을 확인할 수 있습니다.

log_archive_max_processes            integer     4

 

SQL> archive log list
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            /u01/app/oracle/oradata/arch1
Oldest online log sequence     9
Next log sequence to archive   11
Current log sequence           11

위의 경우를 보면 가장 오래된게 9번 현재가 11번 따라서 9, 10 , 11 3개의 아카이브가 있는 것을 확인할 수 있습니다.

SQL> alter system archive log current;

System altered.

위의 명령은 자동으로 log switch가 일어나는 것을 확인할 수 있습니다.

SQL> archive log list
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            /u01/app/oracle/oradata/arch1
Oldest online log sequence     10
Next log sequence to archive   12
Current log sequence           12

바뀌었습니다.

alter system archive log current; // 이거는 현재 것을 수동으로 아카이빙 하는 것이고

(어차피 로그 스위치 일으키는 것과 같지만 메커니즘은 다릅니다.)

alter system archive log all; // 이거는 모든 아카이브 로그 파일을 수동으로 아카이빙 하는 것입니다.

 

====================================     3     =======================================

책의 49페이지에 나와있는 여러 V$뷰를 조회해보았습니다.

 

SQL> select * from v$log_history;

     RECID      STAMP    THREAD#  SEQUENCE# FIRST_CHANGE# FIRST_TIM NEXT_CHANGE#
---------- ---------- ---------- ---------- ------------- --------- ------------
RESETLOGS_CHANGE# RESETLOGS
----------------- ---------
         1  838128337          1          1        754488 29-JAN-14       789562
           754488 29-JAN-14

         2  838128346          1          2        789562 29-JAN-14       792901
           754488 29-JAN-14

         3  838129605          1          3        792901 29-JAN-14       821270
           754488 29-JAN-14

         4  838133422          1          4        821270 29-JAN-14       841850
           754488 29-JAN-14

         5  903987470          1          5        841850 29-JAN-14       867857
           754488 29-JAN-14

         6  903990643          1          6        867857 16-FEB-16       871820
           754488 29-JAN-14

         7  903990698          1          7        871820 16-FEB-16       871847
           754488 29-JAN-14

         8  903990903          1          8        871847 16-FEB-16       871937
           754488 29-JAN-14

         9  903990906          1          9        871937 16-FEB-16       871941
           754488 29-JAN-14

        10  903991260          1         10        871941 16-FEB-16       872164
           754488 29-JAN-14

        11  903991883          1         11        872164 16-FEB-16       872883
           754488 29-JAN-14


11 rows selected.

 

 

 

책 실습 7페이지의 3장 실습 10번을 진행하겠습니다.

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
DB를 정상적으로 종료하였습니다.

 

[oracle@ocpdba oradata]$ cp orcl/* coldbackup/

복사가 완료 되면


SQL> startup

DB를 시작합니다.

 

SQL> desc dba_data_files
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 FILE_NAME                                          VARCHAR2(513)
 FILE_ID                                            NUMBER
 TABLESPACE_NAME                                    VARCHAR2(30)
 BYTES                                              NUMBER
 BLOCKS                                             NUMBER
 STATUS                                             VARCHAR2(9)
 RELATIVE_FNO                                       NUMBER
 AUTOEXTENSIBLE                                     VARCHAR2(3)
 MAXBYTES                                           NUMBER
 MAXBLOCKS                                          NUMBER
 INCREMENT_BY                                       NUMBER
 USER_BYTES                                         NUMBER
 USER_BLOCKS                                        NUMBER
 ONLINE_STATUS                                      VARCHAR2(7)

SQL> SELECT FILE_NAME, TABLESPACE_NAME FROM dba_data_files;

FILE_NAME
--------------------------------------------------------------------------------
TABLESPACE_NAME
------------------------------
/u01/app/oracle/oradata/orcl/users01.dbf
USERS

/u01/app/oracle/oradata/orcl/undotbs01.dbf
UNDOTBS1

/u01/app/oracle/oradata/orcl/sysaux01.dbf
SYSAUX

/u01/app/oracle/oradata/orcl/system01.dbf
SYSTEM

/u01/app/oracle/oradata/orcl/example01.dbf
EXAMPLE

 

파일 ID까지 추가로 조회하였습니다. FILE_ID를 기억하면 파일 이름을 입력하지 않고도 접속 및 관리를 할 수 있습니다.

[oracle@ocpdba oradata]$ oh
[oracle@ocpdba db_1]$ cd dbs
[oracle@ocpdba dbs]$ pwd
/u01/app/oracle/product/11.2.0/db_1/dbs
[oracle@ocpdba dbs]$
[oracle@ocpdba dbs]$ ls
hc_DBUA0.dat  init.ora  orapworcl      peshm_orcl_0
hc_orcl.dat   lkORCL    peshm_DBUA0_0  spfileorcl.ora

OH는 Oracle home으로 이동하도록 환경변수를 설정해 두셨다고 하셨습니다.

spfileorcl.ora : 실습 DB의 parameter file

SQL> show parameter spfile

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
spfile                               string      /u01/app/oracle/product/11.2.0
                                                 /db_1/dbs/spfileorcl.ora

위의 명령으로 확인할 수 있습니다.

SQL> SELECT * FROM V$BACKUP;

     FILE# STATUS                CHANGE# TIME
---------- ------------------ ---------- ---------
         1 NOT ACTIVE                  0
         2 NOT ACTIVE                  0
         3 NOT ACTIVE                  0
         4 NOT ACTIVE                  0
         5 NOT ACTIVE                  0
번호만 보이는데 위의 table과 조인을 하여 볼 수도 있습니다.

SQL> alter tablespace system begin backup;

Tablespace altered.

SQL> SELECT * FROM V$BACKUP;

     FILE# STATUS                CHANGE# TIME
---------- ------------------ ---------- ---------
         1 ACTIVE                 875689 16-FEB-16
         2 NOT ACTIVE                  0
         3 NOT ACTIVE                  0
         4 NOT ACTIVE                  0
         5 NOT ACTIVE                  0

begin backup하자 활성화되었습니다.

SQL> alter tablespace system end backup;

Tablespace altered.

SQL> SELECT * FROM V$BACKUP;

     FILE# STATUS                CHANGE# TIME
---------- ------------------ ---------- ---------
         1 NOT ACTIVE             875689 16-FEB-16
         2 NOT ACTIVE                  0
         3 NOT ACTIVE                  0
         4 NOT ACTIVE                  0
         5 NOT ACTIVE                  0

backup과 복구는 어렵지 않지만 위의 경우도 begin backup을 한 후 end backup을 하지 않아서 장애가 발생하는 경우도 있습니다.


SQL> alter tablespace system begin backup;

Tablespace altered.

SQL> shutdown immediate
ORA-01149: cannot shutdown - file 1 has online backup set
ORA-01110: data file 1: '/u01/app/oracle/oradata/orcl/system01.dbf'

DB가 종료되지도 않습니다. 이 경우 강제로 종료해버리면 나중에 DB가 올라오지도 않는 문제가 발생할 수 있습니다.

SQL> alter database begin backup;

Database altered.

SQL> SELECT * FROM V$BACKUP;

     FILE# STATUS                CHANGE# TIME
---------- ------------------ ---------- ---------
         1 ACTIVE                 875849 16-FEB-16
         2 ACTIVE                 875849 16-FEB-16
         3 ACTIVE                 875849 16-FEB-16
         4 ACTIVE                 875849 16-FEB-16
         5 ACTIVE                 875849 16-FEB-16

SQL> alter database end backup;

Database altered.

SQL> SELECT * FROM V$BACKUP;

     FILE# STATUS                CHANGE# TIME
---------- ------------------ ---------- ---------
         1 NOT ACTIVE             875849 16-FEB-16
         2 NOT ACTIVE             875849 16-FEB-16
         3 NOT ACTIVE             875849 16-FEB-16
         4 NOT ACTIVE             875849 16-FEB-16
         5 NOT ACTIVE             875849 16-FEB-16

DB를 통으로 backup을 할 수 있는경우를 준비 해 보았습니다. 내일 강의시간에 backup을 진행할 예정입니다.

'강의노트' 카테고리의 다른 글

[DB] DB백업과복구 4일차  (0) 2016.02.18
[DB] DB백업과복구 3일차  (0) 2016.02.17
[DB] DB백업과복구 1일차  (0) 2016.02.15
[DB] DB 성능관리와 튜닝 5일차  (0) 2016.02.05
[DB] DB 성능관리와 튜닝 4일차  (0) 2016.02.04

+ Recent posts