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.