Detaillierte Erklärung zum ordnungsgemäßen Löschen einer großen Tabelle in MySQL

Detaillierte Erklärung zum ordnungsgemäßen Löschen einer großen Tabelle in MySQL

Vorwort

Um eine Tabelle zu löschen, kann der Befehl, der einem unbewusst in den Sinn kommt, darin bestehen, DROP TABLE „Tabellenname“ direkt zu verwenden. Dies ist ein naiver Ansatz, da der zu löschende Ausdrucksraum Dutzende GB oder sogar Hunderte GB an Tabellen erreicht. Wenn ein solcher Befehl ausgegeben wird, kann MySQL direkt blockiert werden. Die äußere Auswirkung ist ein schneller Abfall der QPS und eine Verlangsamung der Kundenanfragen.

Lösung

1. Manuelles Löschen außerhalb der Spitzenzeiten

Dies kann erfordern, dass der DBA unermüdlich arbeitet und bis spät in die Nacht aufsteht, um die Tabelle zu löschen.

2. Daten zuerst löschen und zuletzt

Wenn beispielsweise 10 Millionen Datenelemente vorhanden sind, schreiben Sie ein Skript, das jedes Mal 200.000 Elemente löscht, eine Weile pausiert und dann mit der Ausführung fortfährt. Dadurch ist es für den Benutzer auch nicht wahrnehmbar.

3. Erstellen Sie einen Hardlink zur Tabellendatei (IDB-Datei), um das Löschen zu beschleunigen

Diese Methode verwendet das Wissen über Hardlinks unter Linux, um eine schnelle Löschung durchzuführen. Wenn Sie sich nicht erinnern, können Sie zurückgehen und sich „Bird Brothers Linux Private Recipe“ ansehen.

ln data_center_update_log.ibd data_center_update_log.ibd.hdlk

[root@mysql01 Sportzentrum]# ll
Gesamtverbrauch 19903792
-rw-r----- 1 mysql mysql 9076 17. Oktober 13:15 data_center_update_log.frm
-rw-r----- 2 mysql mysql 8447328256 23. Dezember 11:35 data_center_update_log.ibd
-rw-r----- 2 mysql mysql 8447328256 23. Dezember 11:35 data_center_update_log.ibd.hdlk

Nach der Ausführung des obigen Befehls haben wir eine zusätzliche Datei data_center_update_log.ibd.hdlk. Dieser Vorgang nimmt keinen Speicherplatz in Anspruch, er fügt lediglich einen Verweis auf die Datei auf der Festplatte hinzu.

Wenn wir eine dieser Dateien löschen, wirkt sich dies nicht auf die eigentliche Datei auf der Festplatte aus, sondern reduziert lediglich ihren Referenzzähler um 1. Wenn die Anzahl der Referenzen 1 erreicht, wird die Datei gelöscht und es wird ein IO ausgeführt, um sie zu löschen.

Genau durch die Nutzung dieser Funktion wird der ursprüngliche MySQL-Vorgang zum Löschen großer Dateien in ein einfaches Löschen von Dateien auf Betriebssystemebene umgewandelt, wodurch die Auswirkungen auf MySQL reduziert werden.

4. Melden Sie sich bei MySQL an und führen Sie den Drop-Table-Vorgang aus

Bald waren 2 Millionen Daten in nur 1 Sekunde fertig. Dieser Vorgang wurde nach dem Erstellen eines Hardlinks durchgeführt.

mysql> Tabellen data_center_update_log löschen;
Abfrage OK, 0 Zeilen betroffen (1,02 Sek.)


mysql> beenden
Tschüss

Beenden Sie das Programm und überprüfen Sie das Datenverzeichnis erneut. Es ist nur noch die Hardlink-Datei data_center_update_log.ibd.hdlk übrig. [root@mysql01 sports_center]# ll
Gesamtverbrauch 19903792
-rw-r----- 2 mysql mysql 8447328256 23. Dezember 11:35 data_center_update_log.ibd.hdlk

5. Wie lösche ich die Hardlink-Datei ibd.hdlk richtig?

  • Obwohl nach dem Löschen der Tabelle die verbleibenden Hardlink-Dateien nichts mit MySQL zu tun haben. Wenn die Datei jedoch zu groß ist, führt das direkte Löschen mit dem Befehl rm zu einem Anstieg des IO-Overheads und einer übermäßigen CPU-Auslastung, was sich wiederum auf MySQL auswirkt.
  • Die Methode, die wir hier verwenden, kann Dateien in einer Schleife löschen und die Dateien langsam bereinigen. Dies kann mit einem Skript erfolgen.
  • Der Befehl Truncate wird häufig verwendet, um eine Datei auf eine bestimmte Größe zu verkleinern oder zu erweitern. Wenn die Datei größer als die angegebene Größe ist, gehen die zusätzlichen Daten verloren. Wenn die Datei kürzer ist, wird sie erweitert und der erweiterte Teil als Nullbyte gelesen.

