분류 전체보기(53)
-
[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 -
말하는 감자의 13개월 개발자 취준 회고
지난 13개월동안 많은 일이 있었습니다. 학교를 졸업하고코드스쿼드에서 백엔드 코스를 마치고개인 공부와 프로젝트로 6개월을 보낸 후IT 회사에 인턴으로 취업했습니다.한 달이 지난 지금, 다른 직군 다른 회사로 이직하게 되었습니다. 개발경력 단 13개월!의 귀여운 회고를 써봅니다 학교 생활에 대해저는 학부시절을 밀도있게 보내지는 않았습니다. 놀러다니고, 학점을 위한 공부를 할 뿐이었습니다. 졸업하면 네이버나 들어갈까 하는 생각으로 ㅋㅋ 진짜 감자의 삶을 살았습니다. 컴퓨터공학을 전공하고, 어디서 들은 건 있어서 단과대에서 밀다가 2년만에 폭망한 인공지능소프트웨어를 부전공으로 삼았습니다. 수업을 통해 Python으로 시작해서 C, Java, C++ 등 많은 언어를 다 맛보기는 할 수 있었습니다. 인공지능 부전..
2023.02.09 -
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 -
[최적화] Spring Data Jpa DTO 반환, 부하테스트, 페치조인 리스트 DTO 쿼리 반환 오류! org.hibernate.QueryException: query specified join fetching, but the owner of the fetched association was not present in the select list
https://www.youtube.com/watch?v=zMAX7g6rO_Y 해당 발표를 정말 감명깊게 봤습니다. 올라온지 꽤 된 영상이지만 그래도 제게는 인사이트가 막강했습니다.. S급 개발자는 이런 것인가 생각이 들었습니다. 발표 내용 중, Spring Data Jpa를 활용한 쿼리에서 무분별하게 Entity를 조회하면 성능상 손해가 크다는 말이 있었습니다. 아이러니하게도 발표자분이 CTO로 계시는 인프런에서도 미래에 해당 이슈 때문에 장애가 일어나기도 했던 글을 봤습니다. 요약하자면, 강의 목록을 조회해오는데 당장 쓰이지 않을 컬럼까지 모두 조회하는 바람에 대용량 컬럼까지 모두 끌어오게 되어서 강의 한 페이지를 조회하는데 DB에 많은 부하가 발생하는 상황으로 장애가 발생했다고 합니다. 여튼 서론이..
2022.11.14 -
스프링 자동설정과 @Profile
최근 @Profile 이 어떻게 작동하는지에 대한 설명을 요청받았다. 무지성 구글링으로 갖다 쓴 것이라 당연히 대답하지 못했다. '이 어노테이션을 쓰면 알아서 빈 등록을 해주는구나' 정도로만 이해하고 사용했다. 사용하는 모든 기술의 코어를 파악하는 것은 현실적으로 어렵겠지만... 대략적인 그림은 그릴 수 있어야하지 않겠는가....! 질문받은 김에 @SpringBootApplication 에 대해서 조금 공부해보기로 했다. 허를 찌르는 질문 덕분에 또 관련 정보를 찾아보며 성장하는 계기가 되었다. 시작! 우선 SpringBoot 어플리케이션의 메인함수에 붙어있는 어노테이션을 살펴봅시다 @SpringBootApplication public class TempApplication { public static ..
2022.10.26