본문 바로가기

MySQL

(8)
percona rds-exporter AWS API throttling issue 1. 배경 현재 재직 중인 회사에서는 오픈소스인 percona 사의 rds-exporter (https://github.com/percona/rds_exporter) 를 이용하여 RDS 의 enhanced monitoring 지표 (OS 지표) 를 수집하고 있다. 하지만 하나의 account + region 에 종속된 instance 가 많아질수록 API throttling 에러가 발생하며 지표 수집에 실패하는 빈도가 잦아졌다. 그래서 해당 이슈에 대한 원인 파악과 함께 대응 방안을 수립하기 시작했다. 2. 기존 방식의 문제점 1) API throttling 이 발생한 원인 rds-exporter 는 CloudWatch Logs 에 속한 Log stream 중 하나인 "RDSOSMetric" 을 Filt..
rds_exporter API Call 비용 이슈(+ Customizing) 1. 배경 Amazon RDS 를 사용하게 되면 mysqld_exporter 를 통해 mysql 에 대한 정보를 가져올 수는 있으나, OS 정보 수집을 위해서는 rds_exporter 를 통해서 가져와야한다. RDS 의 Monitoring Enhanced 를 enable 시켰을 경우 rds_exporter 에서는 대략 인스턴스 당 400~500개의 메트릭을 수집하게 된다. 아주 deep 하게 보면 필요한 지표들도 있겠지만, 대부분은 비용을 소모하면서까지 수집할 필요가 없는 지표들이다. 2. 문제점 1) 쓸모 없는 metric RDS Exporter 가 scrap 하는 지표들은 CloudWatch 에 쌓인 정보들을 scrap 하는 형태이고, amazon manual 을 살펴보면 scrap 할 경우 지표 당..
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 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 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..