반응형

Task 관리

정의

Task :  '자원소유권의 단위'

Thread : '수행의 단위'

Process : '동작중인 프로그램'


사용자 입장에서 프로세스 구조

텍스트 - CPU에서 직접 수행되는 명령어

데이터 - 전역변수 

스택 -  지역변수와 인자 그리고 함수의 리턴 주소  존재

힙 - 동적 할당받은 내용이 존재

 * 이 때 각 영역을 세그먼트 또는 가상 메모리 객체 라고 함


프로세스와 쓰레드의 생성과 수행

1. 새로운 프로세스를 생성하면, 생성된 프로세스(자식 프로세스)와 생성한 프로세스(부모 프로세스)는 서로 다른 주소공간을 갖는다

  반면, 새로운 쓰레드를 생성하면 생성된 쓰레드(자식 쓰레드)와 생성한 쓰레드(부모 쓰레드)는 서로 같은 주소공간을 공유한다.

2. - 같은 프로세스에서 새로운 쓰레드를 생성할 경우 기존 쓰레드와 생성된 다른 쓰레드가 함께 동작하고 있는 것으로 볼 수 있다.

  즉, 한 프로세스에 2개의 쓰레드가 동작하는 것. (한 프로세스에 여러 쓰레드가 동작하는 모델 = 다중 쓰레드 시스템)

   - 쓰레드 생성은 새로이 모든 자원을 생성해 주어야 했던 프로세스에 비해 생성에 드는 비용이 비교적 적다.

3. 자식 쓰레드에서 결함이 발생하면 그것은 부모 쓰레드로 전파된다.

  반면 자식 프로세스에서 발생한 결함은 부모 프로세스에게 전달되지 않음

  결국, 쓰레드 모델은 지원공유에 적합하며, 프로세스 모델은 결함 고립에 적합한 프로그래밍 모델이다.


리눅스의 태스크 모델



프로세스는 자신이 사용하는 자원과 그 자원에서 수행되는 수행 흐름으로 구성.

이를 관리하기 위해 각 프로세스마다 task_struct라는 자료 구조를 생성

리눅스 커널은 프로세스 또는 쓰레드 중에서 어떤 것이 요청될 지라도, 모두 task_struct 자료 구조로 동일하게 관리

즉, 사용자 수준에서 쓰레드를 생성하면 그 쓰레드의 존재를 커널도 안다


태스크 문맥

태스크와 관련된 이러한 '모든' 정보를 문맥이라고 부름.

- 시스템 문맥 : 태스크의 정보를 유지하기 위해 커널이 할당한 자료구조들

  (task_struct, 파일 디스크립터, 파일 테이블, 세그먼트 테이블, 페이지 테이블 등) 

- 메모리 문맥 : 텍스트, 데이터, 스택, heap 영역, 스왑 공간 등이 여기에 포함

- 하드웨어 문맥 : 문맥 교환 할 때 태스크의 현재 실행 위치에 대한 정보를 유지하며, 쓰레드 구조 또는 하드웨어 레지스터 문맥 이라 불림


각 변수를 관련 있는 것 끼리 구분

가. task identification

- 태스크 ID를 나타내는 pid, 태스크가 속해있는 쓰레드 그룹 ID를 나타내는 tgid,

  pid를 통해 해당 태스크의 task_struct를 빠르게 찾기 위해 커널이 유지하고 있는 해쉬 관련 필드 등의 변수가 있음

 (uid[사용자 ID], euid[유효 사용자ID], suid[저장된 사용자 ID], fsuid[파일시스템 사용자 ID], gid, egid, sgid, fsgid)


나. state

- 생성에서 소멸까지 많은 상태를 거치며, 이를 관리하기 위한 state변수가 존재

(TASK_RUNNING(0), TASK_INTERRUPTIBLE(1), TASK_UNINTERRUPTIBLE(2), TASK_STOPPED(4), TASK_TRACED(8), EXIT_DEAD(16), EXIT_ZOMBIE(32))


다. task realationship

- 태스크는 생성되면서 가족 관계를 갖음

- 현재 테스크를 생성한 부모 태스크의 task_struct 구조체를 가리키는 real_parent와 현재 부모 태스크의 task_struct 구조체를 가르키는 parent 필드가 존재


라. scheduling information

- task_struct에서 스케줄링과 관련된 변수 : prio, policy, cpus_allowed


마. signal information

- 시그널은 태스크에게 비동기적인 사건의 발생을 알리는 매커니즘

- 관련 변수 : signal, sighand, blocked, pending


바. memory information

- 태스크는 자신의 명령어와 데이터를 텍스트, 데이터, 스택 그리고 힙 공간 등에 저장

- task_struct엔 이 공간에 대한 위치와 크기, 접근 제어 정보 등을 관리하는 변수 존재


사. file information

- 태스크가 오픈한 파일들은 task_struct에서 files_struc구조체 형태인 files라는 이름의 변수로 접근 가능

- 루트 디렉터리의 inode와 현재 디렉터리의 inode는 fs_struct 구조체 형태인 fs라는 변수로 접근 가능


아. thread structure

- 문맥 교환을 수행할 때 태스크가 현재 어디까지 실행되었는지 기억해놓는 공간


