프로젝트를 하면서 

ddl과 insert query가 필요했다

현재 쓰는 툴로는 postgresql이 쿼리가 뽑히지 않아서

pg_dump를 이용해 쿼리를 뽑아ㅏㅆ다.

 

내가사용한건 다음과 같이 두 명령어

 

 

-- ddl

./pg_dump -Cs apim -n schemaname e -n pubic -E utf-8 > ddl_schema.sql

 

-- insert query

./pg_dump -a -O --inserts -E UTF8 dbname > dump.sql

 

 

참고)

schema 단위 백업

./pg_dump -Cs dbname -n schemaname -n schemaname2 -E utf-8 > ddl_schema.sql

./pg_dump -a dbname -n schemaname -n schemaname2 -E utf-8 > data_schema.sql

 

table 단위 백업

./pg_dump -Cs dbname -t schema.table -E utf-8 > ddl_table.sql

./pg_dump -a dbname -t schema.table -E utf-8 > data_table.sql

 


참고

 https://stricky.tistory.com/169

 

[gpdb 백업] pg_dump & pg_restore 간단 사용법

[gpdb 백업] pg_dump & pg_restore 간단 사용법 안녕하세요. GPDB 에서 PG_DUMP 와 PG_RESTORE를 이용한 백업과 복구에 관해서 간략하게 안내해 드릴께요. pg_dump & pg_restore는 sql 기반으로 gpdb안의 데이터..

stricky.tistory.com

       

'DEVELOP > DB' 카테고리의 다른 글

[DB] postgreSql Centos7에 설치 및 설정하기  (0) 2020.08.24
[DB]Isolation Level 알아보기  (0) 2020.07.19
[mySql] 계정 생성 및 권한 설정  (0) 2020.05.25
[MariaDB] general log 설정하기  (0) 2020.05.25
DB (mysql) 설정 변경  (0) 2020.03.13

postgresql을 Centos7에 설치해보겠당

 

근데 서버가 yum이나 library를 인터넷에서 받아오는 환경이 아니어서

tar 파일을 postgresql에서 받아주었다.

 

https://www.postgresql.org/ftp/source/v12.0/

 

PostgreSQL: File Browser

 

www.postgresql.org

 

 

1. tar 압축해제

tar xvfz postgresql-12.0.tar.gz

 

 

2. configure 파일 설정

sudo ./configure --prefix=/apim/data/postgresql/pgsql --without-readline --without-zlib

 

왠만하면 다 sudo권한으로 넣어서 명령어 실행시켜주었다.

 

--prefix 는 설치 디렉토리를 지정해주는 경로이다.

 

그리고 나는 서버에서 readline이랑 zlib이 없어서 빼고 설치하라고 나와서 without을 설정해주었다.

뒤에 두개 옵션은 빼도된다.

 

 

3. postgresql 설치

sudo make
sudo make install

 

 

4. DB 설치

 ./initdb -D /data

/data 라는 경로에 DB를 설치해 주었다.

원하는 경로를 입력 하면 된다.

/data라는 경로에 한 이유는 DB 마운트를 저 경로로 했기 때문이다.

 

 

5. DB 기동

./pg_ctl  start -D /data ( status, restart , stop)

 

start 대신해서 status를 입력하면 현재 상태

restart는 재기동

stop은 기동중지를 할 수 있다 ~_~

 

 

6. 외부 접속 허용

/data/postgresql.conf 에서

    1. listen_addresses = ‘localhost’ –> listen_addresses = ‘*’ 수정

data/pg_hba.conf 에서

  • host all all 0.0.0.0/0 password 추가 

 

7. psql 접속

./psql

 

8. 접속 한뒤 database 생성 및 user 생성

postgres=# CREATE DATABASE {DBname};
postgres=# CREATE USER {UserName};
postgres=# ALTER USER {UserName}  WITH PASSWORD '{Password}';

 

 

 

스키마 생성 및 삭제

Create schema {schemaName};

Drop schema {schemaName} cascade;

 

스키마 이름 변경 

ALTER SCHEMA schema_name RENAME TO new_schema_name;

 

스키마 소유자 변경

ALTER SCHEMA username OWNER TO new_username;

 

 

 

해당 database내의 schema 확인

\dn

 

현재 디비 계정및 role 정보

\du  

 

데이터베이스 접속

\connect {databaseName}

 

데이터베이스 목록조회 

\list  
\l

 

데이터베이스 목록 상세조회

\list+  
\l+

참고

https://lahuman.jabsiri.co.kr/173

 

