MySQL 検査スクリプト (必読)

MySQL 検査スクリプト (必読)

以下のように表示されます。

#!/usr/bin/env python3.5

psutilをインポートする
mysql.connectorをインポートする
argparseをインポートする
jsonをインポート
日時をインポート

def get_cpu_info(詳細):
  CPU情報={}
  詳細度 >0 の場合:
    print("[cpu] CPU情報の収集を開始します...")
  データ = psutil.cpu_times_percent(3)
  cpu_info['ユーザー'] = データ[0]
  cpu_info['システム']=データ[2]
  cpu_info['アイドル']=データ[3]
  cpu_info['iowait']=データ[4]
  cpu_info['hardirq']=データ[5]
  cpu_info['softirq']=データ[6]
  cpu_info['cpu_cores'] = psutil.cpu_count()
  詳細度 >0 の場合:
    print("{0}".format(json.dumps(cpu_info,ensure_ascii=False,indent=4)))
    print("[cpu] コレクションが完了しました...")
  cpu_infoを返す

def get_mem_info(詳細):
  メモリ情報={}
  詳細度 >0 の場合:
    print("[mem] メモリ情報の収集を開始します...")
  データ = psutil.virtual_memory()
  mem_info['total'] = データ[0]/1024/1024/1024
  mem_info['変数']=データ[1]/1024/1024/1024
  詳細>0の場合:
    print("{0}".format(json.dumps(mem_info,ensure_ascii=False,indent=4)))
    print("[mem] コレクションが完了しました...")
  mem_infoを返す

def get_disk_info(詳細):
  ディスク情報={}
  詳細度 >0 の場合:
    print("[ディスク] ディスク情報の収集を開始します...")
  パーティション = psutil.disk_partitions()
  パーティション=[(パーティション[1],パーティション[2])パーティション内のパーティションの場合、パーティション[2]!='iso9660'の場合]
  ディスク情報={}
  パーティション内のパーティションの場合:
    ディスク情報[パーティション[0]]={}
    disk_info[パーティション[0]]['fstype']=パーティション[1]
  disk_info.keys() の mount_point の場合:
    データ = psutil.disk_usage(マウントポイント)
    disk_info[マウントポイント]['合計']=データ[0]/1024/1024/1024
    disk_info[マウントポイント]['使用率']=データ[3]
  詳細度 >0 の場合:
    print("{0}".format(json.dumps(disk_info,ensure_ascii=False,indent=4)))
    print("[ディスク] コレクションが完了しました....")
  ディスク情報を返す

def get_mysql_info(cnx_args, status_list):
  設定={
    'ユーザー':cnx_args.ユーザー、
    'パスワード':cnx_args.パスワード、
    'ホスト':cnx_args.ホスト、
    'ポート':cnx_args.ポート}
  cnx=なし
  カーソル=なし
  mysql_info={}
  試す:
    cnx = mysql.connector.connect(**config)
    カーソル = cnx.cursor(準備済み = True)
    範囲(len(status_list))内のインデックスの場合:
      status_list[インデックス].get_status(カーソル)
      ステータス=ステータスリスト[インデックス]
      mysql_info[ステータス名]=ステータス値
    mysql_info['ポート'] = config['ポート']
  mysql.connector.Error を err として除く:
    印刷(エラー)
  ついに:
    カーソル!= Noneの場合:
      カーソルを閉じる()
    cnx != None の場合:
      cnx.close()
  mysql_infoを返す

クラス Status(オブジェクト):
  def __init__(自分自身、名前):
    自己.name = 名前
    self._value=なし


  def get_status(self, カーソル):
    stmt="'{0}' のようなグローバル ステータスを表示します。"format(self.name)
    カーソル.execute(stmt)
    値 = cursor.fetchone()[1].decode('utf8')
    self._value = int(値)


  @財産
  定義値(自己):
    self._value==Noneの場合:
      例外が発生します("get_status 関数を実行する前に値を取得できません")
    それ以外:
      self._value を返す

IntStatus=ステータス