자. time information

- 태스크 시간 정보를 위한 변수로는 태스크가 시작된 시간을 가리키는 start_time, real_start_time 이 있음

- 사용한 CPU 시간의 통계를 담는 필드도 있음


차. format

- 리눅스는 Linux exec 도메인뿐만 아니라 BSD나 SVR4 exec 도메인도 지원

  * BSD나 SVR4 커널에서 컴파일 된 프로그램도 리눅스에서 재 컴파일 없이 수행 될 수 있다는 의미

- personality 변수 사용

- 이진 포맷을 지원하기 위한 필드가 thread_info 내에 존재


카. resource limits

- 태스크가 사용할 수 있는 자원의 한계를 의미

- rlim_max : 최대 허용 자원의 수

  rlim_cur : 현재 설정된 허용 자원의 수

- 자원의 한계가 배열로 구현되어 있으며, 현재 리눅스 커널에는 최대 16개의 자원에 대한 한계를 설정

반응형

리눅스 커널 컴파일

리눅스 커널을 만드는 과정(3단계)

1. 커널 구성(Kernel configuration)

2. 커널 컴파일(Kernel compile)

3. 커널 인스톨(Kernel installation)


1. 커널 구성(Kernel configuration)

- 커널 구성이란 새로 만들어질 리눅스 커널에게 현재 시스템에 존재하는 하드웨어 특성, 커널 구성 요소, 네트워크 특성 등의

  정보를 알려주는 과정

- 시스템 하드웨어 정보들에 대한 사전 지식이 필요

- 수행 방법

  make config

  make menuconfig

  make xconfig 등의 방법이 있음


2. 커널 컴파일(Kernel compile)

- 커널 소스 파일을 이용해 실행 가능한 커널을 만드는 과정

- "make bzImage"나 "make zImage" 등의 명령으로 생성될 수 있다. (bzImage와 zImage는 커널 이미지 크기만 차이가 있을 뿐 커널 자체는 동일)

- 커널 2.6 버전 이후 부터는 "make"만 타이핑 해도 됨


3. 커널 인스톨(Kernel installation)

- 생성된 커널로 시스템이 부팅될 수 있도록 만드는 과정

- 커널 인스톨은 생성된 커널 이미지를 루트 파일시스템으로 복사, 모듈 인스톨, 그리고 부트로더(grub) 수정 등의 과정으로 이루어짐


리눅스 커널 컴파일 수행

* root 계정에서 수행 해야한다.


커널 컴파일을 위한 패키지 설치

 

현재 커널 버전 확인

$ uname -r

 

 

 

커널 소스 다운로드

커널 소스는 http://kernel.org 에서 다운로드 가능

 

 

저 하이퍼링크 마우스 오른쪽을 누른후 링크 copy후

 

# wget [링크 주소] 를 입력하면 다운로드를 받게된다.

 

tar.xz로 다운 받았으므로

# tar xvf linux-4.4.5.tar.xz

를 이용하여 다운로드 받은 파일을 압축풀기

(tar.gz일경우 tar xzvf로 풀면됨)

 

필요 패키지 설치

 

$ sudo apt-get install build-essential libncurses5 libncurses5-dev bin86 kernel-package -y

 


Configuration 파일 복사

 

현재 커널의 configuration 파일을 복사


cp /boot/config-현재커널명 ./.config



$ sudo make menuconfig


Load 를 클릭


OK 후 Save


이후 Exit로 터미널로 빠져나옴


커널 컴파일 (커널 설치 이미지 생성)

$ sudo make-kpkg --initrd --revision=1.0 kernel_image

* 이 명령어 수행시 컴퓨터 상태에 따라 시간이 오래 걸릴 수 있다.

'Study Note > OS' 카테고리의 다른 글

[Linux] root 계정 초기 패스워드 설정  (0) 2016.03.10
[Linux] Task 관리  (0) 2016.03.07
[Linux] 리눅스 커널 구조  (0) 2016.03.07
[Linux] Shell Script  (0) 2016.02.15
[Linux] Shell & Shell 내장 명령어  (0) 2016.02.15
반응형

리눅스 커널 구조


운영체제의 관리 자원

물리적인 자원 : CPU, 메모리, 디스크, 터미널, 네트워크 등 시스템 구성 요소 및 주변 장치들

추상적인 자원 : task, 세그먼트, 페이지, 파일, 통신 프로토콜, 패킷 등

  * 물리적인 자원에 대응되지 않으며 추상적인 객체로만 존재하는 자원 : 보안, 사용자 ID에 따른 접근제어 등


커널이 관리하는 자원 ( 물리적인 자원 + 추상적인 자원)

CPU - task                  (Task 관리자)            => task의 생성, 실행, 상태 전이, 스케줄링, 시그널 처리, 프로세스 간 통신 등의 서비스 제공

Memory - Segment,page  (Memory 관리자)         => 물리 메모리 관리, 가상 메모리 관리, 세그멘테이션, 페이징, 페이지 부재 결함 처리 등의 서비스 제공

Disk - File                  (File System)              => 파일 생성, 접근 제어, inode 관리, 디렉터리 관리, 수퍼 블록 관리 등의 서비스 제공

