Nextcloud Datenbankmigration von sqlite3 zu MariaDB

Wer mit seiner Nextcloud Instanz auf Basis einer SQLITE3 Datenbank gestartet hat möchte diese vielleicht in eine stabilere und professionellere Datenbank (MariaDB) überführen. Wie das geht, das beschreiben wir in diesem Artikel.

Ein Backup ist obligatorisch und wird zwingend vorausgesetzt!

  1. Vorbereitungen
  2. DB-Migration

Die Ausgangsituation sieht wie folgt aus:

1. Vorbereitungen

Zuerst installieren Sie MariaDB als zukünftiges Datenbank-Backend Ihrer Nextcloudinstanz.

cd $HOME
sudo -s
apt install -y curl gnupg2 ca-certificates lsb-release ubuntu-keyring
curl -o /usr/share/keyrings/mariadb-keyring.pgp 'https://mariadb.org/mariadb_release_signing_key.pgp'
echo "deb [signed-by=/usr/share/keyrings/mariadb-keyring.pgp] https://mirror1.hs-esslingen.de/pub/Mirrors/mariadb/repo/10.11/ubuntu $(lsb_release -cs) main" \
    | sudo tee /etc/apt/sources.list.d/mariadb.list
apt install -y curl gnupg2 ca-certificates lsb-release debian-archive-keyring
wget https://downloads.mariadb.com/MariaDB/mariadb_repo_setup
chmod +x mariadb_repo_setup
./mariadb_repo_setup --mariadb-server-version="mariadb-10.11"

Stellen Sie sicher, dass alle PHP-Module installiert wurden:

apt update && apt install -y php-common \
php8.3-{fpm,gd,curl,xml,zip,intl,mbstring,bz2,ldap,apcu,bcmath,gmp,imagick,igbinary,mysql,redis,smbclient,sqlite3,cli,common,opcache,readline} \
imagemagick libmagickcore-6.q16-6-extra --allow-change-held-packages

Die Installation von MariaDB erfolgt nun mit diesem Befehl:

apt update && apt install -y mariadb-server

Härten wir nun den Datenbankserver mittels des mitgelieferten Tools „mysql_secure_installation“. Bei einer Erstinstallation besteht kein Rootpasswort, so dass Sie die Abfrage mit ENTER bestätigen könne. Es wird empfohlen, ein Passwort direkt zu setzen, der entsprechende Dialog erscheint automatisch:

mariadb-secure-installation

Führen Sie den Dialog wie folgt fort:

Enter current password for root (enter for none): <ENTER> or type the password
Switch to unix_socket authentication [Y/n] Y
Change the root password? [Y/n] Y
Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] Y
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y

Stoppen Sie nun den Datenbankserver und sichern dann die Standardkonfiguration, um unmittelbar danach Anpassungen vornehmen zu können:

systemctl stop mysql
mkdir -p /var/log/mysql
chown -R mysql:mysql /var/log/mysql
mv /etc/mysql/my.cnf /etc/mysql/my.cnf.bak
nano /etc/mysql/my.cnf

Kopieren Sie alle nachfolgenden Zeilen in die leere Datei:

[client]
default-character-set = utf8mb4
port = 3306
socket = /var/run/mysqld/mysqld.sock
[mysqld_safe]
log_error=/var/log/mysql/mysql_error.log
nice = 0
socket = /var/run/mysqld/mysqld.sock
[mysqld]
# performance_schema=ON
basedir = /usr
bind-address = 127.0.0.1
binlog_format = ROW
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
datadir = /var/lib/mysql
default_storage_engine = InnoDB
expire_logs_days = 2
general_log_file = /var/log/mysql/mysql.log
innodb_buffer_pool_size = 2G
innodb_log_buffer_size = 32M
innodb_log_file_size = 512M
innodb_read_only_compressed=OFF
join_buffer_size = 2M
key_buffer_size = 512M
lc_messages_dir = /usr/share/mysql
lc_messages = en_US
log_bin = /var/log/mysql/mariadb-bin
log_bin_index = /var/log/mysql/mariadb-bin.index
log_bin_trust_function_creators = true
log_error = /var/log/mysql/mysql_error.log
log_slow_verbosity = query_plan
log_warnings = 2
long_query_time = 1
max_connections = 100
max_heap_table_size = 64M
max_allowed_packet = 512M
myisam_sort_buffer_size = 512M
port = 3306
pid-file = /var/run/mysqld/mysqld.pid
query_cache_limit = 0
query_cache_size = 0
read_buffer_size = 2M
read_rnd_buffer_size = 2M
skip-name-resolve
socket = /var/run/mysqld/mysqld.sock
sort_buffer_size = 2M
table_open_cache = 400
table_definition_cache = 800
tmp_table_size = 32M
tmpdir = /tmp
transaction_isolation = READ-COMMITTED
user = mysql
wait_timeout = 600
[mariadb-dump]
max_allowed_packet = 512M
quick
quote-names
[isamchk]
key_buffer = 16M

Speichern und schließen Sie die Datei und starten dann den Datenbankserver neu, um die Nextcloud-Datenbank, den Nextcloud-Benutzer und sein Passworts einzurichten:

systemctl restart mysql.service

Die neue Datenbank, Den Datenbankbenutzer sowie das Passwort richten Sie mit diesem Befehl ein:

mariadb -e "CREATE DATABASE nextclouddatenbankname CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE USER nextcloudatenbankbenutzer@localhost identified by 'nextclouddatenbankpasswort'; GRANT ALL PRIVILEGES on nextclouddatenbankname.* to nextcloudatenbankbenutzer@localhost; FLUSH privileges;"

Setzen Sie noch den config.php-Wert mysql.utf8mb4 auf true:

nocc config:system:set mysql.utf8mb4 --type boolean --value="true"

Die Vorbereitungen sind nun abgeschlossen, so dass mit der Datenbankmigration begonnen werden kann:

2. Migration

In Anlehnung an den Nextcloud-Blog erfolgt die Migration nach diesem Schema:

nocc db:convert-type [options] type username hostname database

bzw. vollständig

nocc db:convert-type --password="nextclouddatenbankpasswort" --port="3306" --all-apps mysql nextcloudatenbankbenutzer localhost nextclouddatenbankname

Der Port muss ggf. angepasst werden, wenn Sie nicht den Standardport nutzen.

Zum Abschluss werden Ihnen tabellen angezeigt, die nicht konvertiert werden. Das ist in Ordnung udn wird von Nextcloud <hier> bestätigt.

Bestätigen Sie mit ‚y‘

und schließen die Konvertierung ab. Kontrollieren Sie in der Nextcloud, ob die verwendete Datenbank nun eine MariaDB ist.

Ergänzen Sie fehlende DB-Indizes:

nocc db:add-missing-indices

Das war es schon! Wir wünschen Ihnen viel Spaß mit Ihrer Cloud.