[CentOS 6]Postgresql 소스 설치

Postgresql 소스 설치 정리 계정 생성 $> adduser postgres postgres 계정으로 로그인 $> su - postgres postgresql 소스 다운로드와 압축 해제 $> wget https://ftp.postgresql.org/pub/source/v9.5.7/postgresql..

lahuman.jabsiri.co.kr

http://blog.naver.com/hanccii/221701395102

 

PostgreSQL db, schema, user 권한 관리

PostgreSQL에서는 database 를 생성하면 default schema로 public 이라는 schema가 생성이 되며,backen...

blog.naver.com

 

 

'DEVELOP > DB' 카테고리의 다른 글

[postgreSql] pg_dump 하는 방법  (0) 2021.03.15
[DB]Isolation Level 알아보기  (0) 2020.07.19
[mySql] 계정 생성 및 권한 설정  (0) 2020.05.25
[MariaDB] general log 설정하기  (0) 2020.05.25
DB (mysql) 설정 변경  (0) 2020.03.13

ㅎㅎ

중요하지만 쵸큼은 헷갈리던 개념에 대해서

정리해보고자 한닷 '-'

 

정리해놓고 내가 다시보는게 중요하거덩여,,, RGRG,,


보통 4가지 레벨로 구분한다.

1. Read Uncomitted

2. Read Committed

3. Repeatable Read

4. Serializable 

 

한가지씩 정리해보고자 한닷 ^_^

사실 알면 간단하다..(자주하는말)

 

 

2. Read Uncommitted

transaction이 끝나지 않은 상황에서 다른 transaction이 변경한 내용에 대한 조회가 가능하다.

DB의 일관성 유지 할 수 없다.

 

다른 transaction에서 중간에 data를 변경하면 변경된 값 그대로 조회가 된다는 것이다.

 

dirty read 현상이 발생한다. transaction이 완료되지 않았는데 다른 transaction에서 볼 수 있는 현상이다.

 

 

2. Read Comitted

조회시, data에 대한 shared lock이 된다

commit이 된 data에 대해 조회가 된다. 하지만 어떠한 사용자가 어떠한 데이터를 변경하는 동안 

다른 transaction은 접근 할 수 없어 대기한다.

변경한 데이터가 commit되고 난 이후 접근 가능하다.

 

실제 테이블  값을 가져오는 것이 아니라 Undo 영역에 백업된 레코드에서 값을 가져온다.

 

 

3. Repeatable Read

transaction이 범위내에서는 조회한 데이터의 내용이 항상 동일함을 보장해준다.

 

Mysql에서는 transaction마다 트랜잭션 ID를 부여하여 트랜잭션id보다 작은 트랜잭션 번호에서 변경한것만 읽게된다.

 

undo 공간에 백업해두고 실제 레코드 값을 변경한다.

이러한 방식을 MVCC(Multi Version Concurrency Control)이라고 부른다.

 

insert시에는 값이 들어간건 보인다,,그래서 쓰기 잠금을 걸어야한다.

4. Serializable

모든 동작이 직렬화 되어 작동한다. Repeatable 와 다르게 insert를 하여도 작동하지 않는다.

성능 측면에서는 동시 처리성능이 가장 낮다.

거의 사용되지 않는다.

 

 

 

 

 

 

 

 

 

 

 

 

 


https://medium.com/@wonderful.dev/isolation-level-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-94e2c30cd8c9

 

Isolation level 이해하기

Isolation level이란 트랜잭션에서 일관성이 없는 데이터를 허용하는 수준을 이야기합니다.

medium.com

 

https://nesoy.github.io/articles/2019-05/Database-Transaction-isolation

 

트랜잭션의 격리 수준(isolation Level)이란?

 

nesoy.github.io

 

'DEVELOP > DB' 카테고리의 다른 글

[postgreSql] pg_dump 하는 방법  (0) 2021.03.15
[DB] postgreSql Centos7에 설치 및 설정하기  (0) 2020.08.24
[mySql] 계정 생성 및 권한 설정  (0) 2020.05.25
[MariaDB] general log 설정하기  (0) 2020.05.25
DB (mysql) 설정 변경  (0) 2020.03.13

1. 서버에서 mysql 로 접속한다.

 

mysql -u root 

mysql -u root -p // 비밀번호 치고 들어가야 할 때

 

 

2. mysql 스키마 변경

use mysql;

 

 

3. user 테이블 조회

select host , user, password from user;

 

4. 계정 생성

create '계정아이디'@'ip' indentified by '비밀번호';

