mariadb의 general log는 DB 에서 수행되는 모든 쿼리를 로깅하는 기능입니다.
그러나 이 기능 사용 시 모든 세션, 모든 쿼리가 로깅 되기 때문에 로그파일이 몹시 커질 가능성이 있어 vi 등으로 파일을 열어
특정 세션의 쿼리를 찾는 등의 작업이 힘들 수 있습니다.
이번 글로 위와 같은 불편함을 해소하기 위해 general log를 테이블로 관리하는 방법을 소개하겠습니다.
-1. general log 설정
mysql> show variables like '%general%'; +------------------+-----------------------------------------------------------+ | Variable_name | Value | +------------------+-----------------------------------------------------------+ | general_log | OFF | | general_log_file | /logs001/masvc01/TEST_10.2.4/slow/TEST_10.2.4_general.log | +------------------+-----------------------------------------------------------+ mysql> show variables like '%log_output%'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | log_output | FILE | +---------------+-------+
=> log_output은 로그 출력형식을 의미. file과 table 로 출력가능
mysql> set global general_log=on; Query OK, 0 rows affected (0.01 sec)
=> general-log 가 logs001 밑에 TEST_10.2.4_general.log 파일에 쌓이도록 설정
Time Id Command Argument 181001 13:06:15 39661 Connect root@localhost as anonymous on 39661 Connect Access denied for user 'root'@'localhost' (using password: YES) 181001 13:06:18 39659 Query select 1 from dual 181001 13:06:21 39659 Query select 2 from dual 181001 13:06:24 39659 Query select 3 from dual 181001 13:06:32 39659 Query show variables like '%log_output%'
=> 위와 같이 시간대 , thread_id , command type, 수행 쿼리가 로깅되지만
모든 쿼리가 로깅되다 보니 원하는 특정 세션의 쿼리를 찾기가 어렵다는 단점이 있음
-2. general log를 테이블로 관리하기
mysql> set global log_output='TABLE'; Query OK, 0 rows affected (0.00 sec) mysql> set global log_output='TABLE,FILE'; Query OK, 0 rows affected (0.01 sec) mysql> show variables like 'log_output'; +---------------+------------+ | Variable_name | Value | +---------------+------------+ | log_output | FILE,TABLE | +---------------+------------+
=> log output을 TABLE로 설정하면 아래와 같은 general_log table에
수행 쿼리들을 적재할 수 있음
mysql> show create table mysql.general_log\G; *************************** 1. row *************************** Table: general_log Create Table: CREATE TABLE "general_log" ( "event_time" timestamp(6) NOT NULL DEFAULT current_timestamp(6) ON UPDATE current_timestamp(6), "user_host" mediumtext NOT NULL, "thread_id" bigint(21) unsigned NOT NULL, "server_id" int(10) unsigned NOT NULL, "command_type" varchar(64) NOT NULL, "argument" mediumtext NOT NULL ) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='General log'
mysql> alter table mysql.general_log engine=MyIsam; Query OK, 12 rows affected (0.02 sec) Records: 12 Duplicates: 0 Warnings: 0
=> default general_log 테이블은 CSV 엔진을 사용하기 때문에 MyIsam 엔진으로 변경함
아래와 같은 에러 발생 시 general_log 를 off 시킨 후 수행해야함
mysql> alter table mysql.general_log engine=MyIsam; ERROR 1580 (HY000): You cannot 'ALTER' a log table if logging is enabled mysql> mysql> set global general_log=off; Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> select count(*) from mysql.general_log where thread_id in ('296','247');
+----------+
| count(*) |
+----------+
| 213282 |
+----------+
1 row in set (0.58 sec)
=> 위와 같이 조회를 원하는 thread_id 를 선별적으로 찾는게 가능해짐