'Back-End/Data Base'에 해당되는 글 38건

  1. 2019.05.05 19.05.05 데이터베이스 성능
  2. 2019.05.04 19.05.04 백업과 복구
  3. 2019.05.03 19.05.03 테이블의 개념과 정규형
  4. 2019.05.03 19.05.03 트랜잭션과 동시성 제어
  5. 2019.05.01 데이터베이스 외부 관리 툴 설치 (HeidiSQL 설치)
  6. 2019.04.30 19.04.30 DBMS를 조작할 때 필요한 기본 지식
  7. 2019.04.29 19.04.29 데이터베이스와 아키텍처 구성
  8. 2019.04.29 SQL 예제

19.05.05 데이터베이스 성능

Back-End/Data Base 2019. 5. 5. 20:39
728x90
반응형

-성능이란?-

 

성능은 기본적으로 '빠르기' 를 중심으로 한 개념입니다.

성능은 2가지 지표 (매트릭스)에 의해 측정됩니다.

한 가지는 '처리 시간' 또는 '응답 시간' 이라고 불리는 지표이고, 다른 한가지는 '처리율' 입니다.

 

 

 

-처리시간-

 

이들은 어떤 특정 처리의 시작부터 종료까지 걸린 시간을 나타냅니다.

 

 

 

-처리율-

 

시스템에서는 '특정 처리(트랜잭션)를 단위 시간에 몇 건 처리가 가능한가' 에 대한

측정 단위를 나타냅니다.

시스템의 자원용량을 결정하는 요인

 

 

 

-버틀넥 포인트(병목)-

 

동시 실행 처리수가 증가 할수록 준비해야 할 자원도 증가하며 한 가지 자원이라도 한계에 이른 시점에서 성능이 나빠지기 시작합니다.

즉, 응답 시간이 상승하기 시작하고, 반대로 처리율이 떨어지기 시작합니다. 이때 최초로 한계에 이른 자원을 '버틀넥포인트' 또는 '병목' 이라고 합니다.

 

 

 

-데이터베이스가 병목되는 이유-

 

 

  1. 취급하는 데이터양이 가장 많다.

 

  2. 자원 증가를 통한 해결이 어렵다

 

 

 

 

-테이블에 대한 액세스 방법-

 

 

  풀 스캔 (ALL) : 테이블에 포함된 레코드를 처음부터 끝까지 전부 잃어 들이는 방법으로, '테이블 풀 스캔'이라고 합니다.

 

  레인지 스캔(rangd) : 테이블의 일부 레코드에만 액세스하는 방법

 

 

 

 

-데이터베이스가 결과를 통지하는 과정-

 

 

  1. 구문 오류가 없는지를 보는 파스

 

  2. 실행계획 (어떤 경로로 접근할까? 하는 계획) 과 옵티마이저 (실행계획을 결정하는 내부 프로그램),

     통계정보 (옵티마이저가 실행계획을 세울 때 참조하는 정보)

 

 

 

 

-인덱스의 구조-

 

인덱스는 데이터베이스의 성능 향상 수단으로 가장 일반적인 방법입니다.

응답 시간이 늦은 SQL이 발견되면 우선 인덱스로 해결할 수 없는지를 검사하는 것이 튜닝의 제1선택입니다.

인덱스의 인기가 높은 이유는 다음 3가지 입니다.

 

 

  1. SQL 문을 변경하지 않아도 성능을 개선할 수 있다.

 

  2. 테이블의 데이터에 영향을 주지 않는다.

 

  3. 일정한 (때로는 극적인) 효과를 기대할 수 있다.

 

 

쉽게 말하는 인덱스는 비용 대비 성능이 높은 방법입니다.

인덱스가 나무 형태를 하고 있는 것을 일반적으로 'B-tree' 라고 합니다.

B-tree는 관계형 데이터베이스에서 튜닝의 기본이 되는 인덱스 입니다.

 

 

 

-B-tree의 구조-

 

그림에서 원으로 표시된 한개의 데이터를 '노드' 라고 합니다.

가장 위의 노드를 '루트 노드' 라고 하는데, '뿌리' 라는 의미입니다.

가장 아래 노드를 '리프 노드' 라고 하고, '잎' 이라는 의미입니다.

중간 노드는 가지라는 뜻에서 '브랜치 노드' 로 부릅니다.

 

 

 

 

 

-B-tree의 장점-

 

장점 한 가지는 어떤 값에 대해서도 같은 시간에 결과를 얻을 수 있다. (균일성)

데이터양에 증가할수록 우수한 개선 효과를 발휘한다.

 

 

 

-인덱스 작성이 역효과가 날때-

 

 

  * 인덱스 갱신의 오버헤드로 갱신 처리의 성능이 떨어진다.

 

  인덱스는 테이블에 새로운 데이터가 추가되거나 기존의 데이터에  대해 갱신, 제거가 실행되면

  자동으로 인덱스 자신도 갱신하는 기능을 갖추고 있습니다. 테이블을 책이라고 했을 때

  본문이 변경되면 거기에 대응해서 색인도 자동으로 갱신되는 것입니다.

  이것 자체는 매우 우수한 기능이지만, 그 대가로 인덱스가 존재하지 않는 때와 비교하면

  갱신할 때마다 인덱스 갱신도 부수적으로 발생합니다.

  이것도 오버헤드의 일종입니다.

 

 

  * 의도한 것과 다른 인덱스가 사용된다.

 

  이것은 한 개의 테이블에 복수의 인덱스를 작성한 경우에 발생하는 문제입니다.

  업무의 중심이 되는 테이블은 다양한 SQL 문에서 이용되며, 거기에 대응해 작성된

  인덱스 수도 많아지게 됩니다.

  앞에서 예로 든 모든 열에 인덱스를 만든다는 것은 너무 극단적이라고 하더라도,

  10~20개 정도의 인덱스가 1개의 테이블에 만들어져 있는 것도 드물지는 않습니다.

  더 빠른 인덱스가 있을 텐데 의도한 것과는 다른 인덱스가 사용되어 오히려

  느려진 예입니다.

 

 

  * 트레이드오프

 

  인덱스를 만들면 그만큼 저장소 용량을 소비한다.

 

 

 

 

