MySQL 로그 남기기 (일반, 오류, 느린 물음글, 바이너리)

(1) 일반 로그 (general log)

  일반 로그에는 MySQL 서버에서 쓰인 물음글(쿼리) 내용이 평문으로 들어간다.

mysql> SET GLOBAL general_log = ON;

  명령줄에서 getneral_log의 변수값을 On으로 바꾸면 곧바로 물음글이 기록되기 시작한다.

  아래처럼 MySQL 명령줄에서 물음글을 담는 일반 로그(general log)에 얽힌 변수들의 값을 볼 수 있다.

mysql> SHOW VARIABLES LIKE '%general%';
+------------------+----------------------------+
| Variable_name | Value |
+------------------+----------------------------+
| general_log | ON |
| general_log_file | /var/log/mysql/general.log |
+------------------+----------------------------+
  이와 같은 내용을 my.cnf (리눅스라면 대개 /etc/my.cnf)주1에 내용을 넣어서 MySQL 서버를 시작할 때부터 일반 로그를 기록하게 할 수도 있다.
general_log_file = /var/log/mysql/general.log
general_log = ON
  mysql 일반 로그에서 볼 수 있는 로그 내용은 다음과 비슷한 꼴이다.
/usr/sbin/mariadbd, Version: 10.8.3-MariaDB-log (MariaDB Server). started with:
Tcp port: 3306 Unix socket: /var/lib/mysql/mysql.sock
Time Id Command Argument
220714 12:31:32 4 Connect dbmaster@localhost on maindb using Socket
4 Init DB maindb
4 Query SET AUTOCOMMIT=1
4 Query SET NAMES utf8mb4
4 Query SET SESSION collation_connection = 'utf8mb4_unicode_ci'
4 Query SELECT * FROM tc_BlogSettings WHERE blogid = 1
...
4 Query COMMIT
4 Quit
220724 12:31:37 5 Connect dbmaster@localhost on using Socket
5 Query SET NAMES utf8mb4
5 Query SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci'
...
  접속량이 많은 서버는 잠깐 동안에도 일반 로그(물음글 로그)가 매우 많이 쌓이므로, 일반 로그는 필요할 때에만 잠깐 켜서 확인하면 좋다주2

(2) 오류 로그 (error log)

  MySQL 서버가 시작하고 정지하고 운영 중일 때에 일어나는 문제들이 기록된다. 테이블이 깨진 것과 같은 굵직한 오류는 들어가지만, 그에 얽힌 상세한 물음글(쿼리) 내용은 오류 로그에 들어가지 않는다. 물음글 내용은 앞에서 살핀 일반 로그에서 볼 수 있다.

  my.cnf에 아래와 같은 내용을 넣어서 오류 로그가 기록되는 파일 경로를 지정할 수 있다.

log-error = /var/log/mysql/mysql.err

  MySQL 명령줄에서도 오류 로그 파일의 경로을 볼 수 있다.

mysql> SHOW VARIABLES LIKE '%log_error%';
+---------------+--------------------------+
| Variable_name | Value |
+---------------+--------------------------+
| log_error | /var/log/mysql/mysql.err |
+---------------+--------------------------+

  그러나 log_error 변수는 MySQL 명령줄에서 읽을 수만 있다. 일반 로그를 다루는 general_log나 general_log_file처럼 MySQL 명령줄에서 log_error 값을 바꾸려고 하면 아래처럼 오류가 뜬다.

mysql> SET GLOBAL log_error = '/var/log/mysql/mysql.err';
ERROR 1238 (HY000): Variable 'log_error' is a read only variable

(3) 느린 물음글 로그 (slow query log)

  my.cnf에서 아래와 같은 내용을 넣으면, 처리가 느린 물음글에 관한 정보가 기록된다.

slow_query_log = ON
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1

  느린 처리의 기준 시간값 long_query_time은 초 단위로 넣는다. (0.5초, 1초, 2초, 5초, …)

  MySQL 멍렁줄에서도 이 설정값들을 바꾸거나 볼 수 있다.

mysql> SET GLOBAL slow_query_log = ON;
mysql> SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';
mysql> SET GLOBAL long_query_time = 1;

