'Database'에 해당되는 글 5건

  1. 2018.03.05 Mysql 이벤트 스케줄러 사용하기
  2. 2016.08.30 MySQL , MariaDB
  3. 2016.08.25 postgreSQL 설치
  4. 2016.08.25 postgreSQL 주요 기능
  5. 2016.08.24 postgreSQL 소개

Mysql 이벤트 스케줄러 사용하기

  1. 사용가능한 버전 확인

    • mysql 5.16
    • 이 포스트에서 사용하는 버전: MariaDB 10.2.9
  2. 이벤트 스케줄러 사용하도록 설정

    • option 설정
        MariaDB [(none)]> SET GLOBAL event_scheduler = ON;
        Query OK, 0 rows affected (0.00 sec)
      
    • option 설정 확인
        MariaDB [(none)]> show variables like 'event%';
        +-----------------+-------+
        | Variable_name   | Value |
        +-----------------+-------+
        | event_scheduler | ON    |
        +-----------------+-------+
        1 row in set (0.00 sec)
      
    • mysql 서버 재기동에도 스케줄러 동작하도록 my.cnf 설정 값 추가
        $ cat my.cnf
          [mysqld]
          event_scheduler = ON
      
  3. 이벤트 스케줄러 생성
    • 생성문:
        CREATE EVENT IF NOT EXISTS 이벤트 이름
        ON SCHEDULE
            EVERY 1 {INTERVAL_VALUE}
            STARTS CURRENT_TIMESTAMP
        DO
            {SQL 문 | call 프로시저}
      
    • INTERVAL_VALUE 변수:
      • YEAR , QUARTER , MONTH , DAY , HOUR , MINUTE , WEEK , SECOND , YEAR_MONTH , DAY_HOUR , DAY_MINUTE , DAY_SECOND , HOUR_MINUTE , HOUR_SECOND , MINUTE_SECOND
    • 예제: 매일 datetime 을 비교하여 하루 이상된 데이터를 삭제하는 스케줄러
      CREATE EVENT IF NOT EXISTS delete_row 
      ON SCHEDULE 
        EVERY 1 DAY 
        STARTS CURRENT_TIMESTAMP  
      DO 
        DELETE FROM testdb.testtable where date(ts) <= date(subdate(now(), interval 1 DAY));
      
  4. 이벤트 스케줄러 등록 확인
     MariaDB [(none)]> select EVENT_SCHEMA,EVENT_NAME,INTERVAL_FIELD from information_schema.events;
     +--------------+------------+----------------+
     | EVENT_SCHEMA | EVENT_NAME | INTERVAL_FIELD |
     +--------------+------------+----------------+
     | testdb       | delete_row | DAY            |
     +--------------+------------+----------------+
     1 row in set (0.00 sec)


Posted by 감각적신사
,

MySQL , MariaDB

Database 2016. 8. 30. 13:07

# MySQL , MariaDB

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

[mysql공식](dev.mysql.com)

[MariaDB](mariadb.org)