Network 장치 - Socket     (Network 관리자)         => socket 인터페이스, TCP/IP 같은 통신 프로토콜 등의 서비스 제공

각종 장치 - Device Driver  (Device Driver 관리자)  => 디스크나 터미널, CD, 네트워크 카드 등과 같은 주변 장치를 구동하는 드라이버들로 구성


" 운영체제는 시스템 호출을 통해 테스크가 자원을 사용할 수 있게 해주는 자원관리자"



각 디렉터리의 내용


kernel 디렉터리

- task 관리자가 구현한 디렉터리

- task의 생성과 소멸, 프로그램의 실행, 스케줄링, 시그널 처리 등의 기능이 구현되있는 디렉터리


arch 디렉터리

- 리눅스 커널 기능 중 하드웨어 종속적인 부분들이 구현된 디렉터리

- CPU의 타입에 따라 하위 디렉터리로 다시 구분 ( 인텔의 i386, ARM계열, 모토로라의 68시리즈, SUN의 Sparc, IBM의 PPC 등 )


fs 디렉터리

- 리눅스에서 지원하는 다양한 파일시스템과 open(), read(), write() 등의 시스템 호출이 구현된 디렉터리.

- 대표적인 파일시스템 (ext2, ext3, ext4, nfs, fat,proc, sysfs, devfs, isofs, ntfs, reiserfs, f2fs, xfs 등)


mm 디렉터리

- 메모리 관리자가 구현된 디렉터리

- 물리 메모리 관리, 가상 메모리 관리, task마다 할당되는 매모리 객체 관리 등의 기능이 구현


driver 디렉터리

- 리눅스에서 지원하는 디바이스 드라이버가 구현된 디렉터리

- 디바이스 드라이버( 디스크, 터미널, 네트워크 카드 등 주변 장치를 추상화시키고 관리하는 커널 구성 요소 ) 


net 디렉터리

- 리눅스 커널 소스 중 상당히 많은 양을 차지하는 디렉터리

- 리눅스가 지원하는 통신 프로토콜이 구현된 디렉터리

- TCP/IP 뿐만아니라 UNIX 도메인 통신 프로토콜, 802.11, IPX, RPC, AppleTalk, bluetooth, socket 등 다양한 통신 프로토콜 구현


ipc 디렉터리

- 리눅스 커널이 지원하는 프로세스간 통신 기능이 구현된 디렉터리

- 대표적인 프로세스간 통신 ( 파이프, 시그널, SYS V IPC, 소켓 등 )

  * 파이프는 fs디렉터리에, 시그널은 kernel 디렉터리에, 소켓은 net 디렉터리에 구현


init 디렉터리

- 커널 초기화 부분, 즉 커널의 메인 시작 함수가 구현된 디렉터리


include 디렉터리

- 리눅스 커널이 사용하는 헤더 파일들이 구현된 디렉터리


others 디렉터리

- 리눅스 커널의 주요 기능이 구현된 디렉터리 외에도 리눅스 커널 소스에는 여러 다른 디렉터리가 존재한다.

- 대표적으로 (리눅스 커널 및 명령어들에 대한 자세한 문서 파일들이 존재하는 Documentation 디렉터리, 

                 커널 라이브러리 함수들이 구현되는 lib 디렉터리, 

                 커널 구성 및 컴파일 시 이용되는 스크립트 들이 존재하는 scripts 디렉터리 등)이 리눅스 커널소스에 존재



'Study Note > OS' 카테고리의 다른 글

[Linux] Task 관리  (0) 2016.03.07
[Linux] 리눅스 커널 컴파일 (fedora)  (0) 2016.03.07
[Linux] Shell Script  (0) 2016.02.15
[Linux] Shell & Shell 내장 명령어  (0) 2016.02.15
[Linux] Vi Editor  (0) 2016.02.15
반응형

1. 오라클 다운로드

http://www.oracle.com 접속

 

Download 클릭 후 oracle database 클릭.

 

*Orange Tool(64bit를 호환 안함)을 사용하기 때문에 32bit로 설치

 

위쪽에 Accept License Agreement 체크 후

 

File1 클릭 후 Oracle계정으로 로그인 한 후 다운로드 진행.

 

 

2. 압축 해제

 

다운이 완료되면 database 한 폴더 내에 두 개의 zip파일을 압축을 푼다.

 

 

3. 오라클 설치

 

 

아래 체크 해제

 

아래 경고 시 예 클릭

 

 

 

 

 

 

 

 

 

 

 

기본 값이 KO16MSWIN949일 경우 기본값 사용 아닐 경우

아래쪽의 다음 문자 집합 목록에서 선택부분을 눌러 LO16MSWIN949를 선택

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형

Log Miner 활용과 Redo log 장애

Log Miner

- Oracle 8i 버전부터 Binary 형식으로 되어있는 Redo log File의 내용을 조회할 수 있도록 Log Miner를 제공

- Redo log File에 있는 내용을 추출해서 SQL로 변환한 후 사용자가 SQL 문장으로 조회해서 원하는 내용 확인할 수 있음

- Redo log File 내부에는 데이터가 변경된 시점을 정확하게 알 수 있기 때문에 변경이력을 추적해서 원래 값으로

