MySQL データベース監視ソフトウェア lepus の使用上の問題と解決策

MySQL データベース監視ソフトウェア lepus の使用上の問題と解決策

lepus3.7 を使用して MySQL データベースを監視中に、次の問題が発生しました。このブログでは、これらの問題の原因と解決策について説明します。

1. 問題1: PHPページがデータベースに接続できない

php プログラムを直接使用して php ファイルを実行すると、mysql に接続できますが、httpd 内の同じ php ページは mysql に接続できません。

lepus Web プログラム (PHP コード) がデータベースに接続できない場合、Web インターフェイスで操作を実行できません。

この目的のために、最も単純な PDO 接続テスト コードを作成しました。

PHP コードは次のとおりです。

[x@coe2coe lepus]$ cat mysql.php
<?php
 試す{
 #$dsn="mysql:host=127.0.0.1;dbname=lepus;";
 $dsn="mysql:host=11.1.1.11;dbname=lepus;";
 ユーザーID
 $pwd="XXXXXXXXX";
 $sql="now() を a として選択します";
 $dbh = 新しい PDO ($dsn、$user、$pwd);
 $stmt = $dbh->を準備します($sql);
 $stmt->execute();
 $row = $stmt->fetch(PDO::FETCH_ASSOC);
 echo "結果:".$row['a'];
 }
 キャッチ(PDOException $e) {
 echo "失敗しました:".$e->getMessage();
 }
?>

php プログラムは php ファイルを直接実行します。

[x@coe2coe lepus]$ php mysql.php
結果:2018-09-27 00:03:44

ブラウザからこのページにアクセスしてください:

失敗:SQLSTATE[HY000] [2003] '11.1.1.11' の MySQL サーバーに接続できません (13)

lepus Web プログラムによって表示されるエラー メッセージはさらに曖昧です。

理由:

Baiduで検索したところ、ようやくもっと信頼できる分析が見つかりました。

Linux (CentOS7) の selinux セキュリティ メカニズムは、httpd 内のモジュールがネットワークにアクセスすることを禁止します。

[x@coe2coe lepus]$ sudo getsebool -a |grep httpd
httpd_anon_write --> オフ
httpd_builtin_scripting --> オン
httpd_can_check_spam --> オフ
httpd_can_connect_ftp --> オフ
httpd_can_connect_ldap --> オフ
httpd_can_connect_mythtv --> オフ
httpd_can_connect_zabbix --> オフ
httpd_can_network_connect --> オフ
httpd_can_network_connect_cobbler --> オフ
httpd_can_network_connect_db --> オフ
httpd_can_network_memcache --> オフ
httpd_can_network_relay --> オフ
httpd_can_sendmail --> オフ
httpd_dbus_avahi --> オフ
httpd_dbus_sssd --> オフ
httpd_dontaudit_search_dirs --> オフ
httpd_enable_cgi --> オン
httpd_enable_ftp_server --> オフ
httpd_enable_homedirs --> オフ
httpd_execmem --> オフ
httpd_graceful_shutdown --> オン
httpd_manage_ipa --> オフ
httpd_mod_auth_ntlm_winbind --> オフ
httpd_mod_auth_pam --> オフ
httpd_read_user_content --> オフ
httpd_run_ipa --> オフ
httpd_run_preupgrade --> オフ
httpd_run_stickshift --> オフ
httpd_serve_cobbler_files --> オフ
httpd_setrlimit --> オフ
httpd_ssi_exec --> オフ
httpd_sys_script_anon_write --> オフ
httpd_tmp_exec --> オフ
httpd_tty_comm --> オフ
httpd_unified --> オフ
httpd_use_cifs --> オフ
httpd_use_fusefs --> オフ
httpd_use_gpg --> オフ
httpd_use_nfs --> オフ
httpd_use_openstack --> オフ
httpd_use_sasl --> オフ
httpd_verify_dns --> オフ

解決:

一時的な解決策: SELINUX を一時的に無効にします。

[x@coe2coe lepus]$ sudo setenforce 0

永続的な解決策: selinux 構成ファイルを変更し、SELINUX を無効にします。

