MySQL テーブルにおける非主キー列オーバーフロー監視の詳細な説明

MySQL テーブルにおける非主キー列オーバーフロー監視の詳細な説明

今日もまた罠に落ちてしまいました。 私は以前MySQLの主キーオーバーフローに遭遇したことがあり、それをPrometheusで監視しました。詳細については、MySQLの主キーオーバーフローのレビューをご覧ください。

今回遭遇した落とし穴は、さらに隠れたものでした。 ログ テーブル内の int 型の signed 列がいっぱいです。迅速な解決策は、もちろん、緊急措置として新しいテーブルに切り替え、一部の履歴データを古いテーブルからホット テーブルに移動することです。

障害が発生したら、修復する時です。問題を解決したら、他のすべての本番環境テーブルを確認するためのスクリプトをすぐに作成します。

以下は暫定的に使用している検出スクリプトです。まだ完璧ではないので、このまま使用します。

2 つのファイルに分割します (1 つの SQL ファイル、1 つのシェル スクリプト)

check.sqlの内容は次のとおりです。

選択 
キャスト( pow(2, ケースデータ型
  'tinyint' の場合は 7
  'smallint' の場合は 15
  'mediumint' の場合は 23
  'int' の場合は 31
  'bigint' の場合は 63
  end+(column_type like '% unsigned'))-1 は、decimal(30,0)) は、max_int として、
' - ',
concat ('(', concat('select ','max(',COLUMN_NAME,')',' from ',TABLE_SCHEMA,'.',TABLE_NAME),')') 
から 
情報スキーマ.COLUMNS 
どこ 
TABLE_SCHEMA が ('information_schema'、'sys'、'test'、'mysql'、'performance_schema') にありません 
そして 
 DATA_TYPE IN ('int') ;

データベース内で直接実行すると、効果は次のようになります。

check.sh の内容は次のとおりです。

#!/bin/bash
# int 型を監視します。使用可能なスペースが 500 万未満の場合、DDL 操作を実行するように通知します。 # インデックスのない大きな列によってデータベースが遅くなるのを防ぐため、セッション レベルの max_execution_time を 2 秒に設定します。ただし、一部の列が欠落する可能性があるため、注意してください。 # 注: ここでは bigint 型をチェックしていません。必要に応じて、check.sql の where 条件で DATA_TYPE を変更して、bigint チェック ソース /etc/profile を追加してください。
セット-u

mkdir $(日付 +%F) -pv

# ステップ1 {'192.168.1.100','192.168.1.110','192.168.1.120','192.168.1.130'}内のホストの検出;

mysql -udts -pdts -h${ホスト} -BN < check.sql 2>/dev/null > sql.log
待って

echo "説明: | 現在の列に許可される最大値 | 検査用の SQL " >> $(date +%F)/$host.log

行を読み取りながら、
  ret=$(mysql -udts -pdts -h${host} -BNe "セッション max_execution_time=2000 を設定;$line を選択" 2>/dev/null)
  ${ret} をエコーする
  [[ "${ret}" == "NULL" ]]の場合
  続く
  フィ
  [ ${ret} -lt 5000000 ] の場合; 
   echo "$line の残りスペース ${ret}、テーブルの使用可能な水位は 500 万未満です。DDL を bigint 型に変更することをお勧めします" >> $(date +%F)/$host.log
  
  フィ
完了 < ./sql.log

終わり

# step2 検査内容をパッケージ化してメールで送信します(生産状況に応じて変更する必要がある場合があります)
tar czf $(日付 +%F).tar.gz $(日付 +%F)
sendemail -s 192.168.1.200 -f [email protected] -t [email protected] -a $(date +%F).tar.gz -u "$(date +%F) int 水位検査ログ" -o message-content-type=html -o message-charset=utf8 -m "詳細は添付ファイルをご覧ください"

# ステップ 3 毎日生成される日付付きディレクトリと tar.gz ファイルをクリーンアップします。ここではコマンドを投稿しません。

次に、毎日午前 10 時に cron ジョブを追加します。

最後に、毎日受信するメールの内容は、おおよそ次のようになります。

これで、MySQL テーブル内の非主キー列のオーバーフローを監視する方法に関するこの記事は終了です。MySQL の非主キー列のオーバーフローの詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL の自動増分主キーに関する詳細な説明
  • Mysql 主キー UUID と自動増分主キーの違いと利点と欠点
  • MySQL主キー命名戦略関連
  • MySQL の自動増分主キーが使い果たされた場合の対処方法
  • MySQL の自動増分 ID (主キー) が不足した場合の解決策
  • MySQL が uuid または snowflake id を主キーとして使用することを推奨しない理由の詳細な分析
  • Prometheus を使用して、MySQL の自動増分主キーの残りの使用可能パーセンテージをカウントします。
  • 主キーを追加または変更するMySQL SQL文操作

<<:  Dockerコンテナのk8sデプロイメントの実装

>>:  Vue+Openlayer をベースに geojson を動的に読み込む方法

推薦する

JavaScript はマウスのドラッグを実装して div のサイズを調整します

この記事では、マウスをドラッグしてdivのサイズを調整するJavaScriptの具体的なコードを参考...

PHP で JSON バックスラッシュを削除する例

1. 「stripslashes($_POST['json']);」メソッドを使用し...

CenOS6.7 mysql 8.0.22 のインストールと設定方法のグラフィックチュートリアル

CenOS6.7 は MySQL8.0.22 (推奨コレクション) をインストールします1. MyS...

MySQL データベースは何をしますか?

MySQL はリレーショナル データベース管理システムです。リレーショナル データベースは、すべて...

Ubuntu 18.04 に phpMyAdmin をインストールするための詳細なチュートリアル

Ubuntu 18.04 上の Apache で動作するように phpMyAdmin をインストール...

jsを使用してシンプルな弾幕スクリーンシステムを実装する

この記事では、弾幕効果を実現するためのネイティブjsの具体的なコードを参考までに共有します。具体的な...

Vue.jsはカレンダー機能を実装します

この記事では、カレンダー機能を実装するためのVue.jsの具体的なコードを例として紹介します。具体的...

Nginx のアンチホットリンクを設定する方法

実験環境• 最小限のインストール済みの CentOS 7.3 仮想マシン• 構成: 1 コア/512...

メタタグを簡単に説明すると

META タグは、一般的に タグと呼ばれ、HTML Web ページのソース コード内の重要な HTM...

Centos7 ベースの Nginx Web サイト サーバーの構築の詳細説明 (仮想 Web ホストの構成を含む)

1. Nginx サービス基盤Nginx (エンジン x) は、パフォーマンスの最適化のために特別...

jsのイベントオブジェクトを深く理解しましょう

JS でよく使用されるイベントは次の通りです。ページイベント: load;フォーカス イベント: フ...

Vue フロントエンド開発補助機能状態管理詳細例

目次マップ状態マップゲッターマップミューテーションマップアクション例まとめマップ状態コンポーネントが...

Ubuntu システムにおけるネットワーク構成ファイルの分析と説明

今日は奇妙なネットワーク問題に遭遇しました。調査プロセスといくつかの構成状況を記録し、Linux で...

VS2019をMySQLデータベースに接続するプロセスと一般的な問題の概要

今日の午後からVS2019をMySQLで使えるのではないかと思い、いろいろ環境構築を始めました。プロ...

aタグのname属性とid属性を使用してページ内を移動する方法

以前はaタグのname属性を使ってジャンプする方法しか知らなかったのですが、idも使えることを今日知...