Kmail fails to start after upgrade to 15.6

Kmail / PIM / Akonadi fails to start following an otherwise smooth upgrade from Leap 15.5 to 15.6, and I’m hoping someone can help as my limited understanding of Kmail & Akonadi software design is exhausted. These symptoms seem superficially similar to those reported in After Leap upgrade 15.5 to 15.6. Akonadi fails to start

The Akonadi self-test report appears below.

Attempting to start the Kmail client results in the usual client window, but it eports “The Akonadi personal informational management service is not operational” and clicking the Details button yields nothing. It’s still possible to partially configure a user, but the problem is obviously much deeper.

A MYsql socket demon (mysqld) is running, and the Services Manager shows both the MariaDB server (mariadb) and D-Bus (dbus) are in “Active (Running)” state.

However manually stopping & restarting akonadi produces this error:

~> akonadictl stop
Akonadi is not running.
~> akonadictl start
org.kde.pim.akonadictl: Starting Akonadi Server…
org.kde.pim.akonadictl: done.
Connecting to deprecated signal QDBusConnectionInterface::serviceOwnerChanged(QString,QString,QString)
david@Ulysses:~> org.kde.pim.akonadiserver: Starting up the Akonadi Server…
org.kde.pim.akonadiserver: database server stopped unexpectedly
org.kde.pim.akonadiserver: Database process exited unexpectedly during initial connection!
org.kde.pim.akonadiserver: executable: “/usr/sbin/mysqld”
org.kde.pim.akonadiserver: arguments: (“–defaults-file=/home/david/.local/share/akonadi/mysql.conf”, “–datadir=/home/david/.local/share/akonadi/db_data/”, “–socket=/run/user/1000/akonadi/mysql.socket”, “–pid-file=/run/user/1000/akonadi/mysql.pid”)
org.kde.pim.akonadiserver: stdout: “”
org.kde.pim.akonadiserver: stderr: “”
org.kde.pim.akonadiserver: exit code: 1
org.kde.pim.akonadiserver: process error: “Unknown error”
org.kde.pim.akonadiserver: Shutting down AkonadiServer…
org.kde.pim.akonadicontrol: Application ‘/usr/bin/akonadiserver’ exited normally…
^C

At various times I’ve seen hints that QT6 should be present too, but only QT5 (and libQt5Sql5-mysql) is installed.

And finally, here’s the result of an Akonadi self-test:

Akonadi Server Self-Test Report===============================
Test 1: SUCCESS

Database driver found.
Details: The QtSQL driver ‘QMYSQL’ is required by your current Akonadi server configuration and was found on your system.

File content of ‘/home/david/.config/akonadi/akonadiserverrc’:
[Debug]
Tracer=null

[%General]
Driver=QMYSQL

[QMYSQL]
Host=
Name=akonadi
Options=“UNIX_SOCKET=/run/user/1000/akonadi/mysql.socket”
ServerPath=/usr/sbin/mysqld
StartServer=true

Test 2: SUCCESS

Akonadi is not running as root
Details: Akonadi is not running as a root/administrator user, which is the recommended setup for a secure system.

Test 3: SUCCESS

MySQL server found.
Details: You have currently configured Akonadi to use the MySQL server ‘/usr/sbin/mysqld’.
Make sure you have the MySQL server installed, set the correct path and ensure you have the necessary read and execution rights on the server executable. The server executable is typically called ‘mysqld’; its location varies depending on the distribution.

Test 4: SUCCESS

MySQL server is executable.
Details: MySQL server found: /usr/sbin/mysqld Ver 10.11.9-MariaDB for Linux on x86_64 (MariaDB package)

Test 5: ERROR

MySQL server log contains errors.
Details: The MySQL server error log file ‘/home/david/.local/share/akonadi/db_data/mysql.err’ contains errors.