ex)
create user 'test'@'%' IDENTIFIED BY  'test1!';
create user 'test2'@'127.0.0.1' IDENTIFIED BY  'test1!';

 

생성한 user 삭제

 

delete from user where user='test2';

 

 

5. 권한 설정

grant select , insert , update , delete on  스키마명.테이블명 to '계정 아이디 '@'아이피';

grant all privileges on 스키마명.테이블명 to '계정명'@'호스트명' identified by '계정비밀번호' with grant option;

 

첫번째는 주어진거만 , 로 구분해서 권한을 주면 된다.

두번째는 전체 권한이고 

 

 

6. 권한 조회 

show grants for '계정아이디'@'호스트';

ex)
show grants for 'test'@'%';

 

 

7. 권한 삭제

revoke all on '스키마명'.'테이블명' from '계정명'@'호스트';

 

'DEVELOP > DB' 카테고리의 다른 글

[DB] postgreSql Centos7에 설치 및 설정하기  (0) 2020.08.24
[DB]Isolation Level 알아보기  (0) 2020.07.19
[MariaDB] general log 설정하기  (0) 2020.05.25
DB (mysql) 설정 변경  (0) 2020.03.13
NewSql 이란? All in one DBMS  (0) 2019.12.16

MariaDB에는 다양한 로그가 있다.

 

모든 query log가 나올 수 있는 general log가 있고

 

느린 쿼리를 수집하는 slow로그 

 

에러로그를 수집하는 에러로그

 

그중에서 오늘은 general log에 대해서 알아보도록 하자

 

 


1.  root 권한으로 mysql로 접속

우선 서버에서 root 권한으로 들어가준다.

 

mysql -u root 

mysql -u root -p // 비밀번호 치고 들어가야 할 때

 

그리고 mysql로 들어가줌!

 

 

2. general log에 관한 설정 조회

general log에 관한 설정을 조회 해준다.

 

MariaDB [(none)]> show variables like 'general%';
+------------------+-------------------------+
| Variable_name    | Value                   |
+------------------+-------------------------+
| general_log      | OFF                      |
| general_log_file | general.log |
+------------------+-------------------------+

 

 

3. general log 설정 on

set GLOBAL general_log='ON';
set GLOBAL general_log_file='/data/general.log';

이러면 설정은 끝난다.

그치만 매번 DB를 올리고 내릴때마다 같은 설정을 유지하고 싶으니깐

 

my.cnf 파일을 수정해준다.

 

vi /etc/my.cnf

[mysqld]
general_log = 1
general_log_file=/data/general.log

 

만약, 권한이 없으면 sudo 권한으로 열어준다!

( sudo vi /etc/my.cnf )

 

 

default general_log 테이블은 CSV 엔진을 사용하기 때문에 MyIsam 엔진으로 변경한다.

아래와 같은 에러 발생 시 general_log 를 off 시킨 후 수행해야함!

mysql> alter table mysql.general_log engine=MyIsam;

4. 로그 수집 방법 (FILE / TABLE)

 

로그 수집 방법을 조회 해준다.

MariaDB [(none)]> show variables like 'log_output%';
+---------------+------------+
| Variable_name | Value      |
+---------------+------------+
| log_output    | FILE       |
+---------------+------------+
1 row in set (0.001 sec)

 

그런데 나는 로그에서 매번 user_host 즉, ip가 나왔으면 했다.

 

 

그런데 general-log에서는 FILE 로그에서는 connect 할때는 ip가 나오는데 

그 이후, query에서는 나오지 않았다.

 

그런데 table 에서는 기본적으로 user_host가 있으므로 TABLE로 로그를 수집하기로 하였다.

 

cf) 이를 대체하는 방법으로 slow log의 시간을 조정해주는 방법이 있다. 

왜냐면,, slow 로그는 모든 ip를 수집하기 때문이다.

 

SET GLOBAL long_query_time = 0.01;


MariaDB [(none)]> show variables like 'long%';
+-----------------+----------+
| Variable_name   | Value    |
+-----------------+----------+
| long_query_time | 0.100000 |
+-----------------+----------+
1 row in set (0.001 sec)


 

 

 

잠시 삼천포에 빠졌었는데 다시 !

그럼 TABLE 에 로그를 쌓도록 수정하겠다.

 

set global log_output='TABLE';

 

그런데 이러면 slow 로그등 다른 로그들도 영향을 받는다.. 그래서 FILE 도쓰고 TABLE도 쓰겠당!

 

