Upgrade to Nextcloud Hub 10 (31.0.0) Incorrect row format found in your database

I have the Linuxserver Nextcloud and MariaDB docker containers and today Nextcloud updated to Nextcloud Hub 10 (31.0.0). I am getting error messages:

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:

(followed by a long list of files like oc_activity, oc_accounts_data, oc_activity_mq, oc_addressbookchanges and so on.)

What do I need to do?

3 Likes

I had the same issue on an older test instance of mine, and I wrote a small bash script that changes the row format for all affected tables. Maybe it is of any help:

:warning: Altough the script worked for me, I strongly advise you to back up your database before running it!

#!/bin/bash

# Prompt for database credentials
read -p "Enter Database Name: " DB_NAME
read -p "Enter Username: " DB_USER
read -s -p "Enter Password: " DB_PASS
echo

# Generate ALTER TABLE statements and execute them
mysql -u "$DB_USER" -p"$DB_PASS" -e "
SELECT CONCAT('ALTER TABLE \`', TABLE_NAME, '\` ROW_FORMAT=DYNAMIC;') 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA = '$DB_NAME' 
AND ENGINE = 'InnoDB';
" -B -N | while read -r sql; do
    mysql -u "$DB_USER" -p"$DB_PASS" -e "$sql" "$DB_NAME"
done
6 Likes

Thank you. Just wondering where to run this in a docker instance.

MariaDB [nextcloud]> SELECT CONCAT('ALTER TABLE \`', TABLE_NAME, '\` ROW_FORMAT=DYNAMIC;') 
    -> FROM INFORMATION_SCHEMA.TABLES 
    -> WHERE TABLE_SCHEMA = '$DB_NAME' 
    -> AND ENGINE = 'InnoDB';
Empty set (0.000 sec)

may please someone tell me what to do right here?

There’s a variable that you need to replace ($DB_NAME)

2 Likes

omg! my bad! :see_no_evil:

Not sure, to be honest, maybe by “docker exec” into the container and running it from there:

docker exec -it <yourcontainer> /bin/bash

Or by logging in to the database and generating the necessary ALTER TABLE commands directly in the database, as in @kohly’s example.

I am seeing this as well after the 31 update. Yikes I have to update the tables on all of these.

This worked for me.

source .env # assumed: contains MYSQL_ROOT_PASSWORD
DBCONTAINER=nextcloud-db #based on your compose.yaml
DBNAME=nextcloud #based on your compose.yaml

docker exec -i $DBCONTAINER mariadb -u root -p$MYSQL_ROOT_PASSWORD -N -e "
  SELECT CONCAT('ALTER TABLE ', TABLE_NAME, ' ROW_FORMAT=DYNAMIC;')
  FROM information_schema.tables
  WHERE table_schema = '$DBNAME' AND ROW_FORMAT != 'Dynamic';" \
| docker exec -i $DBCONTAINER mariadb -u root -p$MYSQL_ROOT_PASSWORD $DBNAME
2 Likes

Once I had worked out my database names and passwords, that worked for me - at least I no longer get row format errors! Thank you.

1 Like

I copied and pasted all the table names into a text file and manipulated into a list of ALTER commands to make the change. I didn’t think about using a script DOH.

Hello,
Your script changes the ROW_FORMAT of the InnoDB tables to DYNAMIC, but it has a problem: it generates the queries in a first mysql -e and then executes them separately in a loop, which can be problematic if the password is asked for each query. Here is an optimized version that executes everything in one command:

#!/bin/bash

# Prompt for database credentials
read -p "Enter Database Name: " DB_NAME
read -p "Enter Username: " DB_USER
read -s -p "Enter Password: " DB_PASS
echo

# Execute all ALTER TABLE statements in one query
mysql -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" -Bse "
SELECT CONCAT('ALTER TABLE \`', TABLE_NAME, '\` ROW_FORMAT=DYNAMIC;') 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA = '$DB_NAME' 
AND ENGINE = 'InnoDB'
" | mysql -u "$DB_USER" -p"$DB_PASS" "$DB_NAME"


This version avoids the loop and executes the queries directly, thus improving efficiency. :right_anger_bubble:

25 Likes

hi @scgf

what version are you upgrading the nextcloud docker container from? i am still on version 30.0.6 but when i check the database for the row format it already says dynamic.

MariaDB [(none)]> select table_name, row_format
    -> from information_schema.tables
    -> where table_schema = 'nextcloud';
