Hello Matthias,
Sorry, I missed your update.
I see that the InnoDB doublewrite buffer and the page checksums were enabled. So, crash recovery should have performed as expected. It is theoretically possible that a corrupted page accidentally got a valid-looking checksum, though.
The page checksum of the attached file undo_page.bin (which was extracted from gdb) is valid, which suggests that there was no recent redo log activity for the page, or a redo log checkpoint was written by one of the startup attempts before the code crashed when accessing the seemingly corrupted undo log.
As far as I can tell, given that you (quite understandably) do not want to share the data files for deeper analysis, the only way to move forward with this is that someone starts up the server on the data files under a debugger, setting breakpoints in InnoDB code to figure out where the corruption originally occurs.
Less likely options are that someone else runs into this bug, or that you are able to create a reduced test case for repeating the problem.
One more thing that you could perhaps try is to check the diagnostics of the storage medium. Does smartctl -a report any serious errors, such as sector relocation? I am thinking of a possible chain of events like this: The server crashed. On the first crash recovery attempt (applying the redo log), reading the undo log page failed, and the hard drive substituted an empty page (filled with zeros). This would pass the InnoDB page checksum. Then, the redo log records would be applied and the page would be rewritten, except for some ‘holes’ that were not covered by the redo log records.
Also, I wonder if there is some tool like memtest86 which would test the reliability of file systems and the block device. Running memtest86 or similar could also be a good idea, because InnoDB page checksums are only calculated immediately before writing a block back to disk. A low-probability RAM corruption caused by unreliable hardware could go unnoticed for a long time.
All that happend after a system crash caused by a game (X:Rebirth). As the storage contains information about private and business e-mails I am not willing and legally not allowed to disclose the data.
__memcpy_ssse3 () at ../sysdeps/x86_64/multiarch/memcpy-ssse3.S:2848
2848 ../sysdeps/x86_64/multiarch/memcpy-ssse3.S: Datei oder Verzeichnis nicht gefunden.
(gdb) frame 4
#4 trx_purge_get_next_rec (n_pages_handled=n_pages_handled@entry=0x7fffdcc0dde0, heap=0x555557a4e8c0) at /usr/src/debug/mariadb-10.0.22/storage/xtradb/trx/trx0purge.cc:908
908 /usr/src/debug/mariadb-10.0.22/storage/xtradb/trx/trx0purge.cc: Datei oder Verzeichnis nicht gefunden.
(gdb) info locals
rec = 0x7fffe7f6d008 ""
rec2 = <optimized out>
offset = 4104
page_no = 633
space = 0
zip_size = 0
mtr = {memo = {heap = 0x0, used = 32,
data = "\001\000\000\000\000\000\000\000\200\310\377\342\377\177\000\000\001\000\000\000\000\000\000\000\200\321\377\342\377\177", '\000' <repeats 58 times>, "\t\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000\260\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\t\000\000\000\062", '\000' <repeats 19 times>, "[\000\000\000n", '\000' <repeats 19 times>, "w\000\000\000|", '\000' <repeats 11 times>, " \000\000\330\377\177\000\000\200", '\000' <repeats 23 times>..., base = {count = 93825018611448, start = 0x68, end = 0x7fffd80266c8}, list = {prev = 0x555555dc3214 <dict_table_stats_lock(dict_table_t*, unsigned long)+596>, next = 0x11}}, log = {heap = 0x0, used = 0,
data = "\000\000\000\000\000\000\000\000]\000\000\000n\000\000\000\000\252\220y%\rg\220\000\000\000\000\000\000\000\000\000\t\000\330\377\177\000\000\300\350\244WUU\000\000\000\000\000\000\000\000\000\000\300\066\343VUU\000\000\000\000\000\000\000\000\000\000\350\343\244WUU\000\000_\031\316UUU\000\000\000\000\000\000\000\000\000\000\025", '\000' <repeats 16 times>, "\004", '\000' <repeats 15 times>, "\252\220y%\rg\220h\004\000\000\000\000\000\000\000\252\220y%\rg\220\200p\345VUU\000\000\300\350\244WUU\000\000(\351\244WUU\000\000\300\350\244WUU\000\000\300\066\343VUU\000\000<6\323UUU\000\000"..., base = {count = 0, start = 0x0, end = 0x555557a4e3e8}, list = {prev = 0x555557a22158,
next = 0x7ffff5e2e254 <__GI___libc_malloc+84>}}, inside_ibuf = 0, modifications = 0, made_dirty = 0, n_log_recs = 0, n_freed_pages = 0, log_mode = 21, start_lsn = 8104, end_lsn = 10405299918667295232, trx = 0x0}
(gdb) p *n_pages_handled
$1 = 166