돌려야 할 경우 등에 유용

 

Log Miner의 제약 사항

- Log Miner8i 이후 버전에서만 작동

- 분석 대상 인스턴스와 같은 플랫폼에서 동작하고 같은 Character set을 사용하는 db에서 생성된 Redo Log File만 분석할 수 있음

- 분석 대상 인스턴스와 Redo log가 생성된 인스턴스는 DB_BLOCK_SIZE가 동일해야 한다.

다를 경우 Corruption 발생 내용이 기록

- Supplemental loggingenable되어 있어야 함

 

supplemental logging

- 데이터에 DML이 발생할 경우 Redo log에 추가적인 내용을 기록 (기본 값 보다 자세한 내용 기록)

- supplemental log 기능을 사용할 경우 redo log 생성 양이 많아지기 때문에 아카이브 로그 모드를 사용 할 경우 아카이브 경로를

충분하게 주고 사용해야 한다

- 기본 값은 disable

 

min level supplemental logging 조회 및 변경

 

# 조회

select supplemental_log_data_min from v$database;

 

# enable

alter database add supplemental log data;

 

# disalbe

alter database drop supplemental log data;

 

# 특정 테이블에만 적용

alter table scott.emp add supplemental log data (all) columns;

 

# 특정 테이블에만 적용 해제

alter table scott.emp drop supplemental log data (all) columns;

 

# 특정 컬럼 logging 확인

select * from dba_log_groups;

 

Log Miner 설정하기

1. Log Miner 전용 Dictionary 생성

2. Log Miner로 분석할 로그를 보냄

(redo log buffer, archive log) = 등록

3. Log miner에서 분석

4. SQL 로 분석된 결과 조회(v$)

 

Log Miner Dictionary 생성

- Log MinerRedo log file을 분석해서 그 안에 있는 테이블 이름이나 컬럼 이름들이 있는 부분을 딕셔너리를 확인해서

볼 수 있도록 변환해줌

- SQL parse 단계에서 사용하는 딕셔너리가 아닌 Log Miner가 사용하는 별도의 딕셔너리

- 다른 서버에서 만들면 안 되고 분석을 해야하는 Redo log file이 만들어진 DB에 생성되어야 한다.

- 만약 딕셔너리가 없을 경우 테이블 이름이나 컬럼명이 나오는 부분이 변환할 수 없기 때문에 헥사 값으로 보여주게 된다.

 

Dictionary File 생성하는 방법 세 가지

1. Online Catalog 사용

  - Redo log file이 생성된 Source Database에 접근이 가능한 경우

  - 관련 table들에 컬럼 정의가 변경이 없을 경우

  - exec dbms_logmnr.start_logmnr(options => dbms_logmnr.dict_from_online_catalog);

 

2. Redo Log File 자체에 저장하는 방법

  - Redo Log File이 생성된 Source Database에 접근이 불가능할 경우 사용

  - 9i 이상에서 지원됨

  - DBArchive mode 여야 한다

  - 딕셔너리를 추출하는 동안 어떠한 DDL도 허용되지 않음

  - exec dbms_logmnr_d.build(options => dbms_logmnr_d.store_in_redo_logs);

 

3. Flat File에 저장하는 방법 ★ 가장 많이 쓰임

  - 이전 버전과의 호환성을 보장하기 때문에 가장 많이 사용하는 방법

  - exec dbms_logmnr_d.build(‘dict.dat’,‘/home/oracle/logmnr/’, -> dbms_logmnr_d.store_in_flat_file);

 

flat file 로 딕셔너리 생성 실습

1) DB 전체를 종료한 후 parameter file에 딕셔너리 파일의 위치를 아래와 같이 지정한다

SQL > !mkdir /oracle11/logminer

SQL > shutdown immediate;

# vi $ORACLE_HOME/dbs/inittestdb.ora

utl_file_dir=/oracle11/logminer 추가

 

-- 2) DBstart

select *

from v$parameter

where name like '%utl_file_dir%';

-- 3) 딕셔너리 생성

select a.group#, a.member, b.bytes/1024/1024 mb, b.sequence# "seq#", b.status, b.archived arc

from v$logfile a , v$log b

where a.group# = b.group#

order by 1,2;

exec dbms_logmnr_d.build(dictionary_filename=>'dict.dat',dictionary_location=>'/oracle11/logminer');

 

-- 4) Log Miner에 분석할 로그 추가

-- 명령 마지막에 있는 숫자의 의미 1=신규등록, 2=파일삭제, 3=추가등록

exec dbms_logmnr.add_logfile('/oracle11/oracle/oradata/testdb/redo01.log',1);

exec dbms_logmnr.add_logfile('/oracle11/oracle/oradata/testdb/redo02.log',3);

exec dbms_logmnr.add_logfile('/oracle11/oracle/oradata/testdb/redo03.log',3);

 

 

-- 무한 루프 현상 조치

 

-- Log Miner 등록 확인

select db_name, filename from v$logmnr_logs;

 

-- 문제가 되는 로그 삭제

exec dbms_logmnr.add_logfile('/oracle11/oracle/oradata/testdb/redo03.log',2);

 

