RDSのgeneral_logを有効無効にする

手順

RDSの場合、mysql cliコマンドではrootでもgeneral_logを有効にできないので、AWSコンソールから実施する。

  1. パラメータグループ
  2. 対象のインスタンスのグループ
  3. パラメータでgeneral_logの値を 1(有効), 0 (無効) にする

general_logは大量に吐かれるので本番ではやらない。検証環境でも一時的に有効したら無効化しておく。

general_logを削除する

TRUNCATE TABLE general_log ではrootでも権限により削除できない。
削除のためのストアドプロシージャが用意されているのでストアドから実行する。
なお、一回実行したら general_log_backup へ退避されるので、完全に削除したい場合は rds_rotate_general_logというストアドを2回実行する。

 mysql> select count(*) from general_log; 
 +----------+
 | count(*) |
 +----------+
 |   301603 |
 +----------+
 1 row in set (2.13 sec)

 mysql> call rds_rotate_general_log ;
 Query OK, 0 rows affected (0.02 sec)

 mysql> select count(*) from general_log;
 +----------+
 | count(*) |
 +----------+
 |        0 |
 +----------+
 1 row in set (0.00 sec)

 mysql> select count(*) from general_log_backup;
 +----------+
 | count(*) |
 +----------+
 |   301603 |
 +----------+
 1 row in set (2.12 sec)

 mysql> call rds_rotate_general_log ;
 Query OK, 0 rows affected (0.05 sec)

 mysql> select count(*) from general_log_backup;
 +----------+
 | count(*) |
 +----------+
 |        0 |
 +----------+
 1 row in set (0.01 sec)

rds_rotate_general_log の中

 mysql> show create PROCEDURE rds_rotate_general_log\G
 *************************** 1. row ***************************
           Procedure: rds_rotate_general_log
            sql_mode:
    Create Procedure: CREATE DEFINER=`rdsadmin`@`localhost` PROCEDURE `rds_rotate_general_log`()
    READS SQL DATA
    DETERMINISTIC
 BEGIN
 DECLARE sql_logging BOOLEAN;
 select @@sql_log_bin into sql_logging;
 set @@sql_log_bin=off;
 TRUNCATE TABLE mysql.general_log_backup;
 RENAME TABLE mysql.general_log_backup TO mysql.general_log2;
 RENAME TABLE mysql.general_log TO mysql.general_log_backup, mysql.general_log2 TO 
 mysql.general_log;
 set @@sql_log_bin=sql_logging;
 END
 character_set_client: utf8
 collation_connection: utf8_general_ci
  Database Collation: latin1_swedish_ci
 1 row in set (0.00 sec)