Cookies ahead

Our support chat tool "Intercom" would like to collect some more data on you. See the related link for more details.

Docs

MySQL 8.4 upgrade plan

🐬

MySQL 8.4 is now the default for newly created fortrabbit apps. This guide covers two methods for upgrading your existing (old platform) App before we will retire MySQL 8.0 in June 2026.

This article only applies to the old platform, our new platform already uses MySQL 8.4. On the OLD platform MySQL 8.4 is now used by default for all new Apps and MySQL 8.0 is being deprecated.

  • applies to all Uni and Pro Apps in EU and US (old platform)
  • existing Apps using MySQL 8.0 keep using MySQL 8.0 until automatic upgrade
  • manually upgrading your MySQL 8.0 plan to 8.4 is now possible, read more below

Automatic upgrade

In week 25, starting June 22 2026 we will automatically upgrade all remaining Apps that are still on MySQL 8.0 to MySQL 8.4. Subscribe to status updates: status.fortrabbit.com

Please take the time to test and upgrade before this deadline to make sure that your Apps will work properly with MySQL 8.4.

Breaking changes in MySQL 8.4

MySQL 8.4 brings a few breaking changes that might cause your database to fail upgrading from MySQL 8.0 to 8.4.

Foreign keys require unique index

The target column of a foreign key must now have a unique index applied. This will not block the upgrade, but any new tables or foreign keys you create will have to follow this rule. This is fairly easy to resolve, you just have to add a unique index to your target columns. This have always been the expectation, and it is now enforced to ensure that the database always has a clear answer to which unique row your foreign key refers to.

New reserved words

Four new words are now reserved (MANUAL, PARALLEL, QUALIFY, TABLESAMPLE), meaning you can only use them as table, column, index or stored procedure names when they are properly quoted. But it is probably best to not use them at all if you can avoid it.

-- Will not work in 8.4
SELECT manual FROM manual;

-- Will work in 8.4
SELECT `manual` FROM `manual`;
sql

Float/double cannot be auto incremented

Columns of type float and double can no longer have AUTO_INCREMENT applied. If you have this upgrading will fail. This is a very unusual configuration, but if you happen to use this odd setup, be sure to change your auto incrementing column types to INT or BIGINT before upgrading!

Queries to check for all breaking changes

Not sure if you use any of these deprecated settings in your database? Here is a handy set of queries to double check!

-- Check if we have float/double auto increment columns
SELECT table_schema, table_name, column_name, data_type
FROM information_schema.columns
WHERE extra LIKE '%auto_increment%' AND data_type IN ('float', 'double');

-- Check if mysql host has tables with foreign keys with missing unique index
SELECT
    kcu.CONSTRAINT_SCHEMA    AS `database`,
    kcu.TABLE_NAME            AS child_table,
    kcu.CONSTRAINT_NAME       AS fk_name,
    kcu.REFERENCED_TABLE_NAME AS parent_table,
    kcu.REFERENCED_COLUMN_NAME AS parent_column
FROM information_schema.KEY_COLUMN_USAGE kcu
         JOIN information_schema.REFERENTIAL_CONSTRAINTS rc
              ON  rc.CONSTRAINT_NAME   = kcu.CONSTRAINT_NAME
                  AND rc.CONSTRAINT_SCHEMA = kcu.CONSTRAINT_SCHEMA
WHERE kcu.REFERENCED_TABLE_NAME IS NOT NULL
  AND kcu.CONSTRAINT_SCHEMA NOT IN ('mysql','information_schema','performance_schema','sys')
  -- Exclude FKs where the referenced column has a unique or primary key
  AND NOT EXISTS (
    SELECT 1
    FROM information_schema.STATISTICS s
    WHERE s.TABLE_SCHEMA  = kcu.CONSTRAINT_SCHEMA
      AND s.TABLE_NAME    = kcu.REFERENCED_TABLE_NAME
      AND s.COLUMN_NAME   = kcu.REFERENCED_COLUMN_NAME
      AND s.NON_UNIQUE    = 0  -- 0 means unique (includes PRIMARY KEY)
  )
ORDER BY `database`, parent_table, fk_name;

