MySQL 로그와 복제 구성

DB 운영에서 로그는 문제 추적의 눈이고, 복제는 장애 대비의 기본입니다. 두 가지를 함께 정리합니다.

로그 종류와 활성화

MySQL은 목적별로 여러 로그를 남깁니다.

  • 일반 쿼리 로그: 서버가 받은 모든 SQL과 커넥션 이벤트. 성능 영향이 있어 기본 비활성화입니다.
  • 슬로우 쿼리 로그: 설정 시간을 넘긴 느린 쿼리. 성능 튜닝의 핵심 자료예요.
  • 에러 로그: 에러·경고·상태 메시지.
  • 바이너리 로그: 데이터 변경 이벤트 기록. 복제와 복구에 쓰입니다.

런타임에 켜려면 DB 명령으로:

SET GLOBAL general_log = 'ON';
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;   -- 1초 이상 쿼리 기록
SHOW VARIABLES LIKE '%general%';  -- 확인

영구 설정은 설정 파일([mysqld])에 넣습니다.

[mysqld]
general_log = 1
general_log_file = /var/log/mysql/mysql.log

slow_query_log = 1
slow_query_log_file = /var/log/mysql/mariadb-slow.log
long_query_time = 1.0

log_error = /var/log/mysql/mariadb.err
log-bin = /var/lib/mysql/mysql-bin
server-id = 1

슬로우 쿼리 로그를 켜두고 주기적으로 훑는 것만으로도 성능 문제의 상당수를 미리 잡을 수 있어요.

소스-레플리카 복제

가장 기본적인 백업·가용성 대책이 복제입니다. (예전엔 master-slave라고 불렀고, 최근 문서는 source-replica 로 표기합니다. 개념은 같아요.)

소스(마스터) 설정:

[mysqld]
log-bin = mysql-bin
server-id = 1        # 소스와 레플리카가 서로 다르기만 하면 됨
binlog_format = row
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' IDENTIFIED BY '비밀번호';
SHOW MASTER STATUS;   -- File명과 Position 기록해두기

레플리카 설정(server-id = 2) 후 연동:

CHANGE MASTER TO
  MASTER_HOST='소스IP',
  MASTER_USER='repl',
  MASTER_PASSWORD='비밀번호',
  MASTER_PORT=3306,
  MASTER_LOG_FILE='기록한 File명',
  MASTER_LOG_POS=기록한 Position;

START SLAVE;
SHOW SLAVE STATUS\G

동작 흐름은 이렇습니다. 소스가 변경을 바이너리 로그에 기록 → 레플리카가 I/O 스레드로 이벤트를 받아 릴레이 로그에 저장 → SQL 스레드가 이를 실제 DB에 반영. 소스는 레플리카를 신경 쓰지 않고, 레플리카가 알아서 따라오는 구조예요. 레플리카 접속이 안 되면 설정의 bind-address = 127.0.0.1 을 확인하세요.

참고: expire_logs_days 는 MySQL 8에서 폐기되고 binlog_expire_logs_seconds 로 대체됐습니다. MariaDB에서는 여전히 expire_logs_days 를 씁니다.

Galera 멀티 마스터 클러스터

읽기 분산을 넘어 여러 노드에 동시에 쓰고 싶다면 Galera로 멀티 마스터를 구성합니다. 각 노드의 60-galera.cnf 에:

[galera]
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so
wsrep_cluster_address=gcomm://[node1],[node2],[node3]
wsrep_cluster_name=cluster      # 모든 노드 동일
wsrep_node_name=node01          # 노드마다 고유
wsrep_node_address=192.168.0.10
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0

세 노드 모두 설정 후, 전부 stop → 기준 노드에서 galera_new_cluster 로 첫 노드를 띄우고 → 나머지는 일반 start 합니다. 확인은:

SHOW STATUS LIKE 'wsrep_cluster_size';   -- 구축한 노드 수만큼 나오면 성공

클러스터가 꼬이면 /var/lib/mysql/galera.cachegrastate.dat 를 지우고 다시 생성합니다.

Too many connections

커넥션이 몰려 이 오류가 나면, 설정 파일 수정은 재시작이 필요하니 급할 땐 쿼리로 즉시 늘립니다.

SHOW STATUS LIKE 'threads_connected';   -- 현재 연결 수
SET GLOBAL max_connections = 300;       -- 최대 연결 수 증량

다만 근본 원인은 커넥션 누수나 풀 설정인 경우가 많으니, 응급 처치 후에는 애플리케이션의 커넥션 관리를 점검하는 게 좋습니다.