it-swarm-eu.dev

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

Ich bin also ziemlich neu in der Optimierung von InnoDB. Ich wechsle langsam die Tabellen (wo nötig) von MyIsam zu InnoDB. Ich habe ungefähr 100 MB in innodb, also habe ich die Variable innodb_buffer_pool_size 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 ging, um den Wert innodb_log_file_size Zu ändern (Beispiel my.cnf on mysqls innodb-Konfigurationsseite Kommentare, um die Größe der Protokolldatei auf 25% der Puffergröße zu ändern. cnf sieht so aus:

# innodb
innodb_buffer_pool_size = 128M
innodb_log_file_size = 32M

Beim Neustart des Servers wird folgende Fehlermeldung angezeigt:

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

Meine Frage: Ist es sicher, die alten log_files zu löschen, oder gibt es eine andere Methode, um die Variable innodb_log_file_size Zu ändern?

108
Derek Downey

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

Beim Starten von mysqld wird ib_logfile0 und ib_logfile1

Versuche es !!!

UPDATE 2011-10-20 16:40 EDT

Es werden alle Daten im InnoDB-Pufferpool sauber ausgeblendet, bevor die Protokolldateien erneut erstellt werden. Sie sollten 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 fehlerhaften Seiten unter 1% des InnoDB-Pufferpools. Durchführen von service mysql stop macht das trotzdem. Durch ein Herunterfahren werden außerdem 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 19.04.2013 16:16 EDT

Ich habe meine Antwort ein wenig mehr mit innodb_fast_shutdown aktualisiert, weil ich mysql neu gestartet und mysql gestoppt habe, um dies zu tun. Dieser eine Schritt ist jetzt von entscheidender Bedeutung, da jede nicht festgeschriebene Transaktion möglicherweise andere bewegliche Teile innerhalb und außerhalb der InnoDB-Transaktionsprotokolle enthält ( Siehe InnoDB-Infrastruktur ) ).

Bitte beachten Sie, dass die Einstellung innodb_fast_shutdown auf 2 auch die Protokolle bereinigen würde, aber noch mehr bewegliche Teile vorhanden sind und bei Absturz ausgewählt werden Wiederherstellung während des Starts von mysqld. Die Einstellung von 0 ist am besten.

86
RolandoMySQLDBA

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

Verwenden 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 im Redo-Protokoll keine Informationen für ausstehende Transaktionen vorhanden sind. 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 Konfiguration der Protokolldatei 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: Setzen Sie 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 die Anzahl oder Größe der InnoDB-Protokolldateien geändert wird. Außerdem 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 die Größe von 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.

31
RandomSeed

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

innodb_log_file_size ist weniger kritisch. Ändern Sie es nicht, es sei denn, es gibt einen Grund dafür. Roland vorausgesetzt 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. starten Sie MySQL neu
  3. hör auf mysql
  4. entfernen Sie die Protokolldateien
  5. starte mysql

Die Protokolldateien verfolgen unvollendete Geschäfte. " innodb_fast_shutdown "sagt, dass man sich mit dem Zeug befassen soll nach Neustart. 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_size kann geändert werden, ohne zuvor iblog zu entfernen *
  • 5.7 ermöglicht die dynamische Größenänderung von innodb_buffer_pool_size

Soll ich log_file_size ändern?

Verwenden GLOBAL STATUS, 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.

Verlassen innodb_log_files_in_group bei der Standardeinstellung 2.

22
Rick James

Wenn Sie sich bei MySQL anmelden, geben Sie die folgenden Befehle ein:

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

Sie erhalten zwei Zahlen. Zuerst bekommst du eine und wartest dann eine Minute. Du wirst einen anderen bekommen.

Angenommen, der erste ist 3.456.718.123 und der zweite ist 4.098.873.134

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

Das Ergebnis ist = 13,856 MB

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

2
Linux Newbie