mysql> SHOW VARIABLES LIKE '%slow_query%';
+---------------------+-------------------------+
| Variable_name | Value |
+---------------------+-------------------------+
| slow_query_log | OFF |
| slow_query_log_file | /var/log/mysql/slow.log |
+---------------------+-------------------------+

mysql> SHOW VARIABLES LIKE '%long_query%';
+-----------------+----------+
| Variable_name | Value |
+-----------------+----------+
| long_query_time | 1.000000 |
+-----------------+----------+

(4) 바이너리 로그 (bin-log)

  my.cnf에 다음 내용을 넣고 MySQL 서버를 다시 시작하면

log-bin=mysql-bin
expire_logs_days = 14
  /var/lib/mysql에 mysql-bin.000001와 같이 번호를 붙인 이름으로 바이너리 로그가 만들어진다.

  바이너리 로그의 저장 기한을 따로 정하지 않으면(expire_logs_days를 0으로 두면) 바이너리 로그가 제한 없이 쌓일 수 있다. 일반 로그(물음글 로그)처럼 바이너리 로그도 물음글이 많은 서버에서는 용량 관리가 필요할 수 있다.

  명령줄에서도 아래처럼 expire_logs_days 변수를 통하여 바이너리 로그를 저장하는 기한(14날)을 정해 줄 수 있다.

mysql> show global variables like '%expire_logs%';
+----------------------------+----------+
| Variable_name | Value |
+----------------------------+----------+
| binlog_expire_logs_seconds | 0 |
| expire_logs_days | 0.000000 |
+----------------------------+----------+
2 rows in set (0.001 sec)

mysql> set global expire_logs_days = 14;
Query OK, 0 rows affected (0.000 sec)

mysql> show global variables like '%expire_logs%';
+----------------------------+-----------+
| Variable_name | Value |
+----------------------------+-----------+
| binlog_expire_logs_seconds | 1209600 |
| expire_logs_days | 14.000000 |
+----------------------------+-----------+
2 rows in set (0.001 sec)

  아래는 14날을 넘은 바이너리 로그를 곧바로 지우는 시킴말(명령어)이다.

mysql> PURGE MASTER LOGS BEFORE DATE_SUB(CURRENT_DATE, INTERVAL 14 DAY);

(5) 로그 파일이 만들어지지 않는다면

  위와 같이 MySQL 로그 파일이 기록되도록 설정하더라도, 자료방(디렉토리)이 만들어지지 않았거나 mysql 서버에 자료방의 소유권 또는 쓰기 권한이 없어서 로그 파일이 만들어지지 않을 수 있다.

  아래와 같은 리눅스 명령어로 로그 파일이 들어갈 자료방을 만들고 소유권을 지정해 줄 수 있다.

# mkdir /var/log/mysql
# chown mysql:mysql /var/log/mysql
〈주석〉
  1. /etc/my.cnf.d에 설정 파일을 따로 만들어 넣을 수도 있다. back
  2. 무심코 켜 두었다가 디스크가 꽉 차서 서버가 멎는 일도 생길 수 있다. back
2022/07/14 15:43 2022/07/14 15:43
글 걸기 주소 : 이 글에는 글을 걸 수 없습니다.

덧글을 달아 주세요

  1. 좋아하는노래 2022/07/17 17:10 고유주소 고치기 답하기

    살만합니다마쉬멜로우빠빠빠이별을걷는다오키도키바라보나봐사랑아또사랑아봄비기억모진사랑
    잘가라내눈물모아하트하트여우와솜사탕응급실오키도키너의곁으로니가참좋아야래향별이빛나는밤에못서성이다내안에그사람그런사람또없습니다
    커플오빠가간다내아픈사랑아널향해있는사랑니가뭔대그대로내사랑아파라다이스아모르파티반이별의그늘정때문에바보랍니다거침없이하이킥사랑은개나소나그래요토요일밤에나때문에울지마요살다가보면인연이라말합니다하루하루마법의성포옹
    어디인가요그사람더사랑할래바람이불어와사랑이남아사랑해오늘도다가와늘미소가사랑은늘도망가눈꽃사랑이었나요미쳐가두근두근나는문제없어
    그냥눈물이나사는게다그래눈꽃395찌릿찌릿반딧불이하늘해나성에가면그냥눈물이나위로해주세요틈