set global log_output='TABLE,FILE';

 

그러면 mysql에 general_log라는 테이블이 기본 지원 되기때문에 해당 테이블을 조회 하면 connect , query, 권한 부여등

모든 것이 나온다!

 

 

 

 

event_time	user_host	thread_id	server_id	command_type	argument
03:03.8	root[root] @ localhost []	24	1	Query	show variables like '%log%'

 

 

'DEVELOP > DB' 카테고리의 다른 글

[DB]Isolation Level 알아보기  (0) 2020.07.19
[mySql] 계정 생성 및 권한 설정  (0) 2020.05.25
DB (mysql) 설정 변경  (0) 2020.03.13
NewSql 이란? All in one DBMS  (0) 2019.12.16
NoSql DB 종류  (0) 2019.12.13

ㅎㅎ

DB를 서버에 설치 이후,

설정을 가볍게 이거저거 바꿀일이 있다

 

/etc/mysql/my.cnf 나

/etc/my.cnf 에 보통 있다.

 

해당 파일을 vi로 열어서 편집해서 저장한뒤,

DB를 재기동 하면된다.

 

$ vi /etc/my.cnf

 

 

1. 인코딩 : UTF8

 

가장 기본적은 인코딩 방식을 utf8로 바꾸는 것이다

[mysql]

default-character-set = utf8

 

[mysqld]

character-set-client-handshake=FALSE

init_connect="SET collation_connection = utf8_general_ci"

init_connect="SET NAMES utf8"

character-set-server = utf8

collation-server = utf8_general_ci

  

[client]

default-character-set = utf8

 

DB 재기동

$ service mysqld restart

 

 

2. query 대소문자 구분 안함

그리고 보통 많이 하는게 query날렸을때 대소문자를 구분 안하도록 설정해 주는 것이다.

 

show variables like 'lower_case_table_names';

 

다음 쿼리로 확인 해보면 

0일 경우, 대소문자 구분하고

1일 경우, 대소문자 구분을 안한다 그래서 

[mysqld] 에 추가 한뒤, 재기동 해준다~

 

[mysql]

default-character-set = utf8

 

[mysqld]

character-set-client-handshake=FALSE

init_connect="SET collation_connection = utf8_general_ci"

init_connect="SET NAMES utf8"

character-set-server = utf8

collation-server = utf8_general_ci

lower_case_table_names=1

  

[client]

default-character-set = utf8

 

3. DB max connection

   SHOW VARIABLES LIKE '%wait_timeout%';

  SHOW VARIABLES LIKE '%max_connection%'; // 접속수 

      

 

 

4. DB 재기동 없이 변수값 변경하기

 

set global 변경값;

ex) setl global lower_case_table_names=1;

 


참고

 

http://wincloud.link/pages/viewpage.action?pageId=9469960

 

MySQL 기본 인코딩을 UTF8 로 변경 - Linux - Confluence.winCloud.Link

MySQL 기본 설정으로는 한글이 모두 ? 로 나오면 깨져서 보이게 된다. 이를 해결하기 위하여, 기본 인코딩을 UTF8 로 변경한다. 단계별 안내 # 설정값 확인 mysql> show variables like 'c%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+-------------------

wincloud.link

http://blog.naver.com/PostView.nhn?blogId=juner84&logNo=100124891560&categoryNo=23&viewDate=¤tPage=1&listtype=0

 

[Mysql] mysql 중단 없이 mysql variable 변경

# mysql variable 변경 mysql을 사용하다 보면 이것저것 설정을 변경할 필요가 있다. 기본적인 설정은 /etc...

blog.naver.com

 

'DEVELOP > DB' 카테고리의 다른 글

[mySql] 계정 생성 및 권한 설정  (0) 2020.05.25
[MariaDB] general log 설정하기  (0) 2020.05.25
NewSql 이란? All in one DBMS  (0) 2019.12.16
NoSql DB 종류  (0) 2019.12.13
DB(database)의 종류  (0) 2019.12.11

DB에 대해서 알아보다가

RDB와 NoSql은 각각 장단점이 명확해서

이거를 아우를 수 있는 NewSql이 있다는걸 알았다!

 

오늘은 이걸 알아보고자 한당 ㅎ_ㅎ


NewSql 이란?

 

2011년에 처음나온 개념이다 (얼마안되었네..!)

간단히 말하자면,

NewSql = RDB + NoSql

 

RDB처럼 ANSI SQL문법과 ACID(트랜잭션)을 지원하고,

NOSql처럼 Scale-out을 지원한다.

 

 

