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の使い方の詳しい説明

推薦する

Reactでカスタムフックを作成する方法を教えます

1. カスタムフックとは何かロジックの再利用簡単に言えば、カスタム フックを使用すると、特定のコンポ...

CentOS で RPM を使用して MySQL 5.6 をインストールするチュートリアル

これまでのプロジェクトはすべて Windows システム環境にデプロイされていました。今回は Lin...

MySQL 5.7.30 のインストールとアップグレードの問題に関する詳細なチュートリアル

くさびコンピュータにインストールされている MySQL のバージョンが比較的古く、おそらくバージョン...

Tomcat のパフォーマンス最適化のための Apr モジュールの構築方法

序文Tomcat は、無数のチューニング オプションを備えた、広く使用されている Java Web ...

nginx+lua を使用した単一マシンでの何万もの同時接続の実装

nginx は弊社で最もよく使用されるサーバーで、コンテンツ配信やリバース プロキシによく使用されま...

MySQL の一般的なツール例の概要 (推奨)

序文この記事では主にMySQLでよく使われるツールに関する関連コンテンツを紹介し、皆さんの参考と学習...

私の CSS フレームワーク - base.css (ブラウザのデフォルト スタイルをリセット)

コードをコピーコードは次のとおりです。 @文字セット "utf-8"; /* @...

複数の条件を持つ MySQL クエリ メソッド

複数の条件を持つ MySQL クエリ環境: MySQL 5.7 where ステートメントに複数の ...

Vue3+Element+Tsは、フォームの基本的な検索リセットやその他の機能を実装します

Vue2 の記述スタイルから Vue3 の形式に切り替えると、記述スタイルとコード構造にいくつかの変...

Windows が MySQL サービスを開始できず、エラー 1067 を報告する場合の解決策

突然、MySQLにログインすると、アクセスが拒否されたか、データベースに接続できないと表示されました...

Vue 初心者ガイド: 最初の Vue-cli スキャフォールディング プログラムの作成

1. Vue - 最初の vue-cli プログラムVueの開発はNodeJSに基づいています。実際...

SQLベースのクエリステートメント

目次1. 基本的なSELECT文1. 指定されたフィールドをクエリする3. エイリアスを設定する4....

IDEA は MySQL への接続時にエラーを報告します。サーバーが無効なタイムゾーンを返します。タブに移動して serverTimezone プロパティを設定してください。

これからの道は常に困難で、棘だらけです。歯を食いしばって、乗り越えられると信じてください。さあ、さあ...

VMWare 仮想マシン 15.X LAN ネットワーク構成チュートリアル図

最近、分散型およびビッグデータ技術について学ぶために、いくつかの仮想マシンに取り組んでいます。まず、...

Linux ncコマンドの概要

NC のフルネームは Netcat (Network Knife) で、作成者は Hobbit &a...