Wie kann ich die MySQL-Innodb-Variable 'innodb_log_file_size' sicher ändern?


105

Ich bin ziemlich neu im Tunen von InnoDB. Ich ändere langsam die Tabellen (wo nötig) von MyIsam auf InnoDB. Ich habe ungefähr 100 MB in innodb, also habe ich die innodb_buffer_pool_sizeVariable auf 128 MB erhöht:

mysql> show variables like 'innodb_buffer%';
+-------------------------+-----------+
| Variable_name           | Value     |
+-------------------------+-----------+
| innodb_buffer_pool_size | 134217728 |
+-------------------------+-----------+
1 row in set (0.00 sec)

Als ich den innodb_log_file_sizeWert änderte (Beispiel: my.cnf auf der Innodb-Konfigurationsseite von mysql , um die Größe der Protokolldatei auf 25% der Puffergröße zu ändern), sah meine my.cnf folgendermaßen aus:

# innodb
innodb_buffer_pool_size = 128M
innodb_log_file_size = 32M

Wenn ich den Server neu starte, erhalte ich folgende Fehlermeldung:

110216 9:48:41 InnoDB: Pufferpool wird initialisiert, Größe = 128.0M
110216 9:48:41 InnoDB: Initialisierung des Pufferpools abgeschlossen
InnoDB: Fehler: Protokolldatei ./ib_logfile0 hat eine andere Größe 0 5242880 Bytes
InnoDB: als in angegeben die .cnf datei 0 33554432 bytes!
110216 9:48:41 [ERROR] Die 'InnoDB'-Init-Funktion des Plugins hat einen Fehler zurückgegeben.
110216 9:48:41 [ERROR] Die Registrierung von 'InnoDB' als STORAGE ENGINE ist fehlgeschlagen.

Also meine Frage: Ist es sicher, die alten log_files zu löschen, oder gibt es eine andere Methode, um die innodb_log_file_sizeVariable zu ändern ?


1
Kommentieren Sie einfach die innodb_log_file_size in my.ini .....

5
hmm, warum sollte ich es auskommentieren, um den Standardwert zu verwenden, wenn ich versuche, es vom Standardwert zu ändern?
Derek Downey

Ja, indem du die Zeile innodb_log_file_size kommentierst, funktioniert es. Danke.
Muhammad Umar Farooq Frank

2
@muhammadumarfarooqfrank Natürlich funktioniert es - weil Sie den Wert der Variablen nicht mehr ändern und daher den ganzen Punkt streiten. Ich wünschte, es gäbe eine Möglichkeit, Kommentare abzustimmen.
dr01

Antworten:


83

Ja, es ist sicher, die Protokolldatei zu löschen, sobald mysqld heruntergefahren wurde

Führen Sie vor diesem Hintergrund einfach die folgenden Schritte aus:

mysql -uroot -p... -e"SET GLOBAL innodb_fast_shutdown = 0"
service mysql stop
mv /var/lib/mysql/ib_logfile[01] /tmp
service mysql start

Inbetriebnahme mysqld neu erstellen ib_logfile0undib_logfile1

Versuche es !!!

UPDATE 20.10.2011 16:40 Uhr EDT

Damit alle Daten im InnoDB-Pufferpool sauber ausgegeben werden, bevor die Protokolldateien wiederhergestellt werden, sollten Sie diese Option ca. 1 Stunde vor dem Herunterfahren festlegen:

SET GLOBAL innodb_max_dirty_pages_pct = 0;

Standardmäßig ist innodb_max_dirty_pages_pct 75 (MySQL 5.5+) oder 90 (vor MySQL 5.5). Wenn Sie diesen Wert auf Null setzen, bleibt die Anzahl der verschmutzten Seiten unter 1% des InnoDB-Pufferpools. Performing service mysql stopmacht das trotzdem. Darüber hinaus werden durch das Herunterfahren alle verbleibenden Elemente im Redo-Protokoll beendet. Um diese Option beizubehalten, fügen Sie sie einfach zu /etc/my.cnf hinzu:

[mysqld]
innodb_max_dirty_pages_pct = 0

UPDATE 2013-04-19 16:16 EDT

Ich habe meine Antwort ein bisschen mehr mit innodb_fast_shutdown aktualisiert, weil ich mysql neu gestartet und mysql dazu angehalten habe. Jetzt ist dieser Schritt von entscheidender Bedeutung, da jede nicht festgeschriebene Transaktion andere bewegliche Teile innerhalb und außerhalb der InnoDB-Transaktionsprotokolle enthalten kann ( siehe InnoDB-Infrastruktur ).

Bitte beachten Sie, dass durch das Setzen von innodb_fast_shutdown auf 2 auch die Logs gelöscht werden. Es sind jedoch noch mehr bewegliche Teile vorhanden, die beim Starten von mysqld bei Crash Recovery abgerufen werden. Die Einstellung 0 ist am besten.


1
Schöne Antwort und das Update ist auch super. Mein einziger Vorschlag wäre, die ib_log-Dateien an einen anderen Ort zu kopieren, falls etwas schief geht. Auf diese Weise erhalten Sie eine Vorstellung von der Größe der Dateien: mysqlperformanceblog.com/2011/07/09/…
Justin Noel

5
Auch für mich funktioniert, ABER: Die Benutzeroberfläche der Linux-Konsole kann irreführend sein - der Start von mysqld nimmt viel Zeit in Anspruch, wenn Sie eine große Protokolldatei (mehrere hundert MB oder mehr) festlegen. Die Benutzeroberfläche der Konsole zeigt Punkte und dann "failed!" An, aber MySQL wird immer noch gestartet. Warten Sie und lesen Sie die Protokolldatei weiter (oder überwachen Sie die Protokolldatei mit "tail -f [Protokolldatei]"), bis Sie "mysqld: ready for connections" sehen. und beide Protokolldateien auf der Festplatte zugeordnet.
f055

2
WARNUNG!! Schritt 3 hat bei mir nicht funktioniert und mein Herz hat fast aufgehört, als ich sah, dass MySQL ohne InnoDB geladen wurde. Ich musste MySQL stoppen und manuell entfernen und MySQL erneut starten. Zwei Ratschläge: 1. Sichern Sie Ihre bereits vorhandenen Protokolldateien, 2. Löschen Sie die Dateien manuell
Peeyush Kushwaha

2
Peeyush ist richtig. Sogar in der MySQL-Dokumentation wird empfohlen, Ihre Protokolldateien
Greg,

1
@ Greg Deshalb benutze ich SET GLOBAL innodb_fast_shutdown = 0;. Beim Herunterfahren von MySQL werden alle Transaktionen aus allen sich bewegenden Teilen gelöscht, einschließlich der Redo-Protokolle (ib_logfile0 und ib_logfile1). Man kann sie behalten. Ich habe noch keine Probleme mit vollständig geleerten Protokollen.
RolandoMySQLDBA

31

Ich würde stattdessen die offizielle Methode empfehlen , die ich hier der Einfachheit halber wiedergebe:

Befolgen Sie die folgenden Anweisungen, um die Anzahl oder Größe der InnoDB-Protokolldateien in MySQL 5.6.7 oder früher zu ändern . Die zu verwendende Prozedur hängt vom Wert von innodb_fast_shutdown ab, der bestimmt, ob der Systemtabellenbereich vor einem Herunterfahren vollständig aktualisiert werden soll oder nicht:

  • Wenn innodb_fast_shutdown nicht auf 2 gesetzt ist: Stoppen Sie den MySQL-Server und stellen Sie sicher, dass er fehlerfrei heruntergefahren wird, um sicherzustellen, dass das Redo-Protokoll keine Informationen für ausstehende Transaktionen enthält. Kopieren Sie die alten Redo-Log-Dateien an einen sicheren Ort, falls beim Herunterfahren ein Fehler aufgetreten ist und Sie sie benötigen, um den Tablespace wiederherzustellen. Löschen Sie die alten Protokolldateien aus dem Protokolldateiverzeichnis, bearbeiten Sie my.cnf, um die Protokolldateikonfiguration zu ändern, und starten Sie den MySQL-Server erneut. mysqld erkennt, dass beim Start keine InnoDB-Protokolldateien vorhanden sind und erstellt neue.

  • Wenn innodb_fast_shutdown auf 2 gesetzt ist: Setze innodb_fast_shutdown auf 1:

mysql> SET GLOBAL innodb_fast_shutdown = 1;

Folgen Sie dann den Anweisungen im vorherigen Punkt.

Ab MySQL 5.6.8 ist die Einstellung innodb_fast_shutdown nicht mehr relevant, wenn Sie die Anzahl oder Größe der InnoDB-Protokolldateien ändern. Darüber hinaus müssen Sie keine alten Protokolldateien mehr entfernen, obwohl Sie die alten Protokolldateien möglicherweise weiterhin als Sicherung an einen sicheren Ort kopieren möchten. Führen Sie die folgenden Schritte aus, um die Anzahl oder Größe der InnoDB-Protokolldateien zu ändern:

  1. Stoppen Sie den MySQL-Server und stellen Sie sicher, dass er fehlerfrei heruntergefahren wird.

  2. Bearbeiten Sie my.cnf, um die Konfiguration der Protokolldatei zu ändern. Konfigurieren Sie innodb_log_file_size, um die Größe der Protokolldatei zu ändern. Konfigurieren Sie innodb_log_files_in_group, um die Anzahl der Protokolldateien zu erhöhen.

  3. Starten Sie den MySQL-Server erneut.

Wenn InnoDB feststellt, dass innodb_log_file_size von der Größe der Redo-Protokolldatei abweicht, schreibt es einen Protokollprüfpunkt, schließt und entfernt die alten Protokolldateien, erstellt neue Protokolldateien in der angeforderten Größe und öffnet die neuen Protokolldateien.


Dies ist eine gute Antwort als Update auf diese Frage. +1 !!!
RolandoMySQLDBA

2
Dies ist kein "Update". Diese Handbuchseiten gibt es schon lange. Ich empfehle immer Informationen aus erster Hand aus dem Handbuch (eines der besten Handbücher überhaupt), anstatt das Rad neu zu erfinden und Informationen zu duplizieren (was wir DBAs am meisten hassen).
RandomSeed

Dies ist die bevorzugte Methode ab MySQL 5.6. Wenn Sie noch mit einer Version vor 5.6 arbeiten, funktioniert dies nicht.
Derek Downey

20

innodb_buffer_pool_size- einfach ändern my.cnf( my.ini) und mysqld neu starten.

innodb_log_file_sizeist weniger kritisch. Ändern Sie es nicht, es sei denn, es gibt einen Grund dafür. Roland lieferte die Schritte , aber ein Aspekt macht mir Sorgen ... Ich weiß nicht, ob die ersten beiden Schritte wichtig sind; es scheint, als könnten sie sein:

  1. set innodb_fast_shutdown = OFF
  2. starte mysql neu
  3. Stoppen Sie MySQL
  4. Entfernen Sie die Protokolldateien
  5. Starten Sie MySQL

Die Protokolldateien protokollieren noch nicht abgeschlossene Geschäfte. " innodb_fast_shutdown" sagt, dass man sich nach dem Neustart mit dem Zeug befassen soll . Das Entfernen der Dateien kann also Informationen verlieren?

Neue Versionen haben Dinge verbessert: (mehr Diskussion in den Kommentaren)

  • 5.6 Ermöglicht innodb_log_file_size> 4 GB
  • 5.6 innodb_log_file_sizekann geändert werden, ohne zuerst iblog zu entfernen *
  • 5.7 ermöglicht eine dynamische Größenänderung innodb_buffer_pool_size

Soll ich log_file_size ändern?

Verwenden Sie GLOBAL STATUSdiese Option, um die Anzahl der Minuten vor den Protokollzyklen zu berechnen.