MIT 마이클 스톤 브레이커 교수는 NewSql에 대해서 5가지로 정의 내렸다.

 

정의

1.SQL 기반 상호작용

- SQL 문법을 사용한다

 

2. 트랜잭션을 위한 ACID 지원

- 트랜잭션 커밋(Commit)을 위한 필요속성인 ACID( 원자성, 일관성, 고립성, 지속성)을 지원

  • 원자성(Atomicity) : 트랜잭션과 관련된 작업들이 부분적으로 실행되다가 중단되지 않는 것을 보장하는 능력
  • 일관성(Consistency): 트랜잭션이 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 유지
  • 고립성(Isolation): 트랜잭션을 수행 시 다른 트랜잭션의 연산 작업이 끼어들지 못하도록 보장
  • 지속성(Durability): 성공적으로 수행된 트랜잭션은 영원히 반영되어야 함

 

3. 비잠금 동시성 제어

- 데이터 무결성 처리를 위해 지원하는 트랜잭션 동시제어 잠금처리와 관련해 기존 방식과는 다른 Non-locking 구조를 지원

- 락을 걸지않고 단일 스케줄을 통해 동시성 제어를 한다.

 

4. 노드 단위 고성능

- 각 단일 DBMS 서버 노드 단위로 확장해 고성능 보장

- 네트워크를 통한 처리가 없고 Node 단위로 확장하여 성능을 높일 수 있다.

 

5. 병렬, 비공유 아키텍쳐

- 병렬적으로 수행해서 데이터를 고성능으로 처리 할 수 있어야하고, 분산 처리 시 데이터가 각 서버에 중복되지 않고 독립적으로 존재해야 한다.

- CPU, RAM, DISK 같은 하드웨어 자원을 서로 공유하지 않고 개별적으로 사용한다.

 

 

이걸로만으론 그렇게 와닿지가 않는다..! 더 찾아보자

 

특성

1. Partitioning/Sharding

Sharding를 통해 Scale-out을 지원한다.

- Sharding : 같은 테이블 스키마를 가진 데이터를 다수의 데이터베이스에 분산하여 저장하는 방법

- ex) 전 세계의 고객 데이터를 저장하는 DB를 분산한다면, 아시아면 샤드A, 유럽이면 샤드B... 이런식으로 저장한다.

- 테이블을 컬럼 값을 기초로하여 나눈다.

 

 

2. Concurrency Control

MVCC(Multi Version Concorrencty Control) 기법 적용

- NewSql은 트랜잭션에 의해 데이터 갱신이 발생 할때, 생성된 사본에 데이터를 갱신하는 연산을 수행하므로

다른 트랜잭션에 영향을 끼치지 않으면서 빠른 성능을 구현 할 수 있다.

 

 

3. Crash Recovery 

시스템이 무너졌을때, 데이터를 복구하고 상태를 유지하는 기능이 있다.

 

 

4. In-Memory DB

실시간 저장 및 처리를 위해서 인메모리 DB 아키텍처이다.

- 모든 NewSql이 인메모리 DB는 아니지만, 대부분 지원한다.

- 비싼 메모리 가격과 메모리 용량으로 인해 실시간 데이터 처리가 필요한 특정업무에만 제한적으로 사용돼 왔다.

- 메인 메모리 속성인 휘발성 때문에 디스크 백업이 필요한 제약을 극복하기 위한 연구 진행중이다.

 

 

 

RDB, NoSql, NewSql 비교

특성 RDB NoSql NewSql
ACID특성 O X(BASE 제공) O
인메모리 DB X O O
빅데이터 X O O
스케일 아웃 X O O
H/A O O O
리플리케이션 * O O O
성능 X O O
SQL지원 O X O
Relational O X O
join O X O

 

 

*리플리케이션 (replication) : 두개이상의 DBMS시스템을 Master/ Slave로 나눠서 동일한 데이터를 저장하는 방식

 

 

 

 

 


참고사이트

http://www.itworld.co.kr/news/111071

https://www.predictiveanalyticstoday.com/newsql-databases/

https://bitnine.tistory.com/entry/NewSQL%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC

'DEVELOP > DB' 카테고리의 다른 글

[MariaDB] general log 설정하기  (0) 2020.05.25
DB (mysql) 설정 변경  (0) 2020.03.13
NoSql DB 종류  (0) 2019.12.13
DB(database)의 종류  (0) 2019.12.11
Liquibase 사용법 및 개념  (0) 2019.06.12

