Roundcube Session DB Cleanup

Auf dem kleinen mysql-Server, der verschiedene Applikationen auf dem rootserver mit Daten versorgt, ist mir aufgefallen, dass die Sessiontabelle der roundcube-Datenbank ca. 350 MB groß war. Eine genauere Untersuchung ergab, dass da Einträge bis ins Jahr 2015 zurückgingen. Hier schien also ein Cleanup-Job schon sehr lange nicht mehr gelaufen zu sein.

Die Sessiontabelle sieht folgendermaßen aus:

MariaDB [roundcube]> desc session;
+---------+--------------+------+-----+---------------------+-------+
| Field   | Type         | Null | Key | Default             | Extra |
+---------+--------------+------+-----+---------------------+-------+
| sess_id | varchar(128) | NO   | PRI | NULL                |       |
| changed | datetime     | NO   | MUL | 1000-01-01 00:00:00 |       |
| ip      | varchar(40)  | NO   |     | NULL                |       |
| vars    | mediumtext   | NO   |     | NULL                |       |
+---------+--------------+------+-----+---------------------+-------+
4 rows in set (0.00 sec)

Die Anzahl der Einträge lag bei ca. 500000. Um die Tabelle um alle Einträge zu erleichtern, die vor dem 01.02.2019 dazu gekommen sind, reichte ein beherztes

delete from session where changed < '2019-02-01 00:00:00';

Danach ist die Anzahl der Einträge auf knappe 500 gesunken. Um den Plattenplatz wieder freizugeben bedurfte es eines

MariaDB [roundcube]> optimize table session;

um die Tabelle wieder auf 10 MB zusammenschrumpfen zu lassen.

Den Effekt sieht man auch ganz gut in der Größe der täglichen DB-Dumps:

# ls -alh /backup/mysql/
total 840M
drwxr-xr-x 2 root root 4.0K Feb  9 06:49 .
drwxr-xr-x 5 root root 4.0K Sep 12 21:20 ..
-rw-r--r-- 1 root root  59M Jan 26 06:41 mysqldump-2019-01-26.sql.gz
-rw-r--r-- 1 root root  59M Jan 27 06:44 mysqldump-2019-01-27.sql.gz
-rw-r--r-- 1 root root  59M Jan 28 06:42 mysqldump-2019-01-28.sql.gz
-rw-r--r-- 1 root root  59M Jan 29 06:42 mysqldump-2019-01-29.sql.gz
-rw-r--r-- 1 root root  59M Jan 30 06:42 mysqldump-2019-01-30.sql.gz
-rw-r--r-- 1 root root  59M Jan 31 06:41 mysqldump-2019-01-31.sql.gz
-rw-r--r-- 1 root root  59M Feb  1 06:45 mysqldump-2019-02-01.sql.gz
-rw-r--r-- 1 root root  59M Feb  2 06:46 mysqldump-2019-02-02.sql.gz
-rw-r--r-- 1 root root  60M Feb  3 06:48 mysqldump-2019-02-03.sql.gz
-rw-r--r-- 1 root root  60M Feb  4 06:44 mysqldump-2019-02-04.sql.gz
-rw-r--r-- 1 root root  60M Feb  5 06:46 mysqldump-2019-02-05.sql.gz
-rw-r--r-- 1 root root  60M Feb  6 06:43 mysqldump-2019-02-06.sql.gz
-rw-r--r-- 1 root root  60M Feb  7 06:39 mysqldump-2019-02-07.sql.gz
-rw-r--r-- 1 root root  60M Feb  8 06:40 mysqldump-2019-02-08.sql.gz
-rw-r--r-- 1 root root  15M Feb  9 06:38 mysqldump-2019-02-09.sql.gz

Der Cleanup wird übrigens von zwei Konfigurationen gesteuert:

In der Roundcube-Konfig wird die Lebensdauer der Session gesetzt:

// Session lifetime in minutes
$config['session_lifetime'] = 10;
`````

Und in der php-Konfig (`php.ini`) wird die Cleanupfrequenz mit den Werten `session.gc_probability` und `session.gc_divisor` gesteuert.

````php
; Defines the probability that the 'garbage collection' process is started
; on every session initialization. The probability is calculated by using
; gc_probability/gc_divisor. Where session.gc_probability is the numerator
; and gc_divisor is the denominator in the equation. Setting this value to 1
; when the session.gc_divisor value is 100 will give you approximately a 1% chance
; the gc will run on any give request.
; Default Value: 1
; Development Value: 1
; Production Value: 1
; http://php.net/session.gc-probability
session.gc_probability = 1

; Defines the probability that the 'garbage collection' process is started on every
; session initialization. The probability is calculated by using the following equation:
; gc_probability/gc_divisor. Where session.gc_probability is the numerator and
; session.gc_divisor is the denominator in the equation. Setting this value to 1
; when the session.gc_divisor value is 100 will give you approximately a 1% chance
; the gc will run on any give request. Increasing this value to 1000 will give you
; a 0.1% chance the gc will run on any give request. For high volume production servers,
; this is a more efficient approach.
; Default Value: 100
; Development Value: 1000
; Production Value: 1000
; http://php.net/session.gc-divisor
session.gc_divisor = 1000

Die Häufigkeit der Cleanups berechnet sich folgendermaßen: session.gc_probability/session.gc_divisor.

session.gc_probability stand in diesem speziellen Fall auf 0, so dass kein Cleanup stattfand.