Uptime / 60 * innodb_log_file_size / Innodb_os_log_written`

Wenn es viel weniger als 60 (Minuten) ist, kann es hilfreich sein, log_file_size zu erhöhen. Wenn es viel mehr ist, verschwenden die Protokolldateien Speicherplatz. Diese "1 Stunde" ist eher willkürlich. Wenn Sie also in der Nähe sind, müssen Sie die log_file_size nicht ändern.

Übernehmen Sie innodb_log_files_in_groupden Standardwert von 2.


+1 Ihr Anliegen scheint von den Docs
Jack Douglas

Ich habe mir diese Antwort angesehen und die erste Zeile gefällt mir. Ich hatte normalerweise Kunden, die mysql runter und rauf brachten, --skip-networkingals Vorsichtsmaßnahme, um diese Änderungen in letzter Minute aus dem Weg zu räumen. Deine erste Zeile (setze innodb_fast_shutdown = OFF) beseitigt das. +1 !!!
RolandoMySQLDBA

1
Danke für die positiven Bewertungen. Neue Leser benötigen dies möglicherweise nicht. In 5.6.8 , innodb_log_file_sizewurde erweitert , damit es zu ändern , ohne die iblog Dateien zu entfernen.
Rick James

Dis du meinst "kritischer", nicht "weniger kritisch"?
Igor

@Igor - Nein. Wenn Sie log_file_size viel zu klein haben, werden zusätzliche E / A-Vorgänge ausgeführt. Das sehe ich selten. Wenn Sie es viel zu groß haben, verschwenden Sie nur Speicherplatz. Das Ziel bei der Einstellung ist es, in einer Stunde durchzukommen. Aber 10 Minuten versus 10 Stunden - beides spielt keine Rolle. mehr ...
Rick James

1

Wenn Sie sich bei mysql anmelden, geben Sie folgende Befehle ein:

pager grep seq;
show engine innodb status \G select sleep(60); show engine innodb status \G

Sie erhalten zwei Zahlen. Zuerst bekommt man einen und wartet dann eine Minute. Sie werden eine andere bekommen.

Angenommen, der erste ist 3.456.718.123 und der zweite ist 4.098.873.134

Now (4.098.873.134-3.856.718.123) * 60/1024/1024

Das Ergebnis ist = 13.856 MB

Sie haben zwei Protokolldateien. Wenn Sie es durch zwei teilen, erhalten Sie eine Zahl in der Nähe von 7.000 MB. Stellen Sie zur Sicherheit die Größe Ihrer Protokolldatei auf 8 GB ein


1
Es ist nicht offensichtlich (zumindest für mich), dass dies tatsächlich die Frage beantwortet. Dies scheint ein Vorschlag für eine alternative Größe der Protokolldatei zu sein, nicht für das sichere Ändern der Größe der Protokolldatei.
RDFozz

1
@RDFozz du hast recht. Hiermit wird nicht beantwortet, wie die Größe der Protokolldatei geändert werden soll. Diese Frage beantwortet die Frage, wie Sie die Anzahl ermitteln, um die innodb_log_file_size festzulegen. Ich antwortete bereits eine solche Frage 5 Jahre vor (die Hierher Siehe Log File Sizein dba.stackexchange.com/questions/23189/... )
RolandoMySQLDBA

Ich wollte nur helfen: / Ich weiß, es ist jedoch nicht die genaue Antwort.
Linux Newbie

-4

chown mysql: mysql -R / etc / mysql / var / lib / mysql && cd / var / lib / mysql && rm -f ib_logfile * && service mysql restart || Service MySQL neu starten

Probieren Sie es aus, es wird garantiert funktionieren [getestet auf Debian 6]


2
Dies garantiert kein sauberes Herunterfahren. Es funktioniert möglicherweise im Durchschnitt auf einem Server mit nur geringer Auslastung, es wird jedoch nicht empfohlen, wenn Sie sich um die Integrität Ihrer Datenbank kümmern.
Emil Vikström,
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.