Ist es möglich, eine MySQL-Innodb-Speicher-Engine zu bereinigen, damit keine Daten aus gelöschten Tabellen gespeichert werden?
Oder muss ich jedes Mal eine neue Datenbank neu erstellen?
Ist es möglich, eine MySQL-Innodb-Speicher-Engine zu bereinigen, damit keine Daten aus gelöschten Tabellen gespeichert werden?
Oder muss ich jedes Mal eine neue Datenbank neu erstellen?
Antworten:
Hier ist eine vollständigere Antwort in Bezug auf InnoDB. Es ist ein langwieriger Prozess, aber die Mühe kann sich lohnen.
Beachten Sie, dass dies /var/lib/mysql/ibdata1
die am stärksten ausgelastete Datei in der InnoDB-Infrastruktur ist. Es enthält normalerweise sechs Arten von Informationen:
Pictorial Representation of ibdata1
Viele Leute erstellen mehrere ibdata
Dateien in der Hoffnung auf eine bessere Verwaltung und Leistung des Speicherplatzes, aber diese Überzeugung ist falsch.
OPTIMIZE TABLE
?Leider führt das Ausführen OPTIMIZE TABLE
einer InnoDB-Tabelle, die in der gemeinsam genutzten Tabellenbereichsdatei gespeichert ibdata1
ist, zwei Dinge aus:
ibdata1
ibdata1
wachsen , weil die zusammenhängenden Daten und Indexseiten angehängt anibdata1
Sie können jedoch Tabellendaten und Tabellenindizes von ibdata1
diesen trennen und unabhängig voneinander verwalten.
OPTIMIZE TABLE
mit innodb_file_per_table
?Angenommen , Sie hinzufügen waren innodb_file_per_table
zu /etc/my.cnf (my.ini)
. Können Sie dann einfach OPTIMIZE TABLE
auf allen InnoDB-Tabellen laufen ?
Gute Nachricht : Wenn Sie OPTIMIZE TABLE
mit innodb_file_per_table
aktiviert ausführen , wird eine .ibd
Datei für diese Tabelle erstellt. Wenn Sie beispielsweise eine Tabelle mit mydb.mytable
einem Datenverzeichnis von haben /var/lib/mysql
, 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. Toll.
Schlechte Nachrichten : Alles, was Sie getan haben, ist, die Datenseiten und Indexseiten von mydb.mytable
aus dem Leben in zu extrahieren ibdata
. Der Datenwörterbucheintrag für jede Tabelle, einschließlich mydb.mytable
, verbleibt weiterhin im Datenwörterbuch (siehe Bilddarstellung von ibdata1 ). SIE KÖNNEN AN ibdata1
DIESEM PUNKT NICHT EINFACH LÖSCHEN !!! Bitte beachten Sie, dass das ibdata1
überhaupt nicht geschrumpft ist.
Um ibdata1
ein für alle Mal zu schrumpfen , müssen Sie Folgendes tun:
Speichern Sie (z. B. mit mysqldump
) alle Datenbanken in einer .sql
Textdatei ( SQLData.sql
wird unten verwendet).
Löschen Sie alle Datenbanken (außer mysql
und information_schema
). CAVEAT : Führen Sie dieses Skript vorsichtshalber aus, um sicherzustellen, dass alle Benutzerberechtigungen vorhanden sind:
mkdir /var/lib/mysql_grants
cp /var/lib/mysql/mysql/* /var/lib/mysql_grants/.
chown -R mysql:mysql /var/lib/mysql_grants
Melden Sie sich bei MySQL an und führen Sie es aus SET GLOBAL innodb_fast_shutdown = 0;
(Dadurch werden alle verbleibenden Transaktionsänderungen von ib_logfile0
und vollständig gelöscht. ib_logfile1
)
Fahren Sie MySQL herunter
Fügen Sie die folgenden Zeilen zu /etc/my.cnf
(oder my.ini
unter Windows) hinzu
[mysqld]
innodb_file_per_table
innodb_flush_method=O_DIRECT
innodb_log_file_size=1G
innodb_buffer_pool_size=4G
(Nebenbemerkung: Was auch immer Ihr Set ist innodb_buffer_pool_size
, stellen Sie sicher, dass innodb_log_file_size
es 25% von ist innodb_buffer_pool_size
.
Auch: innodb_flush_method=O_DIRECT
ist unter Windows nicht verfügbar)
Löschen ibdata*
und ib_logfile*
optional können Sie alle Ordner /var/lib/mysql
außer entfernen /var/lib/mysql/mysql
.
Start MySQL (Dies wird neu ibdata1
[10 MB standardmäßig] und ib_logfile0
und ib_logfile1
bei 1G jeweils).
Importieren SQLData.sql
ibdata1
Wird jetzt noch wachsen, enthält aber nur Tabellenmetadaten, da jede InnoDB-Tabelle außerhalb von existiert ibdata1
. ibdata1
enthält keine InnoDB-Daten und -Indizes für andere Tabellen mehr.
Angenommen, Sie haben eine InnoDB-Tabelle mit dem Namen mydb.mytable
. Wenn Sie hineinschauen /var/lib/mysql/mydb
, sehen Sie zwei Dateien, die die Tabelle darstellen:
mytable.frm
(Speicher-Engine-Header)mytable.ibd
(Tabellendaten und Indizes)Mit der innodb_file_per_table
Option in /etc/my.cnf
können Sie ausführen OPTIMIZE TABLE mydb.mytable
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 50-GB- ibdata1
Datei auf nur 500 MB verkleinert!
Versuche es. Wenn Sie weitere Fragen dazu haben, fragen Sie einfach. Vertrau mir; Dies wird sowohl kurzfristig als auch langfristig funktionieren.
Wenn in Schritt 6 MySQL aufgrund des Löschens des mysql
Schemas nicht neu gestartet werden kann , schauen Sie noch einmal in Schritt 2 nach. Sie haben die physische Kopie des mysql
Schemas 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
In Bezug auf das Setzen von innodb_log_file_size auf 25% von innodb_buffer_pool_size in Schritt 5 ist diese pauschale Regel eher alte Schule.
Zurück July 03, 2006
hatte Percona einen schönen Artikel, warum man eine richtige innodb_log_file_size wählen sollte . Später Nov 21, 2008
folgte Percona mit einem weiteren Artikel darüber, wie die richtige Größe basierend auf der Spitzenauslastung berechnet werden kann, wobei Änderungen im Wert von einer Stunde beibehalten werden .
Ich habe seitdem im DBA StackExchange Beiträge über die Berechnung der Protokollgröße geschrieben und wo ich auf diese beiden Percona-Artikel verwiesen habe.
Aug 27, 2012
: Richtige Abstimmung für 30 GB InnoDB-Tabelle auf einem Server mit 48 GB RAMJan 17, 2013
: MySQL 5.5 - Innodb - innodb_log_file_size höher als 4 GB zusammen?Persönlich würde ich immer noch die 25% -Regel für eine Ersteinrichtung einhalten. Da die Arbeitslast im Laufe der Zeit in der Produktion genauer bestimmt werden kann, können Sie die Größe der Protokolle während eines Wartungszyklus in nur wenigen Minuten ändern .
innodb_open_tables
bei Bedarf zu erhöhen . Der Standardwert ist 300.
Die InnoDB-Engine speichert keine gelöschten Daten. Beim Einfügen und Löschen von Zeilen bleibt nicht verwendeter Speicherplatz in den InnoDB-Speicherdateien reserviert. Mit der Zeit nimmt der Gesamtspeicherplatz nicht ab, aber mit der Zeit wird der gelöschte und freigegebene Speicherplatz vom DB-Server automatisch wiederverwendet.
Sie können den von der Engine verwendeten Speicherplatz durch eine manuelle Neuorganisation der Tabellen weiter optimieren und verwalten. Speichern 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 Speicherauszugsdateien neu.