File content of ‘/home/david/.local/share/akonadi/db_data/mysql.err’:
2025-04-08 13:44:14 0 [Note] Starting MariaDB 10.11.9-MariaDB source revision 0e8fb977b00983d98c4c35e39bc1f36463095938 server_uid 3WTHVoeodKIyNVq7TAq17iolf3U= as process 6516
2025-04-08 13:44:14 0 [Warning] option ‘innodb-log-buffer-size’: unsigned value 1048576 adjusted to 2097152
2025-04-08 13:44:14 0 [Note] InnoDB: Compressed tables use zlib 1.2.13
2025-04-08 13:44:14 0 [Note] InnoDB: Number of transaction pools: 1
2025-04-08 13:44:14 0 [Note] InnoDB: Using crc32 + pclmulqdq instructions
2025-04-08 13:44:14 0 [Note] InnoDB: Using Linux native AIO
2025-04-08 13:44:14 0 [Note] InnoDB: Initializing buffer pool, total size = 128.000MiB, chunk size = 2.000MiB
2025-04-08 13:44:14 0 [Note] InnoDB: Completed initialization of buffer pool
2025-04-08 13:44:14 0 [Note] InnoDB: Buffered log writes (block size=512 bytes)
2025-04-08 13:44:14 0 [ERROR] InnoDB: Upgrade after a crash is not supported. The redo log was created with MariaDB 10.6.18. You must start up and shut down MariaDB 10.7 or earlier.
2025-04-08 13:44:14 0 [ERROR] InnoDB: Plugin initialization aborted with error Generic error
2025-04-08 13:44:14 0 [Note] InnoDB: Starting shutdown…
2025-04-08 13:44:14 0 [ERROR] Plugin ‘InnoDB’ registration as a STORAGE ENGINE failed.
2025-04-08 13:44:14 0 [Note] Plugin ‘FEEDBACK’ is disabled.
2025-04-08 13:44:14 0 [ERROR] Unknown/unsupported storage engine: innodb
2025-04-08 13:44:14 0 [ERROR] Aborting

Test 6: SUCCESS

MySQL server default configuration found.
Details: The default configuration for the MySQL server was found and is readable at /etc/xdg//akonadi/mysql-global.conf.

File content of ‘/etc/xdg//akonadi/mysql-global.conf’:

Global Akonadi MySQL server settings,

These settings can be adjusted using $HOME/.config/akonadi/mysql-local.conf

Based on advice by Kris Köhntopp kris@mysql.com

[mysqld]

strict query parsing/interpretation

TODO: make Akonadi work with those settings enabled

sql_mode=strict_trans_tables,strict_all_tables,strict_error_for_division_by_zero,no_auto_create_user,no_auto_value_on_zero,no_engine_substitution,no_zero_date,no_zero_in_date,only_full_group_by,pipes_as_concat

sql_mode=strict_trans_tables

DEBUGGING:

log all queries, useful for debugging but generates an enormous amount of data

log=mysql.full

log queries slower than n seconds, log file name relative to datadir (for debugging only)

log_slow_queries=mysql.slow

long_query_time=1

log queries not using indices, debug only, disable for production use

log_queries_not_using_indexes=1

measure database size and adjust innodb_buffer_pool_size

SELECT sum(data_length) as bla, sum(index_length) as blub FROM information_schema.tables WHERE table_schema not in (“mysql”, “information_schema”);

NOTES:

Keep Innob_log_waits and keep Innodb_buffer_pool_wait_free small (see show global status like “inno%”, show global variables)

#expire_logs_days=3

#sync_bin_log=0

Use UTF-8 encoding for tables

character_set_server=utf8
collation_server=utf8_general_ci

use InnoDB for transactions and better crash recovery

default_storage_engine=innodb

memory buffer InnoDB uses to cache data and indexes of its tables (default:128M)

Larger values means less I/O

innodb_buffer_pool_size=128M

Create a .ibd file for each table (default:0)

innodb_file_per_table=1

Write out the log buffer to the log file at each commit (default:1)

innodb_flush_log_at_trx_commit=2

Buffer size used to write to the log files on disk (default:1M for builtin, 8M for plugin)

larger values means less I/O

innodb_log_buffer_size=1M

Size of each log file in a log group (default:5M) larger means less I/O but more time for recovery.

innodb_log_file_size=64M

# error log file name, relative to datadir (default:hostname.err)

log_error=mysql.err

print warnings and connection errors (default:1)

loose_log_warnings=2

Convert table named to lowercase

lower_case_table_names=1

Maximum size of one packet or any generated/intermediate string. (default:1M)

max_allowed_packet=32M

Maximum simultaneous connections allowed (default:100)

max_connections=256

The two options below make no sense with prepared statements and/or transactions

(make sense when having the same query multiple times)

Memory allocated for caching query results (default:0 (disabled))

loose_query_cache_size=0

Do not cache results (default:1)

loose_query_cache_type=0

Do not use the privileges mechanisms

skip_grant_tables

Do not listen for TCP/IP connections at all

skip_networking

The number of open tables for all threads. (default:64)

table_open_cache=200

How many threads the server should cache for reuse (default:0)

thread_cache_size=3

wait 365d before dropping the DB connection (default:8h)

wait_timeout=31536000

We use InnoDB, so don’t let MyISAM eat up memory

key_buffer_size=16K

[client]
default-character-set=utf8

Test 7: SKIP

MySQL server custom configuration not available.
Details: The custom configuration for the MySQL server was not found but is optional.

