Mysql sql スロークエリ監視スクリプトコード例

Mysql sql スロークエリ監視スクリプトコード例

1. my.cnfを変更する

#全体的な効果としては、グローバルがオンになっている場合はテーブルとログ ファイルの両方が書き込まれますが、general_log の場合はテーブルのみが書き込まれ、slow_query_log の場合はテーブルとログ ファイルの両方が記録されます。
general_log=1#MySQL SQL実行ログを開く slow_query_log=1#MySQLの低速SQLログを開く #設定後はgeneral_logとslow_query_logに影響します。
log_output=table,File#ログ出力はテーブルとログファイルに書き込まれます。プログラムがカウントしやすいように、テーブルに書き込むのが最適です#General_log_fileはここでは設定されていないため、general_logはテーブルにのみ書き込みます#mysql5.1.29以降では、次のように設定してmysqlを開き、実行されたSQLをファイルに記録します#general_log_file=/log/general.log

#5.1.29 以前:
#log=/var/lib/mysql/sql_row.log
long_query_time=1#MySQL のスロークエリを 1 秒以上かかるクエリに設定します slow_query_log_file=/log/slow.log

2. MySQLのログテーブルのフォーマットを変更する(MySQLライブラリ内)

#デフォルトでは、general_log は csv 形式です。MyISAM 形式に変更すると、クエリの効率が向上します。

グローバル general_log をオフに設定します。

テーブル general_log を変更します。エンジン = MyISAM;

グローバル general_log をオンに設定します。

#デフォルトの slow_query_log は csv 形式です。これを MyISAM 形式に変更すると、クエリの効率が大幅に向上します。

グローバル slow_query_log = off; を 0 に設定すると同じ効果があります

テーブル slow_log を変更します。エンジン = MyISAM;

グローバルslow_query_log = on;を1に設定すると同じ効果があります

3. MySQL のログ テーブル (general_log と slow_query_log) は変更できないため、削除や変更が簡単な新しいテーブルを作成する必要があります (このログ テーブルは大きすぎるため、n 日前のデータを定期的にクリーンアップする必要があります)

slow_log_dbaテーブルを作成する