저번 시간에는 RDB와 NoSql을 비교해서 이해해 보았다면,

이번에는 NoSql의 종류를 좀 더 상세히 이해해 보고자 한다.

 


NoSQL이란?

대용량 웹 서비스를 위하여 만들어진 데이터 저장소로 관계형 데이터 모델이 아닌 분산된 데이터를 저장 및 조회,

스키마가 없거나 느슨한 스키마를 제공한다.

1. Key-Value DB

- 간단한 키-값 메소드를 사용하여 데이터를 저장하는 비관계형 데이터 베이스 유형

- 키를 고유한 식별자로 사용하는 키-값 쌍의 집함으로 저장

- 키-값DB는 파티셔닝이 가능하고, 다른유형의 DB로는 불가능한 범위까지 수평확장 가능

 

사용사례

- 세션 스토어 : 세션 관련데이터를 주 메모리또는 DB에 저장하는데, 속도가 빠른 키-값 저장소가 적합하다. 키-값DB는 RDB보다 페이지당 제공하는 오버헤드가 적다

- 장바구니: 키-값DB는 분산처리 및 저장을 통해 수백만명의 사용자에게 서비스 제공, 동시에 대량의 데이터 처리및 상태변경 가능 또한, DB 내에 내장형 중복기능이 있어 스토리지 노드 손실 방지 

-Redis

 

Key Value
K1 AAA, BBB, CCC
K2 AAA, BBB
K3  DDD, CCC
K4 AAA, 222, 3333
K5 ZZZZ, 3 , 5555

2. Document DB

- JSON 유사 형식의 문서로 데이터 저장 및 쿼리하도록 설꼐된 비관계형 데이터베이스

- 개발자들이 어플리케이션 코드에서 사용하는것과 동일한 문서 모델 형식을 사용하여 손쉽게 데이터 저장, 쿼리 가능

- 유연한 인덱싱, 강력한 임시 쿼리 , 문서 모음에 대한 분석 지원

 

사용사례

- 콘텐츠 관리 : 어플리케이션이 추적하는 각 엔터티를 단일 문서로 저장 가능 

- 카탈로그 : Doc DB는 효율적 , 효과적으로 저장 가능. 각 상품의 속성을 단일 문서로 기술하여 관리가 쉽고 , 읽기 속도도 빠르다.

- MongoDB, CouchDB

[ 
    { 
        "year" : 2013, 
        "title" : "Turn It Down, Or Else!", 
        "info" : { 
            "directors" : [ "Alice Smith", "Bob Jones"], 
            "release_date" : "2013-01-18T00:00:00Z", 
            "rating" : 6.2, 
            "genres" : ["Comedy", "Drama"], 
            "image_url" : "http://~~~.com", 
            "plot" : "A rock band plays their music at high volumes, annoying the neighbors.", 
            "actors" : ["David Matthewman", "Jonathan G. Neff"] 
        } 
    }, 
    { 
        "year": 2015, 
        "title": "The Big New Movie", 
        "info": { 
            "plot": "Nothing happens at all.", 
            "rating": 0 
        } 
    } 
]

 

3. Graph DB

- 데이터베이스는 노드를 사용하여 데이터 엔터티를 저장하고 엔지로는 엔터티간의 관계를 저장한다.

- 엣지는 항상 시작 노드, 끝노드, 유형과 방향을 가지며 상-하위 관계, 동작, 소유자등을 문서화 한다. 

 

사용사례

- 이상탐지 : 정교한 이상탐지와 예방기능이 있다. 관계를 사용하여 거의 실시간으로 금융이나 구매 트랜잭션 처리 가능

- 추천 엔진: 고객 관심 분야, 친구 , 구매이력과 같은 정보 카테고리들 사이의 그래프 관계 저장

- Neo4j, InfoGrid , Infinite Graph

4. In-Memory DB

- 모든 데이터를 주메모리에 저장하여 Disk에 접근하는 것을 제외해서 즉각적인 반응이 올 수 있는 DB

- micro 초 반응, 많은 트래픽이 요하는 어플리케이션에 적합하다.

 

사용사례

- Real-time Bidding

- 게이밍 리더보즈 : realtime으로 정렬된 데이터를 빠르게 가져 올 수 있다.

- 캐시 : 보통 RAM에 저장해서 빠르게 접근 가능

 

 

5. Search-Engine DB

- 비슷한 주제로 분류한 인덱스를 사용하며, 길고 구조화 되지 않은 데이터를 다루는데 최적화 되어있다. 아주 길거나 복잡한 text를 다루는데 좋다.

 

