Amazon RDS for MySQL だと「log_output」で出力先を複数指定できない

AWS

2023.6.30

Topics

概要

RDS for MySQL にあるパラメータでログの出力先を決める「log_output」では 3 つ値のどれか1つしか設定できません。
しかし、OSS の MySQL では「FILE」と「TABLE」の 2 つ同時に設定することができます。
本記事では、RDS for MySQL と OSS の MySQL の「log_output」にまつわる違いについて見ていきます。

今回は以下の環境で比較をしていきます。

  • RDS for MySQL
  • EC2 on MySQL(OSS)

ちなみに、タイトルで RDS for MySQL と定義してますが、Aurora MySQL でも同じ動作でした。

log_output とは?

log_output は、一般クエリーログおよびスロークエリーログ出力の宛先を設定するパラメータになってます。

以下、表は MySQL ドキュメントに定義されているパラメータの説明です。

コマンド行形式 –log-output=name
システム変数 log_output
スコープ グローバル
動的 はい
SET_VAR ヒントの適用 いいえ
Set
デフォルト値 FILE
有効な値 TABLE,FILE,NONE

SQL でログに対してアクセスしたい場合は TABLE に、バックアップとかファイルとしてアクセスしたい場合は FILE を指定します。

MySQL :: MySQL 8.0 リファレンスマニュアル :: 5.4.1 一般クエリーログおよびスロークエリーログの出力先の選択

AWS だと以下のうように定義されています。

log_output option: log_output パラメータに指定できるオプションは、次のとおりです。
TABLE (デフォルト) – 一般クエリを mysql.general_log テーブルに、スロークエリを mysql.slow_log テーブルに書き込みます。
FILE – 一般クエリログとスロークエリログの両方をファイルシステムに書き込みます。
NONE – ログ記録を無効にします。
RDS for MySQL データベースログの概要 – Amazon Relational Database Service

EC2 on MySQL の場合

EC2 on MySQL の場合は、「TABLE,FILE」を設定することができます。

一般クエリーログエントリをログテーブルおよびログファイルに書き込むには、–log_output=TABLE,FILE を使用してログの宛先と –general_log の両方を選択し、一般クエリーログを有効にします。
MySQL :: MySQL 8.0 リファレンスマニュアル :: 5.4.1 一般クエリーログおよびスロークエリーログの出力先の選択

デフォルト値に変わりはないです。

mysql> select @@log_output;
+--------------+
| @@log_output |
+--------------+
| FILE |
+--------------+
1 row in set (0.00 sec)

set コマンドを使用して変更します。

mysql> set global log_output='FILE,TABLE';
Query OK, 0 rows affected (0.00 sec)

mysql> select @@log_output;
+--------------+
| @@log_output |
+--------------+
| FILE,TABLE |
+--------------+
1 row in set (0.00 sec)

両方設定できることを確認しました。

RDS for MySQL の場合

RDS for MySQL の場合は、set コマンドではなくパラメータグループを変更します。

しかし、見ていただくとプルダウンで一つしか選択できません。
パラメータグループのプルダウン設定画面

また、EC2 と同じように設定しようとしても RDS では global を権限不足のため指定できずエラーになります。

mysql> select @@log_output;
+--------------+
| @@log_output |
+--------------+
| TABLE |
+--------------+
1 row in set (0.00 sec)

mysql> set global log_output='FILE,TABLE';
ERROR 1227 (42000): Access denied; you need (at least one of) the SUPER or SYSTEM_VARIABLES_ADMIN privilege(s) for this operation

何が違うのか

よくよく見ると同じパラメータでも型が異なります。
RDS の方は String 型のため複数指定はできません。
しかし、EC2 の方は Set 型になっています。

環境
RDS for MySQL String
EC2 on MySQL Set

MySQL :: MySQL 8.0 リファレンスマニュアル :: 5.1.8 サーバーシステム変数

まとめ

MySQL と互換がある RDS ですが、OSS の MySQL とは違う点がいくつかあるので注意して下さい。

FILE と TABLE の両方に出力できないことで、データベース上でログの参照をしつつ、AWS でログ監視をする場合は、別途データベース内部のログを出力する仕組みを実装する必要があります。

テックブログ新着情報のほか、AWSやGoogle Cloudに関するお役立ち情報を配信中!

Cold-Airflow

2021年新卒入社。インフラエンジニアです。RDBが三度の飯より好きです。 主にデータベースやAWSのサーバレスについて書く予定です。あと寒いのは苦手です。

Recommends

こちらもおすすめ

Special Topics

注目記事はこちら