クラス diskResource(オブジェクト):
  def __init__(self, マウントポイント, ステータス):
    self.mount_point=マウントポイント
    self.status = ステータス

  __str__(自分)を定義します:
    結果=''' <div class="stage-list">
          <div class="stage-title"><span>{0}</span></div>
          <div class="詳細">
            <p class="詳細リスト">
              <span class="detail-title">フォーマットを区別する</span>
              <span class="detail-describe">{1}</span>
            </p>
            <p class="詳細リスト">
              <span class="detail-title">合計スペースサイズ</span>
              {2:8.2f}G
            </p>
            <p class="詳細リスト">
              <span class="detail-title">空き容量 (%)</span>
              {3:8.2f}
            </p>
            <p class="詳細リスト">
              
            </p>
          </div>
        </div>\n'''.format(self.mount_point,self.status['fstype'],self.status['total'],self.status['used_percent'])
    結果を返す

クラス diskResources(オブジェクト):
  def __init__(自分自身、ステータス):
    自己ディスク = []
    status.keys() の mount_point の場合:
      self.disks.append(ディスクリソース(マウントポイント、ステータス[マウントポイント]))

  __str__(自分)を定義します:
    結果=''' <div class="list-item">
      <div class="カテゴリ">
        <span>ディスク</span>
      </div>
      <div class="second-stage">\n'''
    範囲(len(self.disks))内のインデックスの場合:
      結果 = 結果 + self.disks[index].__str__()
    結果=結果+''' </div>
    </div>\n'''
    結果を返す

クラス cpuResources(オブジェクト):
  def __init__(自分自身、ステータス):
    self.status = ステータス
  __str__(自分)を定義します:
    結果=''' <div class="list-item">
      <div class="カテゴリ">
        <span>CPU</span>
      </div>
      <div class="第2段階">
        <div class="ステージリスト">
          <div class="stage-title"><span>グローバル</span></div>
          <div class="詳細">
            <p class="詳細リスト">
              <span class="detail-title">ユーザースペースの使用率 (%)</span>
              <span class="detail-describe">{0}</span>
            </p>
            <p class="詳細リスト">
              <span class="detail-title">カーネルスペースの使用率 (%)</span>
              <span class="detail-describe">{1}</span>
            </p>
            <p class="詳細リスト">
              <span class="detail-title">アイドル (%)</span>
              <span class="detail-describe">{2}</span>
            </p>
            <p class="詳細リスト">
              <span class="detail-title">ハード割り込み (%)</span>
              <span class="detail-describe">{3}</span>
            </p>
            <p class="詳細リスト">
              <span class="detail-title">ソフト割り込み (%)</span>
              <span class="detail-describe">{4}</span>
            </p>
            <p class="詳細リスト">
              <span class="detail-title">io 待機時間 (%)</span>
              {5}
            </p>
            <p class="詳細リスト">

            </p>
          </div>
        </div>
      </div>
    </div>\n'''.format(self.status['user'],self.status['system'],self.status['idle'],self.status['hardirq'],self.status['softirq'],self.status['iowait'])
    結果を返す

クラス memResources(オブジェクト):
  def __init__(自分自身、ステータス):
    self.status = ステータス

  __str__(自分)を定義します:
    結果=''' <div class="list-item">
      <div class="カテゴリ">
        <span>メモリ</span>
      </div>
      <div class="第2段階">
        <div class="ステージリスト">
          <div class="stage-title"><span>グローバル</span></div>
          <div class="詳細">
            <p class="詳細リスト">
              <span class="detail-title">合計サイズ</span>
              {0:8.2f}G
            </p>
            <p class="詳細リスト">
              <span class="detail-title">フリーサイズ</span>
              {1:8.2f}G
            </p>
            
            <p class="詳細リスト">
              
            </p>
          </div>
        </div>
      </div>
    </div>'''.format(self.status['total'],self.status['avariable'])
    結果を返す


クラスmysqlResources(オブジェクト):
  def __init__(自分自身、ステータス):
    self.status = ステータス
  __str__(自分)を定義します:
    結果=''' <div class="list-item">
      <div class="カテゴリ">
        <span>MySQL</span>
      </div>
      <div class="第2段階">
        <div class="ステージリスト">
          <div class="stage-title"><span>{0}</span></div>
          <div class="詳細">
            <p class="詳細リスト">
              ログ待機
              <span class="detail-describe">{1}</span>
            </p>
            <p class="詳細リスト">
              <span class="detail-title">binlog_cache_use</span>
              <span class="detail-describe">{2}</span>
            </p>
            <p class="詳細リスト">
              <span class="detail-title">temp_disk_table を作成します</span>
              <span class="detail-describe">{3}</span>
            </p>
                        <p class="詳細リスト">
                            <span class="detail-title">遅いクエリ</span>
                            <span class="detail-describe">{4}</span>
                        </p>

            <p class="詳細リスト">
              
            </p>
          </div>
        </div>
      </div>
    </div>'''.format(self.status['port'],self.status['Innodb_log_waits'],self.status['Binlog_cache_use'],
             self.status['Created_tmp_disk_tables']、self.status['Slow_queries'])

    結果を返す