사용사례

- Text Search : Search-Engine DB를 쓰면 RDB보다 full-text를 찾는게 더 빠르고 관련있는 결과들을 정렬 가능

- 로그와 분석 : 로그를 더 효율적으로 관리 가능, 여러 다른 어플리케이션의 로그들을 중앙에서 관리 가능

-ElasticSearch

 

 

6. Column Family Store

- Key-Value 모델이 발전한 형태이다.

- key는 여러 컬럼을 가리키며, 컬럼은 컬럼 패밀리(슈퍼 컬럼)에 따라 정렬된다.

- 여러 서버의 분산된 수많은 데이터를 저장, 처리하기 위해 만들어졌다.

- Join이 되지 않는다. 신규데이터가 추가 될때, 구조를 변경하지않고 Column Family 테이블에 입력하면 된다. 

- Cassnadra, HBase

테이블명 사원
CF : 공통사항

성명

주민번호

CF:최종학력

학교명

전공

졸업년월일

CF:전화번호

집 전화번호

모바일 전화번호

사무실 전화번호

 


참고사이트

https://aws.amazon.com/ko/nosql/

https://subokim.wordpress.com/2011/05/31/nosql-db-four-type/

https://12bme.tistory.com/323

'DEVELOP > DB' 카테고리의 다른 글

[MariaDB] general log 설정하기  (0) 2020.05.25
DB (mysql) 설정 변경  (0) 2020.03.13
NewSql 이란? All in one DBMS  (0) 2019.12.16
DB(database)의 종류  (0) 2019.12.11
Liquibase 사용법 및 개념  (0) 2019.06.12

이번 시간엔 데이터베이스 종류에 대해 알아보겠다

일반적으론 관계형 데이터베이스(RDB)를 가장 많이 쓰는데 요새는 NoSql이라는 것도 많이 쓰인다.

 

학부 수업시간에는 RDB에 대해서만 배웠었는데

IT 직무에 있으면서 사실 데이터베이스를 모르면 전혀 업무를 할 수 없는 수준이라서 

반드시 알아야 하는 부분이다.

 

나는 RDB에서는 익숙하지만 NoSql에 대해서는 생소한 부분이 있기 때문에 두가지를 

비교해서 이해해보도록 하겠다.

 

 


1. 관계형 데이터베이스 (Relational Database)

- 가장 많이 사용

- 행(Column)과 열(Row)로 표현되는 테이블간의 관계를 나타냄

- 엄격한 스키마 (=structure)

- SQL 질의문을 통해 요청 처리

- Mysql , Oracle, PostgreSql

 

 

2. NoSQL ( Not Only SQL)

- 스키마, 관계없음

- RDB의 확장성 이슈 해결하기 위해 나옴

- MongoDB,hBase

- 보통 key-value 형태

 

가) Document 방식

- Json,XML 과같은 collection 데이터 모델 구조 사용

- MongoDB , CouchDB

 

나) Key-Value 방식

- key-value 의 데이터가 쌍으로 저장

- Redis , Memchached : im-memory DB

 

다) Big Table DB

- key-value 형태에서 발전, column family 데이터 모델 구조사용

- HBase, Cassandra, Hypertable, ScyllaDB

 

 

 

3. 비교

  RDB NoSql
특징

Scale-up

(성능을 높이려면 하드웨어를 고성능으로 교체)

 

중복 불가

Scale-out

(분산컴퓨팅으로 DB성능 높일수 있다)

 

중복 허용

장점

명확하게 정의된 스키마

데이터 무결성 보장

스키마가 없어서 유연, 언제든지 데이터 저장 새 필드 추가 가능

데이터는 어플리케이션이 필요로 하는 형식으로 저장, 따라서 속도가 빠르다.

 

 

단점

유연X, 데이터스키마 항상 사전에 정의 되어야한다.

관계가 있으므로 JOIN문이 많은 복잡한 쿼리

수평적 확장(scale-out)어렵다.

유연성때문에 데이터구조 결정을 하지못한다.

데이터가 여러 컬렉션에 중복되어 있어서 수정을 해야할 경우 모든 컬렌션에서 수정해야한다.

 

 

언제 사용?

관계를 맺고있는 데이터가 수정이 자주 되는 경우 

스키마가 변경 가능성이 적을 때

정확한 데이터 구조를 알 수 없거나, 변경/확장이 될 수 있는 경우

 

Read는 자주하지만 update는 자주 하지 않는 경우

 

