it-swarm.com.de

Gewusst wie: Bereinigen einer mysql InnoDB-Speicher-Engine?

Ist es möglich, eine mysql innodb-Speicherengine zu bereinigen, damit keine Daten aus gelöschten Tabellen gespeichert werden?

Oder muss ich jedes Mal eine neue Datenbank erstellen?

128
Bryan Field

Hier finden Sie eine vollständigere Antwort in Bezug auf InnoDB. Es ist ein langwieriger Prozess, aber der Aufwand kann sich lohnen.

Beachten Sie, dass /var/lib/mysql/ibdata1 Die am stärksten ausgelastete Datei in der InnoDB-Infrastruktur ist. Es enthält normalerweise sechs Arten von Informationen:

InnoDB-Architektur

InnoDB Architecture

Viele Leute erstellen mehrere ibdata -Dateien in der Hoffnung auf eine bessere Speicherverwaltung und Leistung, jedoch ist diese Annahme falsch.

Kann ich OPTIMIZE TABLE ausführen?

Leider führt das Ausführen von OPTIMIZE TABLE für eine InnoDB-Tabelle, die in der gemeinsam genutzten Tabellenbereichsdatei ibdata1 Gespeichert ist, zwei Dinge aus:

  • Fügt die Daten und Indizes der Tabelle in ibdata1
  • Lässt ibdata1 Wachsen, da die zusammenhängenden Daten- und Indexseiten angefügt ​​an ibdata1

Sie können jedoch Tabellendaten und Tabellenindizes von ibdata1 Trennen und unabhängig verwalten.

Kann ich OPTIMIZE TABLE mit innodb_file_per_table ?

Angenommen, Sie würden innodb_file_per_table zu /etc/my.cnf (my.ini) hinzufügen. Können Sie dann einfach OPTIMIZE TABLE für alle InnoDB-Tabellen ausführen?

Gute Nachricht: Wenn Sie OPTIMIZE TABLE mit ausführen innodb_file_per_table aktiviert, erzeugt dies eine .ibd - Datei für diese Tabelle. Wenn Sie beispielsweise eine Tabelle mydb.mytable Mit einem Datenverzeichnis von /var/lib/mysql Haben, wird Folgendes erzeugt:

  • /var/lib/mysql/mydb/mytable.frm
  • /var/lib/mysql/mydb/mytable.ibd

Das .ibd Enthält die Datenseiten und Indexseiten für diese Tabelle. Groß.

Bad News: Sie haben lediglich die Datenseiten und Indexseiten von mydb.mytable Aus ibdata extrahiert. Der Datenwörterbucheintrag für jede Tabelle, einschließlich mydb.mytable, Verbleibt weiterhin im Datenwörterbuch (siehe die bildliche Darstellung von ibdata1 ). SIE KÖNNEN ibdata1 AT DIESER PUNKT !!! Bitte beachten Sie, dass ibdata1 ist überhaupt nicht geschrumpft.

InnoDB-Infrastrukturbereinigung