Test 8: SUCCESS

MySQL server configuration is usable.
Details: The MySQL server configuration was found at /home/david/.local/share/akonadi/mysql.conf and is readable.

File content of ‘/home/david/.local/share/akonadi/mysql.conf’:

Global Akonadi MySQL server settings,

These settings can be adjusted using $HOME/.config/akonadi/mysql-local.conf

Based on advice by Kris Köhntopp kris@mysql.com

[mysqld]

strict query parsing/interpretation

TODO: make Akonadi work with those settings enabled

sql_mode=strict_trans_tables,strict_all_tables,strict_error_for_division_by_zero,no_auto_create_user,no_auto_value_on_zero,no_engine_substitution,no_zero_date,no_zero_in_date,only_full_group_by,pipes_as_concat

sql_mode=strict_trans_tables

DEBUGGING:

log all queries, useful for debugging but generates an enormous amount of data

log=mysql.full

log queries slower than n seconds, log file name relative to datadir (for debugging only)

log_slow_queries=mysql.slow

long_query_time=1

log queries not using indices, debug only, disable for production use

log_queries_not_using_indexes=1

measure database size and adjust innodb_buffer_pool_size

SELECT sum(data_length) as bla, sum(index_length) as blub FROM information_schema.tables WHERE table_schema not in (“mysql”, “information_schema”);

NOTES:

Keep Innob_log_waits and keep Innodb_buffer_pool_wait_free small (see show global status like “inno%”, show global variables)

#expire_logs_days=3

#sync_bin_log=0

Use UTF-8 encoding for tables

character_set_server=utf8
collation_server=utf8_general_ci

use InnoDB for transactions and better crash recovery

default_storage_engine=innodb

memory buffer InnoDB uses to cache data and indexes of its tables (default:128M)

Larger values means less I/O

innodb_buffer_pool_size=128M

Create a .ibd file for each table (default:0)

innodb_file_per_table=1

Write out the log buffer to the log file at each commit (default:1)

innodb_flush_log_at_trx_commit=2

Buffer size used to write to the log files on disk (default:1M for builtin, 8M for plugin)

larger values means less I/O

innodb_log_buffer_size=1M

Size of each log file in a log group (default:5M) larger means less I/O but more time for recovery.

innodb_log_file_size=64M

# error log file name, relative to datadir (default:hostname.err)

log_error=mysql.err

print warnings and connection errors (default:1)

loose_log_warnings=2

Convert table named to lowercase

lower_case_table_names=1

Maximum size of one packet or any generated/intermediate string. (default:1M)

max_allowed_packet=32M

Maximum simultaneous connections allowed (default:100)

max_connections=256

The two options below make no sense with prepared statements and/or transactions

(make sense when having the same query multiple times)

Memory allocated for caching query results (default:0 (disabled))

loose_query_cache_size=0

Do not cache results (default:1)

loose_query_cache_type=0

Do not use the privileges mechanisms

skip_grant_tables

Do not listen for TCP/IP connections at all

skip_networking

The number of open tables for all threads. (default:64)

table_open_cache=200

How many threads the server should cache for reuse (default:0)

thread_cache_size=3

wait 365d before dropping the DB connection (default:8h)

wait_timeout=31536000

We use InnoDB, so don’t let MyISAM eat up memory

key_buffer_size=16K

[client]
default-character-set=utf8

Test 9: SUCCESS

akonadictl found and usable
Details: The program ‘/usr/bin/akonadictl’ to control the Akonadi server was found and could be executed successfully.
Result:
akonadictl 5.24.5 (23.08.5)

Test 10: ERROR

Akonadi control process not registered at D-Bus.
Details: The Akonadi control process is not registered at D-Bus which typically means it was not started or encountered a fatal error during startup.

Test 11: ERROR

Akonadi server process not registered at D-Bus.
Details: The Akonadi server process is not registered at D-Bus which typically means it was not started or encountered a fatal error during startup.

Test 12: SKIP

Protocol version check not possible.
Details: Without a connection to the server it is not possible to check if the protocol version meets the requirements.

Test 13: ERROR

No resource agents found.
Details: No resource agents have been found, Akonadi is not usable without at least one. This usually means that no resource agents are installed or that there is a setup problem. The following paths have been searched: ‘/usr/share/akonadi/agents’. The XDG_DATA_DIRS environment variable is set to ‘/home/david/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share’; make sure this includes all paths where Akonadi agents are installed.