-인덱스를 만들 때 기준-

 

 

  * 크기가 큰 테이블만 만든다.

 

  크기가 작은 테이블에는 애초에 인덱스도 풀 스캔도 큰 차이가 없기 때문.

 

 

  * 기본키 제약이나 유일성 제약이 부여된 열에는 불필요하다.

 

  기본키 제약이 부여된 열에는 자동으로 인덱스가 작성되어 있기 때문

 

  * Cardinality 가 높은 열에 만든다.

 

  'Cardinality' 란 값의 분산도를 나타내는 단어로, 특정 열에 대해 많은 종류의 값을 가지고 있다면 높고, 값의 종류가 적으면

  낮다는 의미입니다.

  'Cardinality' 가 낮은 열에 인덱스 효과를 기대할 수 없는 것은 인덱스 트리를 따라가는 조작이 증가할수록

  오버헤드가 증가해 인덱스를 작성한 혜택을 받지 못하기 때문입니다.

 

 

 

728x90
반응형

'Back-End > Data Base' 카테고리의 다른 글

무결성이란?  (0) 2019.06.27
오라클 SQL Develope 다운로드 및 설치  (0) 2019.05.28
19.05.04 백업과 복구  (0) 2019.05.04
19.05.03 테이블의 개념과 정규형  (0) 2019.05.03
19.05.03 트랜잭션과 동시성 제어  (0) 2019.05.03
:

19.05.04 백업과 복구

Back-End/Data Base 2019. 5. 4. 21:12
728x90
반응형

-DBMS의 3가지 구조-

 

DBMS에서 데이터를 보존하는 기억장치는 대부분 하드디스크입니다.

하드디스크에서 지속성을 실현하려면 쓰기를 전부 '동기화쓰기' 로 하면 좋겠지만, 데이터베이스의 쓰기는

기억장치의 임의 장소에 무작위로 액세스해서 쓰기를 수행하기 때문에 동기화 쓰기는 느려서 성능 면에서

실용적이지 않습니다.

그래서 지속성과 성능이 양립하도록 일반적으로 DBMS에서는 3가지 구조를 사용합니다.

 

 

 

-로그 선행 쓰기(WAL)-

 

데이터베이스의 데이터 파일 변경을 직접 수행하지 않고, 우선 로그로 변경 내용을 기술한 로그 레코드를 써서

동기화하는 구조입니다.

MySQL 에서는 이 로그를 'InnoDB 로그' 로 부릅니다.

WAL에는 다음과 같은 이점이 있습니다.

 

 

  1. 디스크에 연속해서 쓰기 때문에 무작위로 쓰는 것보다 성능이 좋다.

 

  2. 디스크에 쓰는 용량과 횟수를 줄일 수 있다.

 

  3. 데이터베이스 버퍼를 이용해 데이터베이스의 데이터 파일로의 변경을 효율성 높게 수행한다.

 

 

 

 

-데이터베이스 버퍼-

 

커밋 시에는 WAL에 변경 내용을 쓰기 때문에 데이터 파일의 변경 내용은 트랜잭션이 커밋되면서 동시에 동기화할

필요가 없습니다.

그렇다고 트랜잭션마다 버퍼를 취해 비동기적인 쓰기를 하면 로그와 데이터 파일 간 일관성을 유지하기가 어렵습니다.

그래서 일반적인 DBMS에서는 '데이터베이스 버퍼' 를 준비해 데이터 파일로의 입력을 데이터베이스 버퍼 경유로

일원화해서 단순화하고 있습니다.

이 때문에 효율적으로 데이터의 일관성을 유지할 수 있게 됩니다.

MySQL의 경우 갱신의 흐름은 다음과 같습니다.

 

 

  1. 갱신 대상의 데이터를 포함한 페이지가 버퍼풀(버퍼)에 있는지를 확인하고 없다면 데이터 파일로부터 읽어 들인다.

 

  2. 버퍼 풀의 해당 페이지에서 갱신을 수행한다.

 

  3. 2의 갱신 내용이 커밋과 함께 로그에 기록된다. 버퍼풀에 갱신되었지만, 아직 데이터 파일에 써지지 않은 페이지는

     버퍼 풀 내에서 더티 페이지(메모리로 읽어서 갱신된 페이지)로 다룬다.

 

  4. 데이터 페이지는 나중에 적당한 타이밍에 정리되어 데이터 파일로 써진다 (이것을 '체크포인트' 라고 부른다.)

 

  5. 4의 체크포인트 이전 로그 파일은 불필요해진다. 또한, 갱신과 더불어 1부터 순서가 반복된다.

 

 

 

 

-크래시 복구-

 

WAL과 데이터베이스 버퍼, 데이터베이스 파일 3가지가 연계 플레이로 지속성을 담보하면서 현실적인 성능으로 DBMS가 동작하고 있습니다.

