InnoDB Storage Engine Architecture

   

1.InnoDB Storage Engine 기본 기능

프라이머리 키에 의한 클러스터링

InnoDB의 모든 테이블은 기본적으로 프라이머리 키를 기준으로 클러스터링 되어 저장된다.

즉 프라이머리 키 값의 순서대로 디스크에 저장된다는 뜻이며, 이로 인해 프라이머리 키에 의한 레인지 스캔은 상당히 빨리 처리될 수 있다. 결론적으로 쿼리의 실행 계획에서 프라이머리 키는 기본적으로 다른 보조 인덱스에 비해 비중이 높게 설정(쿼리의 실행 계획에서 다른 보조 인덱스보다 프라이머리 키를 선택될 확률이 높음)된다.

잠금이 필요 없는 일관된 읽기(Non-locking consistent read)

MVCC(Multi Version Concurrency Control)라는 기술을 이용해 락을 걸지 않고 읽기 작업을 수행(Undo 활용)

외래 키 지원

MyISAM이나 Memory 테이블에서는 사용할 수 없다.

부모, 자식 테이블 간에 데이터 Check하는 작업으로 인하여 락, 데드락이 발생될 때가 많다.

자동 데드락 감지

그래프 기반의 데드락 체크 방식을 사용하기 때문에 데드락이 발생함과 동시에 바로 감지되고, 감지된 데드락은 관련 트랙잭션 중에서 Rollback이 가장 용이한 트랜잭션을 자동적으로 강제 종료해 버린다. => 실제로는 완벽하지는 않을 듯.

자동화된 장애 복구

Mysql서버가 시작될 때, 완료되지 못한 트랜잭션이나 디스크에 일부만 기록된 데이터 페이지(Partial Write)등에 대한 일련의 복구 작업이 자동으로 진행된다. (SMON,PMON과 비슷한 역할을 내역이 있는 듯)

오라클의 아키텍처 적용

Oracle DBMS와 비슷한 부분이 많다.(UNDO, SYSTEM TBS, TBS 등)

   

   

2.InnoDB Architecture

Oracle VS MySQL

  • Oracle과 흡사한 형태이지만 MySQL은 Storage의 선택에 따라 세부 구조가 달라진다. 주로 RDBMS로 InnoDB가 사용되는데 Oracle 구조와 비슷한 형태인 것을 확인할 수 있다. (아래 상세 구성도 확인)

   

MySQL InnoDB 상세구조

1) InnoDB 전체 구성도

  • 사용자는 mysqld를 통하여 InnoDB에 접근하게 되며 Buffer Pool, Storage의 Access를 통하여 RDBMS의 Transaction이 발생됩니다.

 

   

2) Buffer Pool & 기타 Caching 영역

  • Buffer Pool

    가장 핵심적인 부분으로 디스크의 데이터 파일이나 인덱스 정보를 메모리에 캐시해 두는 공간 MyISAM 키 캐시가 인덱스의 캐시만을 주로 처리하는데 비해 InnoDB의 버퍼 풀은 데이터와 인덱스 모두 캐시하고 쓰기 버퍼링의 역할까지 모두 처리함.

    Innodb_buffer_pool_size 설정 중요

    OS를 고려하여 50~80%수중으로 메모리 크기 설정

    Oracle과 비슷하게 바로 변경된 사항에 대하여 디스크에 반영하지 않고 메모리에만 변경를 먼저 변경한 뒤, 디스크에 기록되지 않는 변경된 데이터를 가지고 있다(더티 페이지)

    체크포인트가 발생되면 Write 스레드가 필요한 만큼 디스크로 기록 진행

    Oracle Buffer Cache 영역과 비슷한 기능

       

  • Undo log

    트랜잭션의 롤백 대비용

    트랜잭션의 격리 수준을 유지하면서 높은 동시성을 제공하는 데 사용된다.

    Oracle 과 다르게 별도의 TBS가 아닌 System TBS에서 관리하는 것으로 구조상으로는 확인됩니다.

    Oracle UNDO TBS 와 비슷한 기능

       

  • Insert Buffer

    Data Insert, Update에 따른 변경작업이 발생될 때 인덱스에도 해당 내역을 반영해야 하는데 해당 테이블에 인덱스가 많다면, 이 작업 시 랜덤하게 디스크를 읽은 작업을 하면서 상당히 많은 자원을 소모하기 때문에 별도의 Insert Buffer공간(임시공간)을 만들어 성능 향상

    Innodb_change_buffering 파라미터로 설정

    MySQL 5.5이전 버전은 Insert까지만 지원, 이후에는 Insert, Delete로 인해 키를 추가하거나 삭제하는 작업에 대해서도 버퍼링이 될 수 있도록 개선 => Update의 경우는 확인이 필요할 듯.

    0.인덱스 페이지가 버퍼 풀에 있으면 바로 업데이트 수행

    1. 임시 공간(Insert Buffer)에 필요한 데이터를 디스크에서 읽어 와서 데이터 변경작업 진행

    2. 인덱스 레코드가 조작된 조각은 이후 백그라운드 스레드에 의해 병합되는데 이 스레드를 버퍼 머지 스레드라고 한다.

    3. 완료 (Oracle의 PGA + TEMP와 비슷한 기능)

   