[x@coe2coe lepus]$ cat /etc/selinux/config
# このファイルはシステム上の SELinux の状態を制御します。
# SELINUX= は次の 3 つの値のいずれかを取ることができます。
# enforcing - SELinux セキュリティ ポリシーが適用されます。
# permissive - SELinux は強制する代わりに警告を出力します。
# 無効 - SELinux ポリシーはロードされません。
#SELINUX=強制
SELINUX=無効
# SELINUXTYPE= は次の 3 つの値のいずれかを取ることができます。
# 対象 - 対象プロセスは保護され、
# minimum - 対象ポリシーの変更。選択されたプロセスのみが保護されます。 
# mls - マルチレベルセキュリティ保護。
SELINUXTYPE=ターゲット

確認する:

ブラウザでこの PHP ページに再度アクセスします。

結果:2018-09-27 00:09:26

2.質問 2: lepus ログにグループ別の警告が表示されます。

2018-09-27 01:12:41 [警告] チェック mysql 11.1.1.11:3408 失敗: 1055 SELECT リストの式 #2 は GROUP BY 句内になく、GROUP BY 句内の列に機能的に依存しない非集計列 'information_schema.processlist.USER' が含まれています。これは sql_mode=only_full_group_by と互換性がありません。

理由:

これは、lepus バックエンド監視プログラムによって書き込まれたログです。

デフォルトでは、sql_mode には ONLY_FULL_GROUP_BY が含まれます。

mysql> @@sql_mode を選択します。
+---------------------------------------------------------------------------------------------------------------------------------------------------------------+
| @@sql_mode |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY、STRICT_TRANS_TABLES、NO_ZERO_IN_DATE、NO_ZERO_DATE、ERROR_FOR_DIVISION_BY_ZERO、NO_AUTO_CREATE_USER、NO_ENGINE_SUBSTITUTION |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------+
セット内の1行(0.01秒)

解決:

ONLY_FULL_GROUP_BYを削除します。

sql_mode=STRICT_TRANS_TABLES、NO_ZERO_IN_DATE、NO_ZERO_DATE、ERROR_FOR_DIVISION_BY_ZERO、NO_AUTO_CREATE_USER、NO_ENGINE_SUBSTITUTION

3. 質問 3: レプリケーション監視でデータを照会できません。

データが見つかりません。

解決:

互換性を表示_56=1

4. 質問4: 表スペース分析にデータがありません。

5. 質問 5: 遅いクエリにはデータがありません。

前提:

スロー クエリ ログは、MySQL my.cnf 構成ファイルで構成されます。

遅いクエリログ=1

長いクエリ時間=10

ログ_遅い_管理_ステートメント=1

ログ_スロー_スレーブ_ステートメント=1

理由:

1.lepus スロー クエリ分析は、pecona-toolkit ツールキットの pt-query-digest プログラムに基づいています。まずこのツールキットをインストールする必要があります。

2. pt-query-digest プログラムは、lepus3.7 によって作成されたテーブルと競合します。