크래시 (예를 들면, MySQL 서버의 비정상적 종료)가 발생한 경우의 복구.

 

크래시가 발생하면 다음과 같은 상태가 됩니다.

 

 

  1. WAL : 마지막으로 커밋된 트랜잭션의 갱신 정보를 가진다.

 

  2. 데이터베이스 버퍼 : 크래시로 내용이 전부 소실된다.

 

  3. 데이터베이스 파일 : 최후 체크포인트까지의 갱신 정보를 가진다.

 

 

 

 

-PITR이란?-

 

일반적인 DBMS에서는 데이터베이스에 실행된 갱신을 기록한 로그를 보존해서 그것을 복원한 데이터베이스에 순차 반영해 백업 이후의

임의의 시점으로 복원할 수 있습니다.

이처럼 임의의 시점에서의 데이터 변경을 포함한 복원을 'PITR (Point - in - time Recovery)' 라고 부릅니다.

PITR에 이용되는 로그의 이름과 특성은 DBMS마다 다르다.

 

DBMS 

Oracle 

MySQL 

PostgreSQL 

DB2 

SQL Server 

로그 이름

REDO 로그

바이너리 로그

WAL 로그

트랜잭션 로그

트랜잭션 로그

아카이브 지정

X (본문 참조) 

아카이브 시 이름 

ARCHIVELOG

WAL 아카이브 

아카이브 로깅 

완전 복구 모델

비 아카이브 시 이름 

NOARCHIVELOG 

(없음) 

순환 로깅 

완전 복구 모델 

 

 

 

-아카이브 지정이란?-

 

PITR에 이용하는 로그는 대부분 앞에서 설명한 WAL을 이용합니다.

이 때문에 WAL을 크래시 복구에만 이용한다면 체크포인트 이전의 로그는 불필요하게 되어 해당 디스크 영역은

삭제하거나 재이용할 수 있습니다. (다시 이용되는 경우가 대부분)

하지만 이렇게 되면 PITR을 수행하고 싶을 때에 필요한 로그가 없는 사태가 발생하게 됩니다.

따라서 크래시 복구용으로는 불필요한 로그도 PITR 용으로 보존이 필요할 수 있으며 이를 위한 모드가 '아카이브 지정' 입니다.

 

 

 

-바이너리 로그란?-

 

MySQL에서 PITR에는 '바이너리 로그'를 이용하는데, 앞의 로그 선행 쓰기에 나왔던 InnoDB 로그는 이용하지 않는지 궁금할 수 있습니다.

실은 InnoDB 로그는 InnoDB 전용 크래시 복구에만 이용되고, PITR에는 MySQL 전체 (InnoDB에 한정하지 않고) 에서 이용하는

바이너리 로그를 채용합니다.

 

 

 

-백업-

 

장애가 발생하면 데이터베이스의 데이터는 이용할 수 없게 됩니다.

이런 사태에 신속히 대응하기 위해 데이터베이스가 정상적인 상태일 때 현재 이용하는 데이터를 복제해서 어딘가 다른 장소에 옮겨

두어야 합니다. 이 옮겨진 데이터를 '백업 데이터' 라고 하며 이 데이터를 얻어내는 과정을 '백업' 이라고 부릅니다.

장애가 발생하면 신속하게 백업한 데이터에서 데이터베이스의 데이터를 이용할 수 있는 상황까지 복구합니다.

이것이 '복원 (Restore)' 입니다.

 

백업을 수행하는 데는 다음 3가지 관점이 있습니다.

 

 

  1. 핫 백업과 콜드 백업

 

  2. 논리 백업과 물리 백업

 

  3. 풀 백업과 부분 (증분 / 차등) 백업

 

 

 

핫 백업

콜드 백업 

'온라인 백업' 이라고도 하며 백업 대상의 데이터베이스를 정지하지

않고 가동한채로 백업 데이터를 얻습니다.

핫 백업에서는 데이터베이스를 가동한 채로 백업 데이터를 얻는데,

어떤 도구를 사용하는지, 획득 수단은 무엇인지에 따라 차이가 있습니다.

 '오프라인 백업' 으로 불리며 백업 대상의 데이터베이스를

정지한 후 백업 데이터를 얻습니다.

MySQL에서는 MySQL 서버를 셧다운해서 데이터 디렉터리에 있는

디렉터리와 파일을 전부 OS 명령으로 복사합니다.

 

 

 

구분 

논리 백업 

물리 백업 

장점

  * 편집할 수 있다. 텍스트를 변경해 백업된 내용 일부를

    수정할 수 있다.

 

  * 이식성이 우수하다. 텍스트 변경으로 (CSV 등은 변경 없이)

    동일한 DBMS의 다른 버전이나 다른 DBMS에 복원할 수 있다.

 * 최소 크기로 데이터를 얻을 수 있다. 데이터의 교환이 없어서

   (또는 최소) 백업과 복원 속도가 빠르다.

단점

 * 물리 백업보다 크기가 크다. 바이너리와 텍스트 상호교환에

   들어가기 위한 백업과 복원의 동작 속도가 느리다.

 * 복원 단위는 도구에 따라 다르며 일부 데이터의 교환이나 적용

   등이 불가능 하다.

 

 * 플랫폼 의존 바이너리는 동일한 DBMS라도 호환되지 않는다.

 

 

 

구분 

풀 백업 

