Upgrading Omeka 4

When upgrading from Omeka S on PHP 7.4.3 to Omeka S4, I encountered an error while running the migrate page. Should I upgrade to PHP 8 first? Any suggestions would be greatly appreciated. Thank you.

Doctrine\DBAL\Exception\NonUniqueFieldNameException
An exception occurred while executing ‘ALTER TABLE item ADD primary_media_id INT DEFAULT NULL;’: SQLSTATE[42S21]: Column already exists: 1060 Duplicate column name ‘primary_media_id’

Details:

PDOException: SQLSTATE[42S21]: Column already exists: 1060 Duplicate column name ‘primary_media_id’ in /var/www/html/omeka-s-4/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOConnection.php:141 Stack trace: #0 /var/www/html/omeka-s-4/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOConnection.php(141): PDO->query() #1 /var/www/html/omeka-s-4/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOQueryImplementation.php(38): Doctrine\DBAL\Driver\PDOConnection->doQuery() #2 /var/www/html/omeka-s-4/vendor/doctrine/dbal/lib/Doctrine/DBAL/Connection.php(1449): Doctrine\DBAL\Driver\PDOConnection->query() #3 /var/www/html/omeka-s-4/application/data/migrations/20220824103916_AddPrimaryMediaToItem.php(11): Doctrine\DBAL\Connection->query() #4 /var/www/html/omeka-s-4/application/src/Db/Migration/Manager.php(80): Omeka\Db\Migrations\AddPrimaryMediaToItem->up() #5 /var/www/html/omeka-s-4/application/src/Controller/MigrateController.php(38): Omeka\Db\Migration\Manager->upgrade() #6 /var/www/html/omeka-s-4/vendor/laminas/laminas-mvc/src/Controller/AbstractActionController.php(71): Omeka\Controller\MigrateController->indexAction() #7 /var/www/html/omeka-s-4/vendor/laminas/laminas-eventmanager/src/EventManager.php(319): Laminas\Mvc\Controller\AbstractActionController->onDispatch() #8 /var/www/html/omeka-s-4/vendor/laminas/laminas-eventmanager/src/EventManager.php(179): Laminas\EventManager\EventManager->triggerListeners() #9 /var/www/html/omeka-s-4/vendor/laminas/laminas-mvc/src/Controller/AbstractController.php(97): Laminas\EventManager\EventManager->triggerEventUntil() #10 /var/www/html/omeka-s-4/vendor/laminas/laminas-mvc/src/DispatchListener.php(132): Laminas\Mvc\Controller\AbstractController->dispatch() #11 /var/www/html/omeka-s-4/vendor/laminas/laminas-eventmanager/src/EventManager.php(319): Laminas\Mvc\DispatchListener->onDispatch() #12 /var/www/html/omeka-s-4/vendor/laminas/laminas-eventmanager/src/EventManager.php(179): Laminas\EventManager\EventManager->triggerListeners() #13 /var/www/html/omeka-s-4/vendor/laminas/laminas-mvc/src/Application.php(325): Laminas\EventManager\EventManager->triggerEventUntil() #14 /var/www/html/omeka-s-4/index.php(21): Laminas\Mvc\Application->run() #15 {main} Next Doctrine\DBAL\Driver\PDO\Exception: SQLSTATE[42S21]: Column already exists: 1060 Duplicate column name ‘primary_media_id’ in /var/www/html/omeka-s-4/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDO/Exception.php:18 Stack trace: #0 /var/www/html/omeka-s-4/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOConnection.php(143): Doctrine\DBAL\Driver\PDO\Exception::new() #1 /var/www/html/omeka-s-4/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOQueryImplementation.php(38): Doctrine\DBAL\Driver\PDOConnection->doQuery() #2 /var/www/html/omeka-s-4/vendor/doctrine/dbal/lib/Doctrine/DBAL/Connection.php(1449): Doctrine\DBAL\Driver\PDOConnection->query() #3 /var/www/html/omeka-s-4/application/data/migrations/20220824103916_AddPrimaryMediaToItem.php(11): Doctrine\DBAL\Connection->query() #4 /var/www/html/omeka-s-4/application/src/Db/Migration/Manager.php(80): Omeka\Db\Migrations\AddPrimaryMediaToItem->up() #5 /var/www/html/omeka-s-4/application/src/Controller/MigrateController.php(38): Omeka\Db\Migration\Manager->upgrade() #6 /var/www/html/omeka-s-4/vendor/laminas/laminas-mvc/src/Controller/AbstractActionController.php(71): Omeka\Controller\MigrateController->indexAction() #7 /var/www/html/omeka-s-4/vendor/laminas/laminas-eventmanager/src/EventManager.php(319): Laminas\Mvc\Controller\AbstractActionController->onDispatch() #8 /var/www/html/omeka-s-4/vendor/laminas/laminas-eventmanager/src/EventManager.php(179): Laminas\EventManager\EventManager->triggerListeners() #9 /var/www/html/omeka-s-4/vendor/laminas/laminas-mvc/src/Controller/AbstractController.php(97): Laminas\EventManager\EventManager->triggerEventUntil() #10 /var/www/html/omeka-s-4/vendor/laminas/laminas-mvc/src/DispatchListener.php(132): Laminas\Mvc\Controller\AbstractController->dispatch() #11 /var/www/html/omeka-s-4/vendor/laminas/laminas-eventmanager/src/EventManager.php(319): Laminas\Mvc\DispatchListener->onDispatch() #12 /var/www/html/omeka-s-4/vendor/laminas/laminas-eventmanager/src/EventManager.php(179): Laminas\EventManager\EventManager->triggerListeners() #13 /var/www/html/omeka-s-4/vendor/laminas/laminas-mvc/src/Application.php(325): Laminas\EventManager\EventManager->triggerEventUntil() #14 /var/www/html/omeka-s-4/index.php(21): Laminas\Mvc\Application->run() #15 {main} Next Doctrine\DBAL\Exception\NonUniqueFieldNameException: An exception occurred while executing ‘ALTER TABLE item ADD primary_media_id INT DEFAULT NULL;’: SQLSTATE[42S21]: Column already exists: 1060 Duplicate column name ‘primary_media_id’ in /var/www/html/omeka-s-4/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractMySQLDriver.php:84 Stack trace: #0 /var/www/html/omeka-s-4/vendor/doctrine/dbal/lib/Doctrine/DBAL/DBALException.php(182): Doctrine\DBAL\Driver\AbstractMySQLDriver->convertException() #1 /var/www/html/omeka-s-4/vendor/doctrine/dbal/lib/Doctrine/DBAL/DBALException.php(159): Doctrine\DBAL\DBALException::wrapException() #2 /var/www/html/omeka-s-4/vendor/doctrine/dbal/lib/Doctrine/DBAL/Connection.php(2226): Doctrine\DBAL\DBALException::driverExceptionDuringQuery() #3 /var/www/html/omeka-s-4/vendor/doctrine/dbal/lib/Doctrine/DBAL/Connection.php(1451): Doctrine\DBAL\Connection->handleExceptionDuringQuery() #4 /var/www/html/omeka-s-4/application/data/migrations/20220824103916_AddPrimaryMediaToItem.php(11): Doctrine\DBAL\Connection->query() #5 /var/www/html/omeka-s-4/application/src/Db/Migration/Manager.php(80): Omeka\Db\Migrations\AddPrimaryMediaToItem->up() #6 /var/www/html/omeka-s-4/application/src/Controller/MigrateController.php(38): Omeka\Db\Migration\Manager->upgrade() #7 /var/www/html/omeka-s-4/vendor/laminas/laminas-mvc/src/Controller/AbstractActionController.php(71): Omeka\Controller\MigrateController->indexAction() #8 /var/www/html/omeka-s-4/vendor/laminas/laminas-eventmanager/src/EventManager.php(319): Laminas\Mvc\Controller\AbstractActionController->onDispatch() #9 /var/www/html/omeka-s-4/vendor/laminas/laminas-eventmanager/src/EventManager.php(179): Laminas\EventManager\EventManager->triggerListeners() #10 /var/www/html/omeka-s-4/vendor/laminas/laminas-mvc/src/Controller/AbstractController.php(97): Laminas\EventManager\EventManager->triggerEventUntil() #11 /var/www/html/omeka-s-4/vendor/laminas/laminas-mvc/src/DispatchListener.php(132): Laminas\Mvc\Controller\AbstractController->dispatch() #12 /var/www/html/omeka-s-4/vendor/laminas/laminas-eventmanager/src/EventManager.php(319): Laminas\Mvc\DispatchListener->onDispatch() #13 /var/www/html/omeka-s-4/vendor/laminas/laminas-eventmanager/src/EventManager.php(179): Laminas\EventManager\EventManager->triggerListeners() #14 /var/www/html/omeka-s-4/vendor/laminas/laminas-mvc/src/Application.php(325): Laminas\EventManager\EventManager->triggerEventUntil() #15 /var/www/html/omeka-s-4/index.php(21): Laminas\Mvc\Application->run() #16 {main}

