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 를 선별적으로 찾는게 가능해짐