- 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.
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.
Die Ausgabe wird in tabellarischer Form wie in diesem Beispiel gezeigt erfolgen.
Hier ist zu erkennen dass einige Zeilen das Format
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
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:
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.
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
