728x90

Backend/Database 12

Kubernetes 클러스터에 MongoDB 구성하기

kubernetes 에 MongoDB 를 replica set 으로 구성해서 사용해본다. MongoExpress 도 함께 설치할 예정인데 MongoExpress는 MongoDB 관리를 위한 GUI 웹어드민 툴이다. 우선 replica set 구성을 위해서는 각 노드가 통신할 수 있는 인증 key 가 필요하고 kubernetes 환경에서는 특정 key 파일을 secret 로 만들어서 각 노드에서 활용한다. 즉, 아래와 같다. openssl rand -base64 741 > ./replica-sets-key.txt kubectl create secret generic shared-bootstrap-data --from-file=internal-auth-mongodb-keyfile=./replica-sets-..

Backend/Database 2022.08.31

mysql delete 데이터 공간 반납

mysql은 데이터를 delete 하더라도 사용 했던 공간은 바로 반납하지 않는다. 이에 대량 delete 의 경우 truncate 또는 사전에 파티셔닝을 해놔서 파티션을 삭제하는 방법을 선택한다. 그럼 delete 삭제된 데이터 공간은 영원히 반납하지 않느냐? 그건 또 아니다. 이후 DDL 이 수행될때 지워진 공간이 반납된다. truncate 나 파티션 삭제는 모두 DDL 이기 때문에 곧바로 공간이 반납될 뿐이다. 이를 이용하면 delete 를 수행하고 임의로 DDL를 수행하는 것도 하나의 방법이 될 수 있다.

Backend/Database 2022.04.27

[Mysql] InnoDB lock, Dead lock

Mysql 엔진 중 가장 범용적으로 사용되는 InnoDB 에서 활용되는 lock 에 대해 알아보자. lock(잠금)는 왜 필요한 이유는 데이터의 정합성 유지와 프로세스의 동시성을 처리하기 위해 반드시 필요하다. 예를 들어 여러 트랜잭션에서 특정 테이블에 insert를 시도 한다고 할 때 primary key 또는 unique key는 중복으로 등록되면 안 될 것이다.이를 위해 어찌되었건 처리는 한번에 하나씩 진행되어야 하고 이 과정에서 먼저 들어온 요청을 처리하는 동안 다음 요청의 접근은 제한하는 lock의 개념이 필요해 진다. 그 외에도 많이 사용되는 예로는 은행 입출금 프로세스가 있겠다. 이는 UPDATE 와 관련된 것인데 금액을 출금하는 프로세스를 UPDATE 로 구현했다고 가정해보자. 여러 트랜잭..

Backend/Database 2022.03.10

[Mysql] 커넥션 정보

Mysql 서버에서는 Sql 을 처리하기 위해 연결가능한 커넥션 수를 미리 설정해 놓고 사용한다. 그 이상의 연결이 요청될 경우 Too Many Connection Error 가 발생한다. 이를 미리 예방하고 적절한 수치를 찾기 위해 Mysql 에서 제공하는 여러 데이터가 있지만 여기에서는 간단하게 설정된 최대 커넥션 수와 현재 접속된 커넥션 수 정도를 체크할 수 있는 방법만 기록한다.(사실 상세하게 정리된 포스팅이 너무 많은데 대부분 복붙같고.. 뜻이 애매한게 많아 잘 모르겠다...) 아래 질의를 통해 현재 Mysql 에 셋팅된 최대 연결 가능한 커넥션 수를 확인할 수 있다. show variables where variable_name in ( 'max_connections'); 아래 질의를 통해 현..

Backend/Database 2022.02.17

Mysql 이모지 저장하기

이모지 같은 문자들은 글자당 최대 4바이트의 사이즈가 필요한데 Mysql 의 utf8 문자셋의 경우 글자당 최대 3바이트까지만 지원한다. 이에 일부 ❤️ 같은 일부 이모지는 저장 가능하지만 🧜 같은 이모지는 아래와 같은 오류와 함께 저장이 되지 않는다. SQL Error: 1366, SQLState: HY000 Incorrect string value: '\xF0\x9F\xA7\x9C' for column ... 모든 이모지를 사용하려면 문자셋을 utf8mb4 로 변경해줄 필요가 있다. 참고로 utf8는 utf8mb4의 서브셋이기때문에 인코딩 타입이 utf8 -> utf8mb4 변경 되더라도 기존에 저장된 문자열이 깨지지는 않는다. 다만 문자 하나당 최대 바이트 수가 바뀌면서 문자열 칼럼에 인덱스가 걸려..

Backend/Database 2022.02.07

인덱스 스캔과 묵시적 형변환

oracle, mysql 모두 동일하니 여기에서는 mysql 을 기준으로 작성한다. 아래와 같은 테이블 있다고 가정해보자. CREATE TABLE TEST ( SEQ bigint(11) NOT NULL AUTO_INCREMENT, ID_INT int(10), ID_VARCHAR varchar(10), PRIMARY KEY (SEQ), KEY IDX_ID_INT (ID_INT), KEY IDX_ID_VARCHAR (ID_VARCHAR) ) 일반적으로 알고 있던 지식은 칼럼을 조건으로 조회할 때 해당 칼럼에 타입과 일치하는 값으로 조회을 해야 하고 그렇지 않으면 타입이 달라 인덱스 스캔이 되지 않는다는 것이었다. 맞는 말이긴 하지만 꼭 우리가 명시적으로 그렇게 해줄 필요는 없다. 만약 ID_INT 를 조건으..

Backend/Database 2021.10.20

스키마와 유저. 그리고 데이터베이스

DBMS 를 다루다보면 스키마, 유저, 데이터베이스라는 명칭을 많이 들어봤을 것이다. 대부분 어떻게 표현해도 대충 알아듣고 커뮤니케이션에 큰 문제는 없지만 문서상나 글로 소통을 할 경우 명확한 표현이 필요한 경우가 있다. 그런데 이에 대한 명확한 의미를 알고 쓰는 개발자는 많지 않다. 딱히 중요하게 생각하지 않기도 하고 어떤 이는 스키마==유저라고 하는 사람도 있고 어떤 이는 전혀 다르다고 하는 사람도 있다. 그 이유는 가장 보편적으로 사용되는 Oracle과 Mysql 에서 그 의미가 다르게 사용되기 때문인데 정리하면 아래와 같다. Oracle 오라클에서 스키마는 사용자(USER)가 생성한 모든 오브젝트(테이블, 인덱스, 프로시저 등)를 의미한다. 사용자와 스키마는 전혀 다른 개념으로 스키마에 각각의 사..

Backend/Database 2021.08.19
728x90