MySQL Update: The redo log file ./#innodb_redo/#ib_redo18 size 909312 is not a multiple of innodb_page_size

Bei dem letzten Update meiner MySQL Datenbank auf einem Ubuntu 20.04 Server ist ein Fehler aufgetreten, wodurch ich die Datenbank nicht mehr starten konnte.

Im Log ist folgendes zu lesen:

2022-08-02T12:47:22.127576Z 1 [ERROR] [MY-012962] [InnoDB] The redo log file ./#innodb_redo/#ib_redo18 size 909312 is not a multiple of innodb_page_size  
2022-08-02T12:47:22.127781Z 1 [ERROR] [MY-012930] [InnoDB] Plugin initialization aborted with error Generic error.  
2022-08-02T12:47:22.300317Z 1 [ERROR] [MY-010334] [Server] Failed to initialize DD Storage Engine  
2022-08-02T12:47:22.301113Z 0 [ERROR] [MY-010020] [Server] Data Dictionary initialization failed.  
2022-08-02T12:47:22.301289Z 0 [ERROR] [MY-010119] [Server] Aborting

Die Lösung für das Problem fand sich auf Stackoverflow: https://stackoverflow.com/questions/73186360/innodb-redo0-is-not-a-multiple-of-innodb-page-size

Man muss die redolog Datei auf die passende Größe mit Nullen erweitern. Dazu berechnet man zuerst die Anzahl der Fehlenden Bits

<broken_file_size> % <default_page_size>

root@ipDatabase:~# ls -l /var/lib/mysql/#innodb_redo/#ib_redo18    
-rw-r----- 1 mysql mysql 909312 Jul 29 06:10 /var/lib/mysql/#innodb_redo/#ib_redo18

Die Datei ist also 909312 Byte Groß. Die Rechnung ist dann wie folgt.

echo $((909312 % 16384))
8192

Nun nutzen wir den Code von Stackoverflow

# Gather required zeros to append
# Will create a "zeros" file in the current directory
# This has been calculated based upon 23289856 % 16384 = 8192 or <broken_file_size> % <default_page_size>
dd if=/dev/zero bs=1 count=8192 of=./zeros

# Append zeroes to invalid file
cat zeros >> /var/lib/mysql/#innodb_redo/#ib_redo0

# Restart MySQL
systemctl restart mysql.service

Das alleine hat mein Problem aber noch nicht gelöst.

Da meine Datenbank als LXD Container in einem ZFS-Pool läuft und ZFS scheinbar das Problem ist, habe ich den Container noch auf einen anderen Pool verschieben müssen, bevor ich die oberen Schritte erfolgreich durchführen konnte.

lxc storage create dirpool btrfs
lxc move mySQL -s dirpool
lxc monitor #zeigt den Fortsritt beim Verschieben
lxc start mySQL
# Die Schritte von oben durchführen

# Gather required zeros to append
# Will create a "zeros" file in the current directory
# This has been calculated based upon 23289856 % 16384 = 8192 or <broken_file_size> % <default_page_size>
dd if=/dev/zero bs=1 count=8192 of=./zeros

# Append zeroes to invalid file
cat zeros >> /var/lib/mysql/#innodb_redo/#ib_redo0

# Restart MySQL
systemctl restart mysql.service

Danach ließ sich die Datenbank wieder wie gewünscht starten.

Kommentare anzeigen

Wir nutzen Cookies

Um die Nutzung der Website zu verbessern, nutzen wir Cookies.
Desweiteren werden Google-Dienste für das schalten von Werbung verwendet. Mit der Nutzung der Website geben Sie ihr Einverständnis.
Sollte die Nutzung von Cookies abgelehnt werden, kann dies Auswirkung auf die Nutzung der Website haben.