Detaillierte Erläuterung der Überwachung von Spaltenüberläufen ohne Primärschlüssel in MySQL-Tabellen

Detaillierte Erläuterung der Überwachung von Spaltenüberläufen ohne Primärschlüssel in MySQL-Tabellen

Heute bin ich wieder in die Falle getappt. Ich bin schon einmal auf einen MySQL-Primärschlüsselüberlauf gestoßen und habe ihn über Prometheus überwacht. Weitere Einzelheiten finden Sie in dieser Überprüfung des MySQL-Primärschlüsselüberlaufs

Die Fallstricke, auf die man dieses Mal stieß, waren versteckter. Eine Spalte vom Typ int signed in einer Protokolltabelle ist voll. Die schnelle Lösung besteht natürlich darin, als Notfallmaßnahme auf eine neue Tabelle umzusteigen und dann einige historische Daten von der alten Tabelle auf die Hot Table zu verschieben.

Es ist Zeit, den Fehler zu beheben. Nachdem Sie das Problem behoben haben, schreiben Sie schnell ein Skript, um alle anderen Produktionstabellen zu überprüfen.

Das Folgende ist ein Erkennungsskript, das ich vorübergehend verwende. Es ist noch nicht perfekt, also werde ich es so verwenden, wie es ist.

Aufteilen in 2 Dateien (1 SQL-Datei, 1 Shell-Skript)

Der Inhalt von check.sql ist wie folgt:

WÄHLEN 
cast( pow(2, case Datentyp
  wenn 'tinyint' dann 7
  wenn 'smallint' dann 15
  wenn 'mediumint' dann 23
  wenn 'int' dann 31
  wenn 'bigint' dann 63
  Ende + (Spaltentyp wie '% unsigned'))-1 als Dezimalzahl (30,0)) als max_int,
' - ',
concat ('(', concat('auswählen ','max(',COLUMN_NAME,')',' aus ',TABLE_SCHEMA,'.',TABLE_NAME),')') 
aus 
information_schema.SPALTEN 
Wo 
TABLE_SCHEMA NICHT IN ('Informationsschema', 'Sys', 'Test', 'MySQL', 'Leistungsschema') 
UND 
 DATENTYP IN ('int');

Führen Sie es direkt in der Datenbank aus. Der Effekt ist ungefähr wie folgt:

Der Inhalt von check.sh ist wie folgt:

#!/bin/bash
# Überwachen Sie den int-Typ. Wenn der verfügbare Speicherplatz weniger als 5 Millionen beträgt, erinnern Sie daran, den DDL-Vorgang durchzuführen. # Setzen Sie die max_execution_time der Sitzungsebene auf 2 Sekunden, um zu verhindern, dass große Spalten ohne Index die Datenbank verlangsamen. Dabei können jedoch einige Spalten fehlen, seien Sie also vorsichtig. # Hinweis: Ich habe den Bigint-Typ hier nicht geprüft. Ändern Sie bei Bedarf DATA_TYPE in check.sql, wo die Bedingung zum Hinzufügen der Bigint-Prüfquelle /etc/profile besteht
setze -u

mkdir $(Datum +%F) -pv

# Schritt 1: Erkennung für Host in {'192.168.1.100','192.168.1.110','192.168.1.120','192.168.1.130'};

mysql -udts -pdts -h${host} -BN < check.sql 2>/dev/null > sql.log
Warten

echo "Beschreibung: | Maximal zulässiger Wert für die aktuelle Spalte | SQL zur Überprüfung " >> $(date +%F)/$host.log

während Zeile lesen; machen
  ret=$(mysql -udts -pdts -h${host} -BNe "setze Sitzungs-Max.-Ausführungszeit=2000; wähle $line" 2>/dev/null)
  echo ${ret}
  wenn [[ "${ret}" == "NULL" ]]; dann
  weitermachen
  fi
  wenn [ ${ret} -lt 5000000 ] ; dann 
   echo "$line verbleibender Speicherplatz ${ret}, der verfügbare Wasserstand in der Tabelle beträgt weniger als 5 Millionen. Es wird empfohlen, DDL auf den Typ Bigint zu ändern" >> $(date +%F)/$host.log
  
  fi