[mariadb installation](http://www.tutorialbook.co.kr/entry/Ubuntu-1404LTS-%EC%97%90-MariaDB-10-%EB%A5%BC-apt%EB%A1%9C-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0)


0. MySQL

- deafult : InnoDB 엔진

- 5.6 버전 이후 권장


1. MariaDB

- Mysql 과 동일하다, 커멘드 기타 등등

- deafult : InnoDB 엔진

- XtraDB엔진 : InnoDB 엔진의 강화버전 , Mysql 과 차별화 되는 점(아직 사용사례가 없다)

- open source 로 mysql 에 더 많은 기능을 추가하고자 한다

- cassandra 와 친해지려 한다

- 10.0 버전 이후 권장


2. MariaDB vs Mysql

- 엔진 비교

- InnoDB 

- 트랜잭션 보장 엔진

  - 확장성, 성능, 모니터링 일부 미흡 

- 원하는 테이블에 대해서만 MyISAM 엔진을 사용할 수 있도록 옵션을 주어 설정할 수 있다

- MyISAM 

- 트랜잭션 미보장 엔진 (배치성으로 작업하는 DB) 

  - 기능과 구조가 단순한 스키마에 적합하며 빠른 성능을 보장한다

- Aria 엔진 

- MyISAM 엔진의 강화버전(트랜잭션부분 일부 지원), 

- MyISAM 엔진 대비 강점 

1. crash safe : (myisam 대비, aria-log.xxxx 파일을 생성하여 메모리에서 발생한 정보를 기록한다) 

2. caching : data + index (myisam 은 index 만 캐싱이 가능하다)

- 튜닝 포인트 : aria-pagecache-buffer-size 

3. 트랜잭션 일부 지원

- 튜닝 포인트 : aria-checkpoint-interval  ... : wal file 의 주기 

- 기능 비교

        

- buffer pool 의 프리 로드 (온/오프가 가능하다)

- 자주 사용하는 정보는 메모리에 올린다

- 서브쿼리 최적화 : Oracle 은 기본으로 기능 제공 (왠만하면 안쓰는 것을 추천함)

- 마리아 DB 는 from 절의 서브쿼리만...


3. 모니터링을 위한 커멘드 (Mysql, MariaDB 공통)

- show processlist :  mysql 의 현재 쓰레드 별 상태 정보를 보여주는 명령어

- info 컬럼의 경우 전체 명령어가 나오지는 않는다 <-> oracle 은 전문 출력이 가능하다

- show status : mysql 의 통계정보를 모니터링 하는 명령어

- copy to tmp table : alter table 문을 수행중 데이터는 옮겨지기 전

- copying to group table : oder by , group by 절의 컬럼이 다를때 

- sorting for group

- sorting for order

- executing : 

- sending data : 쿼리문 결과를 주는 작업

- killed

- locked

- show slave status : replication 을 모니터링 하기 위한 slave 서버에서 수행

- seconds_behind_master: sec 단위의 벌어진 격차를 기록, 갭이 늘어나면 문제


4. 서버 프로세스 (Mysql, MariaDB 공통)

  

- Connection layer : 커낵션 핸들링

- communication protocols : 

- TCP/IP

- Unix socket file

- Shared memory

-Named pipes

- threads

- 커넥샨당 하나의 thread 유지

-쿼리 실행을 핸들링

- Authentication

- id/pw 점검

- SQL layer

- Parser : 문법 검사

- Authorization : 유저 권한 확인

- Optimizer : 쿼리에 대한 실행 계획 생성

- Query execution : 실행계획에 따른 쿼리 수행

- Query cache : SQL 문과 수행결과를 메모리에 캐싱

- 용도코드성에 쓰는게 좋다 (대부분 0 으로 튜닝한다)

- 일반적인 OLTP 시스템에서는 적절하지 않다

- Query logging : 실행 쿼리 기록

- Storage layer

- Disk : 디스크 상에 데이터를 저장하는 스토리지 엔진

- InnoDB

- MyISAM

- Memory : 메모리 상에서 데이터를 저장하는 스토리지 엔진 

- Network : 데이터 고가용성을 위해 클러스터를 활용한 확장

- Network Block Device


5. Disk 공간의 사용 (Mysql, MariaDB 공통)

- MAD, MAI, etc


6. Memory (Mysql, MariaDB 공통)

- Server/Shared : Query cache, Thread cache

- Storage Engine/Shared : 

- buffer pool : 전체 메모리의 50 ~ 80% 로 설정하는 것이 좋다

- 튜닝시, DB 가 죽지 않게는 해줄수 있다 

- default 300 MB

- log buffer : InnoDB 의 경우

- key buffer : MyISAM 의 경우 index 만 캐싱하고 데이터는 하지 않는다

- Connection/Session : Sort buffer, Read buffer, Temporary table(sort 하기 위한 임시 테이블)


7. HA (Mysql, MariaDB 공통)

- replication

 ----------------- ( 아래는 상용 솔루션 이다 ) ----------------- 

- MHA

- MHA manager : master 를 heart-bit 하다가 slave 를 올린다(마스터로 ), 

               auto fail0ver 는 되는데 auto filaback 은 안된다

- DRBD

- auto fail0ver 는 되는데 auto failaback 은 된다

- 4 TB 이상은 지원하지 않는다

- 트랜잭션 지원 디비 엔진(Inno, Xtra)만 지원한다

- OS Cluster

- Galera

Posted by 감각적신사
,

# Postgres Installation

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

[참고](https://www.postgresql.org/download/)


1. Prerequirement

    - OS : linux / windows 64bit

    - admin 계정으로 설치 / SELinux permission (permissive mode)

    - locale 정보

- 지역별 문자열에 대한 ordering 이슈가 있을 수 있다. 이를 관리한다 (default 로 쓴다)


2. installation

    - [download](https://www.postgresql.org/download/)

    - 설치 경로

    - 추가 설치 컴포넌트

    - 커넥터스 == driver

    - infinite cache

    - Migration Toolkit : oracle 데이터 importer / exporter

    - PEM : GUI tool (end user 입장에서는 pg_admin 과 동일) (중앙관리적 입장의 기능 추가) _

    - ...

    - data 경로 , WAL 경로

    - 추가 layer (Compatable with Oracle): oracle 명령어를 동작할 수 있게끔 지원 하는 기능 enable/disable

    - user / password 설정

    - port (default 5444)

    - Dynatune 

- Server Utilization

- 개발

- 범용 (default)

- 전용

- Workload Profile

- 트랜잭션 (default) : OLTP systems

- 범용 : OLTP and reporting workloads

- 보고 : 복잡한 쿼리 or OLAP workloads

    - ...

    - StackBuilder run or not

   


3. post installation

    - 권한변경 : installation Path

    - pgplus_env.sh 확인

 export PATH=/opt/PostgresPlus/9.5AS/bin:$PATH

  export EDBHOME=/opt/PostgresPlus/9.5AS

  export PGDATA=/opt/PostgresPlus/9.5AS/data

  export PGDATABASE=edb

  # export PGUSER=enterprisedb

  export PGPORT=5444

  export PGLOCALEDIR=/opt/PostgresPlus/9.5AS/share/locale


4. pg_ctl 명령어

  pg_ctl init[db]               [-D DATADIR] [-s] [-o "OPTIONS"]

  pg_ctl start   [-w] [-t SECS] [-D DATADIR] [-s] [-l FILENAME] [-o "OPTIONS"]

  pg_ctl stop    [-W] [-t SECS] [-D DATADIR] [-s] [-m SHUTDOWN-MODE]

  pg_ctl restart [-w] [-t SECS] [-D DATADIR] [-s] [-m SHUTDOWN-MODE] [-o "OPTIONS"]

  pg_ctl reload  [-D DATADIR] [-s]  # 설정파일만 다시 읽어온다 

  pg_ctl status  [-D DATADIR]

  pg_ctl promote [-D DATADIR] [-s]  # 서비스 이중화 구성시

  pg_ctl kill    SIGNALNAME PID

- 명령어 호출 예제

         


5. psql

- \? : command 명령어

- \x : 컬럼을 열로 보여줌

- \d+ : 상세정보 출력

- \help : sql 문

- psqlrc 파일 생성시, psql client 실행을 할때 선 수행된다

       



6. admin tool

        - query에 대한 limit default 값이 없어 툴이 죽을 수 있다 

        - paging 처리가 반드시 필요함

'Database > postgreSQL' 카테고리의 다른 글

postgreSQL 주요 기능  (0) 2016.08.25
postgreSQL 소개  (0) 2016.08.24
Posted by 감각적신사
,

# postgreSQL 주요 기능

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


0. Transaction Isolation 개념

- session1 : read A > update A to A1

- session2 : read A > ...................... > read A

- session2 가 읽은 A 는 A 일까 A1 일까?

- **3가지 상황 을 처리하기 위한 isolation level**

          

- dirty reads : session2 가 session1 이 commit 하기 전부터 A1 를 읽어옴

- nonrepeatable reads : session2 가 session1 이 commit 해도 기존에 읽은 A 가 있다면 A 를 읽어옴

- phantom reads : session2 가 session1 이 A 데이터를 변경하지 못한다 (shared lock 적용)

  - oracle 도 default 로 read commited level 을 지원한다

    - [참고URL](https://support.microsoft.com/ko-kr/kb/601430)

    - 추가 : oracle transaction 은 statement 단위로 롤백이 되지만, postgreSQL 은 transaction 전체가 롤백 된다


1. MVCC (Multi Version Concurrency Control)

- 만약 하나의 record 에 대해 각각의 세션이 데이터 변경, 삭제 등의 동작을 했다면, 세션1(A), 세션2(A'), 세션3(A'') 는 존재해야 한다

- oracle 방식 (우월한 방식이다)

- 세션1 이 select 중 세션2가 업데이트할 시,

- A 를 다른 공간(undo)에 업데이트 하고 A' 를 원본 데이터로 저장한다

- 세션1에게는 다른 공간의 A를 읽어온다

- undo 영역에 대한 가비지 컬랙터가 존재하며, 부담이 없다

- 대신 rollback 이 느리다

    - postgreSQL 방식

    - 세션1 이 select 중 세션2가 업데이트할 시,

- A' 를 같은 테이블에 저장 append 한다

- 세션1에게는 A' 의 데이터 입력 시간 을 확인하고 skip 한다

- 각 레코드 마다 트랜잭션에 대한 created, expired 컬럼을 가지게 된다

- xmin , xmax : transaction 의 시작,끝

- cmin , cmax : transcation 내의 query 에 매겨지는 순서

- 각 레코드에 불필요한 overhead(각각 32bit)가 발생하게 된다

- 2 ~ 40억 의 값이 부여된다

- 현재 트랜잭션 ID 를 기준으로 +20억 까지는 미래, -20억 까지는 과거

- 그림

- transaction 관리 table 을 두고, transaction 의 상태 (commit, rollback, progress ...) 를 관리한다

- A 를 지우기 위한 가비지 컬랙터가 필요하다, 원본 테이블에 대한 컬랙터의 동작으로 어렵다

- OID 

- table 생성시, with OID 옵션을 추가하면 생긴다

- OID 를 별로도 저장하지 않는다?

- 내부 관리용으로 사용된다


2. Vacuuming

- 쓰레기 데이터를 정리하여 쾌적하게 청소하라는 명령 으로 "디스크 조각 모음" 이라고 생각하면 된다

- Update나 Delete 한다고 해서 해당영역이 자동으로 재사용되거나 사라지지 않고 이러한 오래된 영역을 재사용하거나 정리해주는 명령어가 Vacuum 이다

- postgresql.conf 파일내의 AUTOVACUUM PARAMETERS 관련 옵션을 지정

- default on : 오프시키면 안된다

- table 단위로 on/off 가 가능하다

- log_autovaccum_min_duration (default -1) : 

- freeze_max_age : 2억번 이상의 transaction 이 발생했을 때

- max_wokers (default 3) : 

- naptime (default 1 min) : worker 가 계속 일하는 것이 아니라 쉬는 시간을 갖는다

- threshold : 50 개가 변경이 되면 vacuum 해라

- analyze : 통계 정보가 변경되는 간격

    - http://blog.gaerae.com/2015/09/postgresql-vacuum-fsm.html


3. reindexing

    - 작업 소요 시간의 요인

- indexes 의 수

- indexes 의 크기

- 동작 중의 서버 load

    - reindexing 하는 이유

    - index 가 "bloated" 상태가 되었을때 == 많이 비어있거나 거의 비어있는 상태 일때

    - 대체할 fillfactor 와 같은 parameter 가 존재할 때

필펙터는 인덱스가 생성될 때 인덱스 페이지를 채우는 비율

인덱스가 처음 생성될때만 적용되고 운영중에는 유지되지 않기 때문에 데이타 수정이 잦은 DB라면 의미 없는 값이 된다

데이타 수정이 거의없는 DB라면 필펙터를 높여서 읽기 성능을 높일수 있겠지만

데이타 수정이 잦아지면 페이지 스플릿의 증가로 쓰기 성능이 나빠질수 있다

   - CONCURRENTLY 옵션이 실패하여 "invalid" index 로 남겨졌을 때

이 옵션은 index 생성시에 어떠한 lock 없이 동작하게끔 한다


4. clustering

- clustering 하면 지정된 index 에 의해 순서대로 정렬한다 (하는 중에는 table lock 이 걸린다)

- 반복적으로 적용되어 처리해주는 것이 아니라 명령 실행 이후 데이터는 무정렬 상태로 출력된다


5. backup

- logical backup

- partial backup and recovery (table 단위)

- can validate all data files

- logical backup 의 방법 : sql commands 를 통해

            - pg_dump 유틸리티 를 통해 다양한 포멧의 형태로 백업이 가능하다

                - 주요 사용옵션 : -Fp, -Fd (테이블별 병렬처리로 덤프), -Fc

            - pg_dumall 유틸리티 를 통해 클러스터 전체에 대한 백업을 받는다, 자주 사용하지 않는 기능이다

            - pg_restore 유틸리티 를 통해 복구가 가능하다

    - physical backup

    - 디렉토리 구조 전체의 데이터 파일을 통째로 복사한다

    - type

    - Cold backup : db 멈춘상태에서 백업

    - Continuous Archiving == Pointing In Time Recovery (PITR):

    - checkpoint 가 발생하기 전에 transaction log 를 모아두는 archive log 공간으로 복사

    - 추가적인 WAL log 나 transaction log 를 적용하여 시점 이후의 데이터를 복원 가능하다

    - setting

  wal_level=archive

   archive_mode=on

                - 실행 : cp -i %p from_path/%f </dev/null


6. Extensions

- 다양한 plugin 을 지원한다

- 특징

- package manager 가 있다

- 표준화된 개발환경 (PGXS) 을 지원한다

- 간단한 설치 및 관리

- http://pgxn.org

- 대표적인 extension

- pgcrypto : 암호화 / 복호화 용도

- pg_buffercache : 메모리의 버퍼 상태를 모니터링 하는 용도

- pg_freespacemp : FSM 정보를 제공 하는 용도

- pageinspect : 블럭에 대한 덤프 기능

- pg_prewarm : 디스크의 내용을 메모리에 올려둔다

- pg_stat_statements : 조회한 쿼리 정보 조회 기능

- memory 공간에 대한 추가적인 설정이 필요하다

- pg_repack : 논란의 요지가 있으나 유용하다

- online 중에 clustering, vacuum full 기능을 lock 없이 사용하도록 지원


'Database > postgreSQL' 카테고리의 다른 글

postgreSQL 설치  (0) 2016.08.25
postgreSQL 소개  (0) 2016.08.24
Posted by 감각적신사
,

# Postgres: A Proven Track Record

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


1. Postgres

        

- VS mysql

- 라이센스 정책 이슈 가 없어 사용하기 좋다

- Versioning

          

- 9.0 streaming 지원

- 9.5 parelle scan (table) ... 지원

- version up 됨에 따라 기능, 파라미터의 삭제 case 도 있다

- 제품군

- Postgres (community ver)

- EDB Postgres Advanced Server (enterprise ver)

- hint ? 가 있다

- Postgres Plus Cloud (enterprise ver)


2. physical database 구조

   

- cluster == DB (최근 일반화된 cluster 의 정의와는 다르다)

       - 포터블 하다

       - 각 database 는 하나의 폴더 구조를 가진다 == /install-path/9.5AS/data/

            - pg_tblspc : 각각의 tablespace 에 각각의 관계가 저장된다

            - base :

        - 각각의 table 이나 index 의 경우 각각 다른 파일로 저장된다 (OID 숫자 파일로 생성)

        - OID 숫자는 pg_class.relfilenode 에서 찾을 수 있다

        - 하나의 파일은 최대 1GB

       - page structure

         

            - tuple 8 kb , 조정 불가

            - toast 라는 메커니즘을 통해 8 kb 이상의 가변 길이 데이터를 따로 저장한다


4. process

   

    - multi process 구조 이다 (최근 많이 사용하는 multi thread 구조, 비동기 구조 와는 다르다)

        - 클라이언트에서 pool 로 관리하여 DB 에 접속하기 때문에 변경할 필요는 없다

        - 각자 판단하여 각자 업무를 한다 == utility process 가 별로로 존재

        - 클라이언트 의 응답용 backend process 가 있다

    - Postmaster

listener 가 네트워크 서버 역할, 자식 process 를 만든다

- 하나의 master process 만 생성하기 때문에 port 도 하나만 사용한다

    - Postgres == Server Process == backend process

- postmaster 에 의해 생성되며 client 의 요청을 수행하는 프로세스

- 데이터의 입출력을 담당한다

    - Utility process

        - background writer : write dirty data to disk

- WAL writer : write WAL file to disk

- checkpoint process

- ...


5. DB I/O 의 특징

- DB 의 모든 데이터의 접근은 server process 가 memory 를 통한다

- DB 의 성능을 좌우한다

- read path

- step1. memory 영역 조회

- step2. 없으면 memory 할당을 받음

- step3. 직접 Disk 를 조회

- step4. memory write

- step5. client 에 전달

        - write path

       

            - step1. buffer cache 조회

            - step2. memory 확보

         - step3. 변경내용 log buffer (WAL buffer)에 기록

            - step4. memory 데이터 변경 > transaction log 기록 (utility process 중 background writer)

            - -------------- write 보장 / commit --------------

            - step5. DB File 에 완전히 기록 된 것을 확인 (utility process 중 WAL writer)

        - commit && check point

            - before commit : data in memory

     - after commit : data in transaction log

        - after check point : data in data file


6. transaction log == WAL log

- 순차적으로 변경사항을 기록 (DB file 에 직접 쓰는 것보다 성능적으로 우수하다)

- commit 완료되기 전에 DB file 에 기록

- long transaction 의 경우 commit 되기 전에 주기적으로 기록

- archive log 폴더로 별도의 백업이 이루어진다


7. check point : DB 의 성능을 좌우한다

- 동작

- step1. WAL 파일에 REDO point 를 지정

- step2. 지정된 시점의 WAL 파일을 buffer 에 기록

- step3. pg_control 파일 업데이트

- step4. 공유 버퍼 풀에 있는 모든 dirty page 를 스토리지에 기록 후 플러시

        - 주기 조절이 중요하다

- 빈번한 수행 : 

+ 장애 복구 시 신속한 복구 가능

- disk I/O 가 많아져 성능 저하 이슈

- 긴 주기 수행 : 

disk I/O 가 적어 성능 좋음

- 장애시, 복구할 WAL file 이 많아져 이슈가 될 수 있음 

 - 역할 : 

- 주기적으로 biffer cache 의 변경된 block(dirty buffer) 를 file 에 기록

- 모든 변경 내용이 기록된 transaction log 파일을 release 하여 해당파일 삭제

- 버전 관리

- a > a1 : wal log 에 기록 후 buffer memory 기록

- if 장애 발생시, disk 에 블록 header 부분에 변경사항을 기록한다 , wal log 의 변경사항 비교


참고 https://www.postgresql.org/docs/

'Database > postgreSQL' 카테고리의 다른 글

postgreSQL 설치  (0) 2016.08.25
postgreSQL 주요 기능  (0) 2016.08.25
Posted by 감각적신사
,