-- Check if mysql host has tables/columns/indices/prodecures using new forbidden words
SELECT t.TABLE_SCHEMA AS `database`, t.TABLE_NAME AS `table`, 'TABLE' AS `type`
FROM information_schema.TABLES t
WHERE UPPER(t.TABLE_NAME) IN ('MANUAL','PARALLEL','QUALIFY','TABLESAMPLE')
  AND t.TABLE_SCHEMA NOT IN ('mysql','information_schema','performance_schema','sys')
UNION ALL
SELECT c.TABLE_SCHEMA AS `database`,
       CONCAT(c.TABLE_NAME, '.', c.COLUMN_NAME) AS `table`,
       'COLUMN' AS `type`
FROM information_schema.COLUMNS c
WHERE UPPER(c.COLUMN_NAME) IN ('MANUAL','PARALLEL','QUALIFY','TABLESAMPLE')
  AND c.TABLE_SCHEMA NOT IN ('mysql','information_schema','performance_schema','sys')
UNION ALL
SELECT s.TABLE_SCHEMA AS `database`,
       CONCAT(s.TABLE_NAME, '.', s.INDEX_NAME) AS `table`,
       'INDEX' AS `type`
FROM information_schema.STATISTICS s
WHERE UPPER(s.INDEX_NAME) IN ('MANUAL','PARALLEL','QUALIFY','TABLESAMPLE')
  AND s.TABLE_SCHEMA NOT IN ('mysql','information_schema','performance_schema','sys')
UNION ALL
SELECT p.SPECIFIC_SCHEMA AS `database`,
       CONCAT(p.SPECIFIC_NAME, '.', p.PARAMETER_NAME) AS `table`,
       'PROCEDURE_PARAM' AS `type`
FROM information_schema.PARAMETERS p
WHERE UPPER(p.PARAMETER_NAME) IN ('MANUAL','PARALLEL','QUALIFY','TABLESAMPLE')
  AND p.SPECIFIC_SCHEMA NOT IN ('mysql','information_schema','performance_schema','sys')
ORDER BY `database`, `type`, `table`;
sql

MySQL upgrade methods

Here are two workflows on how to upgrade the MySQL version of your App:

Uni Apps

For Uni Apps you change the MySQL version by upgrading your plan. This method has zero downtime, but your database will be marked read only for the duration of the migration.

  1. Download an up-to-date backup of your MySQL database
    • If you have backups enabled, you can download a zip file from the Dashboard
    • You can also manually dump the database using a mysql client and our tunnel
  2. Upgrade your local development environment to MySQL 8.4
  3. Test your project in your local environment and ensure everything works (Important!)
  4. Click "Upgrade" in the dashboard for your app, select the same or a different plan, and migration to MySQL 8.4 will start
  5. Our system will handle the migration for you, your database will be made read only until the migration finishes.

If you have any issues, reach out to us in support.

Pro Apps

For Pro Apps you change the MySQL version by changing the MySQL Component plan. This method has zero downtime, but your database will be read only for the duration of the migration.

  1. Download an up-to-date backup of your MySQL database
    • If you have backups enabled, you can download a zip file from the Dashboard
    • You can also manually dump the database using a mysql client and our tunnel
  2. Upgrade your local development environment to MySQL 8.4
  3. Test your project in your local environment and ensure everything works (Important!)
  4. Click the MySQL component in dashboard for your app, scale it to the same or bigger size, and migration to MySQL 8.4 will start
  5. Our system will handle the migration for you.

If you have any issues, reach out to us in support.

Migrate to the new platform

You can also take the opportunity to try out our new platform. It already runs on MySQL 8.4 and PHP 8.5, so you can migrate your App there to get the latest tech!

  1. Download an up-to-date backup of your MySQL database
    • If you have backups enabled, you can download a zip file from the Dashboard
    • You can also manually dump the database using a mysql client and our tunnel
  2. Upgrade your local development environment to MySQL 8.4
  3. Test your project in your local environment and ensure everything works (Important!)
  4. Sign up for the new platform
  5. Create a new app (MySQL 8.4 is used by default)
  6. Deploy the project (code, assets and database) to the new app
  7. Test your project on the new app and ensure everything works
  8. Switch DNS entries to the new app
  9. Once you see that everything works, delete the old App

Written by a human. Review, grammar checks and typo fixes by AI.

AI use & editorial process