ApsaraDB RDS for MySQL インスタンスで general クエリログ機能が有効になっている場合、general クエリログファイルには、各 SQL 文の実行の詳細など、すべてのユーザー操作が記録されます。 処理が必要なアクセスリクエストの数が多い場合、または general クエリログファイルが長期間クリーンアップされていない場合、大量のストレージリソースが消費されます。 その結果、ストレージ容量が使い果たされます。 このトピックでは、ApsaraDB RDS for MySQL の general クエリログ機能に関するよくある質問への回答を提供します。
背景情報
デフォルトでは、ApsaraDB RDS for MySQL は、次の理由により、general クエリログをテーブルに保存します。
ファイルに保存されている general クエリログは、ユーザーが ApsaraDB RDS for MySQL のファイルにアクセスできないため、直接クエリまたはダウンロードできません。
general クエリログとスロークエリログの出力形式は、log_output パラメーターの値によって決まります。 ApsaraDB RDS for MySQL はスロークエリログをローテーションしますが、そのためにはスロークエリログをテーブルに保存する必要があります。 その結果、general クエリログもテーブルに保存する必要があります。
general クエリログが大量のストレージを占有する
問題の説明
RDS インスタンスのストレージ容量が使い果たされました。 エラーが過度に大きい general クエリログによって発生している可能性があるかどうかを確認するには、次の手順を実行します。
RDS インスタンスのストレージ使用量を確認します。 sys_data_size ファイルが過度に大きくなっています。 詳細については、「監視情報を表示する」をご参照ください。
インスタンスパラメーターを表示する。 general_log パラメーターが ON に設定されています。
原因
RDS インスタンスで general クエリログ機能が有効になっている場合、general クエリログファイルには、SELECT、INSERT、UPDATE、DELETE など、各 SQL 文の実行の詳細を含む、すべてのユーザー操作が記録されます。 処理が必要なアクセスリクエストの数が多い場合、または general クエリログファイルが長期間クリーンアップされていない場合、general クエリログファイルのサイズは継続的に増加します。 問題をできるだけ早く解決しないと、ストレージ容量が使い果たされます。
general クエリログがパフォーマンスの問題を引き起こす
問題の説明
接続数が増加すると、CPU 使用率が増加します。 SHOW PROCESSLIST 文を実行するか、innodb_trx テーブルをクエリした後、結果には多数の接続が Waiting for table level lock 状態にあることが示されます。
原因
デフォルトでは、RDS インスタンスの general クエリログはテーブルに保存されます。 プロセスにはメタデータロック(MDL)とテーブルロックが必要なため、各スレッドはテーブルにデータを順番に書き込みます。 この場合、複数のスレッドがテーブルにデータを同時に書き込もうとすると、接続は Waiting for table level lock 状態になります。
general クエリログが RTO の延長を引き起こす
問題の説明
RDS インスタンスの目標復旧時間(RTO)が増加します。 復旧期間中は、RDS インスタンスは使用できません。
原因
RDS インスタンスが予期せずシャットダウンした場合、general クエリログのクラッシュマーカーは true になります。 この場合、RDS インスタンスは再起動時に自動復旧プロセスを開始します。 復旧中に、RDS インスタンス上のテーブルのサイズが大きい場合、テーブルの復元に長い時間がかかり、RDS インスタンスは使用できないままになります。
解決策
この問題を解決するには、general ログをクリアします。
新しいログが生成されないようにするには、general_log パラメーターを OFF に設定します。 詳細については、「インスタンスパラメーターを変更する」をご参照ください。
特権アカウントを使用して RDS インスタンスに接続 し、次の文を実行して general クエリログファイルをクリアします。 しばらくすると、インスタンスの監視ページで general クエリログファイルによって占有されているストレージリソースを確認できます。
TRUNCATE TABLE mysql.general_log;
RDS インスタンスの general クエリログ機能を無効にし、デバッグまたは問題追跡中に一時的に general クエリログ機能を有効にすることをお勧めします。 デバッグまたは問題追跡が完了したら、すぐに機能を無効にし、general クエリログをクリアする必要があります。 これにより、多数のアクセスリクエスト、または長期間クリアされていない general クエリログによって引き起こされるファイルの累積とストレージ容量の枯渇を防ぎます。 SQL 文の実行を確認および分析する場合は、次のいずれかの方法を使用できます。
SQL Explorer および Audit 機能を有効にする: この方法を使用することをお勧めします。 この機能を有効にすると、システムは実行された SQL 文を自動的に記録および分析します。 この機能に関連するデータは Database Autonomy Service(DAS)に保存され、RDS インスタンスのストレージ容量を占有しません。 したがって、この機能はインスタンスのパフォーマンスに影響を与えません。 詳細については、「SQL Explorer および Audit 機能を使用する」をご参照ください。
general クエリログ機能を一時的に有効にする: general クエリログ機能を一時的に有効にして、問題をデバッグおよび追跡できます。 general クエリログ機能を有効にした後、次の文を実行して SQL 文の実行を確認します。 デバッグが完了したら、general クエリログ機能を無効にし、general クエリログファイルをクリアできます。 general ログを有効にする方法の詳細については、「インスタンスパラメーターを変更する」をご参照ください。
SELECT * FROM mysql.general_log;
次のステップ
RDS インスタンスのストレージ容量を手動で拡張するか、自動ストレージ拡張機能を有効にすることができます。 RDS インスタンスのストレージ使用量が指定されたしきい値に達すると、システムは RDS インスタンスのストレージ容量を自動的に拡張します。 詳細については、「インスタンスの仕様を変更する」および「自動ストレージ拡張を設定する」をご参照ください。