Hier ist eine vollständigere Antwort in Bezug auf InnoDB. Es ist ein etwas langwieriger Prozess, aber die Mühe kann sich lohnen.
Denken Sie daran, dass /var/lib/mysql/ibdata1 ist die am stärksten ausgelastete Datei in der InnoDB-Infrastruktur. Es enthält normalerweise sechs Arten von Informationen:
- Tabellendaten
- Tabellenindizes
- MVCC (Multiversioning Concurrency Control)
Daten
- Rollback-Segmente
- Rückgängig machen
- Tabellenmetadaten (Datenwörterbuch)
- Doppelter Schreibpuffer (Schreiben im Hintergrund, um die Abhängigkeit vom Betriebssystem-Caching zu verhindern)
- Puffer einfügen (Verwaltung von Änderungen an nicht eindeutigen Sekundärindizes)
- Siehe
Bilddarstellung von ibdata1
InnoDB-Architektur

Viele Leute erstellen mehrere ibdata Dateien, die auf eine bessere Speicherplatzverwaltung und Leistung hoffen, aber dieser Glaube ist falsch.
Kann ich OPTIMIZE ausführen TABELLE
?
Leider läuft OPTIMIZE TABLE
gegen eine InnoDB-Tabelle, die in der gemeinsam genutzten Tabellenbereichsdatei ibdata1 gespeichert ist macht zwei Dinge:
- Macht die Daten und Indizes der Tabelle zusammenhängend innerhalb von
ibdata1 - Erzeugt
ibdata1wachsen, da die zusammenhängenden Daten- und Indexseiten angehängt werden zuibdata1
Sie können jedoch Tabellendaten und Tabellenindizes von ibdata1 trennen und unabhängig verwalten.
Kann ich OPTIMIZE ausführen TABELLE
mit innodb_file_per_table
?
Angenommen, Sie würden innodb_file_per_table
nach /etc/my.cnf (my.ini) . Können Sie dann einfach OPTIMIZE TABLE ausführen
auf allen InnoDB-Tabellen?
Gute Nachrichten :Wenn Sie OPTIMIZE TABLE
mit innodb_file_per_table
aktiviert, erzeugt dies eine .ibd Datei für diese Tabelle. Zum Beispiel, wenn Sie die Tabelle mydb.mytable haben mit einem Datenverzeichnis von /var/lib/mysql , wird Folgendes erzeugt:
/var/lib/mysql/mydb/mytable.frm/var/lib/mysql/mydb/mytable.ibd
Die .ibd enthält die Datenseiten und Indexseiten für diese Tabelle. Großartig.
Schlechte Nachrichten :Sie haben lediglich die Datenseiten und Indexseiten von mydb.mytable extrahiert vom Leben in ibdata . Der Data-Dictionary-Eintrag für jede Tabelle, einschließlich mydb.mytable , verbleibt weiterhin im Datenwörterbuch (siehe die Bilddarstellung von ibdata1
). SIE KÖNNEN ibdata1 NICHT EINFACH LÖSCHEN AN DIESER STELLE !!! Bitte beachten Sie, dass ibdata1 ist überhaupt nicht geschrumpft.
Bereinigung der InnoDB-Infrastruktur
Um ibdata1 zu verkleinern Ein für alle Mal müssen Sie Folgendes tun:
-
Dump (z. B. mit
mysqldump) alle Datenbanken in eine.sqlTextdatei (SQLData.sqlwird unten verwendet) -
Löschen Sie alle Datenbanken (außer
mysqlundinformation_schema) ACHTUNG :Als Vorsichtsmaßnahme führen Sie bitte dieses Skript 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
SET GLOBAL innodb_fast_shutdown =0;aus (Dadurch werden alle verbleibenden Transaktionsänderungen vollständig ausib_logfile0geleert undib_logfile1) -
Beenden Sie MySQL
-
Fügen Sie die folgenden Zeilen zu
/etc/my.cnfhinzu (odermy.iniunter Windows)[mysqld] innodb_file_per_table innodb_flush_method=O_DIRECT innodb_log_file_size=1G innodb_buffer_pool_size=4G(Nebenbemerkung:Was auch immer Sie für
innodb_buffer_pool_sizeeingestellt haben , stellen Sie sicher, dassinnodb_log_file_sizebeträgt 25 % voninnodb_buffer_pool_size.Außerdem:
innodb_flush_method=O_DIRECTist unter Windows nicht verfügbar) -
Löschen Sie
ibdata*undib_logfile*, Optional können Sie alle Ordner in/var/lib/mysqlentfernen , außer/var/lib/mysql/mysql. -
Starten Sie MySQL (Dadurch wird
ibdata1neu erstellt [standardmäßig 10 MB] undib_logfile0undib_logfile1bei jeweils 1G). -
Importieren Sie
SQLData.sql
Jetzt ibdata1 wird immer noch wachsen, aber nur Tabellenmetadaten enthalten, da jede InnoDB-Tabelle außerhalb von ibdata1 existiert . ibdata1 wird keine InnoDB-Daten und Indizes für andere Tabellen mehr enthalten.
Angenommen, Sie haben eine InnoDB-Tabelle mit dem Namen mydb.mytable . Wenn Sie in /var/lib/mysql/mydb suchen , sehen Sie zwei Dateien, die die Tabelle darstellen:
mytable.frm(Storage Engine-Header)mytable.ibd(Tabellendaten und Indizes)
Mit der innodb_file_per_table Option 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 schrumpfen.
Ich habe das in meiner Karriere als MySQL DBA viele Male gemacht. Als ich das zum ersten Mal tat, schrumpfte ich sogar um 50 GB ibdata1 Datei auf nur 500 MB herunter!
Versuche es. Wenn Sie weitere Fragen dazu haben, fragen Sie einfach. Vertrau mir; dies funktioniert sowohl kurzfristig als auch langfristig.
ACHTUNG
Bei Schritt 6, wenn mysql aufgrund von mysql nicht neu gestartet werden kann schema begin gelöscht haben, sehen Sie sich Schritt 2 noch einmal an. Sie haben die physische Kopie von mysql erstellt Schema. 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 die Einstellung innodb_log_file_size auf 25 % von innodb_buffer_pool_size in Schritt 5 ist diese pauschale Regel ziemlich altmodisch.
Zurück am 3. Juli 2006 , hatte Percona einen netten Artikel warum man eine richtige innodb_log_file_size wählen sollte . Später, am 21. November 2008 , folgte Percona mit einem weiteren Artikel über wie man die richtige Größe basierend auf der Spitzenarbeitslast berechnet, wobei Änderungen im Wert von einer Stunde beibehalten werden
.
Seitdem habe ich Beiträge im DBA StackExchange über die Berechnung der Protokollgröße geschrieben und auf diese beiden Percona-Artikel verwiesen.
27. August 2012:Korrektes Tuning für 30 GB InnoDB-Tabelle auf Server mit 48 GB RAM17. Januar 2013:MySQL 5.5 - Innodb - innodb_log_file_size größer als 4 GB zusammen?
Ich persönlich würde immer noch mit der 25%-Regel für eine Ersteinrichtung gehen. Da die Arbeitslast im Laufe der Zeit in der Produktion genauer bestimmt werden kann, können Sie die Größe ändern die Protokolle während eines Wartungszyklus in nur wenigen Minuten.