PHP 7.4 is fine, that shouldn’t be your issue.

Am I right to assume that you tried to upgrade, got an error, then enabled error reporting and tried again?

The error message you have here is a simple problem: it’s saying the upgrade is trying to add a column to the database that’s already there. Usually this means that what’s actually happened is that your first upgrade failed at a slightly later point, but when you go back to try it again, we’ve already done this step of adding the column, so you’re getting this error rather than the correct one.

If you took a backup of your database before upgrading, that’s the most straightforward path from here: restore the backup, then try the upgrade again. If you still get an error, the reported error should reflect the actual problem.

Also, could you clarify, which version of Omeka S you were using before?

Thank you very much. This hint has been helpful, and I retried the process with a fresh database. It is now working fine.

i’m also having trouble with upgrading to 4.0. i was too busy to keep ahead of the updates, and everything i did was fairly customized.

I did the upgrade and had PHP issues which i did address. The update then had issues with Reclaim Hosting who ended up resolving their issue. I updated to Omeka 4 but didn’t work, then i restored backup, then reran the update and it came up this issue. In between the restore, i also enabled error reporting.

2023-09-26T18:51:23+00:00 ERR (3): PDOException: SQLSTATE[42S01]: Base table or view already exists: 1050 Table ‘fulltext_search’ already exists in /home/pafaarch/public_html/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOConnection.php:55