テーブル `slow_log_dba` を作成します (
 `start_time` タイムスタンプ NOT NULL デフォルト CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP、
 `user_host` mediumtext NULLではありません。
 `query_time` 時間が NULL ではない、
 `lock_time` 時間が NULL でない、
 `rows_sent` int(11) NOT NULL,
 `rows_examined` int(11) NOT NULL,
 `db` varchar(512) NOT NULL、
 `last_insert_id` int(11) NULLではない、
 `insert_id` int(11) NULLではない、
 `server_id` int(10) 符号なし NOT NULL,
 `sql_text` 中テキスト NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='dba の遅いログ';

general_log_dbaテーブルを作成する

テーブル `general_log_dba` を作成します (
 `event_time` タイムスタンプ NOT NULL デフォルト CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP、
 `user_host` mediumtext NULLではありません。
 `thread_id` int(11) NULLではない、
 `server_id` int(10) 符号なし NOT NULL,
 `command_type` varchar(64) NOT NULL,
 `argument` mediumtext NOT NULL、
 キー `user_host` (`user_host`(200))、
 キー `event_time` (`event_time`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='dba op の一般ログ';

4. プログラムは最終的にgeneral_log_dbaテーブルとslow_log_dbaテーブルを使用するため、general_logとslow_query_logのデータをgeneral_log_dbaとslow_log_dbaに定期的にコピーする必要があります。

レポートは 1 日に 1 回生成されるため、このアクションは 1 日に 1 回のみ実行する必要があります。

#スクリプトは10日間のデータを保存し、general_logとslow_query_logのデータを毎日general_log_dbaとslow_log_dbaにコピーします

#スケジュールされたタスクとして 1 日に 1 回 mysqllogtable.sh を実行します

#!/bin/sh

NDaysAgo=$(日付 -d '-10 日' "+%F %H:%M:%S")

/usr/local/mysql/bin/mysql -uXXXX -p'xxxxxxxx' -D'mysql' -e "general_log_dba を挿入し、general_log から * を選択します。

general_logを切り捨てます。

general_log_dba から、event_time < \"$NDaysAgo\" となる部分を削除します。

slow_log_dba を挿入します。slow_log から * を選択します。

slow_logを切り捨てます。

slow_log_dba から start_time < \"$NDaysAgo\"" を削除します

5. 毎日の MySQL の SQL 操作とスロークエリをカウントする Python スクリプトを作成します (スクリプトの一部は抽象メソッドなので、ご自身の判断で処理してください)

MySQL の毎日の実行記録をカウントするスクリプト

# -*- コーディング: utf-8 -*-
__author__ = '川'
MySQLdbをmysqlとしてインポートする
輸入再
datetime から datetime、timedelta をインポート
smtplibをインポートする
email.mime.text から MIMEText をインポートします
def sendHtmlMail(メールコンテンツ、myip):
  試す:
    yestoday=(datetime.now()-timedelta(days=1)).strftime("%Y-%m-%d")
    送信者 = '[email protected]'
    受信者 = ['[email protected]']
    件名 = myip+'mysql 操作レポート '+yestoday
    SMTPサーバー = 'smtp.exmail.xx.com'
    ユーザー名 = '[email protected]'
    パスワード = 'xxxxx'
    msg = MIMEText(mailcontent,'html','utf-8')#'Hello','text','utf-8'
    msg['件名'] = 件名
    msg['From'] = 送信者
    メッセージ['宛先'] = '[email protected]'
    SMTP = smtplib.SMTP()
    smtp.connect(smtpserver)
    smtp.login(ユーザー名、パスワード)
    smtp.sendmail(送信者、受信者、msg.as_string())
    SMTP.終了()
  例外を除く、e:
    e,'メール送信エラー' を印刷
__name__ == '__main__' の場合:
  結果=なし
  htmlファイル='mysqlLogMon.html'
  myiplist=['192.168.10.10','192.168.10.19']
  yestoday=(datetime.now()-timedelta(days=1)).strftime("%Y-%m-%d 00:00:00")
  今日 = datetime.now().strftime("%Y-%m-%d 00:00:00")
  myiplist 内の myip の場合:
    sql="event_time >='%s' かつ event_time <='%s' である、user_host、general_log_dba からの引数を選択" %(yestoday、today)
    試す:
      dbcon = mysql.connect(ホスト=myip、ユーザー='xxxxx'、パスワード='xxxxx'、db='mysql'、ポート=3306、文字セット='utf8')
      cur = dbcon.cursor()
      「ステップ 1、」+myip+'、'+datetime.now().strftime("%Y-%m-%d %H:%M:%S") を印刷します。
      cur.execute(sql)
      結果 = cur.fetchall()
      cur.close()
      dbcon.close()
    例外を除く、e:
      e,'conn mysql error' を印刷します
    user_host_set=設定()
    「ステップ 2、"+myip+','+datetime.now().strftime("%Y-%m-%d %H:%M:%S") を印刷します。
    すべてハッシュ={}
    結果:
      user_hostの場合、結果の引数:
        argument_delcom=re.compile(r'(\/\*(\s|.)*?\*\/)').sub("",argument).strip().replace(u"\x00",'').lower()
        re.compile(r'^access.*').match(argument_delcom) または re.compile(r'^.*@.*on.*').match(argument_delcom) または re.compile(r'^grant.*').match(argument_delcom) の場合:
          tmpargument = argument_delcom.strip()
        それ以外:
          tmpargument=argument_delcom.split(' ')[0].strip()
          len(tmpargument)>30の場合:
            #一部のSQLはu'select\n\t\t\t\t\tcount(m.enquirymainid)'ですが、print repr(tmpargument)を使用できます。
            tmpargument=argument_delcom.split('\n')[0].strip()
        # すべてコメントの場合、tmpargument または tmpargument.strip()=='' または tmpargument.strip()==' ' でなければ、この項目はカウントされません:
          続く
        allhash.has_key(user_host)の場合:
          allhash[user_host][tmpargument]=allhash[user_host].get(tmpargument,0)+1
        それ以外:
          allhash[user_host]={tmpargument:1}
      「ステップ 3、"+myip+','+datetime.now().strftime("%Y-%m-%d %H:%M:%S") を印刷します。
      headhtml='''
      
      '''
      「ステップ 4、"+myip+','+datetime.now().strftime("%Y-%m-%d %H:%M:%S") を印刷します。
      open(htmlfile,'w') を htmlfileobj として実行します:
        htmlfileobj.write(headhtml)
        htmlfileobj.flush()
      「ステップ 5、"+myip+','+datetime.now().strftime("%Y-%m-%d %H:%M:%S") を印刷します。
      open(htmlfile,'a') を htmlfileobj として実行します:
        allhash.keys() のホストキーの場合:
          listtmp=sorted(allhash[hostkey].iteritems(),key=lambda labkey:labkey[1],reverse=True)
          rowspan = len(allhash[ホストキー])
          #htmlfileobj.write()
          tmpline = '' % (rowspan、hostkey.encode ('utf-8'))
          htmlfileobj.write(tmpline)
          カウントn=0
          runsqlの場合、listtmp内のカウント:
            countn==0の場合:
              tmpline='' %(runsql.encode('utf-8'),count)
            それ以外:
              tmpline='' %(runsql.encode('utf-8'),count)
            カウントn+=1
            htmlfileobj.write(tmpline)
        tmpline='''
ユーザーが SQL を実行した回数は %s %s %s でした
%s %s
'''
        htmlfileobj.write(tmpline)
      open(htmlfile,'r') を htmlfileobj として実行します:
        メールコンテンツ = htmlfileobj.read()
      sendHtmlMail(メール内容、myip)
    それ以外:
      'SQL の結果は None です。終了しています' と出力します
    「ステップ 6、"+myip+','+datetime.now().strftime("%Y-%m-%d %H:%M:%S") を印刷します。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • MySQL の遅いクエリの落とし穴
  • MYSQL スロークエリとログの例の説明
  • MySQL スロークエリログの役割と公開
  • MYSQL スロークエリとログ設定とテスト
  • MySQL スロークエリログの有効化と設定
  • MySQL の遅いクエリの例
  • MySQL の遅いクエリを見つける方法
  • MySQL のスロークエリの方法と例
  • MySQL 5.7 のスロークエリログの時間がシステム時間より 8 時間遅れている理由の詳細な説明
  • MySQL の遅いクエリの最適化方法と最適化の原則
  • MySQL スロークエリを通じて MySQL のパフォーマンスを最適化する方法
  • MySQLのスレッド実行の急増とクエリの遅延の問題を解決する

<<:  HTML における rel="nofollow" の役割と rel 属性の使用を分析する

>>:  docker-machineの使い方の詳しい説明

推薦する

Vue3+Vue-cli4 プロジェクトで Tencent スライダー検証コードを使用する方法

導入:従来の画像検証コードと比較して、スライダー検証コードには次の利点があります。サーバーは検証コー...

Dockerはnextcloudを使用してプライベートBaiduクラウドディスクを構築します

突然、ドキュメントの保存と共同作業のためのプライベート サービスを構築する必要がありました。多くの場...

MySQL で時刻と日付の型を保存する際の選択問題を分析する

一般的なアプリケーションでは、timestamp、datetime、int 型を使用して時間形式を保...

メタを使用してトラフィックキャッシュをキャンセルし、ページにアクセスするたびにページを更新して簡単にデバッグできるようにします。

コードをコピーコードは次のとおりです。 <!-- ブラウザがローカル キャッシュからページにア...

JavaScript の静的スコープと動的スコープを例を使って説明します

目次序文静的スコープと動的スコープ静的スコープ実行プロセス動的スコープ実行プロセスエクササイズ練習1...

Vueカスタムテーブル列実装プロセス記録

目次序文レンダリングsetTable コンポーネント使用結論序文フォームを使用して PC 側のプロジ...

画像のフェードインとフェードアウト効果を実現する js

この記事では、画像のフェードインとフェードアウトを実現するためのjsの具体的なコードを参考までに紹介...

CSS 背景と境界タグの例の詳細な説明

1. CSS背景タグ1.背景色を設定するbackground-ground-color プロパティは...

Javascriptの基本を詳しく説明

目次変数データ型拡張ポイント要約する変数基本的な構文 var age=10; //ageという変数を...

自動的にフォーカスを取得する要素入力ボックスの実装

最近のプロジェクトでフォームを作成するときに、コメント ボックスまで自動的にスクロールし、コメント ...

Alibaba Cloud ドメイン名と IP バインディングの手順と方法

1 Alibaba Cloud コンソールに入り、ドメイン名コンソールを見つけて、バインドするドメイ...

MySQL データベースの一般的な基本操作の分析 [データベースの作成、表示、変更、削除]

この記事では、例を使用して、MySQL データベースの一般的な基本操作について説明します。ご参考まで...

Vueは開始時間と終了時間の範囲クエリを実装します

この記事では、Vueで開始時間と終了時間の範囲を照会する方法を参考までに紹介します。具体的な内容は次...

MySQLにおける正規表現の一般的な使用法

MySQL における Regexp の一般的な使用法特定の文字列を含むあいまい一致# コンテンツフィ...

Vue が scss (mixin) をグローバルに導入

目次1. ミックスイン.scss 2. 単一ファイルの使用3. グローバルマウント3.1 依存関係の...