본문 바로가기
IT개발/Database

[mariadb] 실행된 SQL 쿼리 이력 확인

by dootiger 2021. 12. 21.
반응형

목차

1. 실행중인 쿼리 확인 (show full processlist)

2. 실행했던 모든 쿼리 확인 (임시)(설정 필요)

3. 실행된 쿼리 이력 확인 + 로그파일 (영구)(설정 필요)

4. 실행 속도 느린 쿼리 확인

5. 쿼리 확인

6. 참조

 

 

1. 실행중인 쿼리 확인 (show full processlist)

-- engine 상태

show engine innodb status;

 

-- 현재 접속중인 유저 실행중인 쿼리

-- 기본

show full processlist;

-- 상세

select * from INFORMATION_SCHEMA.PROCESSLIST;

-- 해당 Thread 현황

select * from information_schema.INNODB_TRXG;

-- 마지막에 해당 thread에서 실행중() 쿼리 조회

SELECT esc.THREAD_ID, t.processlist_id, esc.SQL_TEXT
  FROM performance_schema.events_statements_current esc

  /**********************************************************************************

  processlist 에서 보여주는 mysql 만든 thread

  performance_schema 에서 만든 thread 값이 달라

  threads 테이블을 참조해야 작업을 확인할 있다.

  why? performance_schema.threads background thread 값도 가지고 있기 때문이다.

  **********************************************************************************/

 JOIN performance_schema.threads t ON t.thread_id = esc.thread_id
 WHERE t.processlist_id = 56604
 ;

 

2. 실행했던 모든 쿼리 확인 (임시)(설정 필요)

mariadb 재실행시 설정이 풀린다.

1)  root 권한으로 mysql 접속

mysql -u root
mysql -u root -p // 비밀번호 치고 들어가야 할 때

 

2) general log 관한 설정 조회

show variables where Variable_name in ('version', 'log', 'general_log');
show variables like 'general%';

 

MariaDB [(none)]> show variables like 'general%';

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

| Variable_name    | Value                   |

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

| general_log      | OFF                      |

| general_log_file | general.log |

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

 

3) 설정

set global general_log = 1;
-- or
set GLOBAL general_log='ON';

 

3. 실행된 쿼리 이력 확인 + 로그파일 (영구)(설정 필요)

mysql 설정 파일 설정

1) MySQL 설정 파일을 연다. (운영체제 마다 위치 상이)

ubuntu ex) mysql

/etc/my.cnf

ubuntu ex) mariadb

/etc/mysql/my.cnf
/etc/mysql/mariadb.cnf

 

2) general_log general_log_file 설정하고 저장합니다.

database 재기동 하면 쿼리의 로그가 기록됩니다.

# version 따라서 다를 있음

# version 따라 file 내보내기만 있음

 

# maria

[mariadb]

#쿼리 로그가 출력되도록 설정

general_log
# log_output= FILE | TABLE
# file로 내보내기
log_output=FILE

#로그파일 경로 설정

general_log_file=/var/log/mariadb/general/mariadb_general.log

 

# mysql

[mysqld]

#쿼리 로그가 출력되도록 설정

general_log=ON
# log_output= FILE | TABLE
# file로 내보내기
log_output=FILE

#로그파일 경로 설정

general_log_file=/var/log/mysql/general/mysql_general.log

3) 재기동 (운영체제 마다 위치 상이)

#database 재기동

/etc/init.d/mysqld restart
/etc/init.d/mysql restart
service mysql restart

 

#권한없음 나오면 sudo

4) (file 경우) mysql log 권한 설정 (log root에서 조회 하는걸 권장하지 않는다.)

# 폴더를 만들어 mysql에게만 권한을 주도록 하자.

chown -R mysql:mysql /var/log/mysql

 

# 위와 같이 권한을 설정하였을 경우 또는 etc.. 아래와 같은 문제가 생길 있다.

-bash: cd: mysql: Permission denied

sudo: cd: command not found

 

# mysql log 조회시 계정(권한을 계정) 달리 들어가서 접속하면 보인다.

su - [계정명]
su - mysql

 

# Authentication failure Error

# root 비밀번호가 설정이 안되었을 경우

sudo passwd root

 

4. 실행 속도 느린 쿼리 확인

MySQL 설정 파일을 편집 명령어로 열고 slow_query_log slow_query_log_file 설정하고 저장합니다.

MySQL 재기동 하면 설정한 내용이 반영됩니다.

# 0:끄기,1:켜기
vim /etc/my.cnf slow_query_log=1

 

#로그파일 경로 설정

slow_query_log_file=/home/mysql/mysqld-slow.log

#5초이상 걸리는 쿼리

long_query_time=5

 

#MySQL 재기동

/etc/init.d/mysqld restart

설정으로 쿼리의 실행시간을 확인 있습니다.

long_query_time 기본값은 10초입니다.

 

5. 쿼리 확인

파일 경로를 지정해놨으면 file 경로에 가서 보기!

table 저장하면 해당 테이블(general_log, slow_log....)에서 있다.

SELECT * FROM mysql.general_log;
SELECT * FROM mysql.slow_log;

 

6. 참조

-- 둘다 같음 서버 상태

SELECT * FROM information_schema.GLOBAL_STATUS;

show status;

-- maria db 접속되어 있는 client 정보 리스트

SHOW PROCESSLIST;

 

-- Aborted_connects : MySQL 서버에 접속이 실패된

-- Max_used_connections : 최대로 동시에 접속한

-- Threads_connected : 현재 연결된 Thread

-- Connections : mysql서버에 연결시도한

show status like '%connect%';

-- Aborted_clients : 클라이언트 프로그램이 정상적으로 종료된

show status like '%clients%';

-- Threads_cached : Threads Cache Thread

-- Threads_connected : 현재 연결된 Thread

-- Threads_created : 접속을 위해 생성된 Thread

-- Threads_running : sleeping 되어 있지 않은 Thread

show status like '%thread%';

  

/*

커넥션을 모니터링 위에서 확인한 상태 값을 계산하여 튜닝 여부를 판단할 있다.

Cache Miss Rate(%) =  Threads_created / Connections * 100

Connection Miss Rate(%) = Aborted_connects / Connections * 100

Connection Usage(%) = Threads_connected / max_connections * 100

 

Connection Usage(%) 100%라면 max_connections 수를 증가시켜야 한다.

Connection 수가 부족할 경우 Too Many Connection Error 발생한다.

 

DB서버의 접속이 많은 경우 wait_timeout 최대한 적게 설정하여 불필요한 연결을 빨리 정리하는 것이 좋다.

그러나 Connection Miss Rate(%) 1% 이상이면 wait_timeout 길게 설정한다.

 

MySQL 서버는 외부로부터 접속 요청을 받을 경우 인증을 위해

IP 주소를 호스트네임으로 바꾸는 과정을 수행하여 접속 시에 불필요한 부하가 발생한다.

skip-name-resolve 설정하고 접속시 IP기반으로 접속을 하게 되면

hostname lookup 과정을 생략하게 되어 빠르게 접속할 있다.

*/

show variables like '%timeout';

 

출처: [mariadb] 실행된 SQL 쿼리 이력 확인 (ubuntu).html [365 24시간 초보]

 

반응형