3) Log Buffer & Redo Log

   

  • Commit시 바로 Disk 에 변경된 데이터 조작을 하지않고 ACID(원자성,일관성,격리성,데이터 유지)를 보장하면서 체크포인트가 발생할 경우 일괄적으로 반영하는 형태로 부하를 줄이기 위한 기능
  • 자동화된 자동 복구시 해당 Redo log를 확인하여 복구 진행
  • 로그 버퍼의 크기는 일반적으로 1~8MB 수전으로 설정 (단, BLOB이나 TEXT와 같은 큰데이터를 자주 변경한다면 더 크게 설정하는 것이 좋다)
  • Oracle Redo log file과 log buffer 영역과 비슷한 기능

   

3. MySQL 기본 명령어

MySQL START / STOP

[root@localhost mysql]# /etc/init.d/mysqld stop

Stopping mysqld: [ OK ]

[root@localhost mysql]# /etc/init.d/mysqld start

   

MySQL Password 변경 및 Login

[root@localhost mysql]# mysqladmin -u root password 새비밀번호

[root@localhost mysql]# mysql -uroot -p => 패스워드 입력

   

MySQL 기본 정보 검색

show databases;

show variables like 'have_innodb';

select version();

show engines;

select @@innodb_version;

show plugins;

show variables where Variable_Name LIKE "innodb_buffer%";

show variables where Variable_Name LIKE "innodb_change_buffering%";

show variables where Variable_Name LIKE "innodb_log%";

show variables where Variable_Name LIKE "%innodb_write_io_threads%";

   

SHOW VARIABLES WHERE Variable_Name LIKE "%dir";

/var/lib/mysql

mysql 8350 8143 0 03:25 pts/1 00:00:00 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock

   

[접속 IP 권한 할당]

mysql> GRANT ALL PRIVILEGES ON *.* TO root@'ip주소' IDENTIFIED BY '비밀번호'' WITH GRANT OPTION;

GRANT ALL PRIVILEGES ON *.* TO root@192.168.22.123 IDENTIFIED BY 'mysql' WITH GRANT OPTION;

   

mysql> show information_schema

mysql> SHOW TABLES;

mysql> DESC 테이블이름;

mysql> DESCRIBE 테이블이름;

mysql> EXPLAIN 테이블이름;

  

 

MySQL 기본 Dictionary 조회

[현재 DB 전체 Size 확인]

mysql> SELECT table_schema "Database Name",

-> SUM(data_length + index_length) / 1024 / 1024 "Size(MB)"

-> FROM information_schema.TABLES

-> GROUP BY table_schema;

+--------------------+------------+

| Database Name | Size(MB) |

+--------------------+------------+

| information_schema | 0.00390625 |

| mysql | 0.52499485 |

+--------------------+------------+

2 rows in set (0.04 sec)

   

mysql>

   

   

mysql> SELECT

-> count(*) NUM_OF_TABLE,

-> table_schema,concat(round(sum(table_rows)/1000000,2),'M') rows,

-> concat(round(sum(data_length)/(1024*1024*1024),2),'G') DATA,

-> concat(round(sum(index_length)/(1024*1024*1024),2),'G') idx,

-> concat(round(sum(data_length+index_length)/(1024*1024*1024),2),'G') total_size,

-> round(sum(index_length)/sum(data_length),2) idxfrac

