프로그래밍/database 8

DB동시성 문제와 격리성

일단, DB격리성이란 무엇인지에 대해 알아보자. DB 격리(Isolation)성은 관계형 데이터베이스에서 여러 개의 트랜잭션이 동시에 실행될 때, 각각의 트랜잭션들이 서로에게 영향을 미치지 않도록 데이터 일관성과 동시성을 보장하는 개념이다. 여러 개의 트랜잭션이 동시에 실행될 때 발생할 수 있는 문제점으로는 다음과 같은 것들이 있다. Dirty Read : 한 트랜잭션이 다른 트랜잭션이 수정 중인 데이터를 읽을 수 있는 문제이다. 예를 들어, A트랜잭션이 데이터를 update만 하고 아직 commit하지 않았는데, B트랜직션이 조회했을때 update한 사항이 조회가 되는 상황이다. 이게 왜 문제가 되냐면, A가 어떠한 이유에 의해서 트랜잭션을 rollback했을때 B는 잘못된 값을 알고 있게 되는 꼴이 ..

로컬 커맨드창에서 docker mysql로 바로 접속

도커를 이용해 mysql을 설치하고, 어떻게 접속을 해야 하는지, 특히 /bin/sh, /bin/bash 등의 입출력모드를 거치지 않고, 바로 mysql프로세스로 로그인하는 방법을 살펴보도록 하겠다. 먼저 설치부터 간단하게 해보자. docker 프로그램을 설치 한 이후에, 아래 명령어 한줄만 입력하면, mysql latest 이미지를 pulling해오고 mysql docker 프로세스를 바로 생성하게 된다. 이때 기본 계정은 root이고, password는 컨테이너 생성시 아래와 같이 설정하게 된다. docker run --name -e MYSQL_ROOT_PASSWORD= -d -p 3306:3306 mysql 이렇게 만들어진 mysql서버로 접속하는 방법은 2가지가 있다. 일반적으론 docker ps..

redis expire time(set, hset, zadd) 에 관하여

(cli형식이 아니라, 프로그래밍 코드 형식을 예시로 설명하고자 합니다. 코드는 프레임워크마다 다를 것인데 참고 부탁드립니다.) redis는 인메모리 db로서 빠른성능에 장점이 있는 엔진이기에, 데이터가 과도하게 쌓이면 성능상 효율상 문제가 발생하기 마련이다. 그래서 프로그램에서 아래와 같이 시간을 제한하는 "EXPIRE"의 약자인 "EX"를 사용하는 방식의 set이 흔하다. redis객체.set(key, value, "EX", 초단위시간); 만약 24시간내 까지만 해당 데이터를 사용하고 삭제하고자 한다면, 아래와 같이 해주면 된다. redis객체.set(key, value, "EX", 86400); hset의 경우 이름에서 알 수 있듯 hash를 이용하는 것이고, 메모리 효율과 관리 이점이 있을수 있다..

RDB index 원리

인덱스란 무엇인가? 라고 검색하면, 색인과 목차를 말하고 사전을 말하곤 한다. 그런식의 비유는 좋은 비유이나 직관적으로 와닿지는 않는 것도 사실이다. index는 눈에보이는 테이블이 존재 하지 않다보니, 글로만 공부하게 되면 다소 머릿속에 그 형태가 그려지지 않는다. 아래와 같은 mysql서버에 구성된 회원정보 테이블이 있다고 하자. id(pk) name email(unique) password 1 kim test@naver.com abc1234 2 kim test2@naver.com abc1234 ... ... ... ... 1000 park test1000@naver.com abc1234 위 테이블 컬럼의 구분자로서 id를 primary key를 지정하였고, email 주소는 중복될수는 없기에 uni..

MYSQL SHOW INDEX

index 정보를 확인하기 위해 "show index from 테이블명;"을 하는 경우가 있다. 조회되는 주요 값들 중 어려울 수 있을만한 값들에 대해 정리하고자 한다. (너무 쉬운 내용은 뺐습니다.) 공식문서를 기반으로 내용을 추가하여 정리하였습니다. 출처)https://dev.mysql.com/doc/refman/8.0/en/show-index.html Non_unique : 0인경우 unique, 1인 경우 non-unique Key_name : pk값의 인덱스명은 언제나 PRIMARY. 명령문을 통해 만들때는 지정한 index명. orm을 통해 생성할땐 프로그램에서 만들어준 인덱스명(난수값). Seq_in_index : 멀티컬럼인덱스일경우 순서, 1부터 시작합니다. 단일컬럼 인덱스일경우 1 Col..

GROUP BY 2개 이상

위와 같이 생긴 상품 구매 table이 있다고 하자. 동일한 상품을 2번이상 재구매한 고객을 따로 추출하고자 한다. 즉, 어떤 고객이 어떤 상품을 재구매했는지 파악하고자 한다. 위의 테이블을 보면 id 1번 고객은 상품3을 2번 재구매 하였다. 2번 고객은 2번이상 재구매한 상품은 없다. 3번 고객은 상품1을 2번 재구매 하였으므로 최종적으로 아래표와 같은 형태의 데이터가 추출 되어야 한다. USER_ID PRODUCT_ID 1 3 3 1 이때 user_id로만 group by하여 count(*)>=2 하게 되면, 1,2,3고객 모두가 조회가 될 것이고, product_id로만 group by하여 count(*)>=2 하게 되더라도, 원하는 값을 얻지 못할것이다. 그래서 2번 이상 구매한 user중에 같..

AWS RDS DB 마이그레이션(mysql, posgres dump)

mysql과 postgres를 사용하면서 어떻게 db를 마이그레이션 하는지, 그 중에 dump방식을 어떻게 사용하는지 살펴 보고자 한다. 이번 경우엔AWS RDS -> AWS RDS 또는 로컬DB -> AWS RDS 의 상황에 따른 dump 기능을 사용하는 방법을 예시를 들고자 한다. 신규DB를 구축하고, 기존 DB에서 dump를 통해 신규 DB를 구축하는 상황이라고 생각하면 될 듯하다. 0.먼저, 신규 DB를 구축하기 위해 AWS콘솔을 통해 RDS 데이터베이스 생성하고 스키마를 생성한다.(여기서 말하는 데이터베이스는 DB서버 그 자체를 지칭하고, 스키마는 DB서버 내에 database라고 생각하면 된다.) 아래의 덤프작업은 rds가 설치된 서버에서 직접 작업하는 것이 아닌, rds로 접근 가능한 ec2..

mysql csv file export

dbeaver, 워크벤치, DataGrip 등 대부분의 tool들에는 export가 있어 편하게 csv파일로 데이터를 export할 수 있다. 그러나, idc 환경이라든가, tool사용이 어려운 상황에 명령어로 export를 해야 하는 경우가 있다. 그 경우엔 select하여 조회된 데이터들을 직접 export해주어야 한다. 그 절차와 시행착오에 관해 정리해 보았다. 0.mysql 접속 - 파일 import/export 경로 확인 명령어 : SHOW VARIABLES LIKE “secure_file_priv”; 1.만일 경로가 잡혀 있는 경우 - 테스트 : SELECT * FROM 테이블명 INTO OUTFILE ‘위의 export 경로/test.csv’; - 정상적으로 csv파일이 생성돼 있는 것을 확..