-- 무한 루프중인 로그가 current 이면 current, inactive, inactive 상태로 맞춰준 후 다시 실행한다.

alter system switch logfile;

alter system checkpoint;

 

exec dbms_logmnr.add_logfile('/oracle11/oracle/oradata/testdb/redo03.log',3);

 

--Log Miner 실습 1. drop table 정보 찾기

--drop table 장애가 발생했을 경우 Log Miner을 활용하여

--어떻게 Redo LogFile에서 해당 정보를 찾아내는지 실습

 

--step 1. 현재 상태 확인

select a.group#, a.member, b.bytes/1024/1024 mb, b.sequence# "seq#", b.status, b.archived arc

from v$logfile a , v$log b

where a.group# = b.group#

order by 1,2;

--step 2. 새로운 테이블 생성 후 데이터 입력하고 삭제

create table scott.test1 (no number);

insert into scott.test1 values(1);

commit;

 

drop table scott.test1 purge;

 

-- 현재 current log 확인(1번 그룹에서 진행 중)

SQL> @log.sql;

 

--step 3 .Log Miner를 시작해서 log를 분석한 후 결과를 조회한다. (, temporary space가 있어야 함!)

create temporary tablespace temp2 tempfile '/oracle11/oracle/oradata/testdb/temp02.dbf' size 20M;

 

alter database default temporary tablespace temp2;

 

select tablespace_name from dba_temp_files;

 

select file_name from dba_temp_files;

 

exec dbms_logmnr.start_logmnr(dictfilename=>'/oracle11/logminer/dict.dat',

options=>dbms_logmnr.ddl_dict_tracking+dbms_logmnr.committed_data_only);

 

-- logminer 내용 확인

alter session set nls_date_format='YYYY-MM-DD:HH24:MI:SS';

 

select timestamp, username, operation, sql_redo

from v$logmnr_contents

where seg_name='TEST1';

 

 

 

반응형

Offline 백업 본을 이용한 DB 복구

1) shutdown immediate

 

2) OS 상에서 Cold 백업해둔 파일로 대체

--151228 날짜 백업 본을 이용해 복구

SELECT 'cp /oracle11/backup/20151228' ||substr(name,instr(name,'/',-1))||' '||name

FROM v$datafile

union all

SELECT 'cp /oracle11/backup/20151228' || substr(name,instr(name,'/',-1))||' '||name

FROM v$controlfile

union all

SELECT 'cp /oracle11/backup/20151228' || substr(name,instr(name,'/',-1))||' '||name

FROM (select member as "NAME"

from v$logfile);

 

3) startup

 

 

'Study Note > Database' 카테고리의 다른 글

Oracle 11g Release 2 installation on Windows  (0) 2016.03.01
Log Miner 활용과 Redo log 장애  (0) 2016.02.26
Control File 장애 복구  (0) 2016.02.26
Hot Backup  (0) 2016.02.26
Cold Backup  (0) 2016.02.26
반응형

Control File 장애 복구

** Control File이 과거 버전이면 반드시 다시 만들어야 함(redo를 읽는건 datafile)

 

실습 1. Parameter File의 경로와 실제 파일 경로가 다른 경우 대처하기

==> Parameter File 에 적힌 control file 경로와 실제 control file 의 경로가 달라서 생기는 에러로 두 경로만 일치시키면 간단히 해결

실습환경 만들기

SQL> create pfile from spfile;

-- control file 유실 상황 가정(rm)

 

SQL> shutdown immediate;

!rm /oracle11/oracle/flash_recovery_area/testdb/control02.ctl

 

SQL> startup

 

 

alert log 확인

 

 

해결방법

-- 복구 수행 1) init파일의 ctl 파일 삭제 후 DB open(문제되는 2번 지우기)

* spfile로 운영시 spfile은 삭제 후 open

-- 복구 수행 2) 나머지 손상되지 않은 control file copy DB open

!cp /oracle11/oracle/oradata/testdb/control01.ctl /oracle11/oracle/flash_recovery_area/testdb/control02.ctl;

 

SQL> alter database mount;

SQL> alter database open;

 

실습 2. Control File끼리 버전이 다른 경우 대처하기

==> Control file 끼리의 정보가 서로 다른 경우에 생기는 에러. Control file 끼리 정보를 맞춰주면 됨

실습환경

-- 1. pfile control file 주석 후 pfileDB OPEN (spfile 있을 시 spfile 삭제)

-- 2. shutdown immediate

-- 3. startup

-- 4. 다시 pfile control file 주석 해제 후 DB OPEN 시 에러 확인

 

 

해결방법

--버전 정보가 더 큰 파일을 작은 파일로 cp

cp /oracle11/oracle/oradata/testdb/control01.ctl /oracle11/oracle/flash_recovery_area/testdb/control02.ctl;

 

SQL> alter database mount;

SQL> alter database open;

 

 

실습 3. Old Control File 또는 Control File이 삭제되었을 경우 대처하기

1) noresetlogs : 리두 리셋 안함 (resetlogsredo에도 에러있을시 사용)

 

-- control file 재생성 스크립트 만들기

alter database backup controlfile to trace as '/oracle11/backup/20151229/control.sql';

 