Stack trace:

#0 /home/pafaarch/public_html/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOConnection.php(55): PDO->exec(‘CREATE TABLE fu…’)

#1 /home/pafaarch/public_html/vendor/doctrine/dbal/lib/Doctrine/DBAL/Connection.php(1579): Doctrine\DBAL\Driver\PDOConnection->exec(‘CREATE TABLE fu…’)

#2 /home/pafaarch/public_html/application/data/migrations/20190514061351_AddFulltextSearch.php(11): Doctrine\DBAL\Connection->exec(‘CREATE TABLE fu…’)

#3 /home/pafaarch/public_html/application/src/Db/Migration/Manager.php(80): Omeka\Db\Migrations\AddFulltextSearch->up(Object(Doctrine\DBAL\Connection))

#4 /home/pafaarch/public_html/application/src/Controller/MigrateController.php(38): Omeka\Db\Migration\Manager->upgrade()

#5 /home/pafaarch/public_html/vendor/laminas/laminas-mvc/src/Controller/AbstractActionController.php(71): Omeka\Controller\MigrateController->indexAction()

#6 /home/pafaarch/public_html/vendor/laminas/laminas-eventmanager/src/EventManager.php(319): Laminas\Mvc\Controller\AbstractActionController->onDispatch(Object(Laminas\Mvc\MvcEvent))

#7 /home/pafaarch/public_html/vendor/laminas/laminas-eventmanager/src/EventManager.php(179): Laminas\EventManager\EventManager->triggerListeners(Object(Laminas\Mvc\MvcEvent), Object(Closure))

#8 /home/pafaarch/public_html/vendor/laminas/laminas-mvc/src/Controller/AbstractController.php(97): Laminas\EventManager\EventManager->triggerEventUntil(Object(Closure), Object(Laminas\Mvc\MvcEvent))

#9 /home/pafaarch/public_html/vendor/laminas/laminas-mvc/src/DispatchListener.php(132): Laminas\Mvc\Controller\AbstractController->dispatch(Object(Laminas\Http\PhpEnvironment\Request), Object(Laminas\Http\PhpEnvironment\Response))

#10 /home/pafaarch/public_html/vendor/laminas/laminas-eventmanager/src/EventManager.php(319): Laminas\Mvc\DispatchListener->onDispatch(Object(Laminas\Mvc\MvcEvent))

#11 /home/pafaarch/public_html/vendor/laminas/laminas-eventmanager/src/EventManager.php(179): Laminas\EventManager\EventManager->triggerListeners(Object(Laminas\Mvc\MvcEvent), Object(Closure))

