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

推薦する

MySQLはこのような更新文を決して書きません

目次序文原因現象なぜ?分析要約する序文今日は、非常に典型的な MySQL の「落とし穴」についてお話...

Vue プロジェクトをパッケージ化して Apache サーバーにデプロイする手順

開発環境では、vue プロジェクトは、ローカルで Express サーバーを構築することをベースにし...

mysql8.0.20 のデータディレクトリを移行する方法

mysql のデフォルトのストレージ ディレクトリは/var/lib/mysql/です。以下は、デフ...

HTML フォーム タグの使用方法を学ぶチュートリアル

HTML のフォームを使用して、ユーザーからさまざまな種類の入力情報を収集できます。フォームは、実際...

CentOS 7へのJenkinsのインストール手順の詳細な説明

Yum経由でJenkinsをインストールする1. インストール # yum ソースをインポート wg...

Linux システムで MySQL の文字セットを UTF8 に変更する手順

目次1. データベース内の MySQL ステータスを確認します。 2. 設定ファイルを変更します。 ...

Vueを使い始める際に習得する必要がある知識について簡単に説明します

最も人気のあるフロントエンド フレームワークの 1 つとして、Vue は多くのフロントエンド開発エン...

vuex での mapState の考え方の応用

目次1. マップ方式2. 応用背景:需要開発プロセス中に、一部のインターフェースは、ページに表示する...

デュアル VIP を使用した高可用性 MySQL クラスタの構築

目次1. プロジェクトの説明: 2. プロジェクト環境: 2. プロジェクトの手順: 3. プロジェ...

Founder フォント ライブラリの中国語と英語のファイル名比較表

Founder Type Library は、Founder Type Library ビジネス チ...

JS における for、for...in、for...of、forEach の違いと使用例

forループ基本的な構文形式: for(変数の初期化; 条件式; 演算式){ループ本体ステートメント...

Vue3 でタイマーコンポーネントをカプセル化する方法

背景一部のショッピング モールの Web ページで商品の詳細を開くと、購入数量を選択するためのカウン...

中国語ウェブコンテンツを紹介する10の経験

<br /> テキスト、シンボル、リンクの 3 つの側面に焦点を当て、主に中国語で、私の...