5.1 Installieren Sie den Truncate-Befehl

[root@mysql01 ~]# kürzen
-bash: cruncate: Befehl nicht gefunden Normalerweise installiert das Betriebssystem den Befehl truncate, der sich im Installationspaket von coreutils befindet. Wenn er nicht installiert ist, können Sie ihn mit dem folgenden Befehl installieren [root@mysql01 ~]# yum stellt truncate bereit
coreutils-8.22-24.el7.x86_64: Eine Reihe grundlegender GNU-Tools, die häufig in Shell-Skripten verwendet werden
Quelle: Basis
Passende Quelle:
Dateiname: /usr/bin/truncate

Sie können sehen, dass Truncate vom Coreutils-Installationspaket bereitgestellt wird. Lassen Sie uns das Coreutils-Installationspaket installieren:

[root@mysql01 ~]# yum install -y coreutils

5.2 Allgemeine Optionen für Truncate

-c, --no-create --> Keine Dateien erstellen
-o, --io-blocks --> Größe als Anzahl der Speicherblöcke behandeln, nicht als Anzahl der Bytes
-r, --reference=RFILE --> Referenziert die angegebene Dateigröße
-s, --size=SIZE --> Setzt die Dateigröße auf die angegebenen Bytes

5.3 truncate_bigfile.sh-Skript

Prinzip: Verwenden Sie die Option truncate -s, um die Dateigröße anzugeben, geben Sie die Größe jeder Dateireduzierung über das Skript an und schlafen Sie für einen bestimmten Zeitraum ein, um eine kontrollierbare Dateilöschung zu erreichen.

Anhang: Skript truncate_bigfile.sh

#!/bin/bash
#

TRUNCATE=/usr/bin/truncate
DATEI=$1

wenn [ x"$1" = x ];dann
 echo "Bitte geben Sie den Dateinamen ein in"
 Ausgang 1;
anders
 SIZE_M=$(du -sm "$1" | awk '{print $1}')

 für i in $(seq "${SIZE_M}" -100 0)
 Tun
 Schlaf 1
 echo "${TRUNCATE} -s ${i}M ${FILE}"
 ${TRUNCATE} -s "${i}"M "${FILE}"
 Erledigt
fi

wenn [ $? -eq 0 ];dann
    \rm -f "${FILE}"
anders
    echo "Bitte Datei prüfen"
fi

Zusammenfassen

Dies ist das Ende dieses Artikels zum eleganten Löschen großer Tabellen in MySQL. Weitere Informationen zum eleganten Löschen großer Tabellen 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:
  • So implementieren Sie die Stapellöschung großer Datenmengen in großen MySQL-Tabellen
  • Beispiel zum schnellen Löschen einer 2T-Tabelle in MySQL in Innodb
  • Lösung für das MySQL-Leistungsproblem beim Löschen großer Tabellen
  • Eine kurze Erläuterung zum eleganten Löschen großer Tabellen in MySQL

<<:  CSS- und HTML- und Front-End-Technologie-Schichtendiagramm

>>:  Docker-Image-Analysetool - Analyse des Tauchprinzips

Artikel empfehlen

Erläuterung der objektorientierten Klassenvererbung in JavaScript

1. Objektorientierte Klassenvererbung In den obig...

jQuery klickt auf den Liebeseffekt

In diesem Artikel wird der spezifische Code des j...

So zeigen Sie Bildinformationen in Docker an

In diesem Artikel müssen wir lernen, wie man Bild...

Warum node.js nicht für große Projekte geeignet ist

Inhaltsverzeichnis Vorwort 1. Anwendungskomponent...

Zusammenfassung der Wissenspunkte zum Linux-Datumsbefehl

Verwendung: Datum [Optionen]... [+Format] oder: D...

JS praktisches objektorientiertes Schlangenspielbeispiel

Inhaltsverzeichnis denken 1. Bild mit dem gierige...

Vue implementiert mehrere Ideen zum Themenwechsel

Inhaltsverzeichnis Themen dynamisch ändern Die er...

Sicherheitskonfigurationsstrategie für CentOS-Server

In letzter Zeit wurde der Server häufig mit Brute...

Alibaba Cloud Ubuntu 16.04 baut IPSec-Dienst auf

Einführung in IPSec IPSec (Internet Protocol Secu...

Tutorial zur Installation von MySQL 5.6 auf CentOS 6.5

1. Laden Sie das RPM-Paket für Linux herunter htt...