-> FROM information_schema.TABLES

-> GROUP BY table_schema

-> ORDER BY sum(data_length+index_length) DESC LIMIT 10;

+--------------+--------------------+-------+-------+-------+------------+---------+

| NUM_OF_TABLE | table_schema | rows | DATA | idx | total_size | idxfrac |

+--------------+--------------------+-------+-------+-------+------------+---------+

| 18 | mysql | 0.00M | 0.00G | 0.00G | 0.00G | 0.14 |

| 17 | information_schema | NULL | 0.00G | 0.00G | 0.00G | NULL |

+--------------+--------------------+-------+-------+-------+------------+---------+

2 rows in set (0.00 sec)

   

mysql>

[특정 Table 사이즈 확인]

mysql> SELECT

-> concat(table_schema,'.',table_name),

-> concat(round(table_rows/1000000,2),'M') rows,

-> concat(round(data_length/(1024*1024*1024),2),'G') DATA,

-> concat(round(index_length/(1024*1024*1024),2),'G') idx,

-> concat(round((data_length+index_length)/(1024*1024*1024),2),'G') total_size,

-> round(index_length/data_length,2) idxfrac

-> FROM information_schema.TABLES

-> where table_name = 'events_statements_current' ;

+-------------------------------------+-------+-------+-------+------------+---------+

| concat(table_schema,'.',table_name) | rows | DATA | idx | total_size | idxfrac |

+-------------------------------------+-------+-------+-------+------------+---------+

| mysql.TEST | 0.00M | 0.00G | 0.00G | 0.00G | 93.09 |

+-------------------------------------+-------+-------+-------+------------+---------+

1 row in set (0.00 sec)

[특정 스키마 테이블 정보 확인]

mysql> SELECT table_name, table_type, engine

-> FROM information_schema.tables

-> WHERE table_schema = 'mysql'

-> ORDER BY table_name DESC;

+---------------------------+------------+--------+

| table_name | table_type | engine |

+---------------------------+------------+--------+

| user | BASE TABLE | MyISAM |

| time_zone_transition_type | BASE TABLE | MyISAM |

| time_zone_transition | BASE TABLE | MyISAM |

| time_zone_name | BASE TABLE | MyISAM |

| time_zone_leap_second | BASE TABLE | MyISAM |

| time_zone | BASE TABLE | MyISAM |

| TEST | BASE TABLE | MyISAM |

| tables_priv | BASE TABLE | MyISAM |

| procs_priv | BASE TABLE | MyISAM |

| proc | BASE TABLE | MyISAM |

| host | BASE TABLE | MyISAM |

| help_topic | BASE TABLE | MyISAM |

| help_relation | BASE TABLE | MyISAM |

| help_keyword | BASE TABLE | MyISAM |

| help_category | BASE TABLE | MyISAM |

| func | BASE TABLE | MyISAM |

| db | BASE TABLE | MyISAM |

| columns_priv | BASE TABLE | MyISAM |

+---------------------------+------------+--------+

18 rows in set (0.00 sec)

[성능 분석 Setting]

SHOW VARIABLES LIKE 'perf%';

+---------------------------------------------------+---------+

| Variable_name | Value |

+---------------------------------------------------+---------+

| performance_schema | OFF |

   

/etc/my.cnf

UPDATE performance_schema.setup_consumers SET enabled = 'YES' WHERE name like 'events_waits%';

   

SELECT * FROM INFORMATION_SCHEMA.ENGINES

WHERE ENGINE='PERFORMANCE_SCHEMA'\G;

SHOW ENGINES\G;

   

[TOP 5 Wait EVENT]

select event_name, count_star, sum_timer_wait from performance_schema.

events_waits_summary_global_by_event_name where event_name like

'wait/synch/mutex/innodb%' and count_star > 0 order by sum_timer_wait desc limit 5;

   

[Slow SQL 추출]

# vi /etc/my.cnf

[mysqld]

log-slow-queries = /usr/local/mysql/var/mysql-slow.log

long_query_time = 3

위 내용은 쿼리 타임이 '3초'를 초과 하는 쿼리에 대해 /usr/local/mysql/var/mysql-slow.log파일에 기록 한다는 뜻입니다.

my.cnf에 설정 및 mysql을 Restart 한 뒤 운영 하다 보면 아래와 같이 slow-query-log가 남게 됩니다.