クラスhostResources(オブジェクト):
  def __init__(self,cpu_info,mem_info,disk_info,mysql_info,report_title='MySQL 検査レポート'):
    self.cpu = cpuResources(cpu_info)
    自己.mem = memResources(mem_info)
    self.disk = ディスクリソース(disk_info)
    self.mysql = mysqlResources(mysql_info)
    self.report_title = レポートタイトル
  __str__(自分)を定義します:
    結果='''<!DOCTYPE html>
<html lang="ja">
<ヘッド>
  <メタ文字セット="UTF-8">
  <title>検査報告書</title>
<スタイル>
*{
  マージン: 0;
  パディング: 0;
}
  。コンテンツ{
    幅:1000ピクセル;
    高さ: 自動;
    マージン: 30px 自動;
    ボーダー下部:1px 実線 #b2b2b2;
  }
  .リスト項目{
    境界線:1px 実線 #b2b2b2;
    下部境界線: なし;
    移行: すべて .35;
    オーバーフロー: 非表示;
    ディスプレイ: フレックス;
  }
  .リスト項目:空{
    表示: なし;
  }
  .トップタイトル{
    行の高さ: 32px;
    フォントサイズ: 16px;
    色: #333;
    テキストインデント: 10px;
    フォントの太さ: 600;
  }
  。カテゴリ{
    幅:97px;
    高さ: 自動;
    右境界線: 1px 実線 #b2b2b2;
    フロート: 左;
    テキスト配置: 中央;
    位置: 相対的;
  }
  .stage-title>スパン、
  .カテゴリ>span{
    表示: ブロック;
    高さ: 20px;
    幅:100%;
    テキスト配置: 中央;
    行の高さ: 20px;
    位置: 絶対;
    上位: 50%;
    上マージン: -10px;左: 0;
  }
  .第2段階{
    幅:900ピクセル;
    フロート: 左;
  }
  .ステージリスト{
    下境界線: 1px 実線 #b2b2b2;
    ディスプレイ: フレックス;
  }
  .ステージリスト:最後の子{
    下境界線: 0;
  }
  .ステージタイトル{
    幅:99px;
    右境界線: 1px 実線 #b2b2b2;
    位置: 相対的;
  }
  。詳細{
    フレックス: 1;
  }
  .詳細リスト{
    下境界線: 1px 実線 #b2b2b2;
    高さ: 40px;
    ディスプレイ: フレックス;
    移行: すべて .35;
  }
  .詳細タイトル{
    パディング: 10px;
    高さ: 20px;
    行の高さ: 20px;
    右境界線: 1px 実線 #b2b2b2;
    幅:200px;
  }
  .詳細説明{
    フレックス: 1;
    パディング: 10px;行の高さ: 20px;
  }
  .詳細リスト:最後の子{
    下境界線: 0;
  }
  .list-item:hover{
    背景色: #eee;
  }
  .detail-list:hover{
    背景色: #d1d1d1;
  }
</スタイル>
</head>
<本文>
  <div class="content">
        <div class="リスト項目">
            <p class="top-title">レポートタイトル</p>
        </div>\n'''

    結果 = result.replace('report_title', self.report_title)
    結果 = 結果 + self.cpu.__str__()
    結果 = 結果 + self.mem.__str__()
    結果 = 結果 + self.disk.__str__()
    結果 = 結果 + self.mysql.__str__()
    結果=結果+''' </div>
</本文>
</html>'''
    結果を返す


