一般クエリログは、ApsaraDB RDS for MySQL インスタンスで実行されたすべての SQL ステートメント (SELECT、INSERT、UPDATE、DELETE) を記録するため、急速に肥大化する可能性があります。定期的なクリーンアップを行わずに有効にしたままにすると、ストレージが枯渇し、パフォーマンスが低下し、復旧時間が長くなります。
ApsaraDB RDS で一般クエリログをテーブルに保存する理由
ApsaraDB RDS for MySQL では、デフォルトで一般クエリログをファイルではなくデータベーステーブルに保存します。その理由は次の 2 つです。
ユーザーは ApsaraDB RDS インスタンス上のファイルに直接アクセスできないため、ファイルベースのログはクエリやダウンロードができません。
log_outputパラメータは、一般クエリログとスロークエリログの両方の出力形式を制御します。ApsaraDB RDS ではスロークエリログをローテーションし、テーブルに保存する必要があるため、一般クエリログもテーブルに保存する必要があります。
一般クエリログがストレージを枯渇させる理由
インスタンスで実行される各 SQL ステートメントがログエントリを生成します。一般クエリログを長期間有効にした場合、またはインスタンスが大量のクエリを処理する場合、mysql.general_log テーブルは継続的に増大します。テーブルを定期的にクリアしないと、インスタンスのストレージが一杯になります。
一般クエリログがストレージの問題を引き起こしていることを確認するには、次の手順を実行してください。
インスタンス監視ページでストレージ使用量を確認してください。
sys_data_sizeが異常に大きい場合は、テーブルデータがストレージを消費しています。詳細については、「監視情報を表示する」をご参照ください。インスタンスパラメーターを表示し、
general_logがONに設定されている場合、機能は有効です。
一般クエリログがパフォーマンスの問題を引き起こす理由
一般クエリログが有効になっている場合、SQL ステートメントを実行するすべてのスレッドは mysql.general_log テーブルに行を書き込む必要があります。この書き込み操作にはメタデータロック (MDL) とテーブルロックの両方が必要なため、スレッドは並列ではなくテーブルに順次書き込みます。
接続数が多い状況では、多数のスレッドが同時にこれらのロックを競合し、接続が Waiting for table level lock 状態になります。接続数が増加すると、CPU 使用率も増加します。
確認するには、SHOW PROCESSLIST を実行するか、innodb_trx テーブルにクエリを実行します。多数の接続が Waiting for table level lock を示している場合、一般クエリログがロック競合の原因となっています。
一般クエリログによって復旧時間が長くなる理由
ApsaraDB RDS インスタンスが予期せずシャットダウンした場合、一般クエリログのクラッシュマーカーが true に設定されます。再起動時に、インスタンスは自動復旧プロセスを開始します。ApsaraDB RDS インスタンス上のテーブルのサイズが大きい場合、それらの復元には長時間かかり、その間インスタンスは使用できません。これにより、復旧時間が直接延長されます。
ソリューション
general_logをOFFに設定して、新しいログエントリの書き込みを停止します。「インスタンスパラメーターの変更」をご参照ください。特権アカウントを使用してインスタンスに接続します。詳細については、「ApsaraDB RDS for MySQL インスタンスに接続する」をご参照ください。
ログテーブルをクリアします。
MySQL 5.6 を実行しているインスタンスでは、
TRUNCATEステートメントはサポートされていません。これらのインスタンスでは、ログをクリアするために テクニカルサポート にお問い合わせください。バージョン固有の機能サポートの完全なリストについては、「機能」をご参照ください。TRUNCATEステートメントを特権アカウントで実行するには、インスタンスがサポート対象のマイナーエンジンバージョン (ApsaraDB RDS for MySQL 5.7 の場合は 20210630 以降、ApsaraDB RDS for MySQL 8.0 の場合は 20210930 以降) を実行している必要があります。これより前のマイナーエンジンバージョンを実行するインスタンスでは、TRUNCATEステートメントは特権アカウントであっても失敗します。その場合は、チケットを起票してテクニカルサポートにログのクリアを依頼してください。TRUNCATE TABLE mysql.general_log;
ログをクリアした後、インスタンスの監視ページを確認して、ストレージ使用量が減少していることを確認してください。
SQL 分析の代替手段
通常の運用中は一般クエリログを無効にしておいてください。短時間のデバッグセッションのためにのみ有効にし、その後すぐに無効にしてテーブルをクリアしてください。
継続的な SQL 分析には、代わりに次のいずれかのアプローチを使用してください。
SQL エクスプローラーと監査 (推奨): この機能を有効にすると、SQL ステートメントが自動的に記録および分析されます。 データは Database Autonomy Service (DAS) に保存され、RDS インスタンスのストレージを消費しないため、インスタンスのパフォーマンスに影響はありません。 詳細については、「SQL エクスプローラーと監査機能を使用する」をご参照ください。
一時的な一般クエリログ: 特定の問題をデバッグする必要がある場合は、一般クエリログを有効にしてから、ログテーブルにクエリを実行して SQL アクティビティを確認します。
SELECT * FROM mysql.general_log;デバッグが完了したらすぐに機能を無効にし、テーブルをクリアしてください。
ストレージがすでに枯渇している場合の対処方法
ログをクリアする前にインスタンスのストレージが不足した場合は、ストレージ容量を拡張してください。
手動拡張: インスタンス仕様を変更してストレージを拡張します。「インスタンス仕様の変更」をご参照ください。
自動拡張: ストレージの自動拡張を設定して、使用量が指定されたしきい値に達したときにシステムがストレージを拡張するようにします。 詳細については、「ストレージの自動拡張を設定する」をご参照ください。