* 공백 / 주석을 제거해야 합니다.

 

-- 실습환경 만들기

-- 과거 컨트롤 파일로 바꿔줌

cp /oracle11/backup/20151228/control01.ctl /oracle11/oracle/oradata/testdb/control01.ctl

cp /oracle11/backup/20151228/control01.ctl /oracle11/oracle/flash_recovery_area/testdb/control02.ctl;

 

SQL> startup

 

==> 반드시 control file 재생성 해주어야 함

 

SQL> shutdown immediate

 

* 해당 폴더에서 sqlplus 로 접속 후 @control.sql

 

-- control file 재생성 스크립트 만들기

alter database backup controlfile to trace as '/oracle11/backup/20151230/control.sql';

 

--장애상황 발생

--old 백업 본으로 현재 control file 덮어쓰기

alter database backup controlfile to '/oracle11/backup/20151230/control_bak.ctl'

 

drop table scott.recover_test1;

create table scott.recover_test1(a number);

insert into scott.recover_test1 values(1);

insert into scott.recover_test1 values(2);

insert into scott.recover_test1 values(3);

commit;

 

SQL> shutdown immediate

!cp /oracle11/backup/20151230/control_bak.ctl /oracle11/oracle/oradata/testdb/control01.ctl

!cp /oracle11/backup/20151230/control_bak.ctl /oracle11/oracle/flash_recovery_area/testdb/control02.ctl;

 

-- startup 시 에러 확인

* 컨트롤 파일은 정상인데 시점정보가 맞지 않음(01589)

 

SQL> alter database noresetlogs;

 

* controlfile을 이용해서만 noresetlogs 가능(01610)

 

SQL> alter database resetlogs;

 

* control 파일은 과거 버전인데 system01.dbf는 최신버전 즉, restore 해야 함(01152)

==> control file 재생성 판단

 

--shutdown 상태에서 수행

SQL> shutdown immediate

SQL> @/oracle11/backup/20151230/control.sql

 

SQL> alter database open;

 

 

control file 재생성 하기

--장애 상황 만들기

--01. 현재 online redo 확인

select a.group#, a.member, b.bytes/1024/1024 mb, b.sequence# "seq#", b.status, b.archived arc

from v$logfile a , v$log b

where a.group# = b.group#

order by 1,2;

 

 

 

-- inactive 이면서 arcYES인 리두로그 파일 확인 및 삭제

!rm /oracle11/oracle/oradata/testdb/redo03.log;

 

-- control file 확인

select * from v$controlfile;

 

-- 모든 control file 삭제

!rm /oracle11/oracle/oradata/testdb/control01.ctl;

!rm /oracle11/oracle/flash_recovery_area/testdb/control02.ctl;

 

-- shutdown immediate로 내릴 경우 에러 확인

SQL > shutdown immediate

 

 

 

SQL > shutdown abort

 

!cp /oracle11/backup/20151230/control01.ctl /oracle11/oracle/oradata/testdb/control01.ctl

!cp /oracle11/backup/20151230/control01.ctl /oracle11/oracle/flash_recovery_area/testdb/control02.ctl

 

SQL > startup

 

 

SQL > @control.sql (전에 만들어둔 noresetlogs 옵션)

** redo 파일이 없어져서 error

 

control.sql 파일의 noresetlogsresetlogs로 수정 한 후

 

SQL > @control.sql

SQL > alter database open;

##ORA-01589: must use RESETLOGS or NORESETLOGS option for database open

 

SQL > alter database open resetlogs;

Database altered.

 

1. 마운트 상태에서 alter database backup control file to trace as ‘....’; 명령어로 재생성 할 수 있는 스크립트 생성

2. 스크립트를 열어서 no resetlogs caseresetlogs case를 구분해서 재생성 스크립트를 편집

3. DB shutdown 상태로 만든 후 위 2번에서 만든 스크립트를 실행시켜 DB를 마운트 까지 시킨 후 시작

 

'Study Note > Database' 카테고리의 다른 글

Log Miner 활용과 Redo log 장애  (0) 2016.02.26
Offline 백업 본을 이용한 DB 복구  (0) 2016.02.26
Hot Backup  (0) 2016.02.26
Cold Backup  (0) 2016.02.26
No Archive log / Archive log  (0) 2016.02.26
반응형

Hot Backup

열린 백업 (Hot backup/Open backup/Begin backup/Online backup)

- 데이터베이스 가동 중 전체 파일 백업

- Tablespace 단위로 백업 수행

- 11g부터 Database 단위도 가능 (Redo 발생량 문제로 비 권고)

- 백업 전 대상 Tablespace를 백업 모드로 적용하고, 백업 후 백업 모드를 해제

- Archive Log Mode 필수 (Redo log 파일로 변경하기 위해)

- Redo 발생량 급증, Archive 발생량 급증

- Data fileControl file만 백업 가능, Online Redo Log File은 백업 불가능 --> resetlogs 필요

 

열린 백업 원리

SQL > alter tablespace users begin backup; (DBWR 발생)

 

Checkpoint 발생해서 변경사항 datafile로 저장

마지막 checkpoint scn 정보를 data file control file 에 저장

