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 Logslow_query_log = ONlong_query_time = 3log_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 Logslow_query_log = ONlong_query_time = 1log_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して空にする。