부분 백업 

 장점

 * 백업 데이터가 한군데에 모여 있어서 복원 처리가 단순하다.

 * 갱신한 데이터만을 대상으로 하므로 백업에 필요한 시간이 짧고,

    백업 데이터의 용량이 작아도 문제없다.

 단점

 * 데이터베이스 전체를 백업하므로 백업에 걸리는 시간이 길다.

 

 * 갱신량이 적어도 매일 데이터베이스 전체를 백업하므로

    백업 데이터를 저장하는데 충분한 용량이 필요하다.

 * 복원에는 풀 백업과 부분 백업이 필요해서 복원 절차가 복잡하다.

 

 

 

   단원 정리

 

  - 데이터베이스에는 ACID 특성 중 'Durability(지속성)' 에 의해 커밋된 내용이 영속화 되기 때문에 데이터를 잃어버리는 경우는 없다.

 

  - 데이터파일이 있는 파일 시스템의 파손이나 서버, 디스크의 물리 장애에 대비하기 위해 '백업' 프로세스가 필요하다.

 

  - 백업 관점에는 DBMS 정지 여부 (콜드와 핫), 형식 (논리와 물리), 범위 (풀과 차등 / 증분) 가 있다.

 

  - 기본 백업 방식은 풀 백업이지만, 필요에 따라 차등 / 증분 백업을 검토한다.

 

  - 백업에 걸리는 시간과 부하, 복원과 복구에 걸리는 시간을 고려한다.

 

 

 

 

 

 

 

728x90
반응형
:

19.05.03 테이블의 개념과 정규형

Back-End/Data Base 2019. 5. 3. 23:31
728x90
반응형

-테이블 이란?-

 

각각의 행이 어떤 공통적인 특징을 가진 집합이어야 한다.

또한 테이블은 현실 세계를 반영한다. ('개념' 이나 '집합' 으로)

 

 

 

-열 이란?-

 

개체의 속성을 의미한다.

 

 

 

-기본키-

 

테이블 안에 있는 객체를 구분할 수 있는 키.

또한 기본키는 중복되거나 NULL 값이 올 수 없다. (다른 객체를 구분할 수 없기 때문)

그리고 기본키는 값이 바뀌면 곤란하다. (변경 후 값의 유일성을 보증할 수 없고, 과거 데이터와의 결합이 어렵다.)

 

 

 

-정규형-

 

데이터의 갱신이 발생한 경우에도 부정합이 발생하기 어려운 테이블의 형태 (이상현상을 방지하기 위해 테이블을 무손실 분해하는것)

 

 

 

-제 1정규형-

 

테이블 셀에 복합적인 값을 포함하지 않는다 (하지만 관계형 데이터베이스에서는 이 정의에 반하는 테이블을 작성하는 것이 기술적으로 불가)

복합적인 값을 셀에 넣으면 기본키가 행의 값을 고유하게 특정할 수 없기 때문.

 

 

-비 제1정규형 테이블-

 

사원 ID 

이름 

나이 

성별 

피부양자 

S001

김미경 

38 

여 

박초롱 

S002 

박유안 

30 

남 

박안나 

S003 

이관식 

62 

남 

(이수빈, 이수인) 

 

 

 

-함수 종속성-

 

기본키와 다른 열 사이에 성립하는 함수적인 유일성을 관계형 데이터베이스에서는 '함수 종속성' 이라고 하며 다음과 같이 열을

중괄호 ({ })로 감싸서 화살표(->)로 연결해 표현 합니다.

 

 

  {사원 ID} -> {이름}

 

 

 

 

-제 2정규형-

 

제 1정규형을 만족하고 부분함수 종속성을 제거한 정규형을 말한다.

(기본키는 현재 고객 기업 ID와 주문번호 인데, 고객기업 ID만으로도 기업명과 고객 기업규모를 특정할수 있어 주문번호 열이 쓸데없는 값이 되기 때문)

이와 같은 부분함수 종속이 존재할 경우 해당 키와 종속하는 열만 다른 테이블로 만들어 외부로 꺼내야 합니다.

비정규형 테이블을 사용할 때 같은 내용의 행이 복수 행 존재할수 있으므로 일부가 잘못 등록될 위험이 있기 때문에 제 2정규형을 사용한다.

 

-비 제2정규형 테이블-

 

고객기업 ID 

주문번호 

주문접수일 

고객기업명 

고객기업 규모 

CA

O001

2014 / 12 / 20

A 상사

대규모

CA

O002

2014 / 12 / 21 

A 상사

대규모 

CB 

O001

2014 / 12 / 12

B 건설 

중규모 

CB

O002 

2014 / 12 / 25

B 건설 

중규모 

CB

O003 

2014 / 12 / 25

B 건설 

중규모 

CC

O001 

2014 / 12 / 1

C 화학 

소규모 

 

 

 

-제 3정규형-

 

제 2정규형을 만족하고, 이행 함수 종속을 제거한 정규형을 말한다.

(예를 들어 아래 테이블에서 앞으로 관리하고 싶은 업계는 석유, 건설, 바이오 외에도 시스템 또는 유통 등 다양하다고 해도 지금은

이 테이블에 해당 업계를 등록할 방법이 없습니다. 이 테이블이 '기업' 이라는 단위의 집합을 반영하고 있어서 '유통' 이라는 업계에 속한

기업과 거래를 하지 않은 이상 해당 업계의 레코드를 만들 수 없기 때문입니다.)

 

-비 제3정규형 테이블-

 

고객기업 ID 

고객기업명 

고객기업규모 

업계코드 

계명 

CA

A상사

대규모

D001

석유

CB 

B건설 

중규모 

D002 

건설 

CC 

C화학 

소규모 

D003 

