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_connectedThreads_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 설정 및 성능 튜닝이 완료된 것으로 간주함.
- 설정 변경 이력 존재
- 재시작 후 정상 기동 확인
- 메모리 및 디스크 사용량 예측 가능
- 장애 발생 시 롤백 가능