Problem starting ghost 3.40.1

Hi everyone,

I’m having problems starting Ghost. I was running an older version (3.18) and ran ‘ghost update’. There were no errors printed, but my site was down.

When I run ‘ghost run’ to make sure everything is working fine, I get this error:

[    2020-12-14 18:06:47] INFO Ghost boot 8.005s
    [2020-12-14 18:06:47] INFO Creating database backup
    [2020-12-14 18:06:47] INFO Database backup written to: /var/www/ghost/content/data/mante.ghost.2020-12-14-18-06-47.json
    [2020-12-14 18:06:47] INFO Adding email_recipients.delivered_at column
    [2020-12-14 18:06:47] INFO Adding email_recipients.opened_at column
    [2020-12-14 18:06:47] INFO Adding email_recipients.failed_at column
    [2020-12-14 18:06:47] INFO Adding emails.delivered_count column
    [2020-12-14 18:06:47] INFO Adding emails.opened_count column
    [2020-12-14 18:06:47] INFO Adding emails.failed_count column
    [2020-12-14 18:06:47] INFO Adding members.email_open_rate column
    [2020-12-14 18:06:47] INFO Adding members.email_count column
    [2020-12-14 18:06:47] INFO Adding members.email_opened_count column
    [2020-12-14 18:06:47] INFO Populating email counts on members
    [2020-12-14 18:06:47] INFO Removing members.email_opened_count column
    [2020-12-14 18:06:48] INFO Removing members.email_count column
    [2020-12-14 18:06:48] INFO Removing members.email_open_rate column
    [2020-12-14 18:06:48] INFO Removing emails.failed_count column
    [2020-12-14 18:06:48] INFO Removing emails.opened_count column
    [2020-12-14 18:06:48] INFO Removing emails.delivered_count column
    [2020-12-14 18:06:48] INFO Removing email_recipients.failed_at column
    [2020-12-14 18:06:48] INFO Removing email_recipients.opened_at column
    [2020-12-14 18:06:48] INFO Removing email_recipients.delivered_at column
    [2020-12-14 18:06:48] INFO Dropping composite index on email_recipients for [email_id, member_email]
    [2020-12-14 18:06:48] ERROR alter table `email_recipients` drop foreign key `email_recipients_email_id_foreign` - ER_CANT_DROP_FIELD_OR_KEY: Can't DROP 'email_recipients_email_id_foreign'; check that column/key exists

    alter table `email_recipients` drop foreign key `email_recipients_email_id_foreign` - ER_CANT_DROP_FIELD_OR_KEY: Can't DROP 'email_recipients_email_id_foreign'; check that column/key exists

    "OuterError: update `members` set `email_count` = (SELECT COUNT(id) FROM email_recipients WHERE email_recipients.member_id = members.id), `email_opened_count` = (SELECT COUNT(id) FROM email_recipients WHERE email_recipients.member_id = members.id AND email_recipients.opened_at IS NOT NULL) - ER_CANT_AGGREGATE_2COLLATIONS: Illegal mix of collations (utf8mb4_0900_ai_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT) for operation '='"

    Error ID:
        400

    Error Code:
        ER_CANT_DROP_FIELD_OR_KEY

    ----------------------------------------

    RollbackError: alter table `email_recipients` drop foreign key `email_recipients_email_id_foreign` - ER_CANT_DROP_FIELD_OR_KEY: Can't DROP 'email_recipients_email_id_foreign'; check that column/key exists
        at RollbackError.KnexMigrateError (/var/www/ghost/versions/3.40.1/node_modules/knex-migrator/lib/errors.js:7:26)
        at new RollbackError (/var/www/ghost/versions/3.40.1/node_modules/knex-migrator/lib/errors.js:31:26)
        at /var/www/ghost/versions/3.40.1/node_modules/knex-migrator/lib/index.js:440:23
        at tryCatcher (/var/www/ghost/versions/3.40.1/node_modules/bluebird/js/release/util.js:16:23)
        at Promise._settlePromiseFromHandler (/var/www/ghost/versions/3.40.1/node_modules/bluebird/js/release/promise.js:547:31)
        at Promise._settlePromise (/var/www/ghost/versions/3.40.1/node_modules/bluebird/js/release/promise.js:604:18)
        at Promise._settlePromise0 (/var/www/ghost/versions/3.40.1/node_modules/bluebird/js/release/promise.js:649:10)
        at Promise._settlePromises (/var/www/ghost/versions/3.40.1/node_modules/bluebird/js/release/promise.js:725:18)
        at _drainQueueStep (/var/www/ghost/versions/3.40.1/node_modules/bluebird/js/release/async.js:93:12)
        at _drainQueue (/var/www/ghost/versions/3.40.1/node_modules/bluebird/js/release/async.js:86:9)
        at Async._drainQueues (/var/www/ghost/versions/3.40.1/node_modules/bluebird/js/release/async.js:102:5)
        at Immediate.Async.drainQueues [as _onImmediate] (/var/www/ghost/versions/3.40.1/node_modules/bluebird/js/release/async.js:15:14)
        at processImmediate (internal/timers.js:461:21)

    Error: ER_CANT_DROP_FIELD_OR_KEY: Can't DROP 'email_recipients_email_id_foreign'; check that column/key exists
        at Query.Sequence._packetToError (/var/www/ghost/versions/3.40.1/node_modules/mysql/lib/protocol/sequences/Sequence.js:47:14)
        at Query.ErrorPacket (/var/www/ghost/versions/3.40.1/node_modules/mysql/lib/protocol/sequences/Query.js:79:18)
        at Protocol._parsePacket (/var/www/ghost/versions/3.40.1/node_modules/mysql/lib/protocol/Protocol.js:291:23)
        at Parser._parsePacket (/var/www/ghost/versions/3.40.1/node_modules/mysql/lib/protocol/Parser.js:433:10)
        at Parser.write (/var/www/ghost/versions/3.40.1/node_modules/mysql/lib/protocol/Parser.js:43:10)
        at Protocol.write (/var/www/ghost/versions/3.40.1/node_modules/mysql/lib/protocol/Protocol.js:38:16)
        at Socket.<anonymous> (/var/www/ghost/versions/3.40.1/node_modules/mysql/lib/Connection.js:88:28)
        at Socket.<anonymous> (/var/www/ghost/versions/3.40.1/node_modules/mysql/lib/Connection.js:526:10)
        at Socket.emit (events.js:314:20)
        at Socket.EventEmitter.emit (domain.js:483:12)
        at addChunk (_stream_readable.js:297:12)
        at readableAddChunk (_stream_readable.js:272:9)
        at Socket.Readable.push (_stream_readable.js:213:10)
        at TCP.onStreamRead (internal/stream_base_commons.js:188:23)
        --------------------
        at Protocol._enqueue (/var/www/ghost/versions/3.40.1/node_modules/mysql/lib/protocol/Protocol.js:144:48)
        at Connection.query (/var/www/ghost/versions/3.40.1/node_modules/mysql/lib/Connection.js:198:25)
        at /var/www/ghost/versions/3.40.1/node_modules/knex-migrator/node_modules/knex/lib/dialects/mysql/index.js:135:18
        at new Promise (<anonymous>)
        at Client_MySQL._query (/var/www/ghost/versions/3.40.1/node_modules/knex-migrator/node_modules/knex/lib/dialects/mysql/index.js:129:12)
        at Client_MySQL.query (/var/www/ghost/versions/3.40.1/node_modules/knex-migrator/node_modules/knex/lib/client.js:169:17)
        at Runner.query (/var/www/ghost/versions/3.40.1/node_modules/knex-migrator/node_modules/knex/lib/runner.js:151:36)
        at Runner.queryArray (/var/www/ghost/versions/3.40.1/node_modules/knex-migrator/node_modules/knex/lib/runner.js:248:31)
        at /var/www/ghost/versions/3.40.1/node_modules/knex-migrator/node_modules/knex/lib/runner.js:38:25
        at /var/www/ghost/versions/3.40.1/node_modules/knex-migrator/node_modules/knex/lib/runner.js:277:24
        at processTicksAndRejections (internal/process/task_queues.js:97:5)
        at async down (/var/www/ghost/versions/3.40.1/core/server/data/migrations/versions/3.39/06-add-email-recipient-index.js:46:13)
        at async Object.down (/var/www/ghost/versions/3.40.1/core/server/data/migrations/utils.js:219:13)

Can anyone tell me what I did wrong and what I could do to fix it? Thanks in advance! :slightly_smiling_face:

This is the primary cause of the problem, it seems somehow you’ve ended up with multiple different collations in your database.

I think if you set an explicit collation and then make sure all of your tables are using that you should be able to upgrade ok. I did a quick google and there are a few tutorials for doing that, this is the first one I found https://www.ryadel.com/en/mysql-convert-database-tables-specific-collation-character-set-charset/

1 Like

Hi Kevin,

Thanks for the superfast reply. :sweat_smile:

I did not expect a possible solution so soon, so I tried to upgrade from an old backup, and it worked.
No idea what the difference was. :man_shrugging:

Anyway, problem solved!