Directory listing of ‘/usr/share/akonadi/agents’:
akonadiindexingagent.desktop
akonotesresource.desktop
archivemailagent.desktop
birthdaysresource.desktop
contactsresource.desktop
davgroupwareresource.desktop
etesyncresource.desktop
ewsmtaresource.desktop
ewsresource.desktop
followupreminder.desktop
googleresource.desktop
icaldirresource.desktop
icalresource.desktop
imapresource.desktop
knutresource.desktop
kolabresource.desktop
maildirresource.desktop
maildispatcheragent.desktop
mailfilteragent.desktop
mailmergeagent.desktop
mboxresource.desktop
migrationagent.desktop
mixedmaildirresource.desktop
newmailnotifieragent.desktop
notesagent.desktop
notesresource.desktop
openxchangeresource.desktop
pop3resource.desktop
sendlateragent.desktop
tomboynotesresource.desktop
unifiedmailboxagent.desktop
vcarddirresource.desktop
vcardresource.desktop

Environment variable XDG_DATA_DIRS is set to ‘/home/david/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share’

Test 14: SUCCESS

No current Akonadi server error log found.
Details: The Akonadi server did not report any errors during its current startup.

Test 15: SUCCESS

No previous Akonadi server error log found.
Details: The Akonadi server did not report any errors during its previous startup.

Test 16: SUCCESS

No current Akonadi control error log found.
Details: The Akonadi control process did not report any errors during its current startup.

Test 17: SUCCESS

No previous Akonadi control error log found.
Details: The Akonadi control process did not report any errors during its previous startup.


Please, to make the pieces of computer code in your posts better consumable by technical oriented people:

And post as complete as possible. That is starting with the line with the prompt and the command, then all output, and ending with the new prompt line.
When you really feel you need to change anything in such a copy, then in a comment, else we take all characters literally.

Yes, I realiseed the self-test report was pretty ugly after posting the head entry. The text was obtained by pasting the clipboard contents written directly by the Akonadi self-test package (when I eventually discovered how to goad it into action).

Unfortunately I couldn’t remember where the self-test was located in the system and couldn’t google that information anywhere so I could run it from the CLI and thus get a nice, tidy report with uniform font sizes. And just in passing, I wonder why it uses such a weird range of fonts anyway?

Any comment on where the problem lies? Others have apparently had similar issues.

I personally have no idea. I upgraded from 15.5 > 15.6 (using the on-line method), about half a year ago and did not have the Kmail problems you have.

KMail use a MariaDB database with an innodb storage system. Your MariaDB database crashed before you upgrade from openSUSE Leap 15.5 to 15.6. OpenSUSE Leap 15.6 includes MariaDB version 10.11.9 which is not able to restore your crashed MariaDB database. Read this carefully:

2025-04-08 13:44:14 0 [ERROR] InnoDB: Upgrade after a crash is not supported. The redo log was created with MariaDB 10.6.18. You must start up and shut down MariaDB 10.7 or earlier.

You must start up and shut down this crashed database with MariaDB 10.7 or earlier (under openSUSE Leap 15.5). Or you remove this broken database entirely.

It is not recommendable to upgrade your openSUSE Leap 15.x with a running Wayland- or X11-session! Stop your graphical login manager KDM/GDM/what else, before you start the os upgrade.

Ahh… many thanks for that, and I’m sure you’re right.

As it happens, I was able to configure a Kmail client on another Leap 15.5 laptop and copy the file structure from /home/username/.local/share/local-mail/ on a 15.5 backup. Given there’s now a working 15.5 version of Kmail, I think I’ll just delete the 15.6 Mariadb database entirely and migrate a Kmail Archive from Leap 15.5 to 15.6.

I notice innotop isn’t installed on either system, but I presumably should use this to delete the existing database?

Does anyone know whether importing an Archive also initiates recreation of a new MariaDB database? I can’t see any GUI command to reindex the contents of a Kmail folder and all its subfolders; they apparently have to be manually reindexed one at a time.

Back in the day IBM manuals used to begin with a “Principles of Operation” which explained the architecture of the software (and hardware if relevant) so the reader properly understood the product. But these days a handbook or user-guide is usually just a compendium of “push this button to do that” commands so we have to rely instead on Community Fora and the Expert Members thereof. We should be thankful for their time!

Some advice here:
akonadi can also use a postgresql database. It is incredibly much faster…

Example:

[Debug]
Tracer=null

[%General]
Driver=QPSQL

[QPSQL]
Host=/tmp/akonadi-knurpht.P8f537
InitDbPath=/usr/bin/initdb
Name=akonadi
Options=
PgData=/home/knurpht/.local/share/akonadi/db_data
ServerPath=/usr/bin/pg_ctl
StartServer=true
knurpht@Lenovo-P16:~>

It needs an extra package though