#12 /home/pafaarch/public_html/vendor/laminas/laminas-mvc/src/Application.php(325): Laminas\EventManager\EventManager->triggerEventUntil(Object(Closure), Object(Laminas\Mvc\MvcEvent))

#13 /home/pafaarch/public_html/index.php(21): Laminas\Mvc\Application->run()

#14 {main}

Next Doctrine\DBAL\Driver\PDO\Exception: SQLSTATE[42S01]: Base table or view already exists: 1050 Table ‘fulltext_search’ already exists in /home/pafaarch/public_html/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDO/Exception.php:18

Stack trace:

#0 /home/pafaarch/public_html/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOConnection.php(60): Doctrine\DBAL\Driver\PDO\Exception::new(Object(PDOException))

#1 /home/pafaarch/public_html/vendor/doctrine/dbal/lib/Doctrine/DBAL/Connection.php(1579): Doctrine\DBAL\Driver\PDOConnection->exec(‘CREATE TABLE fu…’)

#2 /home/pafaarch/public_html/application/data/migrations/20190514061351_AddFulltextSearch.php(11): Doctrine\DBAL\Connection->exec(‘CREATE TABLE fu…’)

#3 /home/pafaarch/public_html/application/src/Db/Migration/Manager.php(80): Omeka\Db\Migrations\AddFulltextSearch->up(Object(Doctrine\DBAL\Connection))

#4 /home/pafaarch/public_html/application/src/Controller/MigrateController.php(38): Omeka\Db\Migration\Manager->upgrade()

#5 /home/pafaarch/public_html/vendor/laminas/laminas-mvc/src/Controller/AbstractActionController.php(71): Omeka\Controller\MigrateController->indexAction()

#6 /home/pafaarch/public_html/vendor/laminas/laminas-eventmanager/src/EventManager.php(319): Laminas\Mvc\Controller\AbstractActionController->onDispatch(Object(Laminas\Mvc\MvcEvent))

#7 /home/pafaarch/public_html/vendor/laminas/laminas-eventmanager/src/EventManager.php(179): Laminas\EventManager\EventManager->triggerListeners(Object(Laminas\Mvc\MvcEvent), Object(Closure))

#8 /home/pafaarch/public_html/vendor/laminas/laminas-mvc/src/Controller/AbstractController.php(97): Laminas\EventManager\EventManager->triggerEventUntil(Object(Closure), Object(Laminas\Mvc\MvcEvent))

#9 /home/pafaarch/public_html/vendor/laminas/laminas-mvc/src/DispatchListener.php(132): Laminas\Mvc\Controller\AbstractController->dispatch(Object(Laminas\Http\PhpEnvironment\Request), Object(Laminas\Http\PhpEnvironment\Response))

#10 /home/pafaarch/public_html/vendor/laminas/laminas-eventmanager/src/EventManager.php(319): Laminas\Mvc\DispatchListener->onDispatch(Object(Laminas\Mvc\MvcEvent))

#11 /home/pafaarch/public_html/vendor/laminas/laminas-eventmanager/src/EventManager.php(179): Laminas\EventManager\EventManager->triggerListeners(Object(Laminas\Mvc\MvcEvent), Object(Closure))

#12 /home/pafaarch/public_html/vendor/laminas/laminas-mvc/src/Application.php(325): Laminas\EventManager\EventManager->triggerEventUntil(Object(Closure), Object(Laminas\Mvc\MvcEvent))

#13 /home/pafaarch/public_html/index.php(21): Laminas\Mvc\Application->run()

#14 {main}

