콘텐츠로 이동

MySQL 설정 및 성능 튜닝 (Production 기준)

운영 서버(Production Server) 에서 MySQL을 안정적으로 운영하기 위해
필요한 설정 및 성능 튜닝 기준을 정의함.

“최대 성능”을 목표로 하지 않음.
장기 안정성, 예측 가능성, 장애 대응 용이성을 최우선 기준으로 함.


1. 설정 파일 관리 원칙

MySQL 설정은 다음 파일 중 하나에서 관리함.

  • /etc/my.cnf
  • /etc/mysql/my.cnf

운영 환경에서는 다음 원칙을 따름.

  • 설정 파일은 단일 기준 파일로 관리함
  • 설정 변경 이력은 반드시 기록함
  • 실시간 변경(SET GLOBAL)은 임시 검증 목적 외 사용하지 않음

운영 서버에서 설정은 실행 중 조정 대상이 아니라, 배포 대상임.


2. 튜닝의 기본 방향

운영 환경에서 MySQL 튜닝의 목적은 다음과 같음.

  • 트래픽 변동 시에도 동작 예측 가능
  • 메모리 고갈 및 I/O 폭주 방지
  • 장애 발생 시 원인 추적 용이

다음은 목표가 아님.

  • 벤치마크 점수 향상 ❌
  • 단기 성능 극대화 ❌

튜닝은 “빠르게 만드는 작업”이 아니라 위험을 제거하는 작업임.


3. 연결 관련 설정

3.1 max_connections

  • 의미: 최대 동시 연결 수
  • 기본값은 운영 환경에 적합하지 않을 수 있음
max_connections = 1000

운영 기준:

  • 실제 애플리케이션 동시 접속 수 기준으로 산정함
  • 무조건 크게 설정하지 않음
  • 값 증가 = 메모리 사용량 증가임

커넥션 풀을 전제로 하지 않은 max_connections 증설은
운영 사고로 이어질 수 있음.

3.2 wait_timeout / interactive_timeout

wait_timeout = 30
interactive_timeout = 30
  • 유휴 연결 장기 유지로 인한 리소스 낭비 방지
  • API 서버 환경에서는 짧게 유지함
  • 커넥션 풀 사용을 전제로 함

4. InnoDB 스토리지 엔진 설정

4.1 innodb_buffer_pool_size

  • InnoDB에서 가장 중요한 설정 항목
  • 데이터 및 인덱스를 메모리에 캐시함
innodb_buffer_pool_size = 6G

운영 기준:

  • 전체 메모리의 70~80%
  • 다른 서비스와 공존하는 경우 보수적으로 조정함

4.2 innodb_log_file_size

innodb_log_file_size = 1G
  • 트랜잭션 처리 성능과 직접적으로 연관됨
  • 변경 시 MySQL 재시작 필요함
  • 로그 파일 교체 과정 주의 필요함

4.3 innodb_flush_log_at_trx_commit

innodb_flush_log_at_trx_commit = 1

운영 기준:

  • 1: 운영 기본값. 데이터 안전성 최우선
  • 2: 성능 목적의 예외값. OS crash 시 최근 트랜잭션 일부 유실 가능
  • 0: 데이터 손실 가능성으로 운영 환경에서 지양함

운영 환경에서 “데이터 유실 허용하지 않음”을 기본 원칙으로 둔다면
innodb_flush_log_at_trx_commit = 1 을 기본으로 사용함.

4.4 innodb_io_capacity

innodb_io_capacity = 2000
  • SSD 기준 값
  • HDD 환경에서는 낮춰서 설정함
  • 디스크 성능에 맞춰 조정함

5. 쿼리 캐시 관련 설정

MySQL 8.0 에서는 Query Cache 가 제거되었음.
MySQL 5.7 또는 일부 MariaDB 계열을 운영하는 경우에도 Query Cache 사용을 권장하지 않음.

query_cache_type = 0
query_cache_size = 0

운영 기준:

  • MySQL 8.0 에서는 해당 설정 자체가 불필요함
  • 쿼리 캐시는 동시성 환경에서 병목을 유발함
  • Query Cache 를 지원하는 구버전 계열에서는 명시적으로 OFF 상태 유지

6. 임시 테이블 및 캐시 관련 설정

tmp_table_size = 256M
max_heap_table_size = 256M
table_open_cache = 4000
  • 디스크 기반 임시 테이블 사용 최소화 목적
  • 값 증가는 메모리 사용량 증가로 이어짐
  • 무분별한 증설 금지함

7. 파일 핸들링 및 OS 연계 설정

open_files_limit = 65535
  • 테이블 및 로그 파일 증가 대비
  • OS 파일 디스크립터 제한과 함께 검토함

8. Binary Log 및 장애 복구 관련 설정

운영 환경에서는 Binary Log를 활성화함.

log_bin = /var/log/mysql/mysql-bin.log
binlog_expire_logs_seconds = 604800
max_binlog_size = 100M
sync_binlog = 1

운영 기준:

  • Point-in-Time Recovery 대비
  • 디스크 사용량 주기적 점검 필수
  • sync_binlog는 안정성 우선 기준으로 설정함
  • 구버전 호환이 필요한 경우에만 expire_logs_days = 7 을 예외적으로 사용함

9. Replication 관련 설정

read_only = 1

운영 기준:

  • Replica 서버에서만 사용함
  • Primary 서버에서는 설정하지 않음
  • 복제 구성 시에만 적용함

10. 기타 운영 필수 설정

thread_cache_size = 16
max_allowed_packet = 64M
  • 연결 성능 개선
  • 대용량 데이터 처리 안정성 확보 목적

11. 이 문서에서 의도적으로 다루지 않는 설정

다음 설정은 운영 환경에서
특별한 근거 없이 조정하지 않음.

  • key_buffer_size (MyISAM 전용)
  • Optimizer 관련 세부 파라미터
  • thread_handling 관련 설정
  • 실험적 기능 플래그

기본값을 존중하고 문제가 발생한 지점만 최소 수정하는 전략을 따름.


12. 설정 변경 후 반드시 확인하는 지표

설정 변경 후 다음 항목을 반드시 확인함.

  • Threads_connected
  • Threads_running
  • InnoDB Buffer Pool Hit Ratio
  • 디스크 사용량 변화
  • Slow Query 발생 여부

설정 변경 직후 수치는 신뢰하지 않음.
최소 수 시간 ~ 수일 단위로 관찰함.


13. 성능 이슈 발생 시 튜닝보다 먼저 확인할 것

  • 인덱스 부재 또는 잘못된 인덱스
  • N+1 쿼리 패턴
  • 커넥션 풀 설정 오류
  • 애플리케이션 재시도 로직 폭주

DB 설정 튜닝은 대부분의 경우 마지막 단계임.


14. 설정 적용 절차 (sudo 필요)

설정 변경 후 반드시 MySQL을 재시작함.

sudo systemctl restart mysqld && 
sudo systemctl status mysqld
  • 재시작 후 오류 로그 확인 필수
  • 이상 발생 시 즉시 롤백함

15. 작업 완료 기준

다음 조건을 만족해야
MySQL 설정 및 성능 튜닝이 완료된 것으로 간주함.

  • 설정 변경 이력 존재
  • 재시작 후 정상 기동 확인
  • 메모리 및 디스크 사용량 예측 가능
  • 장애 발생 시 롤백 가능