[mysql-slow.log파일]

use iamroot;

select max(wr_comment) as max_comment from g4_write_ja

where wr_parent = '92' and wr_is_comment = 1;

# Time: 120809 16:08:15

# User@Host: iamroot[iamroot] @ []

# Query_time: 253 Lock_time: 0 Rows_sent: 1 Rows_examined: 419562

select max(wr_comment) as max_comment from test1

where wr_parent = '92' and wr_is_comment = 1;

# Time: 120809 16:08:17

# User@Host: iamroot[iamroot] @ []

# Query_time: 94 Lock_time: 0 Rows_sent: 0 Rows_examined: 640675

use iamroot;

SELECT count(*) from emp where boardcode=1045552594 and boardidx=274;

# Time: 120809 16:08:23

# User@Host: iamroot[iamroot] @ []

# Query_time: 183 Lock_time: 0 Rows_sent: 1 Rows_examined: 268576

   

[로그 내용 중 각 항목에 대한 설명]

Query_time : 쿼리 수행시간

Lock_time : 테이블 LOCK 이 걸린시간

Row_sent : 쿼리 처리 결과 ROW 수

Rows_examined : 쿼리 처리 대상의 ROW 수

   

[참고 자료 및 사이트]

https://www.mysql.com/

http://www.oracle.com/technetwork/database/mysql/index.html

http://www.slideshare.net/morgo/inno-db-presentation

Real MySQL Book

   


블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,



AWR 활용 Monitoring(DBA_HIST_* View)

    • Oracle AWR의 기능은 활용가치가 매우 높다. 기본적으로 특정 시점 별로 스냅샷을 찍어 보관하고 있어 쌓여 있는 정보들을 어떻게 가공하는지에 따라서 그래픽 한 형태로 추출해낼 수 있다.
    • 단순히 AWR Report나 ADDM Report로 추출하는 것보다 원하는 정보를 SQL문으로 질의하여 추출하는 것이 더 의미 있는 정보를 빨리 얻어 낼 수 있다.
    • 아래 내역들은 SQL문으로 핵심이 되는 Table을 Join하여 데이터를 추출하였으며 더 나아간다면 엑셀이나 Program을 통하여 S/W를 만들어 즉각적으로 분석 및 모니터링 하는 것이 가능하다.

         

  1. DBA_HIST_* View 활용

    • DBA_HIST_* View로 구성되어 있는 AWR은 다양한 DB 정보를 일정 기간 동안 보관하고 있어 과거의 데이터부터 현재까지의 연속된 데이터를 그래프로 사용자 편의에 좋게 그려낼 수 있으며 이상 증후 및 패턴을 분석하여 DB 관리에 있어 모니터링이 가능하다.
    • Statspack의 경우에도 stats$* Table들을 활용하여 많은 정보를 추출 할 수 있다.

       

         

  2. CPU & IO Wait Time, Load 등

- 기본적인 CPU, IO 사용량, Load와 같은 부하 정도를 아래 테이블(DBA_HIST_OSSTAT)을 통하여 측정할 수 있으며 DBA_HIST_SNAPSHOT 테이블의 경우에 해당 시점과 항상 Join하기 때문에 구조와 데이터를 잘 파악해두면 좋다.

   

   

  3.Buffer Busy waits, latch free 등

- Buffer Busy Waits, latch Free와 같은 성능적인 지표(DBA_HIST_SYSTEM_EVENT)에 대하여도 추출할 수 있으며 이슈가 되는 시점을 분석하여 집중적으로 Tuning을 진행할 수 있으며 대처에 대한 부분을 강구할 수 도 있다.

   

   

  4.Top 5 Wait Event

- AWR Report에 추출되는 Top5 Wait Events(DBA_HIST_SYS_TIME_MODEL)를 일자 별로 연결하여 봄으로써 빈번하게 발생되는 Event와 주요 이슈에 대하여 즉각적으로 확인하여 볼 수 있다.

   

  5. SQL 분석

- 기존의 SQL분석 시에 v$sql, v$sqlarea, v$sqlplan과 같은 휘발성 데이터를 이용하다 보니 폭넓은 SQL수집이 어려웠지만 AWR을 구성하는 테이블을 활용한다면 보관 주기 동안에 수집된 SQL문을 모두 확인하여 분석할 수 있다.


