오늘은 개인 노트북을 챙겨서 수업을 들을 준비를 하고 왔는데 웬열...?
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 |