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/ibdata1die 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 ibdataDateien 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 TABLEeiner InnoDB-Tabelle, die in der gemeinsam genutzten Tabellenbereichsdatei gespeichert ibdata1ist, zwei Dinge aus:
ibdata1ibdata1wachsen , weil die zusammenhängenden Daten und Indexseiten angehängt anibdata1Sie können jedoch Tabellendaten und Tabellenindizes von ibdata1diesen trennen und unabhängig voneinander verwalten.
OPTIMIZE TABLEmit innodb_file_per_table?Angenommen , Sie hinzufügen waren innodb_file_per_tablezu /etc/my.cnf (my.ini). Können Sie dann einfach OPTIMIZE TABLEauf allen InnoDB-Tabellen laufen ?
Gute Nachricht : Wenn Sie OPTIMIZE TABLEmit innodb_file_per_tableaktiviert ausführen , wird eine .ibdDatei für diese Tabelle erstellt. Wenn Sie beispielsweise eine Tabelle mit mydb.mytableeinem Datenverzeichnis von haben /var/lib/mysql, wird Folgendes erzeugt:
/var/lib/mysql/mydb/mytable.frm/var/lib/mysql/mydb/mytable.ibdDas .ibdenthält die Datenseiten und Indexseiten für diese Tabelle. Toll.
Schlechte Nachrichten : Alles, was Sie getan haben, ist, die Datenseiten und Indexseiten von mydb.mytableaus 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 ibdata1DIESEM PUNKT NICHT EINFACH LÖSCHEN !!! Bitte beachten Sie, dass das ibdata1überhaupt nicht geschrumpft ist.
Um ibdata1ein für alle Mal zu schrumpfen , müssen Sie Folgendes tun:
Speichern Sie (z. B. mit mysqldump) alle Datenbanken in einer .sqlTextdatei ( SQLData.sqlwird unten verwendet).
Löschen Sie alle Datenbanken (außer mysqlund 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_grantsMelden 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_logfile0und vollständig gelöscht. ib_logfile1)
Fahren Sie MySQL herunter
Fügen Sie die folgenden Zeilen zu /etc/my.cnf(oder my.iniunter 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_sizees 25% von ist innodb_buffer_pool_size.
Auch: innodb_flush_method=O_DIRECTist unter Windows nicht verfügbar)
Löschen ibdata*und ib_logfile*optional können Sie alle Ordner /var/lib/mysqlaußer entfernen /var/lib/mysql/mysql.
Start MySQL (Dies wird neu ibdata1[10 MB standardmäßig] und ib_logfile0und ib_logfile1bei 1G jeweils).
Importieren SQLData.sql
ibdata1Wird jetzt noch wachsen, enthält aber nur Tabellenmetadaten, da jede InnoDB-Tabelle außerhalb von existiert ibdata1. ibdata1enthä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_tableOption in /etc/my.cnfkönnen Sie ausführen OPTIMIZE TABLE mydb.mytableund die Datei /var/lib/mysql/mydb/mytable.ibdwird 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 mysqlSchemas nicht neu gestartet werden kann , schauen Sie noch einmal in Schritt 2 nach. Sie haben die physische Kopie des mysqlSchemas 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, 2006hatte Percona einen schönen Artikel, warum man eine richtige innodb_log_file_size wählen sollte . Später Nov 21, 2008folgte 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_tablesbei 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.