블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,


Migration(데이터이관) EXP/IMP/Datapump 활용

   

  1. Migration EXP/IMP/Datapump 방법론

 

구분

장점

단점

비고

Exp/Imp

데이터베이스의 전부 또는 일부 마이그레이션

데이터 압축으로 마이그레이션 가능

오라클을 다른 플랫폼이나 운영체제에 마이그레이션하는 이용할 있음

업그레이드에 이용할 수 있음

압축하지 않으면 속도가 매우 느림

대량의 디스크 공간 요구

  

Named-Pipe Multi-thread

Exp/Imp

Migration 성능이 빠름(exp/imp10배 이상)

CTAS & DB Link와 다르게 Table 단위로 Manual하게 Script를 생성할 필요가 없음

Table별로 Migration Script를 생성해야 함

  

TTS

(Transportable

Tablespace)

이기종간 Data File 이 호환이 됨

Down-Time 을 최소화 할 수 있고 가장 빠른 Migration 방법

Raw-device, ASM, File-System 등 모든 File 에서 적용 가능함

양쪽 DB가 모두 10g 이상이어야 함.

10g이상

Datapump

EXP와 비교해서 20배 이상 정도 빠름

시간 예측 가능

일시 정비 & 이어 받기 가능

병렬 처리 가능

10g 이상 사용 가능

Exp와 호환 안됨

10g이상

   

  2. Migration Exp/Imp/Datapump 구성도

     1) Export, Import, Datapump

  • 기본 exp, imp로 진행 할 경우에 EXPORT-> 파일 전송 -> IMPORT -> 검증 진행
  • Datapump로 진행할 경우에 기존의 Exp/Imp와 동일한 방법과 Network Link를 통하여 바로 데이터 이관도 가능하다.

   

     2) Named-Pipe Multi-thread Exp/Imp

  • DB 버전이 낮은데 빠른 시간안에 데이터이관을 하고자 할 경우에 자주 사용되며 EXPORT와 동시에 IMPORT를 수행하여 데이터이관을 한다.

 

     3) TTS(Transportable Tablespace)

  • Datapump의 활용으로 transport_tablespaces 옵션을 통하여 TTS가 가능하며 동일 장비 및 이기종에 대한 부분도 Rman을 통하여 변환하여 데이터 이관이 가능하다.
  • Datapump TTS -> DataFile 변환 -> 이관 -> Import TTS 진행


블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,



R & R Studio Installation on Windows

  • R 프로그래밍  언어(줄여서  R)는 통계 계산과 그래픽을 위한 프로그래밍 언어이자 소프트웨어 환경으로 뉴질랜드 오클랜드 대학의 로스 이하카와 로버트 젠틀맨에 의해 개발되었으며 GPL 하에 배포되어 비용에 부담없이 자유롭게 사용할 수 있습니다. 
  • R을 먼저 설치한 이후에 R 스튜디오를 설치하세요.

      

  1. R 프로그래밍 설치 준비

https://www.r-project.org/

  • Korea로 검색

    http://cran.nexr.com/

  • Windows 선택

       

  • Base 선택

    base : R의 설치 파일을 다운로드 받습니다. R을 설치하고자 하는 경우 이곳을 통해 설치 파일을 다운로드 받습니다. 

    contrib  : R자체에도 많은 기능이 있습니다만, 사용자들이 사용하면서 만든 추가적인 package 들을 다운로드 받습니다. 

    Rtools : R에서 사용할 package 들을 제작하고자 할 때 사용되는 도구들을 다운로드 받습니다.


  • Windows 32 Bit로 설치 할 것을 권장함. ( 추후 JAVA와 연동 및 추가 기능을 설정할 시에 32Bit가 수월하게 구성을 진행할 수 있음)

       

 

  2. R프로그래밍 설치

   

  • R프로그래밍 설치

       

       

  • 추후 JAVA및 기타 기능간에 동기화를 수월하게 하기 위하여 32bit로 설치하여 사용 하는 것을 추천함.

       

       

  • 설치 완료 및 업데이트

    현재 버전 확인

       

    Packages Update

    • 0-Cloud 선택 ( 자신이 필요한 Package를 설치하면 된다.)

         

   

  3. R 스튜디오 설치 준비