바이오 

 

 

 

  {고객기업 ID} -> {업계코드} -> {업계명} //(고객기업 ID가 업계코드를 정하고 업계코드가 업계명을 정하는 함수종속을 '이행함수종속'이라 한다)

 

 

 

 

-ER 다이어그램-

 

정규화를 수행하면 테이블이 나누어져 그 수가 증가하게 되는데 '갱신 이상'의 위험을 없애는 것이 목적이지만, 결과적으로 테이블 수가

늘어나는 것도 사실입니다. 이런 테이블 간의 관련성을 한눈에 알 수 있게 고안된 기술이 ER 다이어그램 입니다.

Entity(엔티티, 실체)란 '테이블' , 'Relationship(릴레이션십, 관계, 관련성)' 이란 '테이블 간의 관계' 를 의미합니다.

이를 표시하는데 그래픽으로 이해하기 쉽도록 해주는 기술이 ER 다이어그램 입니다.

 

 

 

-엔터티란?-

 

간단히 설명하면 테이블과 같고 사각형으로 표시합니다.

복잡한 정보를 간략화하기 위한 기술.

위 절반의 부분에는 '기본키'를 아래 절반의 부분에는 '기타 열(기본키가 아닌 열)'을 기재합니다.

 

 업계코드(PK)

 업계명

 

 

 

-릴레이션십이란?-

 

외래키가 존재하는 테이블은 해당 열이 다른 테이블의 기본키 열을 참조하는 것을 의미합니다.

이 관련성을 '릴레이션십' 이라고 합니다.

 

728x90
반응형
:

19.05.03 트랜잭션과 동시성 제어

Back-End/Data Base 2019. 5. 3. 22:39
728x90
반응형

-트랜잭션-

 

데이터베이스를 사용하는 실제 시스템이나 애플리케이션에서는 단일 쿼리만으로 조작하는 일은 거의 없고

복수의 쿼리를 연속적으로 사용해 일관성 있는 형태의 한 단위로 취급해야한다.

이러한 한 덩어리의 쿼리 처리 단위를 '트랜잭션'이라고 합니다.

 

MySQL에서는 트랜잭션을 사용할 수 없는 단순한 구조의 'MyISAM형'과 일반적인 DBMS와 똑같은

트랜잭션 구조를 사용할 수 있는 'InnoDB형' 2종류의 테이블을 이용할 수 있습니다.

이번 장에서는 트랜잭션을 사용하기 위해 InnoDB형 테이블을 작성합니다.

 

 

 

-트랜잭션의 4가지 특성(앞글자를 따서 'ACID 특성'이라고 한다.)-

 

 

  1. Atomicity (원자성) = 데이터의 변경 (INSERT/DELETE/UPDATE)을 수반하는 일련의 데이터 조작이

     전부 성공할지 실패할지 보증하는 구조 (전부 성공하거나 실패하거나)

 

  2. Consistency (일관성) = 일련의 데이터 조작 전후에 그 상태를 유지하는 것 (예를들어 속성에 유일성 제약을 걸면 중복된 번호 저장 불가)

 

  3. Isolation (고립성 또는 격리성) = 일련의 데이터 조작을 복수 사용자가 동시에 실행해도 '각각의 처리가 모순없이 실행되는 것을 보증한다' 는 것

 

  4. Durability (지속성) = 일련의 데이터 조작(트랜잭션 조작)을 완료(COMMIT)하고 완료 통지를 사용자가 받는 시점에서 그 조작이 영구적이

      되어 그 결과를 잃지 않는 것을 나타냅니다.

 

 

SQL 문은 몇가지 키워드와 테이블명, 열명 등을 조합해 하나의 문장을 만들어 쿼리의 내용을 기술하는데, 이중 키워드는

처음부터 의미나 사용법이 정해져 있는 특별한 영단어입니다. SQL문은 DBMS에 줄 수 있는 명령의 종류에 따라

다음 3가지로 구분됩니다.

 

데이터 정의 언어 (DDL) 

 데이터 조작 언어 (DML)

 데이터 제어 언어 (DCL)

 

 DDL은 데이터를 저장하는 그릇인 스키마

(데이터베이스) 또는 테이블 등을 작성하거나

제거합니다. DDL로 구분된 명령에서는

CREATE, DROP,ALTER 등이 있습니다.

 

 DML은 테이블의 행을 검색하거나 변경하는데 사용할 수 있습니다. DML로 구분된 명령에는

'SELECT (행의 검색), INSERT (행의 추가), UPDATE (행의 갱신), DELETE (행의 제거)

등이 있습니다.

 DCL은 데이터베이스에서 실행한 변경을

확정하거나 취소하는데 사용합니다.

COMMIT, ROLLBACK 등이 있습니다.

 

 

 

-MySQL의 특성-

 

 

  1. 읽기를 수행할 경우 갱신 중이라도 블록되지 않는다 (읽기와 읽기도 서로 블록되지 않는다)

 

  2. 읽기 내용은 격리 수준에 따라 내용이 바뀌는 경우가 있다.

 

  3. 갱신 시 배타적 잠금을 얻는다. 잠금은 기본적으로 행 단위로 얻으며 트랜잭션이 종료할 때까지 유지한다.

 

  4. 갱신과 갱신은 나중에 온 트랜잭션이 잠금을 획득하려고 할 때 블록된다. 일정 시간을 기다리며 그 사이에 잠금을 획득할 수 없는 경우에는

    잠금 타임아웃이 된다.

 

  5. 갱신하는 경우 갱신 전의 데이터를 UNDO 로그로 '롤백 세그먼트' 라는 영역에 유지한다. 이 'UNDO 로그'는 용도가 2가진데, 첫 번째는

     갱신하는 트랜잭션의 롤백 시 갱신 전으로 되돌리는 것이고, 두 번째는 복수의 트랜잭션으로부터 격리 수준에 따라 대응하는 갱신 데이터를

     참조하는데 이용한다.

 

 

 

 

