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

推薦する

不規則な投影を実現するためのボックスシャドウとドロップシャドウのサンプルコード

border-radius で生成できる四角形やその他の図形に影を追加する場合 (「Adaptive...

Navicat Premium が MySQL 8.0 に接続してエラー「1251」を報告する問題を解決する方法の分析

長い間何もしていなかった人は、努力をすると一生懸命働いていると思うようになります。 1. 問題Nav...

コンテナDockerCommitを介してイメージを送信し、DockerPushでイメージをプッシュします。

ローカルでコンテナを作成した後、このコンテナに基づいてローカル イメージを作成し、このイメージを D...

JavaScript データ型変換の例 (他の型を文字列、数値型、ブール型に変換する)

序文データ型変換とは何ですか?フォームまたはプロンプトを使用して取得されるデフォルトのデータ型は文字...

MySQLフィールド定義でnullを使用しない理由の分析

NULL が頻繁に使用されるのはなぜですか? (1)Javaのnull Java の NullPoi...

vue-cli 3 で vue-bootstrap-datetimepicker 日付プラグインを使用する方法

需要背景最近、Vue を使用してフロントエンド エンジニアリング システムと組み合わせ、以前のデモを...

jQueryのチェーンプログラミングスタイルの詳細な例

チェーンプログラミングの実装原理jQuery を使用すると、開発者は常にドット構文を使用して独自のメ...

Docker Docker の保存場所を変更する コンテナイメージのサイズ制限を変更する操作

これは新しいバージョンではもう不可能なようで、推奨されません。そうでない場合は、ソフト リンクを直接...

トランジションコンポーネントのアニメーション効果を使用した Vue サンプルコード

トランジションドキュメントアドレスは、フェードインとフェードアウト効果を実現するための背景ポップアッ...

Firefox で Webdings フォントをサポートする方法

Firefox、Opera、その他のブラウザは Webdings フォントをサポートしていません。回...

JSはカリキュラムタイムテーブルアプレット(スーパーカリキュラムタイムテーブルを模倣)を実装し、カスタムバックグラウンド機能を追加します

概要:市販されているいくつかのタイムテーブルソフトウェアから教訓を得ました。機能が複雑すぎるため、タ...

Quickjs は JavaScript サンドボックスの詳細をカプセル化します

目次1. シナリオ2. 基盤となるAPIを簡素化する2.1 自動的に破棄を呼び出す2.2 VM値を作...

背景のグラデーションと自動フルスクリーンを実現するCSSコード

背景グラデーションと自動フルスクリーンに関する CSS の問題編集長は CSS の開発中に致命的な問...

HTML ブロックレベルタグとインラインタグの違い

1. ブロックレベル要素: 独立して存在できる能力を指します。通常、ブロックレベル要素は改行によって...

.html、.htm、.shtml、.shtm の違いと関連性について簡単に説明します。

ご存知のとおり、私たちが毎日閲覧する Web ページ、Web サイト、または Web ページには独自...