https://www.rstudio.com/

   

  • Download RStudio 선택

   

   

  • Desktop 선택

       

  • Free 버전 선택

       

  • RStudio 0.99.484 - Windows Vista/7/8/10 선택(OS에 맞게 다운 받으면 됨)

                         

   

  4. R 스튜디오 설치

      

   

      

   

  • 설치 완료

       

[참고 자료 및 사이트]



블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,


MS-SQL 2012 Installation

   

  • 설치 권장 버전(Windows server 2008R, Windows 7)
  • 설치 파일: kopie-mss2012e-sp1-en, ko_windows_7_ultimate_k_with_sp1_x86_x64_K,J_11P.iso

   

1.MS-SQL 2012 설치 진행

 1) 기본 초기 설정

New SQL Server Stand-alone Installation ** 선택

   

Product Updates & Install Setup Files 확인 완료되면 다시 프로그램이 재 시작 된다.

   

설치가 가능한지 확인진행

   

④ 정품 라이선스 키확인, 정품이 아닐 경우에 Specify a free edition을 선택

   

모두 선택

   

SQL Server Feature Installation 선택

   

설치 경로 및 추가 기능 선택

   

설치 가능 여부 확인

   

2) MS-SQL 2012 세부 설치 진행

Instance Configuration

  • MS-SQL SID & 설치경로 설정

   

설치 경로의 Disk 사용량 확인

   

Server Configuration

   

Database Engine Configuration

  • Add Current User 선택

       

       ⑤ Analysis Services Configuration

  • Add Current User 선택

       

       ⑥ Reporting Services Configuration

  • Install and Configure 선택

       

      ⑦ Error Reporting

   

Installation Configuration Rules

   

Ready to Install

   

Installation Progress

   

Complete

   

상태 확인

 

[참고 사이트]

https://technet.microsoft.com/ko-kr/library/bb500395(v=sql.110).aspx

블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,

Oracle Backup & Recovery의 종류

   

 1. DB Backup 종류

구분

Backup Type

Archive log 상태

DB 상태

비 고

EXPORT

Backup

datafile, user, table

별로 Backup 가능

Archive log mode

OR Noarchive log mode

와는 무관

DB open 상태

논리적 Backup

HOT Backup

(Archive log

backup)

Full Backup,

Partial Backup 둘 다 가능

Archive log mode

설정 되어 있어야 함 .

DB open 상태

물리적 Backup

COLD

Backup

Full Backup,

Partial Backup 둘 다 가능

Archive log mode

OR Noarchive log mode 와는 무관

DB Shutdown

상태

물리적 Backup

RMAN

Data File, Control File, init Parameter file, Archive Redo Log Flile [Auto Backup]

Archive log mode

OR Noarchive log mode 백업 대상에 따라 다름

DB mount/open 상태

물리적 Backup

기타 정책

-Oracle golden gate / Active data Guard / Flashback

   

 2. DB Backup에 대한 기본 정책

 

Backup 정책

   

복합 백업 정책(DR)

   

   

 3. HA(High Availability)

- 중단 없는 서비스를 하기 위하여 HA구성의 다양한 정책을 세워 구성하고 있다.

   

HW적 HA구성 & Oracle RAC 기반의 자동 Failover

   

Oracle Golden Gate & Oracle Data Guard

   

   

4.Recovery 종류

구분

Recovery 방법

Recovery 범위

DB 상태

비 고

IMPORT

datafile, user, table 별로 Import를 통하여 Recovery가능

Table 단위, Object 단위 에서부터 전체 DATA 복구 가능

(백업이 수행된 시점)

DB open 상태

논리적 Recovery

HOT Backup

Recovery

(Archive log backup)

Full Backup, Partial Backup에 따른 Recovery 가능

Data file, Tablespace 단위 복구 가능

DB Shutdown / open 상태

물리적 Recovery

COLD Backup

Recovery

Full Backup, Partial Backup에 따른 Recovery가능

Data File, Control File, Redo log File, Archive log File

DB Shutdown

물리적 Recovery

RMAN

Recovery

Data File, Control File, init Parameter file, Archive Redo Log Flile Backup에 따른 Recovery 가능

Data file, Tablespace 단위 복구 가능

DB mount/open 상태

물리적 Recovery

 


블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,


