본문 바로가기

SQL/MYSQL

MySQL 슬로우 쿼리 로그 설정

MySQL 슬로우 쿼리 로그 설정


MySQL 접속하여 현재 설정 확인

mysql> SHOW VARIABLES LIKE 'slow_query_%';

+---------------------+---------------------------------+

| Variable_name       | Value                           |

+---------------------+---------------------------------+

| slow_query_log      | OFF                             |

| slow_query_log_file | /var/run/mysqld/mysqld-slow.log |

+---------------------+---------------------------------+

2 rows in set (0.00 sec)

→ 슬로우 쿼리 설정 OFF


● 로그 폴더 생성, 퍼미션 조정

[root@user~]# mkdir /var/log/mysql

[root@user~]# chown mysql:mysql /var/log/mysql

[root@user~]# ll /var/log/ | grep mysql

drwxr-xr-x 2 mysql mysql    4096 Aug  3 22:46 mysql

-rw-r----- 1 mysql mysql   53059 Jun 15 02:08 mysqld.log

 로그 설정

my.cnf 파일 편집. [mysqld]의 아래 적당한 곳에 다음 내용 기입

[root@user~]# vi /etc/my.cnf

[mysqld]

slow_query_log = 1

slow_query_log_file = /var/log/mysql/mariadb-slow.log

long_query_time = 5

log_slow_rate_limit = 1

log_slow_verbosity = query_plan

log_slow_admin_statements

→ slow_query_log = 1(사용), 로그파일 위치는 /var/log/mysql/mariadb-slow.log

→ 수행시간이 5초 넘는 쿼리를 수집

● cnf 파일(예시) 확인

[root@user~]# cat /etc/my.cnf

[mysqld]

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

user=mysql

# Disabling symbolic-links is recommended to prevent assorted security risks

symbolic-links=0

max_allowed_packet=4M

default-storage-engine=InnoDB

slow_query_log=1

slow_query_log_file=/var/log/mysql/mysql-slow.log

long_query_time=5


[mysqld_safe]

log-error=/var/log/mysqld.log

pid-file=/var/run/mysqld/mysqld.pid

● MySQL 재시작 (설정 적용)

재시작(restart) 대신 리로드(reload)만 해도 됨

여기서는 그냥 재시작

[root@user~]# service mysqld restart

Stopping mysqld:                                           [  OK  ]

Starting mysqld:                                           [  OK  ]

● 확인

슬로우 로그 파일 생성 확인

[root@user~]# cat /var/log/mysql/mysql-slow.log

/usr/libexec/mysqld, Version: 5.1.73-log (Source distribution). started with:

Tcp port: 0  Unix socket: /var/lib/mysql/mysql.sock

Time                 Id Command    Argument

MySQL 접속하여 환경변수 확인

mysql> SHOW VARIABLES LIKE 'slow_query_%';

+---------------------+-------------------------------+

| Variable_name       | Value                         |

+---------------------+-------------------------------+

| slow_query_log      | ON                            |

| slow_query_log_file | /var/log/mysql/mysql-slow.log |

+---------------------+-------------------------------+

2 rows in set (0.00 sec)

mysql> SHOW VARIABLES LIKE 'long_query_%';

+-----------------+----------+

| Variable_name   | Value    |

+-----------------+----------+

| long_query_time | 5.000000 |

+-----------------+----------+

1 row in set (0.00 sec)

 테스트

5초 이상 걸리는 쿼리를 실행하고 로그 파일을 확인해보자.


mysql> SELECT SLEEP(7);

+----------+

| SLEEP(7) |

+----------+

|        0 |

+----------+

1 row in set (7.00 sec)

[root@user~]# cat /var/log/mysql/mysql-slow.log

/usr/libexec/mysqld, Version: 5.1.73-log (Source distribution). started with:

Tcp port: 0  Unix socket: /var/lib/mysql/mysql.sock

Time                 Id Command    Argument

# Time: 160102 20:29:51

# User@Host: root[root] @ localhost []

# Query_time: 7.000300  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 0

SET timestamp=1451734191;

SELECT SLEEP(7);

→ 언제(Time) 누가(User) 어디서(Host) 얼마나 긴(Query_time) 쿼리를 수행했는지 알 수 있다.

→ 2016년 1월 2일 20:29:51에, root가 localhost에서 7.000300초 걸리는 쿼리를 수행함

→ 쿼리문은 SELECT SLEEP(7);

→ 실제 상황에서는 테이블 독점시간을 나타내는 Lock_time도 매우 중요하다. (여기서는 데이터 처리가 없는 SLEEP이라 0)