ホームページ  >  記事  >  データベース  >  MySQLを監視しながらテーブル情報を収集するコードの詳細説明(画像とテキスト)

MySQLを監視しながらテーブル情報を収集するコードの詳細説明(画像とテキスト)

黄舟
黄舟オリジナル
2017-03-18 14:39:542049ブラウズ

1. ストーリー

おそらく、過去 1 年間のライブラリ内の特定のテーブルの月ごとのデータ量の増加についてよく質問されると思います。もちろん、テーブルが月ごとに分割されている場合は、show table status を 1 つずつ実行する方が簡単です。大きなテーブルが 1 つしかない場合は、おそらく単独で SQL 統計を実行する必要があります。現在のテーブル情報のみを取得でき、過去の情報を追跡することはできないため、皆が休んでいる夜に。 show table status,如果只有一个大表,那估计要在大家都休息的时候,寂寞的夜里去跑sql统计了,因为你只能获取当前的表信息,历史信息追查不到了。

除此以外,作为DBA本身也要对数据库空间增长情况进行预估,用以规划容量。我们说的表信息主要包括:

    SELECT IFNULL(@@hostname, @@server_id) SERVER_NAME, %s as HOST, t.TABLE_SCHEMA, t.TABLE_NAME, t.TABLE_ROWS, t.DATA_LENGTH, t.INDEX_LENGTH, t.AUTO_INCREMENT, c.COLUMN_NAME, c.DATA_TYPE, LOCATE('unsigned', c.COLUMN_TYPE) COL_UNSIGNED # CONCAT(c.DATA_TYPE, IF(LOCATE('unsigned', c.COLUMN_TYPE)=0, '', '_unsigned')) FROM information_schema.`TABLES` t LEFT JOIN information_schema.`COLUMNS` c ON t.TABLE_SCHEMA = c.TABLE_SCHEMA AND t.TABLE_NAME = c.TABLE_NAME AND c.EXTRA = 'auto_increment' WHERE t.TABLE_SCHEMA NOT IN ( 'mysql', 'information_schema', 'performance_schema', 'sys' ) AND t.TABLE_TYPE = 'BASE TABLE'

    关于 auto_increment,我们除了关注当前增长到哪了,还会在意相比 int / bigint 的最大值,还有多少可用空间。于是计算了 autoIncrUsage 这一列,用于保存当前已使用的比例。

    然后使用 InfluxDB 的python客户端,批量存入influxdb。如果没有InfluxDB,结果会打印出json —— 这是Zabbix、Open-Falcon这些监控工具普遍支持的格式。

    最后就是使用 Grafana 从 influxdb 数据源画图。

    3. Usage

    1. 环境
      在 python 2.7 环境下编写的,2.6,3.x没测。

    运行需要MySQLdbinfluxdb两个库:

    $ sudo pip install mysql-python influxdb
    1. 配置
      settings_dbs.py 配置文件


  • DBLIST_INFO:列表存放需要采集的哪些MySQL实例表信息,元组内分别是连接地址、端口、用户名、密码
    用户需要select表的权限,否则看不到对应的信息.

  • InfluxDB_INFO:influxdb的连接信息,注意提前创建好数据库名 mysql_info
    设置为 None 可输出结果为json.

  • 创建influxdb上的数据库和存储策略
    存放2年,1个复制集:(按需调整)

  • CREATE DATABASE "mysql_info"
    CREATE RETENTION POLICY "mysql_info_schema" ON "mysql_info" DURATION 730d REPLICATION 1 DEFAULT

    看大的信息类似于:
    MySQLを監視しながらテーブル情報を収集するコードの詳細説明(画像とテキスト)

  1. 放crontab跑
    可以单独放在用于监控的服务器上,不过建议在生产环境可以运行在mysql实例所在主机上,安全起见。

一般库在晚上会有数据迁移的动作,可以在迁移前后分别运行 mysql_schema_info.py 来收集一次。不建议太频繁。

40 23,5,12,18 * * * /opt/DBschema_info/mysql_schema_info.py >> /tmp/collect_DBschema_info.log 2>&1
  1. 生成图表

导入项目下的 grafana_table_stats.json
さらに、DBA として、容量を計画するためにデータベース容量の増加を見積もる必要もあります。ここで説明するテーブル情報には主に次のものが含まれます: MySQLを監視しながらテーブル情報を収集するコードの詳細説明(画像とテキスト)

    json として出力されます。これは Zabbix であり、Open です。 -Falcon など 監視ツールで一般的にサポートされている形式。 🎜🎜最後のステップは、Grafana を使用して influxdb データ ソースから画像を描画することです。 🎜🎜3. 使用法🎜
    1. 🎜環境🎜 Python 2.7 環境で書かれています。2.6 と 3.x はテストされていません。 🎜
    🎜操作には 2 つのライブラリが必要です: MySQLdbinfluxdb: 🎜rrreee
    1. 🎜設定🎜settings_dbs.py 設定ファイル🎜
    2. 🎜🎜🎜
  • 🎜DBLIST_INFO : リストには、収集する必要がある MySQL インスタンス テーブル情報が保存されます。タプルは、接続アドレス、ポート、ユーザー名、およびパスワードです。ユーザーは、テーブルを選択する権限が必要です。そうでない場合、対応する情報を取得することはできません。 🎜
  • 🎜InfluxDB_INFO: Influxdb 接続情報。データベース名 mysql_info🎜結果を json として出力するには、None に設定します。🎜
  • 🎜influxdb 上にデータベースとストレージ戦略を作成します🎜ストレージは 2 年間、 1 レプリ​​カ セット: (オンデマンド調整) 🎜
  • rrreee🎜次のような大きなメッセージを参照してください: 🎜MySQLを監視しながらテーブル情報を収集するコードの詳細説明(画像とテキスト)🎜
  1. 🎜crontabを実行🎜監視用のサーバーに別途置くこともできますが、セキュリティ上の理由から、mysql インスタンスが配置されているホストの実稼働環境で実行することをお勧めします。 🎜
🎜 通常、ライブラリでは夜間にデータ移行が行われます。移行の前後に mysql_schema_info.py を実行してデータを収集できます。あまり頻繁にはお勧めしません。 🎜rrreee
  1. 🎜チャートを生成します🎜
🎜プロジェクトの下の grafana_table_stats.json を Grafana パネルにインポートします。効果は次のとおりです: 🎜🎜🎜🎜テーブルのデータサイズと行数🎜🎜🎜🎜🎜🎜毎日の行番号変更の増分、auto_incrementの使用🎜🎜

4. 詳細

  1. サブデータベースとテーブルの場合、テーブル autoIncrUsage でグローバル一意の ID を計算することはできません

  2. 実装は非常に簡単で、より重要なことはこの情報を収集する意識

  3. を高めることができます グラファイト出力フォーマット

    以上がMySQLを監視しながらテーブル情報を収集するコードの詳細説明(画像とテキスト)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。