Next Doctrine\DBAL\Exception\TableExistsException: An exception occurred while executing ‘CREATE TABLE fulltext_search (id INT NOT NULL, resource VARCHAR(190) NOT NULL, title LONGTEXT DEFAULT NULL, text LONGTEXT DEFAULT NULL, FULLTEXT INDEX IDX_AA31FE4A2B36786B3B8BA7C7 (title, text), PRIMARY KEY(id, resource)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB;’:

SQLSTATE[42S01]: Base table or view already exists: 1050 Table ‘fulltext_search’ already exists in /home/pafaarch/public_html/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractMySQLDriver.php:57

Stack trace:

#0 /home/pafaarch/public_html/vendor/doctrine/dbal/lib/Doctrine/DBAL/DBALException.php(182): Doctrine\DBAL\Driver\AbstractMySQLDriver->convertException(‘An exception oc…’, Object(Doctrine\DBAL\Driver\PDO\Exception))

#1 /home/pafaarch/public_html/vendor/doctrine/dbal/lib/Doctrine/DBAL/DBALException.php(159): Doctrine\DBAL\DBALException::wrapException(Object(Doctrine\DBAL\Driver\PDO\MySQL\Driver), Object(Doctrine\DBAL\Driver\PDO\Exception), ‘An exception oc…’)

#2 /home/pafaarch/public_html/vendor/doctrine/dbal/lib/Doctrine/DBAL/Connection.php(2222): Doctrine\DBAL\DBALException::driverExceptionDuringQuery(Object(Doctrine\DBAL\Driver\PDO\MySQL\Driver), Object(Doctrine\DBAL\Driver\PDO\Exception), ‘CREATE TABLE fu…’, Array)

#3 /home/pafaarch/public_html/vendor/doctrine/dbal/lib/Doctrine/DBAL/Connection.php(1581): Doctrine\DBAL\Connection->handleExceptionDuringQuery(Object(Doctrine\DBAL\Driver\PDO\Exception), ‘CREATE TABLE fu…’)

#4 /home/pafaarch/public_html/application/data/migrations/20190514061351_AddFulltextSearch.php(11): Doctrine\DBAL\Connection->exec(‘CREATE TABLE fu…’)

#5 /home/pafaarch/public_html/application/src/Db/Migration/Manager.php(80): Omeka\Db\Migrations\AddFulltextSearch->up(Object(Doctrine\DBAL\Connection))

#6 /home/pafaarch/public_html/application/src/Controller/MigrateController.php(38): Omeka\Db\Migration\Manager->upgrade()

#7 /home/pafaarch/public_html/vendor/laminas/laminas-mvc/src/Controller/AbstractActionController.php(71): Omeka\Controller\MigrateController->indexAction()

#8 /home/pafaarch/public_html/vendor/laminas/laminas-eventmanager/src/EventManager.php(319): Laminas\Mvc\Controller\AbstractActionController->onDispatch(Object(Laminas\Mvc\MvcEvent))

#9 /home/pafaarch/public_html/vendor/laminas/laminas-eventmanager/src/EventManager.php(179): Laminas\EventManager\EventManager->triggerListeners(Object(Laminas\Mvc\MvcEvent), Object(Closure))

#10 /home/pafaarch/public_html/vendor/laminas/laminas-mvc/src/Controller/AbstractController.php(97): Laminas\EventManager\EventManager->triggerEventUntil(Object(Closure), Object(Laminas\Mvc\MvcEvent))

#11 /home/pafaarch/public_html/vendor/laminas/laminas-mvc/src/DispatchListener.php(132): Laminas\Mvc\Controller\AbstractController->dispatch(Object(Laminas\Http\PhpEnvironment\Request), Object(Laminas\Http\PhpEnvironment\Response))

#12 /home/pafaarch/public_html/vendor/laminas/laminas-eventmanager/src/EventManager.php(319): Laminas\Mvc\DispatchListener->onDispatch(Object(Laminas\Mvc\MvcEvent))

#13 /home/pafaarch/public_html/vendor/laminas/laminas-eventmanager/src/EventManager.php(179): Laminas\EventManager\EventManager->triggerListeners(Object(Laminas\Mvc\MvcEvent), Object(Closure))

#14 /home/pafaarch/public_html/vendor/laminas/laminas-mvc/src/Application.php(325): Laminas\EventManager\EventManager->triggerEventUntil(Object(Closure), Object(Laminas\Mvc\MvcEvent))

#15 /home/pafaarch/public_html/index.php(21): Laminas\Mvc\Application->run()

#16 {main}

i read a few threads about a possible database issue…any thoughts with this error?

This error is saying that the upgrade is trying to create a table that already exists.

This could be a quite similar problem to the previous one on this thread: if you did the upgrade, it failed, you loaded in your database dump, then ran again, you might not have deleted/dropped any new tables that the first upgrade attempt created.

One thing to do would be to make a new blank database to restore your backup into and go from there. Otherwise you could drop either all tables before restoring the backup, or just drop the specific offending table here (fulltext_search), though you could have similar issues with other tables in that case.