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.cache 와 grastate.dat 를 지우고 다시 생성합니다.
Too many connections
커넥션이 몰려 이 오류가 나면, 설정 파일 수정은 재시작이 필요하니 급할 땐 쿼리로 즉시 늘립니다.
SHOW STATUS LIKE 'threads_connected'; -- 현재 연결 수
SET GLOBAL max_connections = 300; -- 최대 연결 수 증량
다만 근본 원인은 커넥션 누수나 풀 설정인 경우가 많으니, 응급 처치 후에는 애플리케이션의 커넥션 관리를 점검하는 게 좋습니다.