DBMS_CRYPTO Package를 이용한 단방향 암호화

   

  • 단방향 암호화란?
    • 고객의 Password와 같이 특정 컬럼에 암호화(ENCRYPTION)하며, 복호화(DESCRIPTION)이 필요 없는 단방향성 암호화 기법이다.
    • 고객의 Password는 암호화만 되며, 고객이 입력한 Password는 암호화 루틴을 거쳐 암호화된 값과 일치 여부를 판별한다. 복호화 과정은 필요 없으며, 있을 필요도 없다.
    • 고객의 Password의 분실 시 복호화 해서 알려주는 것이 아니라 RESET으로 임의의 초기값으로 설정하여 통보한다.

         

  • 단방향 암호화를 위해서는
    • Encryption의 Function은 볼 수 없어야 합니다. ==> wrap으로 처리
    • MASTER KEY는 보안담당자만이 알고 있거나, 한번 설정으로 알 필요가 없어야 한다.
    • 해당 특정 Application(AP서버에 있는 Application만)만 암/복호화를 할 수 있어야 한다. ==> Data Vault이용 (Option)
    • Password를 잊었을 경우는 DBMS_RANDOM을 이용하여 초기화 한 후 고객에게 초기화 Password를 알려 준다.

       

       DBMS_CRYPTO를 위한 암호화 Function

   

해당 Function Scriptwrap를 이용하여 Wrapping

   

Wrapping 된 단방향 암호화 Function – 암호화 로직 Master Key를 알 수 없다.

   

Wrapping 된 단방향 암호화 Function – 암호화 로직 Master Key를 알 수 없다.

블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,


Fine Grained Auditing의 활용

  • 사용자 및 오브젝트의 액세스 패턴 에 관한 Auditing 이외에 보다 정교하고 세분화된 조건을 만족하기 위하여 Fine Grained Auditing 을 사용한다
  • Fine Grained Auditing을 사용하여 다음의 Policy를 구현할 수 있다.
    • 사전에 정의된 조건에 맞는 결과에 대해서만 Audit
    • 지정된 컬럼들 (Any or All) 이 사용된 경우에만 Audit
    • SQL 단위의 Audit ( Select 및 DML 포함)

         

  • 실행 계획

       ① 중요한 테이블과 컬럼의 목록을 작성한다.

② 정보 접근에 대한 감사 기준을 설정한다. (예: salary가 500 이하인 경우는 감사 조건에 포함시키지 않음).

③ 가능한 모든 기준을 감안하여 조건을 조합하며, 하나의 구문이 두 개 이상의 조건에 적용되지 않도록 한다.

④ 정의된 조건을 이용하여 FGA 정책을 구현한다. ( DBMS_FGA.ADD_POLICY)

⑤ FGA 정책을 활성화한다. (AUDIT_TRAIL = DB_EXTEND)

⑥ 일정 시간이 경과한 후 FGA 감사 로그 파일을 분석한다. (DBA_FGA_AUDIT_TRAIL)

⑦ 로그 파일의 삭제를 위한 스케줄을 설정하고 FGA 로그 테이블을 삭제한다.

   

  • 세부적인 Auditing조건을 쉽고 간단하게 Auditing 설정 예

       

       

  • TEST 작업 스크립트

exec dbms_fga.drop_policy(

object_schema => 'SCOTT',

object_name => 'EMP',

policy_name => 'CONA_ACCESS_FGA'

);

begin

dbms_fga.add_policy (

object_schema => 'SCOTT',

object_name => 'EMP',

policy_name => 'EMP_ACCESS_FGA',

audit_column => 'ENAME',

audit_condition => 'SYS_CONTEXT(''USERENV'',''IP_ADDRESS'') NOT IN (''127.0.0.1'',''10.103.90.1'',' ||

'''10.103.90.2'',''10.103.90.3'',''10.103.90.4''' ||

',''10.103.90.12'',''10.103.90.13'',''10.103.90.22'',''10.103.90.23''' ||

',''10.103.90.32'',''10.103.90.33'',''10.103.90.42'',''10.103.90.43'')' ,

statement_types => 'INSERT,UPDATE,DELETE,SELECT',

audit_trail => DBMS_FGA.DB + DBMS_FGA.EXTENDED );

end;

/

 

select ENAME from scott.emp;

select *from scott.emp;

select *from DBA_FGA_AUDIT_TRAIL;

   

블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,