fertig < ./sql.log

Erledigt

# Schritt 2: Verpacken Sie die Inspektionsinhalte und versenden Sie sie per E-Mail (ggf. müssen Sie dies entsprechend Ihrer Produktionssituation anpassen)
tar czf $(Datum +%F).tar.gz $(Datum +%F)
sendemail -s 192.168.1.200 -f [email protected] -t [email protected] -a $(date +%F).tar.gz -u "$(date +%F) int Wasserstandsprüfprotokoll" -o message-content-type=html -o message-charset=utf8 -m "Einzelheiten finden Sie im Anhang"

# Schritt 3: Bereinigen Sie die täglich generierten Verzeichnisse mit Datumsnamen und Tar.gz-Dateien. Ich werde die Befehle hier nicht veröffentlichen.

Fügen Sie dann jeden Tag um 10 Uhr einen Cronjob hinzu.

Abschließend sei bemerkt, dass der Inhalt der täglich empfangenen E-Mails ungefähr wie folgt aussieht:

Dies ist das Ende dieses Artikels zur Überwachung des Überlaufs von Nicht-Primärschlüsselspalten in MySQL-Tabellen. Weitere Informationen zu Überläufen von Nicht-Primärschlüsselspalten in MySQL finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • Ausführliche Diskussion über die automatische Inkrementierung von Primärschlüsseln in MySQL
  • Der Unterschied sowie die Vor- und Nachteile des MySQL-Primärschlüssels UUID und des automatisch inkrementierten Primärschlüssels
  • MySQL-Primärschlüssel-Benennungsstrategie im Zusammenhang
  • Was tun, wenn der Auto-Increment-Primärschlüssel in MySQL aufgebraucht ist?
  • Lösung für das Ausgehen der Auto-Increment-ID (Primärschlüssel) von MySQL
  • Detaillierte Analyse, warum MySQL die Verwendung von UUID oder Snowflake-ID als Primärschlüssel nicht empfiehlt
  • Verwenden Sie Prometheus, um den verbleibenden verfügbaren Prozentsatz der MySQL-Autoinkrement-Primärschlüssel zu zählen
  • Mysql SQL-Anweisungsvorgang zum Hinzufügen oder Ändern des Primärschlüssels

<<:  Implementierung der K8S-Bereitstellung eines Docker-Containers

>>:  Methode zum dynamischen Laden von Geojson basierend auf Vue+Openlayer

Artikel empfehlen

Detaillierte Erläuterung des MySql-Beispiels für automatische Kürzung

Detaillierte Erläuterung des MySql-Beispiels für ...

React Native JSI implementiert Beispielcode für RN und native Kommunikation

Inhaltsverzeichnis Was ist JSI Was ist anders an ...

Beispiele für die Verwendung des ES6-Spread-Operators

Inhaltsverzeichnis Was sind Spread- und Rest-Oper...

Vue.js implementiert Kalenderfunktion

In diesem Artikelbeispiel wird der spezifische Co...

Grafisches Tutorial zur Installation von JDK1.8 unter CentOS7.4

Schritte zur Linux-Installation von JDK1.8 1. Übe...

Analyse von SQL-Integritätsbeschränkungsanweisungen in der Datenbank

Integritätsbeschränkungen Integritätsbedingungen ...

Vue-CLI3.x stellt Projekte automatisch auf dem Server bereit

Inhaltsverzeichnis Vorwort 1. Installieren Sie sc...

Vue implementiert Bildverifizierungscode beim Anmelden

In diesem Artikelbeispiel wird der spezifische Co...

Vue + Element dynamische Mehrfachheader und dynamische Slots

Inhaltsverzeichnis 1. Nachfrage 2. Wirkung 3. All...

So implementieren Sie eine verschachtelte if-Methode in Nginx

Nginx unterstützt weder verschachtelte if-Anweisu...

So umbrechen Sie das HTML-Titelattribut

Als ich vor ein paar Tagen ein Programm schrieb, w...

Ubuntu installiert mehrere Versionen von CUDA und wechselt jederzeit

Ich werde nicht erklären, was CUDA ist, sondern d...