Mauticアップデートで`Doctrine\ORM\Mapping\MappingException`が出た時の対応

Mautic(特に古いバージョンのもの)を最新版にアップデートする際、まれにsite is offlineになるケースがあります。

その場合は落ち着いて以下の2つを実施しましょう。

  • サーバーのエラーログを確認する
  • SSHして、symfonyコマンドを実行する

サーバーのエラーログを確認する

今回こちらで発生したケースでは、/var/log/httpd/ssl_error.logに以下のエラーが出ていました。

[Sun Jan 07 02:14:31.417360 2018] [:error] [pid 9078] [client 111.232.123.80:57156] PHP Warning:  require(/var/www/html/app/cache/prod/doctrine/orm/Proxies/__CG__MauticPluginBundleEntityPlugin.php): failed to open stream: No such file or directory in /var/www/html/vendor/doctrine/common/lib/Doctrine/Common/Proxy/AbstractProxyFactory.php on line 209, referer: https://ec2-13-230-186-49.ap-northeast-1.compute.amazonaws.com/s/login
[Sun Jan 07 02:14:31.417396 2018] [:error] [pid 9078] [client 111.232.123.80:57156] PHP Fatal error:  require(): Failed opening required '/var/www/html/app/cache/prod/doctrine/orm/Proxies/__CG__MauticPluginBundleEntityPlugin.php' (include_path='.:/usr/share/pear:/usr/share/php') in /var/www/html/vendor/doctrine/common/lib/Doctrine/Common/Proxy/AbstractProxyFactory.php on line 209, referer: https://ec2-13-230-186-49.ap-northeast-1.compute.amazonaws.com/s/login

SSHして、symfonyコマンドを実行する

php app/console cache:warmup --env=prodでMauticが持っているキャッシュを削除することができます。

このコマンドを実行して、復旧しないか確認してみましょう。

これを実行後にサイトが復旧すれば、キャッシュによるものと思われます。
が、今回遭遇したケースでは以下のようにエラーが発生しました。

$ php app/console cache:warmup --env=prod

 // Warming up the cache for the prod environment with debug false                                                      



  [Doctrine\ORM\Mapping\MappingException]                                                                                         
  Duplicate definition of column 'id' on entity 'Mautic\CoreBundle\Entity\MessageQueue' in a field or discriminator column mapping.                                                                                                                             


cache:warmup [--no-optional-warmers] [-h|--help] [-q|--quiet] [-v|vv|vvv|--verbose] [-V|--version] [--ansi] [--no-ansi] [-n|--no-interaction] [-s|--shell] [--process-isolation] [-e|--env ENV] [--no-debug] [--] <command>

Duplicate definition of column 'id' on entity 'Mautic\CoreBundle\Entity\MessageQueue' in a field or discriminator column mapping.の対応

以下のようにすることで、サイトを復旧できました。

# rm app/bundles/CoreBundle/Entity/MessageQueue.php
# rm -rf app/cache/prod/ or sudo -u apache php app/console cache:warmup --env=prod

app/bundles/CoreBundle/Entity/MessageQueue.phpを削除することに抵抗がある場合、mv app/bundles/CoreBundle/Entity/MessageQueue.php /tmpなどで関係のない場所に移動させればOKです。

参考

https://github.com/mautic/mautic/issues/1508
https://github.com/mautic/mautic/issues/5459