+-------------------------------+------------+
| table_name                    | row_format |
+-------------------------------+------------+
| oc_photos_albums_collabs      | Dynamic    |
| oc_circles_token              | Dynamic    |
| oc_talk_poll_votes            | Dynamic    |
| oc_schedulingobjects          | Dynamic    |
| oc_reader_bookmarks           | Dynamic    |
| oc_cards                      | Dynamic    |
| oc_user_status                | Dynamic    |
| oc_talk_bots_conversation     | Dynamic    |
| oc_recent_contact             | Dynamic    |
| oc_profile_config             | Dynamic    |
| oc_calendar_resources_md      | Dynamic    |
| oc_deck_attachment            | Dynamic    |
| oc_deck_sessions              | Dynamic    |
| oc_photos_albums              | Dynamic    |
| oc_flow_operations            | Dynamic    |
| oc_ex_ui_styles               | Dynamic    |
| oc_trusted_servers            | Dynamic    |
| oc_calendarobjects_props      | Dynamic    |
| oc_filecache                  | Dynamic    |
| oc_open_local_editor          | Dynamic    |
| oc_authtoken                  | Dynamic    |
| oc_circles_membership         | Dynamic    |
| oc_group_folders_versions     | Dynamic    |
| oc_talk_retry_ocm             | Dynamic    |
| oc_properties                 | Dynamic    |
| oc_cards_properties           | Dynamic    |
| oc_circles_mountpoint         | Dynamic    |
| oc_twofactor_totp_secrets     | Dynamic    |
| oc_authorized_groups          | Dynamic    |
| oc_bookmarks_shared_to_shares | Dynamic    |
| oc_richdocuments_template     | Dynamic    |
| oc_ex_speech_to_text          | Dynamic    |
| oc_talk_attendees             | Dynamic    |
| oc_group_folders_trash        | Dynamic    |
| oc_circles_mount              | Dynamic    |
| oc_ex_text_processing_q       | Dynamic    |
| oc_login_flow_v2              | Dynamic    |
| oc_bookmarks_shared_folders   | Dynamic    |
| oc_calendar_appt_configs      | Dynamic    |
| oc_calendarchanges            | Dynamic    |
| oc_bookmarks_tree             | Dynamic    |
| oc_talk_commands              | Dynamic    |
| oc_deck_assigned_users        | Dynamic    |
| oc_file_locks                 | Dynamic    |
| oc_ex_occ_commands            | Dynamic    |
| oc_deck_boards                | Dynamic    |
| oc_comments_read_markers      | Dynamic    |
| oc_talk_sessions              | Dynamic    |
| oc_calendar_reminders         | Dynamic    |
| oc_vcategory                  | Dynamic    |
| oc_ex_ui_scripts              | Dynamic    |
| oc_text_documents             | Dynamic    |
| oc_ex_ui_top_menu             | Dynamic    |
| oc_bookmarks_folders_public   | Dynamic    |
| oc_deck_assigned_labels       | Dynamic    |
| oc_addressbookchanges         | Dynamic    |
| oc_filecache_extended         | Dynamic    |
| oc_calendar_appt_bookings     | Dynamic    |
| oc_richdocuments_assets       | Dynamic    |
| oc_systemtag_object_mapping   | Dynamic    |
| oc_calendar_rooms_md          | Dynamic    |
| oc_external_mounts            | Dynamic    |
| oc_bookmarks_root_folders     | Dynamic    |
| oc_sociallogin_connect        | Dynamic    |
| oc_ex_text_processing         | Dynamic    |
| oc_dav_absence                | Dynamic    |
| oc_files_reminders            | Dynamic    |
| oc_migrations                 | Dynamic    |
| oc_calendarobjects            | Dynamic    |
| oc_external_options           | Dynamic    |
| oc_external_config            | Dynamic    |
| oc_group_folders              | Dynamic    |
| oc_flow_operations_scope      | Dynamic    |
| oc_text2image_tasks           | Dynamic    |
| oc_richdocuments_direct       | Dynamic    |
| oc_reader_prefs               | Dynamic    |
| oc_activity_mq                | Dynamic    |
| oc_vcategory_to_object        | Dynamic    |
| oc_group_folders_acl          | Dynamic    |
| oc_ex_apps_routes             | Dynamic    |
| oc_users                      | Dynamic    |
| oc_talk_rooms                 | Dynamic    |
| oc_directlink                 | Dynamic    |
| oc_mounts                     | Dynamic    |
| oc_direct_edit                | Dynamic    |
| oc_calendar_rooms             | Dynamic    |
| oc_preferences_ex             | Dynamic    |
| oc_bookmarks_shares           | Dynamic    |
| oc_ex_translation_q           | Dynamic    |
| oc_preferences                | Dynamic    |
| oc_appconfig_ex               | Dynamic    |
| oc_circles_member             | Dynamic    |
| oc_ex_settings_forms          | Dynamic    |
| oc_bookmarks_folders          | Dynamic    |
| oc_ex_apps                    | Dynamic    |
| oc_user_transfer_owner        | Dynamic    |
| oc_notifications_settings     | Dynamic    |
| oc_deck_stacks                | Dynamic    |
| oc_ex_apps_daemons            | Dynamic    |
| oc_circles_share_lock         | Dynamic    |
| oc_group_user                 | Dynamic    |
| oc_ex_speech_to_text_q        | Dynamic    |
| oc_accounts                   | Dynamic    |
| oc_deck_labels                | Dynamic    |
| oc_talk_bots_server           | Dynamic    |
| oc_ex_ui_files_actions        | Dynamic    |
| oc_share_external             | Dynamic    |
| oc_oauth2_clients             | Dynamic    |
| oc_oauth2_access_tokens       | Dynamic    |
| oc_text_steps                 | Dynamic    |
| oc_textprocessing_tasks       | Dynamic    |
| oc_bookmarks                  | Dynamic    |
| oc_group_folders_groups       | Dynamic    |
| oc_calendars                  | Dynamic    |
| oc_circles_remote             | Dynamic    |
| oc_jobs                       | Dynamic    |
| oc_external_applicable        | Dynamic    |
| oc_twofactor_providers        | Dynamic    |
| oc_files_metadata_index       | Dynamic    |
| oc_talk_invitations           | Dynamic    |
| oc_ex_event_handlers          | Dynamic    |
| oc_systemtag_group            | Dynamic    |
| oc_accounts_data              | Dynamic    |
| oc_talk_polls                 | Dynamic    |
| oc_webhook_listeners          | Dynamic    |
| oc_mimetypes                  | Dynamic    |
| oc_webauthn                   | Dynamic    |
| oc_dav_shares                 | Dynamic    |
| oc_files_versions             | Dynamic    |
| oc_addressbooks               | Dynamic    |
| oc_circles_event              | Dynamic    |
| oc_photos_albums_files        | Dynamic    |
| oc_talk_bridges               | Dynamic    |
| oc_deck_cards                 | Dynamic    |
| oc_groups                     | Dynamic    |
| oc_calendar_resources         | Dynamic    |
| oc_whats_new                  | Dynamic    |
| oc_notifications_pushhash     | Dynamic    |
| oc_calendar_invitations       | Dynamic    |
| oc_taskprocessing_tasks       | Dynamic    |
| oc_richdocuments_wopi         | Dynamic    |
| oc_talk_attachments           | Dynamic    |
| oc_bruteforce_attempts        | Dynamic    |
| oc_activity                   | Dynamic    |
| oc_storages                   | Dynamic    |
| oc_calendarsubscriptions      | Dynamic    |
| oc_talk_bans                  | Dynamic    |
| oc_twofactor_backupcodes      | Dynamic    |
| oc_ratelimit_entries          | Dynamic    |
| oc_talk_proxy_messages        | Dynamic    |
| oc_files_metadata             | Dynamic    |
| oc_collres_resources          | Dynamic    |
| oc_ex_translation             | Dynamic    |
| oc_reactions                  | Dynamic    |
| oc_files_trash                | Dynamic    |
| oc_appconfig                  | Dynamic    |
| oc_collres_collections        | Dynamic    |
| oc_known_users                | Dynamic    |
| oc_ex_task_processing         | Dynamic    |
| oc_talk_internalsignaling     | Dynamic    |
| oc_text_sessions              | Dynamic    |
| oc_deck_board_acl             | Dynamic    |
| oc_flow_checks                | Dynamic    |
| oc_group_admin                | Dynamic    |
| oc_systemtag                  | Dynamic    |
| oc_talk_consent               | Dynamic    |
| oc_notes_meta                 | Dynamic    |
| oc_dav_cal_proxy              | Dynamic    |
| oc_ex_ui_states               | Dynamic    |
| oc_group_folders_manage       | Dynamic    |
| oc_privacy_admins             | Dynamic    |
| oc_circles_circle             | Dynamic    |
| oc_share                      | Dynamic    |
| oc_collres_accesscache        | Dynamic    |
| oc_talk_reminders             | Dynamic    |
| oc_federated_reshares         | Dynamic    |
| oc_shares_limits              | Dynamic    |
| oc_comments                   | Dynamic    |
| oc_notifications              | Dynamic    |
| oc_storages_credentials       | Dynamic    |
| oc_bookmarks_tags             | Dynamic    |
+-------------------------------+------------+
181 rows in set (0.002 sec)