-트랜잭션 격리 수준별 외관-

 

 

  반복 읽기 : 최초 쿼리를 실행한 시점에 커밋된 데이터를 읽어 들입니다.

                이 시점에서는 커밋된 읽기와 같습니다. 같은 쿼리를 여러번 실행하면 최초 읽은 내용의 결과 세트가 반환됩니다.

          복수 회의 쿼리 실행 사이에 다른 트랜잭션이 커밋했어도 그 내용은 반영되지 않습니다.

 

  커밋된 읽기 : 쿼리를 실행한 시점에서 커밋된 데이터를 읽어 들입니다.

   같은 쿼리를 여러번 실행하면 그 사이에 다른 트랜잭션에서 커밋할 때가 있는데, 이 경우 최신 쿼리의 실행 개시

   시점에서 커밋된 데이터를 읽습니다.

 

  갱신을 수행하는 트랜잭션 자신 : 트랜잭션 격리 수준이나 COMMIT/ROLLBACK에 상관없이 자신이 수행했던 갱신은 즉시 볼 수가 있습니다.

 

 

 

 

-잠금 타임아웃이란?-

 

'갱신' 과 '참조'는 서로를 블록하지 않지만, '갱신' 과 '갱신' 이 부딪치는 경우에는 나중에 온 갱신이 잠금 대기 상태가 됩니다.

잠금을 건 쪽이 언제 잠금을 풀지 알 수 없어서 잠금 해제를 기다리고 있는 쪽에서는 잠금을 기다리거나 기다리지 않거나,

기다린다면 어느 정도 기다릴지를 (초수 지정이나 무한으로 기다린다) 설정할 수 있습니다.

이때 잠금 대기로 타임아웃이 발생하는 경우 DBMS로부터 롤백되는 단위가 다를 때가 있는데, 해당 트랜잭션 전체를

롤백하는 경우와 쿼리만 롤백하는 것입니다.

MySQL 에서는 잠금 대기로 타임아웃이 발생하면 롤백되는 것은 기본으로 오류가 발생한 쿼리 입니다.

트랜잭션 전체를 롤백하고 싶다면 다음 방법으로 할 수 있습니다.

 

 

  타임아웃 오류 후 명시적으로 ROLLBACK을 실행한다.

 

  innodb_rollback_on_timeout 시스템 변수를 설정한다.

 

 

 

 

-교착 상태란?-

 

예를 들어, 트랜잭션 A가 테이블 a의 잠금을 얻고 트랜잭션 B가 테이블 b의 잠금을 얻었다고 해보겠습니다.

이 잠금을 유지한 채 서로 잠금을 건 자원에 잠금이 필요한 처리(INSERT/UPDATE/DELETE)를 실행하면 아무리

기다려도 상황이 바뀌지 않는 상태가 되는 것을 '교착 상태' 라고 합니다.

 

 

 

-교착상태의 빈도를 낮추는 대책-

 

DBMS 전반적인 대책 

 MySQL의 대책

 

 1. 트랜잭션을 자주 커밋한다.

    트랜잭션이 작은 단위가 되어 교착상태의 가능성을 낮춘다.

 

 2. 정해진 순서로 테이블(행)에 액세스 하게 한다.

 

 3. 필요 없는 경우에는 읽기 잠금 획득(SELECT ~ FOR UPDATE 등)의

    사용을 피한다.

 

 4. 쿼리에 의한 잠금 범위를 더 좁히거나 잠금 정도를

     더 작은 것으로 한다.

 

 5. 한 테이블의 복수 행을 복수의 연결에서 순서 변경 없이

    갱신하면 교착 상태가 발생하기 쉽다.

    동시에 많은 연결에서 갱신 때문에 교착 상태가 자주 발생한다면

    테이블 단위의 잠금을 획득해 갱신을 직렬화하면 동시성은 떨어지지만

    교착상태는 회피할 수 있어서 전체 처리로 보면 좋은 예도 있다.

 

 6. 테이블에 적절한 인덱스를 추가해 쿼리가 이를 이용하게 한다.

    인덱스가 사용되지 않는 경우에는 필요한 행의 잠금이 아닌

    스캔한 행 전체에 대해 잠금이 걸리게 한다.

 

 

 

 

  단원 정리

 

  1. DBMS의 트랜잭션은 'ACID'의 특성이 있다.

 

  2. 트랜잭션은 원자성에 의해 전부 성공하거나 전부 실패하는 원칙으로 동작한다.

 

  3. 고립성에 따라 병렬 실행이 일관성 있게 수행된다.

 

  4. 트랜잭션에는 4가지 격리 수준이 있는데, 직렬화 기능 이외의 수준을 선택하면 3가지의 현상이 발생한다.

   실제 운용에서는 '커밋된 읽기' 또는 '반복 읽기'의 격리 수준을 이용한다.

 

  5. 트랜잭션에서 잠금 대기와 교착 상태는 피할 수 없으므로 적절히 대처하는 것이 필요하다.

 

  6. 오토커밋은 쿼리 단위로 커밋하는 설정인데, 주의해서 사용하지 않으면 트랜잭션의 혜택을 받지 못할뿐더러 성능에 악영향을 미친다.

 

 