막대한 양의 데이터를 다루는 경우(scale-out이 필요한 경우)

 

4. 결론

다양한 경우가 있겠지만,

나라면 RDB와 NoSql을 적당히 섞어서 쓸거 같다.

 

우선 RDB를 사용하되,

특히 고정적인 스키마가 필요한 경우, update가 자주 일어나는 경우에는 RDB를 사용하고

 

빅데이터나, 데이터 구조가 일관적이지 않은 부분은 NoSql을 사용할거 같다

 

그러는 것이 수정할때도, 데이터를 가져올 때의 성능도 좋을 것으로 보인다.

 

 

 


참고 블로그

https://honeyteacs.tistory.com/19

https://siyoon210.tistory.com/130

https://toma0912.tistory.com/83

'DEVELOP > DB' 카테고리의 다른 글

[MariaDB] general log 설정하기  (0) 2020.05.25
DB (mysql) 설정 변경  (0) 2020.03.13
NewSql 이란? All in one DBMS  (0) 2019.12.16
NoSql DB 종류  (0) 2019.12.13
Liquibase 사용법 및 개념  (0) 2019.06.12

개발하다보니 더 추가할사항이 있어서 추가해보겠당~!

 

1. Liquibase 란?

데이터베이스 변경관리를 체계적으로 자동화 해주는 오픈소스 (스키마 버전 관리)

 

개발하다보면 DB가 어쩔수 없이 변경되는 경우가 있을 수 있다. 이경우 갑자기 DB를 변경할 경우

각 개발자 로컬에서 수많은 버그들이 발생할것이다.. 그리고 관리도 어렵고

그래서 관리를 하기위해서 git처럼 형상관리로 하는거다 project 안에 파일이 있으니까 더 수월히 된다 

 

2. 사용법

1. maven 에 liquibase를 pom.xml에 추가해준다.

 

<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
</dependency>

 

2. liquibase.xml 파일을 생성해준다.

부모가 되는 xml 파일이다. 다른 각각 테이블 별로 된 xml 파일을 여기서 include 해준다.

 

<include file="~~~.xml" relativeToChangelogFile="true" />

 

3. 각 테이블마다 xml을 만들어 주면된다. 

 

https://www.liquibase.org/documentation/xml_format.html

 

Liquibase | Database Refactoring | XML Format

XML Format Liquibase supports XML as a format for storing your changelog files. XSD Support XSD schema definitions are available for each Liquibase version. Since there are no changelog format changes in patch versions, there are only xsd files that corres

www.liquibase.org

 

<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.0.xsd http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd"> <preConditions> <runningAs username="liquibase"/> </preConditions> <changeSet id="1" author="nvoxland"> <createTable tableName="person"> <column name="id" type="int" autoIncrement="true"> <constraints primaryKey="true" nullable="false"/> </column> <column name="firstname" type="varchar(50)"/> <column name="lastname" type="varchar(50)"> <constraints nullable="false"/> </column> <column name="state" type="char(2)"/> </createTable> </changeSet> <changeSet id="2" author="nvoxland"> <addColumn tableName="person"> <column name="username" type="varchar(8)"/> </addColumn> </changeSet> <changeSet id="3" author="nvoxland"> <addLookupTable existingTableName="person" existingColumnName="state" newTableName="state" newColumnName="id" newColumnDataType="char(2)"/> </changeSet> </databaseChangeLog>

 

 

 

4. spring에 databaseConfig 파일d에 liquibase관련 내용을 Bean으로 만들어준다.

 

SpringLiquibase liq = new SpringLiquibase();

 

liq에 필요한 내용을 set해준다( datasource등..)

 

 

 

5. 그이후 서버를 기동하면 다음과 같은 테이블이 생성함을 확인 할 수 있다.

databasechangelog

databasechangeloglock

databasechangelog는 한번 돌았던 xml파일을 다시 반영하지 않기 위해 어떤파일을 database에 반영했는지

기록하는 테이블이고

 

 

databasechangeloglock은 기동하면서 xml파일이 반영될때 lock을 잡고 있을때 테이블에 데이터가 들어갔다가

lock이 해제되면 빠진다

 

 

 

 

 

'DEVELOP > DB' 카테고리의 다른 글

[MariaDB] general log 설정하기  (0) 2020.05.25
DB (mysql) 설정 변경  (0) 2020.03.13
NewSql 이란? All in one DBMS  (0) 2019.12.16
NoSql DB 종류  (0) 2019.12.13
DB(database)의 종류  (0) 2019.12.11

+ Recent posts