プレビュー
この機能はまだ開発中ですが、ぜひお試しください。
この機能は現在、弊社のプレリリース ポリシーに従ってプレビューの一部として提供されています。
NRDOT Collectorを使用してMySQLを監視する際に発生する可能性のある一般的な問題をトラブルシューティングします。
接続をテストする
MySQLへのネットワーク接続をテストしてください
まず、ポートに到達可能であるかを確認してください:
$nc -zv <YOUR_DB_HOST> <YOUR_DB_PORT>
次に、監視ユーザーが実際に認証してクエリを実行できることを確認します:
$mysql -h <YOUR_DB_HOST> -P <YOUR_DB_PORT> -u <YOUR_DB_USERNAME> -p -e "SELECT 1;"
コマンドがエラーなしで完了した場合、監視ユーザー、ホスト、およびポートはすべて正しいです。
OTLPエンドポイントの接続テスト
次を実行して、ホストが選択したNew Relic OTLPエンドポイントに到達できることを確認します:
$ENDPOINT="<YOUR_NEWRELIC_OTLP_ENDPOINT>"
$HOST=$(echo "$ENDPOINT" | sed 's|https://||' | cut -d: -f1)
$PORT=$(echo "$ENDPOINT" | awk -F: '{print $NF}')
$(timeout 2 bash -c "</dev/tcp/$HOST/$PORT" && echo "SUCCESS") || echo "FAILED"
期待される出力: SUCCESS
よくある問題
症状: New Relicでクエリサンプルと上位クエリのログイベントが欠落しています。
考えられる原因:
パフォーマンススキーマが有効になっていることを確認してください:
SHOW VARIABLES LIKE 'performance_schema';
値はONである必要があります。
レシーバーの設定を確認します:
データベースの権限を確認します:
SHOW GRANTS FOR '<YOUR_DB_USERNAME>'@'%';
performance_schema.*にSELECTを含める必要があります。
症状: ロック待機時間のメトリクスが常に0秒を示しています。
原因: events_waits_currentパフォーマンススキーマの消費者が無効になっています。
解決策:
セルフマネージドMySQLデータベースの場合: my.cnf/my.iniに追加します:
performance-schema-consumer-events-waits-current=ON
次に、MySQLを再起動します。
AWS RDSの場合:
UPDATE performance_schema.setup_consumers
WHERE NAME='events_waits_current';
重要
RDSでは、この設定は再起動後に保持されません。コレクターが自動的に再有効化できるように、監視ユーザーにperformance_schema.setup_consumersのUPDATE権限を付与してください。
症状: 一部のクエリ、特に長いクエリでmysql.query_planが空になります。
原因: ステートメントテキストがMySQLのダイジェスト長制限によって切り捨てられたため、レシーバーはEXPLAINをスキップしました。
解決策: MySQLサーバーのパラメーターを増やしてください:
SET GLOBAL max_digest_length = 4096;
SET GLOBAL performance_schema_max_digest_length = 4096;
SET GLOBAL performance_schema_max_sql_text_length = 4096;
永続化するには、my.cnfに追加します:
performance_schema_max_digest_length = 4096
performance_schema_max_sql_text_length = 4096
症状: db.server.top_queryイベントで利用できるクエリプランがありません。
原因: 予想される動作 — query_sample_textはMySQL 5.7.xまたは8.0.0~8.0.2には存在しません。
解決策: クエリプランをサポートするには、MySQL 8.0.3以降にアップグレードしてください。
症状: UPDATE、INSERT、DELETE、またはREPLACEステートメントのクエリプランが欠落しています。
原因: 監視ユーザーにDML権限がなく、explain_modeがinlineに設定されています。
解決策: レシーバーの設定でprocedureモードに切り替えてください:
これは、監視ユーザーにDML権限を付与せずに書き込みステートメントを説明するために、SQL SECURITY DEFINERプロシージャを使用します。
症状: 一部のデータベース接続でmysql.session.client_name属性が空になっています。
原因: バグではありません — 一部のクライアントドライバーは、デフォルトで接続属性を送信しません。
メモ:
- これはデータに依存する動作です。
- 異なるMySQLクライアントライブラリでは、接続属性のサポートが異なります。
- すべてのアプリケーションがこの情報を送信するようにドライバーを設定しているわけではありません。
症状: APMの相関タグがSQLコメントから抽出されていません。
原因: コメントタグの抽出が設定されていません。
解決策: 設定の両方のコレクションブロックにallowed_comment_keysを追加してください:
allowed_comment_keys: [nr_service_guid]
allowed_comment_keys: [nr_service_guid]
セキュリティ上の理由から、コメントタグの抽出はデフォルトで空になっています。
症状:
エンティティエクスプローラーからMySQLエンティティが欠落している
APMアプリケーションにデータベースの関連付けが表示されない
原因: エンティティの合成に必要なserver.addressおよびserver.portリソース属性が欠落しています。
解決策: コレクターの設定にリソースプロセッサを追加します:
processors: [resource/mysql, batch]
exporters: [otlp/newrelic]
processors: [resource/mysql, batch]
exporters: [otlp/newrelic]
症状:
"接続拒否"エラー
"アクセス拒否" の認証失敗
解決策:
接続拒否の場合:
MySQLが実行されていることを確認します:
ファイアウォールのルールでMySQLポート(デフォルトは3306)での接続が許可されていることを確認します。
MySQL設定のbind-addressが外部接続を許可していることを確認してください。
認証エラーの場合:
ユーザーが存在し、正しい権限を持っていることを確認します:
SELECT User, Host FROM mysql.user WHERE User='<YOUR_DB_USERNAME>';
SHOW GRANTS FOR '<YOUR_DB_USERNAME>'@'%';
パスワードが正しいことを確認します。
RDSの場合は、セキュリティグループがインバウンド接続を許可していることを確認してください
RDSパフォーマンススキーマの消費者リセット: RDSの再起動/フェイルオーバー時に、events_waits_current消費者は自動的に無効になります。コレクターが再度有効にできるように、performance_schema.setup_consumersにUPDATE権限を付与してください:
GRANT UPDATE ON performance_schema.setup_consumers TO '<YOUR_DB_USERNAME>'@'%';
RDSネットワークセキュリティ: RDSセキュリティグループが、NRDOT CollectorのIPアドレスまたはセキュリティグループからのポート3306のインバウンドトラフィックを許可していることを確認してください。
症状: コレクターが接続に失敗し、証明書またはTLS関連のエラーが発生します。
原因: RDSがTLSを強制しています。コレクターはデフォルトでAmazonのRDS CAを信頼しません。
解決策: tls.ca_file(またはtls.ca_pem)をAmazon RDS証明書バンドルに設定し、tls.insecure/tls.insecure_skip_verifyはfalseのままにします:
insecure_skip_verify: false
ca_file: /path/to/global-bundle.pem
NRQL クエリの例
以下のNRQLクエリを使用して、MySQL監視のトラブルシューティングと検証を行います:
ブロックされたクエリを確認してください。
FROM Log SELECT * WHERE event.name = 'db.server.query_sample'
AND mysql.blocking.blocker.count > 0
ヒント
!= 0ではなくmysql.blocking.blocker.count > 0でフィルタリングします — NRQLでは、null != 0はTRUEと評価され、ブロックされていないセッションが結果に暗黙的に含まれることになります。
最も遅いクエリを検索
FROM Log SELECT db.query.text,
mysql.events_statements_summary_by_digest.sum_timer_wait,
mysql.events_statements_summary_by_digest.count_star
WHERE event.name = 'db.server.top_query'
ORDER BY mysql.events_statements_summary_by_digest.sum_timer_wait DESC
エンティティ合成を検証してください。
FROM Metric SELECT uniqueCount(entity.guid)
WHERE metricName LIKE 'mysql.%'
FACET server.address, server.port
助けを得る
問題が引き続き発生する場合:
NRDOT Collectorのログを確認します:
$journalctl -u nrdot-collector -f
設定の構文を確認してください:
$nrdot-collector validate --config=<your-config-file>
互換性要件を確認してください。
コレクターのログと設定を添えてNew Relicサポートにお問い合わせください(パスワードなどの機密情報は削除してください)。