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
ibdata1
wachsen, 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.sql
Textdatei (SQLData.sql
wird unten verwendet) -
Löschen Sie alle Datenbanken (außer
mysql
undinformation_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_logfile0
geleert undib_logfile1
) -
Beenden Sie MySQL
-
Fügen Sie die folgenden Zeilen zu
/etc/my.cnf
hinzu (odermy.ini
unter 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_size
eingestellt haben , stellen Sie sicher, dassinnodb_log_file_size
beträgt 25 % voninnodb_buffer_pool_size
.Außerdem:
innodb_flush_method=O_DIRECT
ist unter Windows nicht verfügbar) -
Löschen Sie
ibdata*
undib_logfile*
, Optional können Sie alle Ordner in/var/lib/mysql
entfernen , außer/var/lib/mysql/mysql
. -
Starten Sie MySQL (Dadurch wird
ibdata1
neu erstellt [standardmäßig 10 MB] undib_logfile0
undib_logfile1
bei 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.