MMM(Multi-Master Replication Manager)

목표 MMM이 무엇인지 이해한다. MMM의 동작 과정을 이해한다. MMM MMM은 MySQL에서 failover 및 모니터링을 수행해주는 스크립트다. MMM 구조 monitor-agent 통신 방식 monitor: MMM 내에 있는 DB 노드들을 모니터링하고 관리한다. agent: MMM 내의 DB 노드들에 설치해서 monitor에 의해 관리된다. agent는 monitor에 의해 읽기, 쓰기 모드가 관리된다. 기본 구성 2개의 마스터가 존재한다. active master: read, write 가능 standby master: read만 가능 active master와 standby master가 양방향 복제된다. slave 추가 구조 active master로부터 단방향 복제된다....

2025-05-12 · 2 min · 231 words

현재 시각 가져오기

CURRENT_TIMESTAMP 를 호출하면된다. SELECT CURRENT_TIMESTAMP AS current_date_time; ----------------------- 2019-02-23 20:02:21.550 (1 row affected) 참고 자료 https://www.sqlservertutorial.net/sql-server-date-functions/sql-server-current_time-function/

2024-09-15 · 1 min · 16 words

하나의 쿼리에 여러 record 업데이트

목표 쿼리 하나로 여러 record의 값을 서로 다르게 업데이트 한다.(INSERT 문처럼) 방법 SQL에서 따로 제공하는 문법은 없다. CASE 문을 통해 구현해야 된다. UPDATE BANDS SET PERFORMING_COST = CASE BAND_NAME WHEN 'METALLICA' THEN 90000 WHEN 'BTS' THEN 200000 ELSE PERFORMING_COST END WHERE BAND_NAME IN('METALLICA', 'BTS'); 참고 자료 https://www.geeksforgeeks.org/how-to-update-multiple-records-using-one-query-in-sql-server/

2024-09-15 · 1 min · 47 words

특정 컬럼에 null이 아닌 row의 개수 구하기