데이터파일 헤더의 Hot-backup-in-progress 플래그에 백업 시작 정보 기록

이후의 변경된 데이터는 리두로그에 블록단위(데이터 손실을 막기위해)로 기록

--> Begin backup을 수행해도 테이블스페이스 변경은 가능

--> 백업 수행 시 archive 양이 급증 하므로 모니터를 더 잘해야함

백업 완료 후에는 반드시 end backup을 수행해야 함(hot backup을 수행 중에는 shutdown immediatenormal로 종료불가)

 

SQL > alter tablespace users end backup;

 

ALTER TABLESPACE BEGIN BACKUP 내부 처리 과정

1. ALTER TABLESPACE BEGIN BACKUP 명령이 수행되는 순간 체크포인트 신호가 발생하여 db 버퍼 캐시의

Dirty Block 들을 데이터 파일로 내려쓰는 작업이 시작됩니다.

 

2. 체크포인트 신호가 발생되면서 SCN은 동기화 작업이 일어나며 데이터 파일 헤더에 SCN이 기록됩니다.

 

3. ALTER TABLESPACE END BACKUP 명령이 완료 될 때까지 데이터 파일에 기록된 SCN은 변경되지 않는다.

하지만, 데이터 파일의 블록은 읽고 변경이 된다.

 

4. 최종 SCN 이후의 변경된 내용은 리두 로그 파일에 저장되어 있다가 ALTER TABLESPACE END BACKUP

명령을 수행하면 리두로그에 있는 데이터 파일에 기록

 

5. 복구는 ALTER TABLESPACE BEGIN BACKUP 명령을 수행했을 때 고정된 SCN을 기준으로 HOT백업 한

데이터 파일을 복권해서 복구할 수 있습니다. 그러면 리두 로그 파일에 기록된 내용을 ROLL FORWARD

되면서 HOT백업 한 시간까지의 모든 변경된 내용들이 적용됩니다.

 

 

01. BACK UP 대상 확인

SELECT TABLESPACE_NAME, FILE_NAME

FROM DBA_DATA_FILES;

 

 

02. BEGIN BACKUP MODE : 백업모드 적용 (CHECKPOINT 발생)

SELECT TABLESPACE_NAME, 'ALTER TABLESPACE '||TABLESPACE_NAME||' BEGIN BACKUP;'

FROM DBA_TABLESPACES

WHERE TABLESPACE_NAME NOT LIKE 'TEMP%';

 

03. OS BACKUP 수행

SELECT TABLESPACE_NAME, FILE_NAME, 'CP '||FILE_NAME||' /oracle11/backup/'||to_char(sysdate,'yyyymmdd')

FROM DBA_DATA_FILES;

 

04. END BACKUP MODE : 백업 모드 해제 (CHECKPOINT 발생)

SELECT TABLESPACE_NAME, 'ALTER TABLESPACE ' ||TABLESPACE_NAME||' END BACKUP;'

FROM DBA_TABLESPACES

WHERE TABLESPACE_NAME NOT LIKE 'TEMP%';

 

확인

select a. file#, a.name, b.status, to_char(b.time, 'YYYY-MM-DD:HH24:MI:SS') as time

from v$datafile a, v$backup b

where a.file#=b.file#;

 

05. control file 백업

alter database backup controlfile to '/oracle11/backup/20151229/control01.ctl';

'Study Note > Database' 카테고리의 다른 글

Offline 백업 본을 이용한 DB 복구  (0) 2016.02.26
Control File 장애 복구  (0) 2016.02.26
Cold Backup  (0) 2016.02.26
No Archive log / Archive log  (0) 2016.02.26
Recovery 원리  (0) 2016.02.26
반응형

Cold Backup

 

□ 백업 대상

- 필수 : Data File, Redo Log File(archive가 있다면 안 가져갈 수 도 있음), Control File

- 선택 : Parameter File, Password File, sqlnet.ora, listener.ora, tnsnames.ora

 

1) Data File

- 사용 중인 Data File은 자주 백업을 받아야 함

SQL > select name, status from v$datafile;

 

NAME STATUS

------------------------------------------------------------

/oracle11/oracle/oradata/testdb/system01.dbf SYSTEM

/oracle11/oracle/oradata/testdb/sysaux01.dbf ONLINE

/oracle11/oracle/oradata/testdb/undotbs01.dbf ONLINE

 

NAME STATUS

------------------------------------------------------------

/oracle11/oracle/oradata/testdb/users01.dbf ONLINE

/oracle11/oracle/oradata/testdb/example01.dbf ONLINE

 

2) Control File

- 현재 Control File을 백업 받아야 함

SQL > select name from v$controlfile;

NAME

--------------------------------------------------------------------------------

/oracle11/oracle/oradata/testdb/control01.ctl

/oracle11/oracle/flash_recovery_area/testdb/control02.ctl

 

3) Redo Log File

SQL >select a.group#, a.member, b.bytes/1024/1024 MB, b.sequence# "SEQ#", b.status, b.archived "ARC"

from v$logfile a, v$log b

where a.group#=b.group#

order by 1,2;

 

 

4) Parameter File/Password File

- Parameter File

  · Oracle 서버의 각종 설정 정보 저장

  · 기동에 반드시 필요, 최적값 백업 필요

  · $ORACLE_HOME/dbs