728x90
반응형
:

데이터베이스 외부 관리 툴 설치 (HeidiSQL 설치)

Back-End/Data Base 2019. 5. 1. 22:34
728x90
반응형

데이터베이스 외부 관리 툴 설치 (HeidiSQL 설치)

 

광고창 때문에 경고창이 발생하므로 '우클릭' ->'다른이름으로 저장' 을 누르면 된다!



출처

https://www.heidisql.com/

 


 

728x90
반응형
:

19.04.30 DBMS를 조작할 때 필요한 기본 지식

Back-End/Data Base 2019. 4. 30. 20:38
728x90
반응형

-커넥션-

 

로그인해서 프롬프트가 표시되었다는 것은 로그인 전과 로그인 후로 사용자와 MySQL의 관계가 변했다는 것을 의미합니다.

이는 사용자와 MySQL이 접속되었다. 즉 연결되었다는 뜻입니다.

이 연결이라는 것을 시스템 세계에서는 '커넥션' 이라고 부릅니다.

 

 

 

-프롬프트란?-

 

'사람에게 무언가를 하라고 재촉할때 사용하는 말' 입니다.

따라서 'mysql>'이란 MySQL이 사용자를 향해서 '명령을 입력하라'고 재촉하는 것입니다.

또한, 프롬프트 문자열은 DBMS의 설정을 수정하면 사용자가 좋아하는 문자열로 바꿀 수 있습니다.

 

 

 

-커넥션의 상태를 조사하는 명령-

 

 

  mysql> show status like 'Threads_connected';

 

 

 

 

-로그오프-

 

전화를 거는 것이 '로그인'이라면 전화를 끊는 것에 해당하는 행위는 '로그오프' 입니다.

로그오프를 하면 MySQL과의 커넥션이 끊어집니다.

로그오프 명령은 프롬프트 상태에서 'quit'라고 입력하고 'Enter' 키를 누르면 간단하게 실행됩니다.

 

 

  mysql> quit

 

  Bye 

 

 

 

 

-관리 명령이란?-

 

DBMS는 SQL이외에도 다양한 용도의 명령어를 준비해 두고 있는데, 이것을 '관리 명령' 이라고 합니다.

관리 명령은 DBMS가 정상적으로 동작하는지 감시하거나 DBMS가 이상한 동작을 할 때 문제 해결을 위해

정보수집을 하는 등의 용도로 사용합니다.

해당 명령의 목록은 DBMS의 메뉴얼에 기재되어 있고, 래퍼런스 문서도 있어서 이를 읽어보면 어떠한 정보를 어떤

명령어로 얻을 수 있는지는 알 수 있습니다.

관리 명령에서 중요한 점은 2가지 입니다.

 

 

  *DBMS는 SQL 문 이외에도 '관리 명령'이 있다.

 

  *관리 명령의 종류나 문법은 DBMS에 따라 다르다.

 

 

 

 

-SQL 문과 관리 명령의 구분법-

 

 

  *SQL문은 반드시 'SELECT, INSERT, DELETE, UPDATE' 중 하나의 단어로 시작한다.

 

  *이 외의 단어로 시작한다면 관리 명령이다.

 

  (물론 예외도 있다. CREATE, DROP 등등)

 

 

 

 

-스키마-

 

데이터베이스에서 폴더에 해당하는 개념.

'틀' 이라는 의미입니다.

테이블은 실제로 몇 개의 스키마 속에 저장되는 형식을 취하고 있습니다.

스키마도 폴더처럼 사용자가 자유롭게 만들 수 있어서 용도별로 나누거나

보여주고 싶지 않은 사용자에게는 접근할 수 없도록 제한을 건 스키마를 만드는 등의

관리를 수행하는 것도 가능합니다.

스키마의 상위에는 또 하나의 계층으로 '데이터베이스'가 있습니다.

데이터베이스에는 '계층'을 표시하는 의미도 있기 때문입니다.

 

 

 

-인스턴스-

 

데이터베이스보다 한 층 더 위에 있는 '인스턴스'란 개념이 있습니다.

이것은 물리적 개념으로, DBMS가 동작할 때의 단위입니다.

그래서 OS 입장에서는 '프로세스' 라고도 부릅니다.

DBMS에 따라서는 이것을 '서버 프로세스' 또는 단순히 '서버'로 부르는 경우도 있습니다.

 

 

 

-관계형 데이터베이스의 계층 구조-

 

 

  3계층 : 인스턴스 -> 스키마 -> 테이블 (Oracle, MySQL)

 

  4계층 : 인스턴스 -> 데이터베이스 -> 스키마 -> 테이블 (SQL Server, DB2, PostgreSQL)

 

 

 

 

728x90
반응형
:

19.04.29 데이터베이스와 아키텍처 구성

Back-End/Data Base 2019. 4. 29. 22:35
728x90
반응형

-아키텍처-

 

시스템을 만들기 위한 물리 레벨의 조합.

하드웨어와 미들웨어의 구성을 가리킨다.

 

 

 

-아키텍처의 역사-

 

1. Stand-alone : 데이터베이스만으로 시스템이 성립하는 가장 간단한 방법

2. 클라이언트 / 서버 : 클라이언트와 서버로 계층을 분리하여 상호 간에 네트워크로 접속하는 서버

3. Web 3계층 : 클라이언트 / 서버를 더욱더 발전시킨 것

 

Stand-alone

 특징

장점 

단점 

 문자 그대로 데이터베이스가 동작하는 머신이

LAN이나 인터넷 등의 네트워크에 접속하지