sum(case when [session.id](http://session.id/) is null then 0 else 1 end) case 키워드를 이용하면 된다. 참고 자료 https://www.sqlshack.com/working-with-sql-null-values/

2024-09-15 · 1 min · 17 words

컬럼명 수정 SQL

ALTER TABLE user CHANGE name nickname VARCHAR(30) NULL; 바꿀 컬럼명 뒤에 타입도 함께 명시하지 않으면 에러가 난다는 점을 유의해야된다.

2024-09-15 · 1 min · 19 words

인덱스 생성, 삭제, 조회 SQL 문

// 생성 ALTER TABLE 테이블명 ADD INDEX 인덱스명(컬럼명1, 컬럼명2, ...) // 삭제 ALTER TABLE 테이블명 DROP INDEX 인덱스명 // 조회 SHOW INDEX FROM 테이블명;

2024-09-15 · 1 min · 24 words

운영에서 Foreign Key를 사용하지 않는 이유

배경 ERD diagram을 최신화 하는 도중 실제 운영 DB에서는 FK가 따로 설정되어 있지 않아서 테이블 간의 관계를 파악하는 것에 어려움이 있었다. 일반적으로 한국 회사에서 이 방법을 많이 사용하는 것으로 보인다. 설명 성능에 영향을 미친다. FK의 정합성을 체크하는 과정에서 부하가 발생한다. 데이터를 처리하는 순서를 신경쓸 필요가 없다. 부모 테이블에 작업할 때 자식 테이블의 간섭을 피할 수 있다. 데이터베이스 대신 애플리케이션에서 체크를 한다. 이를 통해 유동적으로 검증 과정을 수정할 수 있다. 데이터베이스 샤딩을 할 때 FK가 방해된다....

2024-09-15 · 1 min · 86 words

외부 접속 허가 설정

/etc/mysql/mysql.conf.d/mysqld.cnf 에서 bind-address를 0.0.0.0로 수정해야된다. localhost 뿐만 아니라 모든 ip의 접속을 다 허가한다는 의미다. 참고 자료 https://github.com/Hyeon9mak/WIL/blob/main/reverse-proxy-was-mysql.md

2024-09-15 · 1 min · 17 words

비즈니스 로직을 DB가 아닌 앱에 넣어야 하는 이유

배경 비즈니스 로직을 DB가 아닌 앱에서 처리해야 되는 주 이유는 애플리케이션 리소스가 더 확장하기 쉽기 때문이다. 하지만 DB에서 반환되는 결과의 양을 통제하려면 DB에 일부 로직을 넣을 수 밖에 없다. DB에서 처리할 로직과 앱에서 처리할 로직의 기준을 정해본다. 방법 추출과 필터링 분리하기 데이터 필터링에 필요한 일부 필드만 가져오고, 앱에서 필터링 로직을 수행한다. 필터링이 완료되면, 필터링이 완료된 ID 목록으로 후속 쿼리를 수행한다. select id,field1,field2 from my_table select * from my_table where id in (3,5,123,392,....

2024-09-15 · 1 min · 98 words

범위 탐색 시 인덱스 설계

목표 WHERE 절에서 범위 탐색 시에 인덱스 설계하는 방법을 이해한다. 상황 SELECT first_name, last_name, date_of_birth FROM employees WHERE date_of_birth >= '1971-01-01' AND date_of_birth <= '1971-01-09' AND subsidiary_id = 27 위와 같은 상황에 date_of_birth와 subsidiary_id 의 인덱스 컬럼 순서를 어떻게 해야될지 알아보자. date_of_birth, subsidiary_id 순으로 인덱스 설계할 경우 date_of_birth 기준으로 먼저 정렬되어 있다. 중간 노드만으로는 어느 리프 노드가 subsidiary_id가 27인 경우를 가지고 있는지 알 수 없다. 쿼리에 date_of_birth의 범위 조건이 있으므로, 이를 기준으로 먼저 범위 탐색을 하게 된다....

2024-09-15 · 1 min · 167 words

무중단으로 DB 스키마 수정하기

배경 운영중인 DB에 여러 애플리케이션이 사용하고 있으면 컬럼 수정/삭제가 제한이 된다. Online Schema Change 정의 이름 그대로 운영중인 상태에서 스키마를 변경하는 기법을 말한다. 동작 과정 대상 테이블을 복제한다. 복제된 테이블에 스키마를 수정한다. binary log stream이나 trigger 등을 사용해서 복제된 테이블에 변경사항을 반영한다. 수정된 코드를 배포한다. 대상 테이블과 복제된 테이블을 swap한다. 주요 툴 Meta: https://github.com/facebookincubator/OnlineSchemaChange gh-ost: https://github.com/github/gh-ost 참고 자료 https://jojoldu.tistory.com/358 https://blog.myungseokang.dev/posts/online-schema-change/

2024-09-15 · 1 min · 60 words

모든 ip에서 사용가능한 계정 만들기

create user [username]@'%' identified by '[password]';

2024-09-15 · 1 min · 6 words

리플리케이션(Replication)

사용자가 많은 Database는 많은 쿼리를 모두 처리하기 힘들어, CUD를 위한 데이터베이스(master)와 read를 위한 database를(slave) 따로 나눈다. 참고 자료 https://kwonnam.pe.kr/wiki/springframework/transaction https://nesoy.github.io/articles/2018-02/Database-Replication

2024-09-15 · 1 min · 20 words

데이터베이스 생성시 UTF-8 설정

CREATE DATABASE db_name DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

2024-09-15 · 1 min · 9 words

그룹 별 상위 n개 가져오기

배경 어떤 테이블에 대해서 컬럼 A 기준으로 group을 만들고 그룹 내에서 컬럼 B 기준으로 상위 n개를 가져와야 되는 목적이 생겼다. 해결 방법 예시를 들어 설명을 한다. 아래와 같이 테이블과 행이 존재한다. create table player ( user_id bigint auto_increment primary key, team_id bigint not null, score bigint not null ); 다음과 같이 데이터가 존재하고, team_id 별로 상위 2등까지 플레이어를 확인하고 싶다면 아래와 같이 작성하면된다. SELECT * FROM( SELECT *, RANK() OVER (PARTITION BY player....

2024-09-15 · 1 min · 129 words

Workbench에서 ERD Diagram 만들기

기존에 존재하던 데이터베이스의 ERD Diagram 자동 생성하기 설명 Workbench의 Reverse Engineer 기능을 이용하면 된다. Database => Reverse Enginner 예시 만들어진 ERD Diagram을 최신화 하기 설명 Database => Synchronize model 예시 alter table `test`.`member` add column `phone_number` varchar(20); 참고 자료 https://medium.com/@tushar0618/how-to-create-er-diagram-of-a-database-in-mysql-workbench-209fbf63fd03 https://dba.stackexchange.com/questions/25900/mysql-workbench-how-to-refresh-eer-diagram

2024-09-15 · 1 min · 41 words

TIMESTAMP vs DATETIME

목표 TIMESTAMP와 DATETIME의 차이점을 이해한다. 크기 5.6.4 버전 이후 기준 TIMESTAMP는 기본적으로 4 bytes에 소수점 표현을 위해 0~3 bytes를 추가로 사용한다. DATETIME은 기본적으로 5 bytes에 소수점 표현을 위해 0~3 bytes를 추가로 사용한다. 표현 범위 TIMESTAMP: 1970-01-01 00:00:00 ~ 2038-01-19 03:14:17 DATETIME: 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 따라서, 2038년이 넘는 날짜가 필요하면 TIMESTAMP를 사용할 수 없다. Timezone DATETIME은 timezone에 대해서 아무것도 처리되지 않는다. TIMESTAMP는 timezone에 대한 처리가 이루어진다. 저장 시 TIMESTAMP 값을 현재 timezone 에서 UTC로 변환 조회 시 UTC에서 현재 timezone으로 변환 예시 CREATE TABLE timezone_test ( `timestamp` TIMESTAMP, `datetime` DATETIME ); SET SESSION time_zone = '+00:00'; INSERT INTO timezone_test VALUES ('2029-02-14 08:47', '2029-02-14 08:47'); SELECT * FROM timezone_test; -- | timestamp | datetime | -- |---------------------|---------------------| -- | 2029-02-14 08:47:00 | 2029-02-14 08:47:00 | SET SESSION time_zone = '-05:00'; SELECT * FROM timezone_test; -- | timestamp | datetime | -- |---------------------|---------------------| -- | 2029-02-14 03:47:00 | 2029-02-14 08:47:00 | 참고 자료 https://planetscale....

2024-09-15 · 1 min · 155 words

TIMESTAMP ms 단위까지 저장하기

TIMESTAMP(3) 이라고 타입을 지정하면 ms단위까지 저장한다. 참고 자료 https://mariadb.com/kb/en/timestamp/ https://stackoverflow.com/questions/26299149/timestamp-with-a-millisecond-precision-how-to-save-them-in-mysql/26299379

2024-09-15 · 1 min · 10 words

SQL에서 JOIN ~ ON과 WHERE 의 실행 순서

SQL문을 실행하면 일반적으로 아래와 같은 순서로 진행된다고 일고 있을 것이다. 1. FROM 2. ON 3. JOIN 4. WHERE 5. GROUP BY 6. WITH CUBE or WITH ROLLUP 7. HAVING 8. SELECT 9. DISTINCT 10. ORDER BY 11. TOP 하지만 이것은 논리적 처리 순서이다. SQL 문을 실행시키면 쿼리 옵티마이저가 인덱스를 사용할 수 있도록 JOIN과 WHERE의 순서를 바꿔서 처리한다. 실제 처리 순서와 논리적 순서가 다르다는 것을 이해할 필요가 있다. SELECT programmer.exercise, count(1) as count FROM hospital INNER JOIN covid ON covid....

2024-09-15 · 1 min · 128 words

SQL 튜닝 전에 알아야 될 용어

MySQL 구조 MySQL의 SQL 튜닝을 하기 전에 MySQL가 어떤 구조로 동작하는지 알 필요가 있다. MySQL Connectors를 통해 SQL문을 보내게되면 간략히 아래와 같은 과정을 거친다. Parser를 통해 MySQL 엔진에서 문법 에러가 있는지, DB에 존재하는 테이블을 대상으로 SQL문을 작성했는지 검사한다. Optimizer를 통해 요청한 데이터를 빠르고 효율적으로 찾아가는 전략적 계획을 만든다. 계획을 토대로 스토리지 엔진에 위치한 데이터를 찾는다. 찾은 데이터에서 불필요한 부분을 필터링하고 필요한 연산을 수행한 뒤에 사용자에게 반환한다. 스토리지 엔진 InnoDB, MyISAM, Memory 등과 같은 스토리지 엔진은 사용자가 요청한 SQL 문을 토대로 DB에 저장된 디스크나 메모리에서 필요한 데이터를 가져오는 역할을 한다....

2024-09-15 · 6 min · 1082 words