데이터베이스(14)
-
[MySQL 운영 및 !자동화!] Undo 로그 길이 모니터링 및 장기 실행 트랜잭션의 쿼리 조회하기
MySQL을 운영하다보면 종종 Rollback History List Length 메트릭에 걸려있는 알람이 울립니다. 트랜잭션이 너무 오래 열려있어서 Length가 길어지는 현상인데요, MySQL에서는 MVCC 를 통해 잠금없는 SELECT를 구현합니다. MVCC 매커니즘은 Undo Log(=Rollback Segment)를 통해 구현되기 때문에 Undo Log를 임계치 이하로 관리하는 것이 매우 중요합니다. 임계치를 벗어나게 되면 read 레이턴시가 전반적으로 매우 하락해서 유저 경험 또한 매우 하락하게 되겠죠 -_-; 제가 경험했던 Undo Log가 길어지는 이유는 크게 세 가지 였습니다. 서비스 Batch가 장시간 실행되는 경우 개발자가 개인 컴퓨터 환경에서 수동으로 트랜잭션을 열고 난 후에, 커밋..
2023.08.31 -
MySQL 소스코드 분석 입문해보기. DROP TABLE 내부 동작 코드
MySQL은 오픈소스 서비스입니다. 그래서 공식 홈페이지에 가면 쉽게 소스를 다운받을 수 있습니다. 다운받는 과정까지가 가장 쉽습니다 다운 받고 압축을 풀면, vscode로 열어서 코드를 확인할 수 있습니다. '소스 설치' 를 할 것이 아니라면 어느 OS 에서든지 그냥 아무거나 받아서 봐도 됩니다. 소스를 다운받는 것에 큰 의미는 없고, 유능한 DBA가 되려면 언젠가 소스를 까볼 일이 생길 것만 같았습니다. 그래서 오늘은! 칼을 뽑은 김에 테이블을 삭제하는 프로세스가 내부적으로 어떻게 일어나는지 살펴보겠습니다. 참고로 이 글은 C/C++을 학부시절에만 만져봐서 뭐가 어떻게 흘러가는지 모를 사람에 의해 쓰여지고 있습니다. 가장 아래에 첨부된 소스코드 가이드가 있긴 한데, 워낙 프로젝트가 방대해서 도움이 잘..
2023.08.28 -
MySQL 8.1 간단하게 살펴보기
https://www.percona.com/blog/a-quick-peek-at-mysql-8-0-34-and-mysql-8-1-0/ A Quick Peek at MySQL 8.0.34 and MySQL 8.1.0 Taking a look at what Oracle delivered with MySQL 8.0.34 and 8.1.0 on July 17th, 2023. www.percona.com 드디어 8.1이 나왔습니다. 공식문서 보다가 버전 선택란에 8.1이 있길래 깜짝 놀람 -_-; 아직 엄청나게 큰 변화는 없는 것 같습니다. 8.0의 지원이 벌써 2년 반 밖에 남지 않은 시점에서, 슬슬 8.1의 추이도 잘 지켜봐야 할 것 같습니다. 아래는 단순 번역본입니다. 이것은 Oracle이 2023년 7월 ..
2023.08.02 -
MySQL DBA DDL 실무 장애 경험 - (NULL -> NOT NULL)
https://dev.mysql.com/doc/refman/5.7/en/innodb-online-ddl-operations.html MySQL :: MySQL 5.7 Reference Manual :: 14.13.1 Online DDL Operations 14.13.1 Online DDL Operations Online support details, syntax examples, and usage notes for DDL operations are provided under the following topics in this section. The following table provides an overview of online DDL support for index operations. An aste..
2023.08.02 -
MySQL에서 DDL과 Metadata Lock, 장애와 자동화
실무에서 MySQL이 제공해주는 동시 요청 제어 컨트롤을 제대로 이해하지 못하고 유지보수 및 개발자분들의 요청을 처리하다가 장애를 맞은 경험이 있습니다. 다행히도, 서비스 구조상 DB 서버가 MSA로 잘게 나뉘어있어서 상품 목록을 불러오는 기능만 1분 정도 막히는 해프닝으로 넘어갔지만... 아직도 아찔한 경험입니다. 결론부터 말씀드리자면, 이 모든게 !메타데이터 락!에 대한 무지에서 시작되었습니다. 먼저 메타데이터 락과 간단한 예제를 살펴보고 이를 해결하는 방법을 소개드리고 Java + SpringBoot 코드로 이 과정을 자동화 하는 예제도 살펴봅시다 Metadata Lock 메타데이터 락은 MySQL 5.5 버전부터 생긴 개념입니다. MySQL 서버는 메타데이터 락을 통해서 데이터베이스 개체(프로시..
2023.06.21 -
MySQL VARCHAR과 TEXT의 차이점과 적용시기
각 타입의 특징 VARCHAR 컬럼에 가변길이 문자열 타입을 지정 1부터 65535의 값을 가질 수 있음 (바이트가 아닌 글자 수) 길이를 표현하기 위한 공간복잡도 오버헤드가 있음 255까지의 길이는 1byte, 256부터는 2byte 오버헤드 존재 CHAR의 경우는 고정길이 문자열 타입이지만 공간복잡도 오버헤드가 없음 인덱스를 생성할 수 있음 TEXT VARCHAR와 동일하게 컬럼에 가변길이 문자열 타입을 지정 최대 65535글자의 글자를 적재할 수 있지만 크기를 미리 지정 불가 길이를 표현하기 위해 무조건 2byte의 공간복잡도 존재 인덱스를 제한적으로 생성 가능함. 부분 prefix 인덱스만 가능 의문: VARCHAR로도 65535의 길이를 모두 표현 가능한데 TEXT를 사용해야 하는 이유가 뭘까?..
2023.02.01 -
[MySQL8.0] row constructor 여러 레코드를 서로 다른 값으로 업데이트하는 방법
개인 게시판 프로젝트를 진행하고 있습니다. 구현한 기술 요구사항 중, 각 게시글의 조회수를 요청마다 한 건씩 바로 업데이트 하는 것이 아니라 어딘가에 모아뒀다가 한번에 Update쿼리를 쏟아내는 방식으로 벌크 업데이트 처리를 한 구현이 있습니다. 이 상황에서, Update 쿼리를 한 트랜잭션에서 모아서 쏴주기는 하지만 단일 트랜잭션에 Update쿼리가 너무 많습니다. 그래서 인프런 JPA의 어머니에게 질문을 남겼던 기억이 있습니다. 아래 이미지는 당시에 답변받은 내용입니다. 아.. 그렇구나.. 김영한님이 안된다면 안되는거구나 하고 그냥 넘겼었습니다. For문 돌리면서 그냥 하나하나 update를 수행했습죠. 그런데 오늘 책을 읽다가 엄청난 것을 발견했습니다. MySQL8.0 버전부터는 레코드 생성 문법으..
2022.12.23 -
SQL 성능튜닝 가즈아
11번가 코딩테스트에서 매우 어려운 SQL문제가 나왔습니다. 프로그래머스에서 SQL 고득점 kit를 푼 정도로는 해결할 수 없는 레벨이었습니다. 마감 1분을 남겨두고 제출하긴 했지만, 여전히 제 실력이 부족하다는 것을 느끼게 되는 계기였습니다. 백엔드 개발자는 SQL을 자유자재로 구사해야 합니다. 업무와 밀접하기도 하고, 어떻게 작성하고 튜닝하느냐에 따라 성능이 수백배 차이나기도 합니다. WAS 장애 포인트의 90퍼센트 이상이 DB 성능문제라고 하니, 실행계획을 보고 SQL과 인덱스를 개선하는 능력은 필수입니다. 실무에서 장애를 몸으로 겪으며 성장하는 것이 가장 빠르겠지만, 그럴 수 없으니.... 책으로 미리 경험하고 실무에 투입하면 좋을 것이라고 생각해서 책을 읽기 시작했습니다. RealMySQL을 읽..
2022.10.24 -
InnoDB의 레코드락에 대한 궁금점
최근 운영체제를 복습하며 reader-writer problem 에 대한 토픽을 알게 되었다. MySQL8의 기본 스토리지 엔진 InnoDB는 DDL이 아닌 이상 테이블 잠금이 아니라 레코드 기반 락을 사용한다. 문득, 어떤 식으로 락이 걸리고 어느 정도까지 제한을 두는지 궁금해졌다. 가정은 이렇다. 사실 레코드 하나의 전체에 락을 거는 것이 아니라 인덱스에 락을 거는 방식인데, 그럼 이 때, 해당 인덱스가 아닌 다른 속성들에는 락이 걸리지 않는 것인가? 만약 그렇다면, 해당 인덱스A를 제외한 커버링 인덱스B로 처리되는 또 다른 쿼리문은 해당 인덱스A 락이 풀리지 않아도 처리가 가능할까? 뭔말인지 잘 모르겠다. 일단 해보자 우선 인덱스 생성부터! create index test1 on post (post..
2022.07.15 -
MySQL8.0 Error Code: 1071. Specified key was too long 해결법
빠른 조회를 위해 테이블 속성에 인덱스를 걸려고 하는 참이었다. 그런데, 다음과 같은 에러가 발생했다. Error Code: 1071. Specified key was too long; max key length is 3072 bytes 다름 아닌 인덱스 키의 최대 크기 제한이 있다는 것을 발견했다. 이것과 관련해서 글도 썼었는데 -_-;;; 이래서 실습이 중요하다.. 궁금하시다면 https://leezzangmin.tistory.com/30 [MySQL8.0] B-Tree 인덱스 사용에 영향을 미치는 요소 이 글은 'Real MySQL 8.0 개발자와 DBA를 위한 MySQL 실전 가이드'를 보고 학습한 내용을 정리한 글입니다. B-Tree 인덱스는 인덱스를 구성하는 1. 칼럼의 크기와 2. 레코드의..
2022.07.15