본문 바로가기

MySQL

(10)
MySQL Large table drop issue 분석 (in source code) 1. 배경 DB 를 운영을 하다보면 Table Drop 을 진행할 일이 많다. DB 에 저장된 데이터는 최후의 보루이기때문에(물론 백업본이 있기는하지만), 보통은 테이블 renaming 을 통해 사용되지않는 것을 확인 후 추후 Drop 을 진행한다. InnoDB 의 Table Drop 은 file_per_table=1 일 경우, 물리적인 Table Space 자체를 없애는 것이기때문에 DB 입장에서는 테이블의 크기가 크더라도 시간이 오래 걸릴만한 작업은 아니다. 물론, Adaptive Hash Index 같은 것들이 메모리 상에 존재할 경우에는 해당 Hash map 을 해제해야하기때문에 시간이 오래 걸릴 수는 있다. 하지만 일반적인 경우에서 InnoDB 는 OS 에 unlink call 을 하고 Inno..
MySQL FlashBack (5.7 / 8.0) 1. MySQL Flashback 기본적으로 MySQL Community Version 에서는 FlashBack 을 지원하지 않는다. 해당 기능은 MariaDB 10.2.4 이상의 "mysqlbinlog" 바이너리 파일에 탑재된 기능이다. 이는 Binary Log 를 이용하여 FlashBack 을 구현하기때문에, MySQL Community Version 에서도 정상 작동한다. 차후 출시된 MariaDB 의 신규 버전에서는 DDL (DROP, TRUNCATE, ALTER 등) 에 대한 FlashBack 이 지원될 예정이나 현재 버전에서는 지원하지않는다. 또한 이는 MariaDB 에서만 사용될 것이라고 생각된다. MariaDB 10.2.4 Version 이상에서는 Server Parameter 로 "--f..
MySQL Partition Key length 이슈 (in MySQL 5.7) 1. 배경 MySQL 버전 업그레이드를 진행하다가 특정 테이블 생성이 불가능해서 살펴봤었다. 월별 파티션 같은 테이블에서는 파티션 키를 date 관련 타입이 아닌, char 관련 타입으로 가져가는 경우가 있다. 이 때, MySQL 5.7 이전 (MySQL 5.6 이하) 버전에서는 파티션 키의 크기가 파티션 range 의 범위 크기 (ex. '201801' 의 경우 크기는 6) 보다 작아도 파티션 테이블이 만들어 졌다. 그러나 MySQL 5.7 부터는 "ERROR 1654 (HY000): Partition column values of incorrect type" 에러가 발생한다. 2. 테스트 1) MySQL 5.6 > CREATE TABLE `t1` ( `reg_month` varchar(6), `con..
MySQL 8.0 binlog_row_value_options (JSON Type option) 1. binlog_row_value_options 해당 parameter 는 MySQL 8.0.3 에 적용된 신규 옵션이다. JSON document 를 update 시 효과적인 binary log 공간을 확보하기위해 도입된 개념이다. default 값은 " " (공백) 값이며, Valid Values 는 "PARTIAL_JSON" 이다. Scope : Global / Session Dynamic : Yes Default : ' ' Valid Values : PARTIAL_JSON 1) MySQL 8.0.3 JSON 데이터 형태는 JSON 필드를 update 시에, 변경되는 key 와 value 가 아닌, JSON 필드의 모든 key : value 형태가 binary log 에 작성되었다. 무조건 모든 ..
MySQL 8.0 Atomic DDL (data definition statement) 1. 개요 8.0 에서 새롭게 "Atomic Data Definition Statement Support" 에 대한 내용이 소개 되었다. 2. Atomic DDL 1) 지원되는 DDL 문 Atomic DDL 기능은 DDL 이 지원되는 테이블과 지원되지 않는 테이블 모두 지원한다. table DDL Statement : CREATE / ALTER / DROP ( for databases, tablespaces, tables, indexes, truncate table ) non-table DDL Statement : stored programs, triggers, views, user-defined functions user management Statement : CREATE / ALTER / DROP ..
MySQL 8.0 binlog_row_metadata 1. 개요 MySQL 8.0 에서 추가된 "binlog_row_metadata" 변수가 있다. 해당 값은 "MINIMAL" 과 "FULL" 값을 설정할 수 있다. binlog 작성 시 row 의 meta 정보를 함께 기록하는 것인데, "FULL" 로 설정을 하게되면 MINIMAL 과 생각보다 큰 binlog 사이즈를 가지게 된다. 구성하는 요소가 무엇인지, 어떤 형식으로 binary log 에 남게되는지 보고자 한다. 해당 파라메터는 Global dynamic variable 이다. 2. binlog_row_metadata 란 ? 목적 1) 마스터와 슬레이브가 테이블 구조가 다를 경우, 슬레이브는 전송된 데이터로부터 metadata 를 사용 2) 외부 소프트웨어가 메타 데이터를 사용하여 row event..
MySQL JSON 이 BLOB, TEXT 에 비해 느린 이유 (JSON source 분석) 배경 해당 내용은 JSON Function 을 전혀 사용하지않고, json 의 모든 값들을 Fetch 할 때의 이야기이다. ========================================================================= MySQL 에서 JSON Data 를 Client 단으로 보내줄 때 다른 Type 의 컬럼들에 비해 CPU Usage 를 많이 사용한다. 이는 MySQL 의 경우 JSON type 을 내부적으로 binary 형태로 저장하고, TEXT type 은 string 형태로 저장하기때문이다. Client 단에서 데이터를 요청했을 때, TEXT type 의 경우 type conversion 없이 string 형태 그대로 전송을 해주면되지만, JSON type 의 ..
MySQL 8.0 Optimizer Trace MySQL 8.0 에서만 특정 쿼리가 2초만에 끝나는 use index 힌트를 무시하고 자꾸 600초 가량이 걸리는 Full Table Scan 을 선택해서 부하 테스트가 잘 안됐다. 기존 원본 버전인 MariaDB 10.0 버전에서는 원하는대로 use index 만으로도 원하는 인덱스를 잘 사용했는데, 타겟 버전인 MySQL 8.0 에서만 이슈가 있던 부분이다. ( force index 는 잘 됨 ) 그래서 MySQL 8.0 에서는 optimizer 부분이 어떻게 바뀌었는지 Optimizer Trace 를 살펴보면서 정리했다. Cost-based Query Optimization 1. 기본 컨셉 Assign Cost to Operations Assign Cost to partial or alternat..