Server/DB 24

MySQL) Window 로컬 환경에서 Master-Slave 테스트

권한사용자Master쓰기/읽기기본 사용자복제용 사용자Slave읽기기본 사용자 Master는 3306 포트로 실행한다.Slave는 3307 포트로 실행한다. Master에서 쓰기(insert)가 발생하면, 바이너리 로그를 저장한다.Master의 로그를 Slave의 DB에 복제한다.1. 마스터 DB 설치MySQL이 기본적으로 설치되어있다고 가정한다.이미 설치된 MySQL은 Master가 될 것이다. 2. 슬레이브 DB 설치윈도우 환경에서 인스톨러를 다시 실행하면 추가로 설치되지 않는다.Archive에서 .zip파일을 다운 받아 특정 경로에 압축을 해제한다.윈도우 권한 문제로, 마스터가 설치된 곳 이외에 폴더를 위치시킨다. 3. 환경설정 파일 생성 또는 수정# 슬레이브의 my.ini[mysqld]port=33..

Server/DB 2025.06.12

DB) LIMIT 1 & index

sql에서 limit1을 사용함에 있어 오해가 있었다.데이터를 select할 때 limit1을 작성하면, 전체 데이터를 긁어온 후 1개를 반환하는 것으로 알고있었다.실제 1억개가 넘는 데이터에서 경험했기 때문이다. 그런데 아래 영상을 보던 중, 쿼리 성능에 대한 이야기를 해주시는데 limit1을 사용해보라는 이야기가 있었다.그래서 당연히 내가 잘못된 경험을 했고 잘못 알고있을 거라 확신한 후 다시 찾아보게 되었다. 결론은 조건절에 들어가는 컬럼이 인덱싱이 잡혀있다면 limit 만큼 조회하고 쿼리는 종료된다.내 과거 경험에서는 인덱스를 설정하지 않았기 때문에 모두 검색 후, limiit에 해당하는 결과를 출력하느라 속도가 느렸던 것이다. 인덱스 설정 O인덱스 설정 X만족하는 조건 검색 하자마자 종료전체 스..

Server/DB 2025.04.23

Mysql) insert statement deadlock

nodejs에서 insert구문을 수행하던 도중 데드락을 처음 접해봤다. Error: Deadlock found when trying to get lock; try restarting transaction code: 'ER_LOCK_DEADLOCK', errno: 1213, sqlState: '40001', sqlMessage: 'Deadlock found when trying to get lock; try restarting transaction', ... 벌크잡이 수행 되는 동안 (작업이 완료되지 않은 진행 중인 상황) 다른 insert 구문이 들어왔을 때 발생한 에러였다. write쿼리가 종료되지 않았는데 트랜잭션이 들어왔을 경우 발생. 해당 인서트 구문이 종료된 후 트랜잭션을 받을 수 있게 처리했다.

Server/DB 2023.06.30

MySQL) AES 128 <-> 256

현재 적용중인 모드를 확인한다. 디폴트는 aes-128-ecb이다. SELECT @@session.block_encryption_mode; 아래 명령어로 모드를 변경할 수 있다. SET block_encryption_mode = 'aes-128-ecb'; SET block_encryption_mode = 'aes-256-ecb'; 변경 후 실행결과를 살펴보자. SELECT AES_ENCRYPT('hi', SHA2(CONCAT('key1','key2'), 256)), TO_BASE64(AES_ENCRYPT('hi', SHA2(CONCAT('key1','key2'), 256))) ; 참고) https://dev.mysql.com/doc/refman/5.7/en/encryption-functions.html#..

Server/DB 2023.01.30

MySQL) AES128 사용하기

양방향 대칭키 암호화 알고리즘 AES를 MySQL에서 사용해보았다. 테이블 데이터를 Blob으로 지정할 경우에는 hex로 변환이 필요 없다. String 타입의 테이블을 사용하려면 아래와 같은 방법을 사용한다. INSERT INTO Aes256 (data) VALUES (HEX(AES_ENCRYPT('test', 'SecretKey'))); SELECT *, AES_DECRYPT(UNHEX(data), 'SecretKey') FROM Aes256; 1,2,3번이 헥스로 변환한 데이터. 4,5번이 Blob타입 그대로의 암호화된 암호문이다. 복호화 키가 맞지 않으면 복호화 값은 NULL을 리턴한다. 조금 더 복잡한 암호화를 위해 다음과 같은 방법을 고안했다. - 암호키 2개 - SHA256 - BASE64 ..

Server/DB 2023.01.27

MySQL) Union으로 full outer join에서 rownum으로 페이지네이션 구현하기.

OFFSET, CURSOR 이외에 페이지네이션을 구현해야했다. mssql을 사용했을 때, rownum을 사용하기 위해선 가상테이블을 뷰로 만들어야 했었던걸로 기억한다. rownum 자체를 where절에서 사용이 불가하기 때문이었다. 이번에 MySQL에서 다른 테이블을 UNION ALL로 full outer join을 걸고 sort, pagination을 구축해야 했기에 rownum을 활용하기로 했다. SELECT @rownum:=@rownum+1, TT.* FROM (SELECT 'post' AS type, P.createdAt, P.deletedAt FROM Post AS P WHERE P.userId = 1 UNION ALL SELECT 'comment' AS type, C.createdAt, C.d..

Server/DB 2022.12.21

Mysql) USE INDEX로 인덱싱하여 조회하기

대용량 데이터를 처리하는 경우, 행이 많다면 쿼리타임이 늘어난다. 이를 해결하기 위해 테이블 구성시 인덱스를 만들 수 있다. 하지만 컬럼명 이외 다양한 인덱스를 활용할 수 있기 때문에 조회문에서 인덱싱을 사용하기도 한다. 서브쿼리를 사용하면 FROM절 이전에 실행된다. 다시 말하면, 서브쿼리에서 대용량 데이터 스키마를 검색한다면 해당 쿼리 전체를 읽기 전에 타임아웃이 발생할 수 있다. 서브쿼리에서 인덱싱을 사용한다면 이를 해소할 수 있다. 해당 테이블의 조건식에 따른 최대 출력 행 수를 확인한다. Mysql에서 EXPLAIN 구문을 사용하면 해당 SELECT문의 row를 확인할 수 있다. EXPLAIN SELECT * FROM Users; I_AGE라는 인덱스를 구성했고 해당 쿼리문에서 이를 활용했다. ..

Server/DB 2022.11.14