パイプライン プロセス 5 (反復) でエラーが発生しました: DBD::mysql::st 実行に失敗しました: 行 1 の列 'checksum' のデータが切り捨てられました [for ステートメント "REPLACE INTO `lepus`.`mysql_slow_query_review_history`(`checksum`, `sample`, `serverid_max`, `db_max`, `user_max`, `ts_min`,
.....
プロセス 4 (反復) でエラーが多すぎるため、パイプラインを終了します。

mysql_slow_query_review を変更します。

mysql> テーブル mysql_slow_query_review を変更します。チェックサム varchar(100) は null ではありません。
クエリは正常、影響を受けた行は 0 行 (0.03 秒)
レコード: 0 重複: 0 警告: 0
mysql_slow_query_review_history を変更します。
mysql> テーブル mysql_slow_query_review_history を変更します。チェックサム varchar(100) は null ではありません。
クエリは正常、影響を受けた行は 0 行 (0.02 秒)
レコード: 0 重複: 0 警告: 0
mysql> テーブル mysql_slow_query_review_history を変更し、 serverid_max smallint(4) null を変更します。
クエリは正常、影響を受けた行は 0 行 (0.02 秒)
レコード: 0 重複: 0 警告: 0

スクリプトを変更します。

元の lepus_slowquery.sh ファイルにはいくつか問題があります。

(1)lepus_server_idを手動で指定する必要があります。このスクリプトは各 MySQL サーバーに展開する必要があるため、監視する MySQL サーバーが多数ある場合は間違いが起こりやすくなります。

パラメータ lepus_server_id は非常に重要です。次のコードはこの ID を自動的に取得できます。

id=$( $mysql_client -h$lepus_db_host -P$lepus_db_port -u$lepus_db_user -p$lepus_db_password -e "$lepus_db_database.db_servers_mysql から id、ホスト、ポートを選択します。ここで、ホスト = '$mysql_host'、ポート = $mysql_port\G" 2>/dev/null |grep "id:" |awk -F": " '{print $2}')

(2)同じマシンに複数のMySQLサービスインスタンスが展開されている場合、別のスクリプトでローカルマシン上の複数のMySQLサービスインスタンスを同時にチェックするには、スケジュールされたタスクが1つだけ必要です。

全体的なタイミング スクリプトは次のとおりです。テスト中に 6 つの MySQL インスタンスが開かれ、ポートは 3306、3307、3308、3406、3407、3408 です。このうち、3306 と 3406 が MASTER で、その他は SLAVE です。この全体的なスクリプトでは、各インスタンスに対して lepus_slowquery.sh が呼び出されます。

[x@coe2coe mysql]$ cat slowquery.sh
##################################################################
# ファイル名:slowquery.sh
# 著者: [email protected]
# 作成日:2018-09-27
# 説明:http://www.cnblogs.com/coe2coe/
#################################################################
#!/bin/bash
ポート=(3306 3307 3308 3406 3407 3408)
私=0
[ $i -lt ${#ports[*]} ] の間
する
 ポート=${ポート[$i]}
 echo -e "/lepus_slowquery.sh $port"
 ./lepus_slowquery.sh $ポート 
 i=i+1とする
終わり

(3) オリジナルの lepus_slowquery.sh は MySQL のグローバル設定パラメータを変更します。個人的には変更する必要はないと思います。2 つの設定は、MySQL サーバーの my.cnf ファイルの設定に基づいている必要があります。lepus 監視システムを導入したからといって、このパラメータを勝手に変更すべきではありません。したがって、コードの最後の数行は直接コメントアウトされます。

長いクエリ時間
遅いクエリログファイル

変更された完全な lepus_slowquery.sh ファイルは次のとおりです。

[x@coe2coe mysql]$ cat lepus_slowquery.sh
#!/bin/bash
#************************************************************************#
# スクリプト名: /usr/local/sbin/lepus_slowquery.sh
# 作成日: 2014-03-25 10:01
# 変更日: 2014-03-25 10:01
#************************************************************************#
ポート=$1
id=$2
[ "$port" == "" ] の場合 || [ $port -lt 1 ] 
それから
 echo -e "無効な引数ポート"
 出口1
フィ
echo -e "mysql ポートは:{$port} "
#config lepus データベースサーバー
lepus_db_host="11.1.1.11"
lepus_db_port=3306
lepus_db_user="lepus_monitor"
lepus_db_password="XXXXXXXXX"
lepus_db_database="lepus"
#mysqlサーバーの設定
mysql_client="/usr/bin/mysql"
mysql_host="11.1.1.11"
mysql_port=$ポート
mysql_user="lepus_monitor"
mysql_password="XXXXXXXXX"
id=$( $mysql_client -h$lepus_db_host -P$lepus_db_port -u$lepus_db_user -p$lepus_db_password -e "$lepus_db_database.db_servers_mysql から id、ホスト、ポートを選択します。ここで、ホスト = '$mysql_host'、ポート = $mysql_port\G" 2>/dev/null |grep "id:" |awk -F": " '{print $2}')
[ "$id" == "" ] の場合 || [ $id -lt 1 ]
それから
 echo -e "無効な引数ID"
 出口2
フィ
echo -e "mysql lepus id は:{$id}"
#config スロークエリ
slowquery_dir="/tmp/"
slowquery_long_time=1
slowquery_file=`$mysql_client -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password -e "'slow_query_log_file' のような変数を表示" 2>/dev/null |grep log|awk '{print $2}'`
pt_query_digest="/usr/bin/pt-query-digest"
#config サーバーID
lepus_server_id=$id
#MySQL スロークエリログを lepus データベースに収集する
$pt_query_digest --user=$lepus_db_user --password=$lepus_db_password --port=$lepus_db_port --review h=$lepus_db_host、D=$lepus_db_database、t=mysql_slow_query_review --history h=$lepus_db_host、D=$lepus_db_database、t=mysql_slow_query_review_history --no-report --limit=100% --filter=" \$event->{add_column} = length(\$event->{arg}) かつ \$event->{serverid}=$lepus_server_id " $slowquery_file > /tmp/lepus_slowquery.log
##### 新しいスロークエリログを設定します ###########
#tmp_log=`$mysql_client -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password -e "select concat('$slowquery_dir','slowquery_', '$port','_', date_format(now(),'%Y%m%d%H'),'.log');" 2>/dev/null |grep log|sed -n -e '2p'`
#config mysql スロークエリ
#$mysql_client -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password -e "set global slow_query_log=1;set global long_query_time=$slowquery_long_time;" 2>/dev/null
#$mysql_client -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password -e "グローバル slow_query_log_file を '$tmp_log' に設定します。"
#7日前にログを削除
#cd $slowquery_dir
#/usr/bin/find ./ -name 'slowquery_*' -mtime +7|xargs rm -rf ;
####終わり####

6. 質問6: Webの遅いクエリではlepusでデータが見つからない

遅いクエリは mysql_slow_query_review テーブルに記録されますが、lepus Web インターフェースにはデータがありません。

実行: select sleep(14) Webインターフェース上で照会できない場合があります。

原因: pt-query-digest によって生成された結果の db_max が NULL になり、クエリが失敗することがあります。

このフィールドの元のデータベースは NOT NULL ですが、NOT NULL の場合、pt-query-digest によって NULL データを挿入することがあり、エラーが発生します。そのため、NULL に変更されました。

これを NULL に変更すると、Web インターフェイスでのクエリに使用される PHP プログラムの SQL ステートメントに問題が発生します。NULL の状況が考慮されないため、この部分のデータのクエリが失敗します。

解決:

一時的にグローバルパラメータ general_log を開き、Web のスローログをクエリすると、SQL ステートメントをすばやく見つけることができ、この SQL ステートメントに基づいて問題のある PHP コードを見つけることができます。

application/controllers/lp_mysql.php 内の次のステートメントをコメントアウトします。

変更前:

$this->db->where( "b.db_max !=", 'information_schema'");

変更後:

//$this->db->where( "b.db_max !=", 'information_schema'");

7. 質問7: ホスト監視の3つの項目にデータがありません。

原因: 監視ホストと監視対象ホストに snmpd と snmptrapd がインストールされていません。

解決:

すべてのホストに snmpd と snmptrapd をインストールします。

ソフトウェア パッケージ:

x@coe2coe snmp]$ ls ネット snmp*

ネットSNMP-5.7.2-32.el7.x86_64.rpm

ネットSNMPエージェントライブラリ5.7.2-32.el7.x86_64.rpm

ネットSNMP開発ツール5.7.2-32.el7.x86_64.rpm

ネットSNMPライブラリ5.7.2-32.el7.x86_64.rpm

ネット-snmp-perl-5.7.2-32.el7.x86_64.rpm

ネット-snmp-python-5.7.2-32.el7.x86_64.rpm

ネット-snmp-sysvinit-5.7.2-32.el7.x86_64.rpm

ネットSNMPユーティリティ5.7.2-32.el7.x86_64.rpm

これらのパッケージは CentOS7-everything-xxx.iso で入手できます。

インストールが完了したら、snmpd および snmptrapd サービスを開始します。

要約する

以上が、編集者が紹介したMySQLデータベース監視ソフトウェアlepusの使用上の問題と解決策です。皆様のお役に立てれば幸いです。ご質問がございましたら、メッセージを残してください。編集者がすぐに返信いたします。また、123WORDPRESS.COM ウェブサイトをサポートしてくださっている皆様にも感謝申し上げます。

以下もご興味があるかもしれません:
  • MySQL監視ツールmysql-monitorの詳細な説明
  • MySQL テーブルにおける非主キー列オーバーフロー監視の詳細な説明
  • Grafana+Prometheus を使用して MySQL サービスのパフォーマンスを監視する
  • Zabbix を使用して Nginx/Tomcat/MySQL を監視する方法の詳細なチュートリアル
  • MySQL インデックス使用状況監視スキル (収集する価値あり!)
  • MySQLステートメントを監視する方法の詳細な説明
  • Zabbix が MySQL のマスター/スレーブ状態を監視する方法の詳細な説明
  • PrometheusとGrafanaを使用したMySQLサーバーのパフォーマンス監視の詳細な説明
  • MySQLリアルタイム監視ツールorztopの使い方の紹介
  • 実際のシミュレーション監視MySQLサービスシェルスクリプトの概要
  • MySQLを監視するためのZabbixのインストールと設定に関する基本的なチュートリアル
  • MySQL監視グループレプリケーションについて簡単に説明します

<<:  docker run によって起動されたコンテナがハングしてデータが失われた場合の対処方法

>>:  同じページを動的にロードするための Vue ルーティングリスニングの例

推薦する

Dockerfile テキストファイルの使用例の分析

Dockerfile は、イメージをビルドするために使用されるテキスト ファイルです。テキスト コン...

Vue でコンポーネントを一括インポート、登録、使用する方法

序文コンポーネントは、非常に頻繁に使用されるものです。多くの人は、コンポーネントを 1 つのファイル...

CentOS 8.4 に Docker をインストールする詳細なチュートリアル

目次序文:システム要件:インストール環境:古いバージョンをアンインストールします: yum は具体的...

CSS3 のカラー値 RGBA とグラデーションカラーの使用方法の紹介

CSS3以前は、グラデーション画像は背景画像としてのみ使用できました。 CSS3 のグラデーション構...

Docker での Redis のマスタースレーブ構成チュートリアルの詳細説明

1. Redisイメージを取得するdocker pull redis 2. それぞれポート6379、...

Linux環境でユーザーにsudo権限を追加する方法

sudo 設定ファイルsudo のデフォルトの設定ファイルは /etc/sudoers です。一般的...

初心者向け入門講座⑧:記事サイトを簡単に作る

前回の投稿では、Web ページの作成方法について説明しました。Web サイトは多くの Web ページ...

CentOS7 上で KVM 仮想化プラットフォームを構築する (3 つの方法)

KVM はカーネルベースの仮想マシンの略で、Linux をハイパーバイザーに変換する Linux ...

Vue は PC カメラを呼び出してリアルタイムで写真を撮る機能を実装します

VueはPCカメラを呼び出してリアルタイムで写真を撮影します。参考までに、具体的な内容は次のとおりで...

フロントエンド開発に必要な共通ツール機能のまとめ

1. 時刻の書式設定とその他の方法moment.jsライブラリファイルの使用をお勧めします2. テン...

nginxリバースプロキシのyum設定の詳細な手順

パート0 背景社内のイントラネットサーバーは直接インターネットにアクセスすることはできませんが、外部...

JS を使用して要素がビューポート内にあるかどうかを確認する方法

序文要素がビューポート内にあるかどうかを監視する2つの方法を共有する1. 位置計算Element.g...

JavaScript はクラス宝くじアプレットを実装します

この記事では、クラス抽選アプレットを実装するためのJavaScriptの具体的なコードを参考までに紹...

MySQL実行計画の詳細な説明

EXPLAIN ステートメントは、MySQL がステートメントを実行する方法に関する情報を提供します...

Nginx/Httpd ロードバランシング Tomcat 設定チュートリアル

前回のブログでは、Nginx と httpd を使用して、逆生成用のバックエンド Tomcat サー...