않고 독립되어 동작하는 구성

 구축이 매우 간단해서 소규모 작업을 빨리할수있다.

 

보안이 매우 높다.

물리적으로 떨어진 장소에서 접근할 수 없다.

 

복수의 사용자가 동시에 작업할 수 없다.

 

가용성이 낮다.

 

확장성이 부족하다. 

 

 

 클라이언트 / 서버

 특징

 장점

단점 

 데이터베이스를 네트워크에 연결한 것

 먼 곳에서도 이용할 수 있다.

 

복수의 사용자가 동시에 작업할 수 있어서 효율적

 인터넷 -> 데이터베이스 (보안위험)

 

불특정 다수의 사용으로 인한 관리비용 증가

 

 

 

 Web 3계층

 특징

 장점

단점 

 시스템을 3가지 계층의 조합으로 생각하는 모델

(웹 서버, 애플리케이션, 데이터베이스)

 보안을 높일수 있다.

 

관리 비용을 낮추는 구성이 될 수 있다.

 가용성이 낮다.

 

확장성이 부족하다.

 

 

 

-가용성을 높이는 2가지 전략-

 

 

  심장전략(고품질-소수전략)

 

  시스템을 구성하는 각 컴포넌트의 신뢰성을 높여 장애 발생률을 낮게 억제해서 가용성을 높인다. (소수정예 노선)

 

  신장전략(저품질-다수전략)

 

  시스템을 구성하는 각 컴포넌트의 신뢰성을 계속해서 높이기보다는 '사물은 언젠가 망가진다' 란 체념을 전제로 여분을 준비해둔다.

  이를 철저히 대비하는 것을 '물량작전'이라고 부른다.

 

 

 

 

-클러스터란?-

 

신장전략처럼 동일한 기능의 컴포넌트를 병렬화하는 것을 '클러스터링' 이라고 부릅니다.

'클러스터'는 사물이나 사람의 집합을 가리키는 말로, 포도 등의 '송이'란 의미도 있습니다.

이 의미처럼 시스템 세계에서는 '동일한 기능의 컴포넌트를 복수 개 준비해 한 개의 기능을 실현한다' 는 의미로 사용합니다.

또한, 클러스터 구성으로 시스템의 가동률을 높이는 것을 '여유도 를 확보한다' 또는 '다중화'라고 지칭합니다.

 

 

 

-단일 장애점-

 

다중화되어 있지 않아서 시스템 전체 서비스의 계속성에 영향을 주는 컴포넌트를 '단일 장애점'이라고 합니다.

또한 단일 장에점의 신뢰성이 시스템 전체의 가용성을 결정합니다.

 

 

 

-DB와 다른 서버의 차이-

 

데이터베이스는 데이터를 장기간 보존하는 매체가 필요합니다.

이것이 기본적으로 데이터를 일시적으로 처리할 뿐인 웹 서버나 애플리케이션 서버와 다른 점 입니다.

웹 서버나 애플리케이션 서버는 한창 처리 중일 때는 일시적으로 데이터를 보존하기도 하지만, 처리가 끝난 후까지 계속 데이터를

보존할 필요는 없습니다.

하지만 데이터베이스는 대량의 데이터를 영구적으로 보존해야 하고 그에 따른 성능도 요구되기 때문에

데이터를 보존하는 매체에 필요한 요건이 높습니다.

 

 

 

-기본적인 다중화-

 

Active-Active : 클러스터를 구성하는 컴포넌트를 동시에 가동한다. 시스템 다운 시간이 짧다. 성능이 좋다.

 

Active-Standby : 클러스터를 구성하는 컴포넌트 중 실제 가동하는 것은 Active, 남은 것은 대기하고 있는다.

ㄴCold-Standby : 평소에는 Standby DB가 작동하지 않다가 Active DB가 다운된 시점에 작동하는 구성이다.

ㄴHot-Standby : 평소에도 Standby DB가 작동하는 구성이다.

 

 

 

-리플리케이션-

 

Active-Active와 Active-Standby 클러스터 구성에서는 서버 부분은 다중화할 수 있어도 저장소 부분은 다중화할 수 없어서 데이터를 다중화하지

않는 공통적인 단점이 있습니다.

즉, 저장소가 부서질 경우에는 데이터를 잃게 됩니다.

물론 저장소도 보통은 내부 컴포넌트가 다중화되어 있지만, 데이터 센터 전체가 지진으로 붕괴하거나 화재가 난다면 끝입니다.

이런 상황에 대응하기 위한 클러스터 구성이 '리플리케이션' 입니다.

이는 DB서버와 저장소 세트를 복수로 준비하는 것을 말합니다.

 

 

-성능을 추구하기 위한 다중화 -

 

 Shared Disk

Shared Nothing 

 복수의 서버가 1대의 디스크를 사용하는 구성

네트워크 이외의 자원을 모두 분리(공유하지 않는) 방식

 

서버와 저장소의 세트를 늘리면 병렬처리 때문에 성능이 향상

 

비용 대비 성능이 좋다.

 

 

 

 

 

728x90
반응형
:

SQL 예제

Back-End/Data Base 2019. 4. 29. 00:11
728x90
반응형

 

 

테이블 2개를 생성해서 JOIN검색 해보기

 

 

 

1. 학생정보 테이블 생성

 

 

 

 

 

2. 학과인원 테이블 생성

 

 

 

 

 

 

3. [학생정보] 테이블과 [학과인원] 테이블에서 학과명이 같은 튜플을 JOIN 하여 학과, 학생수를 검색

 

728x90
반응형
: