When I started self-hosting Ghost about a year ago, I didn’t pay any mind to the DB backend (which I should have, I know), but now I’m stuck when trying to move beyond ver. 6.52.1. There was an incompatibility going to 6.53.0 with MariaDB as the backend where one of the member table migrations couldn’t complete.
Today I attempted to spin up a new container for MySQL 8. I initiated a dump of the DB from my MariaDB 11.8 container and restored it to the fresh MySQL 8 container. Ghost runs successfully with ver 6.52.1, but when I try to upgrade to v6.53, I encounter an error when the migration attempts to create and add permissions to the member_custom_field table.
[2026-08-20 14:08:05] WARN Database state requires migration.
[2026-08-20 14:08:05] INFO Creating database backup
[2026-08-20 14:08:05] INFO Database backup written to /var/lib/ghost/content/data/incorgnito-releases.ghost.2026-08-20-18-08-05.json
[2026-08-20 14:08:05] INFO Running migrations.
[2026-08-20 14:08:05] INFO Adding table: members_custom_fields
[2026-08-20 14:08:06] INFO Adding permission for browse:member_custom_field
[2026-08-20 14:08:06] INFO Adding permission(Browse member custom fields) to role(Administrator)
[2026-08-20 14:08:06] INFO Adding permission(Browse member custom fields) to role(Admin Integration)
[2026-08-20 14:08:06] INFO Adding permission(Browse member custom fields) to role(Super Editor)
[2026-08-20 14:08:06] INFO Adding permission for read:member_custom_field
[2026-08-20 14:08:06] INFO Adding permission(Read member custom fields) to role(Administrator)
[2026-08-20 14:08:06] INFO Adding permission(Read member custom fields) to role(Admin Integration)
[2026-08-20 14:08:06] INFO Adding permission(Read member custom fields) to role(Super Editor)
[2026-08-20 14:08:06] INFO Adding permission for add:member_custom_field
[2026-08-20 14:08:06] INFO Adding permission(Add member custom fields) to role(Administrator)
[2026-08-20 14:08:06] INFO Adding permission(Add member custom fields) to role(Admin Integration)
[2026-08-20 14:08:06] INFO Adding permission for edit:member_custom_field
[2026-08-20 14:08:06] INFO Adding permission(Edit member custom fields) to role(Administrator)
[2026-08-20 14:08:06] INFO Adding permission(Edit member custom fields) to role(Admin Integration)
[2026-08-20 14:08:06] INFO Adding permission for destroy:member_custom_field
[2026-08-20 14:08:06] INFO Adding permission(Delete member custom fields) to role(Administrator)
[2026-08-20 14:08:06] INFO Adding permission(Delete member custom fields) to role(Admin Integration)
[2026-08-20 14:08:06] INFO Adding table: members_custom_field_values
[2026-08-20 14:08:06] INFO Rolling back: alter table `members_custom_field_values` add constraint `members_custom_field_values_member_id_foreign` foreign key (`member_id`) references `members` (`id`) on delete CASCADE - Referencing column 'member_id' and referenced column 'id' in foreign key constraint 'members_custom_field_values_member_id_foreign' are incompatible..
[2026-08-20 14:08:06] INFO Dropping table: members_custom_field_values
[2026-08-20 14:08:06] INFO Removing permission(Delete member custom fields) from role(Admin Integration)
[2026-08-20 14:08:06] INFO Removing permission(Delete member custom fields) from role(Administrator)
[2026-08-20 14:08:06] INFO Removing permission for destroy:member_custom_field
[2026-08-20 14:08:06] INFO Removing permission(Edit member custom fields) from role(Admin Integration)
[2026-08-20 14:08:06] INFO Removing permission(Edit member custom fields) from role(Administrator)
[2026-08-20 14:08:06] INFO Removing permission for edit:member_custom_field
[2026-08-20 14:08:06] INFO Removing permission(Add member custom fields) from role(Admin Integration)
[2026-08-20 14:08:06] INFO Removing permission(Add member custom fields) from role(Administrator)
[2026-08-20 14:08:06] INFO Removing permission for add:member_custom_field
[2026-08-20 14:08:06] INFO Removing permission(Read member custom fields) from role(Super Editor)
[2026-08-20 14:08:06] INFO Removing permission(Read member custom fields) from role(Admin Integration)
[2026-08-20 14:08:06] INFO Removing permission(Read member custom fields) from role(Administrator)
[2026-08-20 14:08:06] INFO Removing permission for read:member_custom_field
[2026-08-20 14:08:06] INFO Removing permission(Browse member custom fields) from role(Super Editor)
[2026-08-20 14:08:06] INFO Removing permission(Browse member custom fields) from role(Admin Integration)
[2026-08-20 14:08:06] INFO Removing permission(Browse member custom fields) from role(Administrator)
[2026-08-20 14:08:06] INFO Removing permission for browse:member_custom_field
[2026-08-20 14:08:06] INFO Dropping table: members_custom_fields
[2026-08-20 14:08:06] INFO Rollback was successful.
[2026-08-20 14:08:06] ERROR alter table `members_custom_field_values` add constraint `members_custom_field_values_member_id_foreign` foreign key (`member_id`) references `members` (`id`) on delete CASCADE - Referencing column 'member_id' and referenced column 'id' in foreign key constraint 'members_custom_field_values_member_id_foreign' are incompatible.
alter table `members_custom_field_values` add constraint `members_custom_field_values_member_id_foreign` foreign key (`member_id`) references `members` (`id`) on delete CASCADE - Referencing column 'member_id' and referenced column 'id' in foreign key constraint 'members_custom_field_values_member_id_foreign' are incompatible.
{"config":{"transaction":false},"name":"2026-07-15-20-22-53-add-members-custom-field-values.js"}
"Error occurred while executing the following migration: 2026-07-15-20-22-53-add-members-custom-field-values.js"
Error ID:
300
Error Code:
ER_FK_INCOMPATIBLE_COLUMNS
----------------------------------------
Error: alter table `members_custom_field_values` add constraint `members_custom_field_values_member_id_foreign` foreign key (`member_id`) references `members` (`id`) on delete CASCADE - Referencing column 'member_id' and referenced column 'id' in foreign key constraint 'members_custom_field_values_member_id_foreign' are incompatible.
at /var/lib/ghost/versions/6.53.0/node_modules/.pnpm/knex-migrator@5.4.1_@types+node@26.0.0/node_modules/knex-migrator/lib/index.js:1032:19
at Packet.asError (/var/lib/ghost/versions/6.53.0/node_modules/.pnpm/mysql2@3.22.5_@types+node@26.0.0/node_modules/mysql2/lib/packets/packet.js:791:17)
at Query.execute (/var/lib/ghost/versions/6.53.0/node_modules/.pnpm/mysql2@3.22.5_@types+node@26.0.0/node_modules/mysql2/lib/commands/command.js:29:26)
at Connection.handlePacket (/var/lib/ghost/versions/6.53.0/node_modules/.pnpm/mysql2@3.22.5_@types+node@26.0.0/node_modules/mysql2/lib/base/connection.js:552:34)
at PacketParser.onPacket (/var/lib/ghost/versions/6.53.0/node_modules/.pnpm/mysql2@3.22.5_@types+node@26.0.0/node_modules/mysql2/lib/base/connection.js:102:12)
at PacketParser.executeStart (/var/lib/ghost/versions/6.53.0/node_modules/.pnpm/mysql2@3.22.5_@types+node@26.0.0/node_modules/mysql2/lib/packet_parser.js:75:16)
at Socket.<anonymous> (/var/lib/ghost/versions/6.53.0/node_modules/.pnpm/mysql2@3.22.5_@types+node@26.0.0/node_modules/mysql2/lib/base/connection.js:109:25)
at Socket.emit (node:events:519:28)
at addChunk (node:internal/streams/readable:561:12)
at readableAddChunkPushByteMode (node:internal/streams/readable:512:3)
at Readable.push (node:internal/streams/readable:392:5)
at TCP.onStreamRead (node:internal/stream_base_commons:189:23)
[2026-08-20 14:08:06] WARN Ghost is shutting down
[2026-08-20 14:08:06] WARN Ghost has shut down
[2026-08-20 14:08:06] WARN Your site is now offline
[2026-08-20 14:08:06] WARN Ghost was running for a few seconds
I can probably grab additional logs with more information later if needed. I’m just trying to figure out, at this point, since I neglected to configure it correctly originally, am I better off backing up my content and settings, nuking what I have, and starting fresh with the latest version of Ghost, then importing my configuration?