- Password File

  · sysdba 권한 암호 저장

  · DB종료 상태에서 딕셔너리 없이 로그온 하기 위해 존재

  · orapwd 로 재생성 가능

 

5) sqlnet.ora & listener.ora & tnsnames.ora

- sqlnet.ora

  · $ORACLE_HOME/network/admin

  · local 접속의 권한 관리

  · 외부 접속자 list 관리

- listener.ora

  · $ORACLE_HOME/network/admin

  · 외부에서 DB서버로 접속을 받아주는 리스너의 설정 파일

- tnsnames.ora

  · $ORACLE_HOME/network/admin

  · 외부 DB서버로 접속할 때의 TNS 정보 설정 파일

 

백업의 종류

1) 닫힌 백업 (Cold backup/Closed backup)

- 데이터베이스 종료 후 전체 파일 백업

- 모든 파일의 Checkpoint SCN은 같아야 함

· 일반적으로 각각 다른 시점에 받은 백업 파일은 복구에 같이 사용 할 수 없음

- 정상 shutdown 상태에서 백업 가능

· shutdown abort, instance crash 등 상태는 일관성이 흐트러진 상태로 복구에 사용될 수 없음

· OFFLINE 되어 있는 Data File 도 복구에 사용 불가 (Checkpoint scn정보가 다름)

- Archive Log Mode 여부 무관

- Data File, Online Redo Log File, Control File 백업 가능

- 주로 복구가 아닌 복제를 할 때 사용

 

01. datafile 확인

select name, status from v$datafile;

 

 

 

02. controlfile 확인

select name from v$controlfile;

 

03. redo log file 확인

select a.group#, a.member as "NAME", b.bytes/1024/1024 MB, b.sequence# "SEQ#", b.status, b.archived "ARC"

from v$logfile a, v$log b

where a.group#=b.group#

order by 1,2;

 

 

04. copy 문 script 작성

SELECT 'cp '||NAME|| ' /oracle11/backup/'||to_char(sysdate,'YYYYMMDD')|| substr(name,instr(name,'/',-1))

FROM v$datafile

union all

SELECT 'cp '||NAME|| ' /oracle11/backup/'||to_char(sysdate,'YYYYMMDD') || substr(name,instr(name,'/',-1))

FROM v$controlfile

union all

SELECT 'cp '||NAME|| ' /oracle11/backup/'||to_char(sysdate,'YYYYMMDD') || substr(name,instr(name,'/',-1))

FROM (select member as "NAME"

from v$logfile);

 

05. DB 정상 종료

SQL > shutdown immediate

 

06. 폴더 만든 후 파일 백업 (copy문 실행)

 

07. DB OPEN

SQL > startiup

 

 

'Study Note > Database' 카테고리의 다른 글

Control File 장애 복구  (0) 2016.02.26
Hot Backup  (0) 2016.02.26
No Archive log / Archive log  (0) 2016.02.26
Recovery 원리  (0) 2016.02.26
파티션 테이블(partition table) - 인덱스(index)  (0) 2016.02.25
반응형

No Archive log / Archive log

No Archive log

 

A까지만 백업 Datafile에 저장된 상태

 

- No archive log 모드 이므로 Redo log file에 저장을 덮음

- 백업 파일 복원하여 장애 복구 진행함

  * B 파일이 유실 되어있으므로 순차적 프로그램이라 전체 다 복구 되지 않음

- Log switch 발생해서 기존 redo log file의 내용을 덮어씀

 

□ Archive log

 

Archive log mode 단점

1. Archive log file을 저장해야 할 별도의 저장 공간이 추가로 필요

2. Archive hang 이 발생할 수 있음

3. 관리가 까다로움

 

Archive Hang 발생 시 해결하는 방법

- Archive HangDB 종료 없이 해결하는 방법

1) 현재 상황 확인

SQL> archive log list

2) # chown R root:root /oracle11/arch

 

 

3) log switch 발생 하여 archive 파일 생성 시도

--> oracle계정을 쓸 수 없도록 변경한 후 Log Switch를 발생시키면 Archive Hang이 발생

 

4) 권한 병경 후 다시 확인

# chown R oracle:dba /oracle11/arch

SQL> alter system switch logfile;

 

5) 바로 Hang이 풀리면 상관없지만 Hang이 안 풀릴시

SQL> alter system archive log stop;

SQL> alter system archive log start;

 

Hang일 때, 새로운 session 접속 시 에러 발

 

-- Log 참조 뷰

select * from v$logfile;

select * from v$log;

 

 

** 잘 쓰지않음**

-- archive log 압축 확인

select archivelog_compression from v$database;

 

-- archive log 압축 설정

alter database archivelog compress enable;

 

-- archive log 압축 해제

alter database archivelog compress disable;

 

 

'Study Note > Database' 카테고리의 다른 글

Hot Backup  (0) 2016.02.26
Cold Backup  (0) 2016.02.26
Recovery 원리  (0) 2016.02.26
파티션 테이블(partition table) - 인덱스(index)  (0) 2016.02.25
SQL TUNNING - 1  (0) 2016.02.24

+ Recent posts