このトピックでは、Database Autonomy Service (DAS) のグローバルスロークエリログ分析機能の使用方法について説明します。ユーザーグループを作成および管理して、複数のデータベースインスタンスを集中監視および分析できます。この機能は、スロー SQL ステートメントを効率的に検出し、診断、管理し、データベースの高ペイロードやパフォーマンスの変動といった問題を解決して、コアビジネスの安定性の確保に役立ちます。
コアコンセプト:ユーザーグループ
ユーザーグループはスロークエリログ分析機能の中核となるコンポーネントです。ユーザーグループは、カスタムインスタンス監視ダッシュボードとして機能します。ユーザーグループを作成して、次の操作を実行できます:
論理的なグループ化:異なる事業部門のデータベースインスタンスをグループ化し、管理を容易にします。各ユーザーグループには最大 10 個のインスタンスを含めることができます。
統一されたビュー:グループ内のすべてのインスタンスのスロークエリログの傾向、イベントの分布、SQL 統計を単一のページから表示します。
効率的な切り替え:インスタンスを繰り返し選択することなく、異なるビジネスの重点領域を素早く切り替えます。
DAS は、Top Slow Log Group という名前のデフォルトのシステムグループを作成します。DAS は 1 時間ごとに、過去 24 時間で異常アクティビティが最も顕著で、かつスロークエリログ数が最も多い、アカウント配下のインスタンス上位 5 件を自動的に選択します。これらのインスタンスはグループに追加され、重大な問題を迅速に特定し、解決するのに役立ちます。
前提条件
対応データベースエンジン:データベースインスタンスが、次のいずれかのエンジンタイプを使用している必要があります:
リレーショナルデータベース:
RDS MySQL、PolarDB for MySQL、MyBase MySQL
RDS SQL Server、MyBase SQL Server
RDS PostgreSQL、PolarDB for PostgreSQL、PolarDB for PostgreSQL (Compatible with Oracle)
PolarDB-X 2.0
NoSQL データベース:
Tair (Redis-compatible)、MyBase Redis
ApsaraDB for MongoDB
インスタンスへのアクセス:対象のデータベースインスタンスが DAS に接続されている必要があります。詳細については、「データベースインスタンスへの接続」をご参照ください。
対応リージョン:
スロークエリログの詳細:この機能はすべてのリージョンでサポートされています。
リアルタイムのスロークエリログ統計:この機能は、中国本土、香港 (中国)、シンガポール、マレーシア (クアラルンプール)、インドネシア (ジャカルタ)、日本 (東京)、ドイツ (フランクフルト)、英国 (ロンドン)、米国 (シリコンバレー)、および米国 (バージニア) の各リージョンでサポートされています。
セルフマネージドデータベース:スロークエリログ分析ページは、セルフマネージドデータベースインスタンスをサポートしていません。
スロークエリログのしきい値:データベースカーネルがスロークエリログの記録を制御します。DAS は分析を担当し、しきい値は設定しません。MySQL の
long_query_timeパラメーターなど、スロークエリログのしきい値を設定するには、特定のデータベースインスタンスにログインする必要があります。
手順
グローバルスロークエリログページへのアクセス
DAS コンソールにログインします。
左側のナビゲーションペインで、 を選択します。
オプション:右上の 古いバージョンに戻る ボタンをクリックして、旧バージョンに切り替えます。詳細については、「スロークエリログ (旧バージョン)」をご参照ください。
ユーザーグループの管理と切り替え
ユーザーグループの切り替え:ページ左上のドロップダウンリストからユーザーグループを選択し、分析ビューを切り替えます。
ユーザーグループの作成:新しいユーザーグループを追加 ボタンをクリックします。ダイアログボックスで、ユーザーグループの名前を入力し、確認 をクリックします。
ユーザーグループの管理:
グループの編集または削除:ユーザーグループパネルで、ユーザーグループ名の横にあるアクションアイコンをクリックして、グループの名前を変更または削除します。
インスタンスの追加:対象のユーザーグループを選択した後、パネルの下にある さらにインスタンスを追加 ボタンをクリックします。ダイアログボックスで、次の操作を行います:
選択可能なインスタンス リストで、インスタンスをクリックして現在のユーザーグループに追加します。
選択済みインスタンス リストで、選択したインスタンスをクリックして現在のユーザーグループから削除します。
インスタンスの削除:現在のユーザーグループのインスタンスリストで、インスタンスカードの [×] アイコンをクリックしてインスタンスを削除します。
インスタンスの非表示:現在のユーザーグループのインスタンスリストで、インスタンスカードの
アイコンをクリックして、ビューからインスタンスを非表示にします。インスタンスのスロークエリログ情報 (傾向、イベント、スロークエリログリストを含む) は表示されなくなります。もう一度アイコンをクリックすると、インスタンスが表示され、その情報が復元されます。ユーザーグループの別名保存:別名で保存 ボタンをクリックして、現在のグループのインスタンス設定に基づいて新しいユーザーグループを作成します。
インスタンスの権限:青色でハイライト表示されたインスタンスカードは、そのインスタンスに対する権限があることを示します。権限のないインスタンスは黄色でハイライト表示されます。ID のみ表示でき、特定のデータは表示できません。権限のないインスタンスを除外することで、アクセス可能なインスタンスのみを含むカスタムユーザーグループを作成できます。
傾向とイベントの分析
ログのトレンドが遅い:期間を選択すると、上部の傾向グラフに現在のユーザーグループ内のすべてのインスタンスのスロークエリログの総数と傾向が表示されます。これにより、パフォーマンスの変動がいつ発生したかを迅速に特定できます。
[イベント配信]:傾向グラフの下には、指定した期間内に発生した主要なデータベースイベントが表示されます。これらのイベントには、次のものが含まれます:
[最適化イベント]:SQL 最適化分析が実行されたり、最適化の提案が生成されたりしたイベント。
[セキュリティイベント]:SQL 攻撃や設定の脆弱性など、中〜高のセキュリティリスクをもたらすイベント。
[スロットリング イベント]:SQL スロットリングまたは自動 SQL スロットリングアクションが発生したイベント。
[自動スケーリングイベント]:自動スケールアウトまたはスケールインアクションが発生したイベント。
スロー SQL ステートメントの特定と診断
ページ下部の スローログリスト は主要な分析エリアです。現在のユーザーグループ内のすべてのインスタンスのスロークエリログ情報が集約されています。
グローバル統計:デフォルトでは、リストはすべてのスロー SQL ステートメントを集約し、各ステートメントの実行回数、最大実行時間、最大ロック待機時間、最大スキャン行数、最大返却行数、最大 CPU 時間を表示します。
単一インスタンスのドリルダウン:インスタンスID/名前 の横にある
矢印をクリックして、特定のインスタンスのスロークエリログの詳細な分析を実行します。インスタンスのスロークエリログ情報では、スロークエリログの傾向、イベント配信、スロークエリログの統計、スロークエリログの詳細 を表示できます。
スロークエリログの傾向 グラフでは、特定の時点を選択して、その時点の スロークエリログの統計 と スロークエリログの詳細 を表示できます。
説明スロー SQL ステートメントが長すぎて完全に表示されない場合は、ステートメントにマウスポインターを合わせると、ポップアップボックスに完全な SQL ステートメントが表示されます。
遅いログ統計 および 遅いログの詳細 タブで、
をクリックしてスロークエリログ情報をコンピューターに保存できます。
をクリックして OpenAPI Explorer コンソールに移動できます。現在選択および入力されているパラメーターは、API デバッグ用に自動的に引き継がれます。イベント配信 エリアでは、指定した期間内のスロークエリログイベントをクエリできます。イベントをクリックすると、その詳細が表示されます。
スロークエリログの統計 エリアでは:
リストの上部で、フィルター条件を選択してデータをフィルタリングできます。利用可能なフィルター条件は、データベースエンジンによって異なります。
対象の SQL テンプレートの [クエリ ID] 列にあるデータ ID をクリックすると、相関関係と、ユーザー分布、クライアント分布、メトリックの傾向を含む詳細なリストが表示されます。
対象の SQL テンプレートの 操作 列で 最適化 をクリックします。表示された SQL 診断の最適化 ダイアログボックスで、SQL 診断結果を表示します。
診断の提案を受け入れる場合は、ページ右上の コピー をクリックし、最適化された SQL ステートメントをデータベースクライアントまたは DMS に貼り付けて実行します。提案を受け入れない場合は、Cancel をクリックして診断を終了します。
説明DAS は、SQL ステートメントの複雑さ、対応するテーブルのデータ量、およびデータベースのペイロードに基づいて SQL 診断を実行します。診断の提案が返されるまでに 20 秒以上かかる場合があります。診断が完了すると、診断エンジンは診断結果、最適化の提案、および期待される最適化効果を提示します。診断結果に基づいて提案を受け入れるかどうかを判断できます。
対象の SQL テンプレートの 操作 列で スロットリングを実行してください。 をクリックします。SQL スロットリング ページで、スロットリングパラメーターを設定して、対象の SQL ステートメントにレート制限を適用します。詳細については、「SQL スロットリング」をご参照ください。
PolarDB for MySQL データベースインスタンスの場合、対象の SQL テンプレートの 操作 列で [IMCI] をクリックして、インメモリ列指向インデックス (IMCI) のドキュメントを表示します。
説明[IMCI] ボタンは、PolarDB for MySQL データベースインスタンスにインメモリ列指向インデックスノードがなく、スロークエリログの 最大実行時間 が 20 秒を超え、スキャンされた最大行数 が 200,000 を超える場合に表示されます。
データ量の多い複雑なクエリの場合、インメモリ列指向インデックス (IMCI) を使用してクエリのパフォーマンスを向上させることができます。
スロークエリログの詳細 エリアでも、対象の SQL ステートメントの 操作 列にある 最適化 と スロットリングを実行してください。 をクリックして、[SQL 診断の最適化]と [SQL スロットリング]を実行できます。
よくある質問
Q:スロークエリログデータが表示されないのはなぜですか?
A:リアルタイム計算とウィンドウ集計技術が使用されているため、最新のスロークエリログ統計が表示されるまでに約 3 分の遅延が生じる場合があるためです。次の点もご確認ください:
データベースインスタンスでスロークエリログ機能が有効になっており、しきい値が妥当な値に設定されていることを確認してください。
選択した期間内にスロークエリログが生成されたことを確認してください。
現在のアカウントが対象インスタンスに対する DAS のアクセス権限を持っていることを確認してください。
Q:RAM ユーザーがユーザーグループを表示または管理する権限を持っていない場合はどうすればよいですか?
A:管理者は、RAM ユーザーにアカウントレベルのアクション権限を付与する必要があります。この承認は、ユーザーグループを操作する権限にのみ影響し、RAM ユーザーの他のインスタンスに対するデータ権限は変更されません。
ユーザーグループ管理者ポリシー:たとえば、DASGlobalGroupAdmin があります。このポリシーにより、ユーザーはユーザーグループの作成、削除、変更、およびクエリを実行できるようになります。
{ "Version": "1", "Statement": [ { "Action": [ "hdm:DescribeGlobalGroups", "hdm:CreateGlobalGroup", "hdm:DeleteGlobalGroup", "hdm:ModifyGlobalGroup" ], "Resource": "*", "Effect": "Allow" } ] }ユーザーグループ読み取り専用ポリシー:たとえば、DASGlobalGroupReadOnly があります。このポリシーにより、ユーザーはユーザーグループの表示のみが許可されます。
{ "Version": "1", "Statement": [ { "Action": "hdm:DescribeGlobalGroups", "Resource": "*", "Effect": "Allow" } ] }
Q:一部のインスタンスが黄色でハイライト表示され、現在のユーザーがアクセス権限を持っていないことを示しているのはなぜですか?
A:黄色のハイライトは、RAM ユーザーがそのインスタンスに対するデータアクセス権限を持っていないことを示します。この問題は、次の 2 つの方法のいずれかで解決できます:
管理者に連絡する:管理者に、RAM ユーザーにインスタンスへのアクセス権限を付与するよう依頼します。
ユーザーグループ権限の付与:RAM ユーザーに DASGlobalGroupAdmin 権限を付与します。これにより、RAM ユーザーはユーザーグループを作成し、アクセス権を持つインスタンスのデータを一括で表示できます。
Q:クエリが実際にデータを返しているにもかかわらず、スロークエリログの返却行数 (Rows_sent) が 0 になるのはなぜですか?
A:これは通常、アプリケーションがサーバーサイドカーソルモードを使用しているためです。カーソルモードでは、SQL ステートメントの実行は 2 つの段階に分かれます:
EXECUTE 段階:サーバーはクエリを実行して結果セットを生成しますが、データ行をすぐにクライアントに送信しません。列定義などのメタデータのみを返します。
FETCH 段階:クライアントは
FETCHコマンドを使用してデータ行をバッチでプルします。
スロークエリログは EXECUTE 段階の統計を記録します。この段階では、MySQL はデータをスキャンしていますが (そのため
Rows_examinedは 0 ではありません)、まだクライアントにデータ行を送信していません (データは後続の FETCH 段階で送信されます)。したがって、Rows_sentは 0 として記録されます。一般的なシナリオ:
Java/JDBC:接続 URL で
useCursorFetch=trueが有効になっており、PreparedStatement.setFetchSize()が 0 より大きい値またはInteger.MIN_VALUEに設定されている場合。Python:
MySQLdb.cursors.SSCursorまたはpymysql.cursors.SSCursorが使用されている場合。ORM フレームワーク:一部のオブジェクトリレーショナルマッピング (ORM) フレームワークは、大規模なデータセットのクエリを処理する際に、デフォルトでストリーミングクエリを使用します。これはカーソルモードに基づいています。
これが原因であるかを確認するには、アプリケーションコードで
fetchSizeが設定されているか、またはストリーミングカーソルが使用されているかを確認してください。また、データベースでSHOW GLOBAL STATUS LIKE 'Com_stmt_fetch';コマンドを実行して FETCH リクエストを確認することもできます。Q:スロークエリログの完了時刻が SQL ステートメントの実際の実行時刻と異なるのはなぜですか?
A:この問題は通常、SQL ステートメントの実行時にタイムゾーンが変更されたために発生します。スロークエリログに記録される SQL 実行時間のタイムゾーンは、セッション、データベース、またはシステムレベルで設定できます。スロークエリログの時刻は、次のロジックで決定されます:データベースにタイムゾーンが設定されている場合はそのタイムゾーンが、設定されていない場合はシステムのタイムゾーンが使用されます。SQL ステートメントを使用してセッションレベルのタイムゾーンが変更された場合、スロークエリログレコードのタイムゾーンが正しく変換されないことがあります。
関連ドキュメント
DAS の自動データベース管理機能を有効にすると、データベースインスタンスでスロー SQL ステートメントが発生したときに自動的に最適化できます。