__name__=="__main__"の場合:
  パーサー = argparse.ArgumentParser()
  parser.add_argument('--verbose',type=int,default=1,help='出力の詳細')
  parser.add_argument('--user',default='chkuser',help='mysqlに接続するためのユーザー名')
  parser.add_argument('--password',default='123456',help='mysql に接続するためのユーザーパスワード')
  parser.add_argument('--host',default='127.0.0.1',help='mysql ホスト IP')
  parser.add_argument('--port'、デフォルト=3306、タイプ=int、ヘルプ='mysql ポート')
  parser.add_argument('--int-status',default=('Com_select,Com_insert,Com_update,Com_delete,Innodb_log_waits,'
                        'Binlog_cache_disk_use、Binlog_cache_use、作成されたtmp_disk_tables、'
                        'Slow_queries')
            、help = 'mysql ステータスの値は int のように')
  parser.add_argument('--report-title',default='MySQL 検査レポート',help='レポートのタイトル')
  parser.add_argument('--output-dir',default='/tmp/',help='デフォルトのレポートファイル出力パス')
  引数 = パーサー.parse_args()
  cpu_info = get_cpu_info(args.verbose)
  mem_info = get_mem_info(args.verbose)
  disk_info = get_disk_info(args.verbose)
  status_list=[IntStatus(name=item) args.int_status.split(',')] 内のアイテム
  mysql_info = get_mysql_info(引数、ステータスリスト)
  #dr=ディスクリソース(ディスク情報)
  #cr=cpuリソース(cpu_info)
  #mr=memResources(mem_info)
  #msr=mysqlリソース(mysql_info)
  hr = ホストリソース(cpu_info、mem_info、disk_info、mysql_info、args.report_title)
  now = str(datetime.datetime.now()).replace(' ','^')
  args.output_dir.endswith('/') != True の場合:
    args.output_dir = args.output_dir + '/'
  ファイル名=args.output_dir+'mysql_inspection_{0}.html'.format(現在)
  出力としてopen(filename,'w')を使用します:
    出力を書き込みます(hr.__str__())
  print('[レポート] レポートが {0} に保存されました。OK.... ....'.format(filename))

上記のMySQL検査スクリプト(必読)は、編集者が皆さんと共有する内容のすべてです。参考になれば幸いです。また、123WORDPRESS.COMを応援していただければ幸いです。

<<:  CentOS の環境変数と設定ファイルの詳細な説明

>>:  サブメニューをクリックする効果を実現するJavaScript

推薦する

CSSスプライトの応用の詳細な説明

CSS Sprite は、CSS スプライトとも呼ばれ、画像結合技術です。この方法は、複数の小さなア...

Centos7 に Nginx 統合 Lua サンプル コードをインストール

序文私が使用しているパソコンはMacで、OSはmacOS Mojaveです。コンピュータに仮想マシン...

Vue+Openlayer で select を使用して要素を選択する実装コード

効果画像: 実装コード: <テンプレート> <div id="map&q...

React でカレンダー コンポーネントを構築するためのステップ バイ ステップ ガイド

目次事業背景テクノロジーの活用技術的な問題デザインのアイデア😱 困惑と苦痛に満ちた顔🙄考え始める🌲デ...

Nginx が Apache より優れている理由

Nginx は、わずか数年で Web サーバー市場の大部分を占めるようになりました。周知のとおり、N...

iframe パラメータの説明と例

<iframe src=”test.jsp” width=”100″ height=”50″ ...

HTMLハイパーリンクタグAのTARGET属性の詳細な説明

ハイパーリンク <a> タグはリンク ポイントを表します。これは英語の単語「anchor...

MySQLで大きなテーブルをエレガントに削除する方法について簡単に説明します

目次1. 切り捨て操作1.1 MySQL truncate はどのような操作を実行しますか? 1.2...

HTML に画像が存在しない場合にデフォルトの画像を表示する方法の例

画像リンク <img src="" /> jsを使用してURLが有効...

ジョセフリング問題を解決する 3 つの JavaScript メソッド

目次概要問題の説明循環リンクリスト順序付き配列数学的再帰要約する概要ジョセフ・リング問題は、ジョセフ...

JSONデータをHTMLで表示する方法

背景:場合によっては、json データをページに直接表示する必要があります (たとえば、インターフェ...

JavaScript タイマーの詳細

目次1. 簡単な紹介2. 間隔を設定する2.1 説明2.2 パラメータ2.3 戻り値2.4 使用法3...

MySQLは文字列関数のSQL文をインターセプトします

1. left(name,4)は左の4文字をインターセプトしますリスト: SELECT LEFT(2...

【HTML要素】画像の埋め込み方法

img 要素を使用すると、HTML ドキュメントに画像を埋め込むことができます。画像を埋め込むには、...

JavaScript Proxyオブジェクトの詳細な説明

目次1. プロキシとは何ですか? 2. 使い方は? 1. プロキシを使用する簡単な例2. 対象オブジ...