Bonjour,

Merci beaucoup pour votre contribution !!

Votre script fonctionne parfaitement !!


Hello,

Thank you very mutch for your contribution !!

Your script works perfectly !!

Nicolas

Thank you! This worked for me as well.
I wasn’t sure what to do with the first line:

source .env # assumed: contains MYSQL_ROOT_PASSWORD

So I removed it and entered the password directly in the code instead of using the variable. It worked fine.

I also ran into this issue after upgrading. Nextcloud should stop rolling out the update as long as this issue persists. Normal users should not be forced to touch the database. This is kind of annoying.

4 Likes

Great. source .env reads the environment variables from that file, which is the default environment file for Docker. That way you don’t have to type in sensitive data in the command line.

1 Like

You’re not forced to change them.
But it would be helpful to include instructions in the message or even provide an occ script that updates the database row format.

1 Like

Yes, you’re absolutely right: a normal user shouldn’t.

But the administrator of a Nextcloud instance should know about the technical basis it runs on and should be able to fix such things. :slight_smile: At least after searching and reading some docs.

I have sorted all the errors and discovered it happens to users who were running NC v24 and earlier and have upgraded many times to arrive at the current version. I run nextcloud in a docker container along with mariadb and I (probably foolishly) upgrade automatically with watchtower.

1 Like