Nextcloud Upgrade auf Version 31 (Hub 10) - Incorrect row format found in your database.

  • Ab sofort steht euch hier im Forum die neue Add-on Verwaltung zur Verfügung – eine zentrale Plattform für alles rund um Erweiterungen und Add-ons für den DSM.

    Damit haben wir einen Ort, an dem Lösungen von Nutzern mit der Community geteilt werden können. Über die Team Funktion können Projekte auch gemeinsam gepflegt werden.

    Was die Add-on Verwaltung kann und wie es funktioniert findet Ihr hier

    Hier geht es zu den Add-ons

luddi

Benutzer
Sehr erfahren
Registriert
05. Sep. 2012
Beiträge
3.313
Reaktionspunkte
639
Punkte
174
Wer Nextcloud in Verbindung mit einer mysql/mariadb Datenbank verwendet dem kann bei einem Update folgender Fehler über den Weg laufen.

Code:
MySQL row format: Incorrect row format found in your database. ROW_FORMAT=Dynamic offers the best database performances for Nextcloud.
Please update row format on the following list: oc_accounts, oc_accounts_data, oc_activity, oc_activity_mq, oc_addressbookchanges, ...

Leider gibt es hier keine Unterstützung durch den Nextcloud Updater und man ist gezwungen das Format der betroffenen Zeilen selbst auf den geforderten Wert zu ändern.

Wer möchte kann sich auch vor einem Update bereits die akteullen Zeilenformate ausgeben lassen um dies zu überprüfen.
Folgender Befehl kann hierfür direkt in der Kommandozeile verwendet werden.
Bash:
mysql -u root -p -e "SELECT TABLE_NAME, ROW_FORMAT FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'DATENBANKNAME';"

Die Ausgabe wird in tabellarischer Form wie in diesem Beispiel gezeigt erfolgen.
Code:
+--------------------------------+------------+
| TABLE_NAME                     | ROW_FORMAT |
+--------------------------------+------------+
| oc_systemtag_group             | Compressed |
| oc_ex_ui_styles                | Dynamic    |
| oc_share_external              | Compressed |
| oc_mail_aliases                | Compressed |
| oc_notifications_pushhash      | Compressed |
| oc_storages_credentials        | Compressed |

Hier ist zu erkennen dass einige Zeilen das Format Compressed verwenden anstelle das von Nextcloud 31 geforderte Format Dynamic.


Wie vorzugehen ist:
Man kann das Zeilenformat der Datenbank entweder vor oder nach dem Upgrade der Nextcloud Instanz anpassen.

Eigentlich müsste man für jede einzelne Zeile aus der Datenbank welche noch nicht das Format Dynamic verwendet folgendes Kommando eingeben wie hier an dem Beispiel der Datenbankzeile oc_systemtag_group gezeigt.
Code:
ALTER TABLE DATENBANKNAME.oc_systemtag_group ROW_FORMAT=DYNAMIC;

Dies macht allerdings keinen Spass wenn man hunderte Zeilen manuell eingeben muss.
Genau aus diesem Grund habe ich ein kleines Helper Shell-Skript geschrieben welches die ganze Arbeit erleichtert und alle betroffenen Zeilenformate in einem Rutsch ändert.

Funktionsweise:
Das Skript sucht alle Zeilen der Datenbank welche nicht das Format DYNAMIC verwenden und erstellt für jeden Eintrag das Kommando um das Format zu ändern.
Die erstellte Datei mit den einzelnen Kommandos wird anschließend mit dem mysql Befehl eingelesen um die einzelnen Befehle nacheinander im Stapel auszuführen.
Der Anwender wird durch die Ausgaben auf der Kommandozeile durch die Abarbeitung geführt. Bevor etwas gändert wird können die erstellen Kommandos auch direkt im Durchlauf überprüft werden sobald Einträge gefunden wurden bei denen es einer Änderung bedarf.
Erst durch ausdrückliche Zustimmung des Anwenders werden die Befehle zur Änderung ausgeführt.

