MariaDB Serverのslow_log設定

slow_logを見てみたら300万行あったので設定を見直したときの覚書。
Gemini 3 Pro Previewと対話。

環境: FreeBSD 14.3-RELEASE-p7, MariaDB Server  10.11.14


1. slow_log設定

現在のslow_log設定。
# less /usr/local/etc/mysql/conf.d/server.cnf

# Slow Query Log
slow_query_log                = ON
long_query_time               = 3
log_output                    = TABLE
# インデックス未使用のクエリをログに記録し、ボトルネックを特定しやすくする
log_queries_not_using_indexes = ON
# 指定した行数以上の行をスキャンしたクエリのみをログに記録する
min_examined_row_limit        = 5000

log_queries_not_using_indexesはWordPressを利用しているとインデックスを使わない軽量なクエリが大量に発生するためOFFにする。
min_examined_row_limitもコメントアウト。
# less /usr/local/etc/mysql/conf.d/server.cnf

# Slow Query Log
slow_query_log                = ON
long_query_time               = 1
log_output                    = TABLE
# インデックス未使用のクエリをログに記録し、ボトルネックを特定しやすくする
log_queries_not_using_indexes = OFF
# 指定した行数以上の行をスキャンしたクエリのみをログに記録する
#min_examined_row_limit               = 5000

MariaDB再起動。
# service mysql-server restart
# service mysql-server status


2. slow_logのエンジンをCSVからMyISAMに変更

CSVのままでは、直接DELETEを行うと、サーバーに高負荷がかかり応答不能になる可能性があるらしいので、MyISAMに変更する。
# mariadb -p

ログ記録を一時停止(安全のため)。
> SET GLOBAL slow_query_log = 'OFF';

エンジンをMyISAMに変更(35秒掛かった)してインデックス作成(5秒掛かった)。
> ALTER TABLE mysql.slow_log ENGINE = MyISAM;
> CREATE INDEX start_time ON mysql.slow_log(start_time);

ログ記録を再開。
> SET GLOBAL slow_query_log = 'ON';

1ヶ月以上前のデータを削除する。
> DELETE FROM mysql.slow_log WHERE start_time < NOW() - INTERVAL 1 MONTH;

ERROR 1556 (HY000): You can't use locks with log tables

MariaDB 10.4以降では仕様が厳格化され、「ログ出力先として設定されているテーブル(mysql.slow_log)」に対しては、ログ設定をOFFにしても DELETE 文が許可されない(ロックが取得できない) 仕様になっているらしい。
参考: Writing Logs Into Tables | Server | MariaDB Documentation

slow_logはphpMyAdminからEmptyして空にする。



▼ 関連記事