2022

MySQL8.0 TempTable Flow

MySQL8.0 TempTable Flow

MySQL 8.0에서 Internal Temporary Table 방식이 변경되었다. Default TempTable이라는데 이게 기존과 어떤 차이가 있는지 확인해보자

Back to Top ↑

2021

Back to Top ↑

2020

MySQL slave sql_thread command type in 8.0

MySQL slave sql thread command type in 8.0

8.0부터 slave sql thread의 command type 표시 내용이 다르다. 뭔가 남몰래 바뀐 느낌. 로깅을 위해서 버전별로 확인해두자.

Meta Data Lock 에 의한 Deadlock 발생 예제

개요

  • 개발팀에서 Deadlock found when trying to get lock; try restarting transaction 메세지를 Application에서 받았다고 했지만, show engine innodb status 의 정보나 information_schema.INNODB_METRICS 테이블에 관련된 내용이 전혀 없었음.

MySQL slave delay under long history list

MySQL MVCC history list

MySQL은 default REPEATABLE READ라서, InnoDB 모든 변경을 undo에 마구마구 기록하게 됩니다. https://blog.jcole.us/2014/04/16/the-basics-of-the-innodb-undo-logging-and-history-system/ 그리고 오래된 트랜잭션때문에 history list가 커지면 성능저하가 발생하게 됩니다. https://www.percona.com/blog/2017/05/08/chasing-a-hung-transaction-in-mysql-innodb-history-length-strikes-back/

MySQL table definition cache LRU Maintenance

MySQL InnoDB table definition cache LRU Maintenance

InnoDB에서는 table definition cache를 server(frm) 와 engine level(InnoDB system table)에서 모두 관리합니다. sql을 실행할때마다, table definition 을 접근해야합니다. 이것을 frm file이나 system table에서 매번 가져와야한다면 엄청 느리겠지요. 그래서 MySQL은 이를 캐시하는 영역이 있습니다. table definition cache. 이를 어떻게 관리하는지 설명합니다.

Back to Top ↑

2019

MySQL에서 null safe equal operator (<=>)


개요

  • SQL에서 NULL과의 모든 연산은 NULL을 반환한다. NULL은 아직 할당되지 않은 값이기 때문이다. 이를 피하기 위해 ifnull과 같은 함수를 사용하기도 하지만 모든 nullable column을 비교하기위해 해당 function을 사용하는것은 꽤나 귀찮은 일이다. 이때문에 MySQL은 <=>라는 연산자를 제공한다.

MySQL 디버깅을 위한 Docker 안에서 MySQL Source 설치하기


주의사항

  • 해당 스크립트는 MySQL Debugging 을 위해 debug버젼을 compile하는데 목적이 있음으로 OS root유저로 진행한다. 사용을 위해서는 정상적인 절차 (mysql user 생성 / systemd 등록..) 를 진행한다.
  • 5.7 과 8.0은 명령어가 조금 다른데, 해당이유는 8.0을 compile 하기 위해서는 cmake 버젼과 gcc 버젼을 올려줘야 한다.
  • cmake >= 3.0
  • GCC >= 4.8 (C++ 11) (MySQL 5.7의 경우, GCC >= 4.4)
  • 8.0 compile시, fatal error: ld terminated with signal 9 [Killed] 라는 에러가 발생했는데 이는 docker가 사용했던 메모리가 부족 (2GiB)하여 발생되었다. oom 세팅과 메모리를 4GiB로 올린 후 문제는 발생하지 않았다.
  • windows 는 깔끔하게 mysql_debug binary를 받아서 사용하면 된다. :-)

Docker를 이용한 MySQL RPM 설치 및 기타 Tool 설치


명령어 모음

OS 명령어

Docker로 centos 이미지 만들기

docker search centos
docker pull centos
docker images -a
docker run -dit --hostname C7_M8017 --name centos7_mysql8017 centos
docker container ls -a
docker exec -it centos7_mysql8017 /bin/bash

Alter table시 소요시간 예측해보기

개요

* Alter table 명령어를 실행하고 나면, 현재 진행상황이 어느정도인지 궁금할때가 있다.
 일반적으로 파일사이즈나 show engine innodb status를 통해 가늠해볼 수는 있지만, 정확한 값은 아니며 때로는 여러단계에서 같은 작업을 진행함으로 현재 작업을 얼마나 더 해야 하는지 예상하기 쉽지 않다.
 MySQL 5.7부터는 Performance_schema 를 이용하여, Alter 명령어에 대해 모니터링을 할 수 있다.

MySQL decimal type 제대로 알고 사용하기

decimal type 제대로 알고 사용하기

mysql에서 실수를 표현할때는 보통 decimal 혹은 double을 사용하게 된다. 이 둘의 차이점이 무엇이고, decimal 을 사용하는 경우에 주의할 점을 기술한다.

MySQL explicit_defaults_for_timestamp

explicit_defaults_for_timestamp 에 대해서

[Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use –explicit_defaults_for_timestamp server option (see documentation for more details).

Back to Top ↑

2018

MySQL Read Committed vs. Repeatable Read

Read Committed vs. Repeatable Read

  • MySQL의 Isolation level은 전통적으로 Repeatable Read 를 default로 한다.
  • 하지만 반드시 repeatable read가 필요한 경우에만 lock을 사용하고 그외에서는 committed 를 봐도 무방하다면, 다른 RDBMS와 같이 Read committed를 default Isolation level로 하는 건 어떨까.
  • 막연하게 Read Committed가 lock contention이 더 줄고, 동시성에 더 좋을 것 같다.
  • 그리고 Repeatable read 에서 long running query (혹은 슬프게도 transaction이 제대로 close되지 않아서)가 돌때 undo가 너무 많이 쌓여서 전체적으로 성능에 영향을 주는 상황도 회피할 수 있다.

MTS considerations

MTS considerations

Multi-threaded slave(MTS)를 통해서 slave delay를 줄일수 있을까.

  • → YES. https://mysqlhighavailability.com/multi-threaded-replication-performance-in-mysql-5-7/
  • 실제로 slave delay가 발생하는 시스템에서 MTS on/off test결과 효과적인 것을 확인 할 수 있었다.
Back to Top ↑

2017

Back to Top ↑

2016

Back to Top ↑

2015

Back to Top ↑

2014

Back to Top ↑

2013

Back to Top ↑