Verwendung:
Das Skript an einem beliebigem Ort und Namen speichern (Beispiel: /volume1/temp/mysql_row_format_dynamic.sh), ausführbar machen mit chmod +x /volume1/temp/mysql_row_format_dynamic.sh und direkt aus der Kommandozeile ausführen.
Man wird aufgefordert den Namen der Datenbank einzugeben an welcher die Änderung erfolgen soll, sowie die Eingabe des Datenbankbenutzers und dessen Passwort.
Am besten verwendet man als Administrator gleich den mysql Benutzer root für den Datenbankzugriff und die Änderung.

Wer noch Zweifel oder Fragen zur Vorgehensweise hierzu hat darf sich gerne melden.
Wer möchte kann das Skript auch direkt als Text Datei aus dem Anhang herunterladen.


Bash:
#!/bin/bash
# This script generates SQL commands to alter the row format of all tables in a specified MariaDB database to DYNAMIC.
# It then prompts the user to execute the generated commands or review them first.
# Make sure to set the database name and user credentials before running the script.
# Usage: ./mysql_row_format_dynamic.sh
# Set the database name and user credentials

# This script fixes the row format of all tables in a specified MariaDB database to DYNAMIC.

SQL_FILE="alter_tables.sql"
MySQL=$(which mysql)
if [ -z "$MySQL" ]; then
    echo "MySQL client is not installed. Please install it and try again."
    exit 1
fi

read -r -p "Enter the database name: " DB_NAME
read -r -p "Enter the MySQL username: " USER
read -s -r -p "Enter the MySQL password: " PASSWORD
echo -e "\n\n"

# Generate the SQL commands for tables that are not in ROW_FORMAT=DYNAMIC
$MySQL -u "$USER" -p"$PASSWORD" -s -N -e "
SELECT CONCAT('ALTER TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ' ROW_FORMAT=DYNAMIC;')
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = '$DB_NAME'
AND ROW_FORMAT != 'Dynamic';
" > "$SQL_FILE"
retcode=$?
if [ $retcode -ne 0 ]; then
    echo "An error occurred while generating the SQL commands."
    echo "Please check your database connection and permissions."
    exit 1
fi

# Check if the SQL file is empty
if [ ! -s "$SQL_FILE" ]; then
    echo "All tables in the database '$DB_NAME' are already set to ROW_FORMAT=DYNAMIC."
    rm -f "$SQL_FILE"
    exit 0
else
    echo
    echo "SQL commands have been generated and saved to $(realpath "$SQL_FILE")."
    echo "You can review the file before executing it."
    echo "The SQL commands are:"
    echo "------------------------------------------"
    cat "$SQL_FILE"
    echo "------------------------------------------"
    echo -e "\n\n"
fi

read -r -p "Do you want to execute the generated SQL commands now? (yes/no): " choice
case "$choice" in
    [Yy]es|[Yy])
        $MySQL -u "$USER" -p"$PASSWORD" "$DB_NAME" < "$SQL_FILE"
        retcode=$?
        if [ $retcode -eq 0 ]; then
            echo "SQL commands executed successfully."
        else
            echo "An error occurred while executing the SQL commands. Return code: $retcode"
        fi
        read -r -p "Do you want to remove the generated $SQL_FILE file? (yes/no): " remove_choice
        case "$remove_choice" in
            [Yy]es|[Yy])
                rm -f "$SQL_FILE"
                echo "The file $SQL_FILE has been removed."
                ;;
            [Nn]o|[Nn]|*)
                echo "The file $SQL_FILE has been kept."
                ;;
        esac
        ;;
    [Nn]o|[Nn]|*)
        echo "Execution skipped. You can run the commands later using the provided command."
        ;;
esac

exit 0
 

Anhänge

  • Like
Reaktionen: diedel und plang.pl

Additional post fields

 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat