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

推薦する

HTTP ステータス コード

このステータス コードは、リクエストのステータスに関する情報を提供し、サイトとリクエストされたページ...

Centos サーバーに MySql をデプロイし、Navicat に接続するプロセスの詳細な説明

(1)サーバー構成: [root@localhost ~]# cd /usr/local/src/ ...

Linux システムの最適化 (カーネルの最適化) に関するいくつかの提案

スワップを無効にするサーバーがデータベース サービスまたはメッセージ ミドルウェア サービスを実行し...

Debian ベースの Linux システム ソフトウェア インストール コマンドの詳細な説明 (推奨)

Debian の紹介Debian は、広い意味では、フリーなオペレーティング システムの作成に専念...

MySQL 5.7.18 アーカイブ圧縮版のインストールチュートリアル

この記事では、MySQL 5.7.18アーカイブ圧縮版をインストールする具体的な方法を参考までに紹介...

静的リソースファイルのアクセスログをフィルタリングするNginxの実装

乱雑なログ日常的に使用される Nginx は、静的リソース サーバーとリバース プロキシ サーバーの...

Vue でメニュー権限制御を実装するためのサンプルコード

バックエンド管理システムで作業している場合、通常、メニュー権限制御に関連する問題に遭遇します。もちろ...

HTML チュートリアル: 画像のサイズ、配置、間隔、境界線の属性を変更する方法

画像タグ: <img> ページに画像を挿入するには、「src」属性を持つ「img」タグを...

SQL と NoSQL の違いのまとめ

主な違い: 1. タイプSQL データベースは主にリレーショナル データベース (RDBMS) とし...

Vue を使用して Web ページのスクリーンショットを撮る方法をご存知ですか?

目次1. html2Canvasをインストールする2. 必要なVueコンポーネントを導入する3. ス...

win10でのmysql5.7.21解凍バージョンのインストールチュートリアル

次のように、Win10でMysqlの解凍バージョンをインストールします。環境: win10 64ビッ...

MySQL の null と not null、null と空の値の違いの詳細な説明 ''''

MySQL を長い間使用してきた多くの人は、これら 2 つのフィールド属性の概念をまだよく理解して...

JS でモバイルのインタラクティブ エクスペリエンスを向上させる方法

目次1. 即時フィードバック1.1 ボタンからの即時フィードバック1.2 継続的なフィードバック1....