Um ibdata1 Ein für alle Mal zu verkleinern, müssen Sie Folgendes tun:

  1. Dump (z. B. mit mysqldump) aller Datenbanken in eine .sql - Textdatei (SQLData.sql Wird unten verwendet)

  2. Löschen Sie alle Datenbanken (außer mysql und information_schema) EINSCHRÄNKUNG : Führen Sie dieses Skript vorsichtshalber unbedingt aus Stellen Sie sicher, dass Sie alle Benutzerberechtigungen eingerichtet haben:

    mkdir /var/lib/mysql_grants
    cp /var/lib/mysql/mysql/* /var/lib/mysql_grants/.
    chown -R mysql:mysql /var/lib/mysql_grants
    
  3. Melden Sie sich bei mysql an und führen Sie SET GLOBAL innodb_fast_shutdown = 0; Aus. (Dadurch werden alle verbleibenden Transaktionsänderungen von ib_logfile0 Und ib_logfile1 Vollständig gelöscht.)

  4. Fahren Sie MySQL herunter

  5. Fügen Sie die folgenden Zeilen zu /etc/my.cnf Hinzu (oder my.ini Unter Windows)

    [mysqld]
    innodb_file_per_table
    innodb_flush_method=O_DIRECT
    innodb_log_file_size=1G
    innodb_buffer_pool_size=4G
    

    (Anmerkung: Unabhängig von Ihrer Einstellung für innodb_buffer_pool_size Stellen Sie sicher, dass innodb_log_file_size 25% von innodb_buffer_pool_size Ist.

    Außerdem: innodb_flush_method=O_DIRECT Ist unter Windows nicht verfügbar.)

  6. Löschen Sie ibdata* Und ib_logfile*. Optional können Sie alle Ordner in /var/lib/mysql Mit Ausnahme von /var/lib/mysql/mysql Entfernen.

  7. Starten Sie MySQL (dabei werden ibdata1 [10 MB standardmäßig] und ib_logfile0 Und ib_logfile1 Mit jeweils 1 GB neu erstellt).

  8. Importieren SQLData.sql

Jetzt wächst ibdata1 Weiter, enthält jedoch nur Tabellenmetadaten, da jede InnoDB-Tabelle außerhalb von ibdata1 Vorhanden ist. ibdata1 Enthält keine InnoDB-Daten und -Indizes mehr für andere Tabellen.

Angenommen, Sie haben eine InnoDB-Tabelle mit dem Namen mydb.mytable. Wenn Sie in /var/lib/mysql/mydb Nachsehen, sehen Sie zwei Dateien, die die Tabelle darstellen:

  • mytable.frm (Speicher-Engine-Header)
  • mytable.ibd (Tabellendaten und Indizes)

Mit der Option innodb_file_per_table In /etc/my.cnf Können Sie OPTIMIZE TABLE mydb.mytable Ausführen, und die Datei /var/lib/mysql/mydb/mytable.ibd Wird tatsächlich verkleinert.

Ich habe dies in meiner Karriere als MySQL-DBA viele Male getan. Tatsächlich habe ich beim ersten Mal eine 50GBibdata1 - Datei auf nur 500MB verkleinert!

Versuche es. Wenn Sie weitere Fragen dazu haben, fragen Sie einfach. Vertrau mir; Dies wird sowohl kurzfristig als auch langfristig funktionieren.

VORBEHALT

Wenn mysql in Schritt 6 aufgrund des verlorenen Schemas mysql nicht neu gestartet werden kann, schauen Sie zurück in Schritt 2. Sie haben die physische Kopie des Schemas mysql erstellt. Sie können es wie folgt wiederherstellen:

mkdir /var/lib/mysql/mysql
cp /var/lib/mysql_grants/* /var/lib/mysql/mysql
chown -R mysql:mysql /var/lib/mysql/mysql

Gehen Sie zurück zu Schritt 6 und fahren Sie fort

UPDATE 2013-06-04 11:13 EDT

In Bezug auf das Setzen von innodb_log_file_size auf 25% von innodb_buffer_pool_size in Schritt 5 ist diese Pauschalregel ziemlich altmodisch.

Zurück auf July 03, 2006 Hatte Percona einen netten Artikel , warum man eine richtige innodb_log_file_size auswählte. Später, bei Nov 21, 2008, Folgte Percona ein weiterer Artikel über , wie die richtige Größe basierend auf der maximalen Arbeitsbelastung berechnet werden kann, wobei die Änderungsdauer von einer Stunde beibehalten wird .

Ich habe seitdem Beiträge in DBA StackExchange geschrieben, in denen es um die Berechnung der Protokollgröße geht und in denen ich auf diese beiden Percona-Artikel verwiesen habe.

Persönlich würde ich mich immer noch an die 25% -Regel für eine anfängliche Einrichtung halten. Dann, da die Arbeitslast im Laufe der Zeit in der Produktion genauer bestimmt werden kann, Sie könnten die Größe der Protokolle ändern während eines Wartungszyklus in nur wenigen Minuten.

341
RolandoMySQLDBA

Die InnoDB-Engine speichert keine gelöschten Daten. Beim Einfügen und Löschen von Zeilen verbleibt nicht verwendeter Speicherplatz in den InnoDB-Speicherdateien. Mit der Zeit wird der Gesamtspeicherplatz nicht kleiner, aber mit der Zeit wird der "gelöschte und freigegebene" Speicherplatz vom DB-Server automatisch wiederverwendet.

Sie können den vom Modul belegten Speicherplatz durch eine manuelle Neuorganisation der Tabellen weiter optimieren und verwalten. Sichern Sie dazu die Daten in den betroffenen Tabellen mit mysqldump, löschen Sie die Tabellen, starten Sie den mysql-Dienst neu und erstellen Sie die Tabellen aus den Sicherungsdateien neu.

4
bigjeff