Re: 8.5.2 → 8.5.3のアップデートに失敗する

2020年6月9日 at 18:46

なんらかの原因でマイグレーションがうまくいかなかった可能性があります。

データベース管理ツールは使えますでしょうか?
もし使える場合、SystemDatabaseMigrations テーブルに 20190309000000 という値が入ったレコードがあるかどうか確認してください。

ない場合→何らかの原因で TreeFileFolderNodes テーブルを作る処理が行われなかった可能性があります。解決方法に進んでください。
ある場合→何らかの原因で TreeFileFolderNodes テーブルを作ろうとしたが出来なかった、またはインポートなどの作業時のミスで消してしまった可能性があります。20190309000000 という値が入ったレコードを削除してから解決方法に進んでください。

解決方法

コマンドラインツールから、個別のマイグレーションを手動実行できます。

concrete/bin/concrete5 migrations:execute 20190309000000 --up

このコマンドを実行することで、下記のマイグレーションファイルの処理が再実行されます。

http://github.com/concrete5/concrete5/blob/develop/concrete/src/Updater/Migrations/Migrations/Version20190309000000.php

Re: 8.5.2 → 8.5.3のアップデートに失敗する

2020年6月10日 at 16:50
ご返信ありがとうございます。
こういう場合はマイグレーションのファイルをテーブル名で検索すると良いんですね。
確かに、DBのそのテーブルには該当する値がありませんでした。

解決方法としてご提示いただいたコマンドについてですが、
コマンドラインツールの起動自体が同じDBエラーで止まっており、
指定のコマンドを打ってもマイグレーション出来なかったため、
8.5.2のMigrationsフォルダに8.5.3の該当マイグレーションファイル(Version20190309000000.php)をコピーして、コマンドを実行できました。

ところが、8.5.3でc5:updateコマンドを打ったところ、
別のマイグレーションの途中でエラー終了してしまい、アップデートできませんでした。

** Executing migration: 20190509205043
Refreshing schema for Concrete\Core\Entity\Express\Entry...
Refreshing schema for Concrete\Core\Entity\Express\Control\PublicIdentifierControl...
Refreshing schema for Concrete\Core\Entity\Express\Control\Control...

In AbstractMySQLDriver.php line 115:

An exception occurred while executing 'ALTER TABLE ExpressFormFieldSetPublicIdentifier
Controls ADD CONSTRAINT FK_67180C04BF396750 FOREIGN KEY (id) REFERENCES ExpressFormFie
ldSetControls (id) ON DELETE CASCADE':

SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint


In PDOConnection.php line 106:

SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint


In PDOConnection.php line 104:

SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint


見た感じ、マイグレーション20190509205043の途中でエラーになっているのですが、
これはどう対処するのがよいのでしょうか。
 

Re: 8.5.2 → 8.5.3のアップデートに失敗する

2020年6月10日 at 17:03
おそらく、20190309000000 のマイグレーションを8.5.2にコピーして実行したせいで、20190309000000 まではマイグレーションが終わっていると言う状態になってしまい、8.5.3で必要なマイグレーションが途中までスキップされているのだと思います。

再度 SystemDatabaseMigrations テーブルを見ていただいて、8.5.2に含まれる最新のマイグレーションバージョン 20190925072210 より大きな日付のレコードを全て削除した上で、 c5:update を再チャレンジしてください。
 

Re: 8.5.2 → 8.5.3のアップデートに失敗する

2020年6月10日 at 23:06
ありがとうございます。すみません、ORMのことよくわかってないのに変なことしちゃってましたね…
SystemDatabaseMigrationsテーブルを確認しましたが、20190925072210より大きな日付のレコードはありませんでした。
この場合、一旦20190309000000から先のレコードを全て削除して、もう一度8.5.3でc5:updateしたほうがいいのでしょうか?
 

Re: 8.5.2 → 8.5.3のアップデートに失敗する

2020年6月13日 at 0:38
いろいろ試行錯誤した結果、
・8.5.2で c5:update --rerun を行う
・8.5.2に8.5.3の Version20190309000000.php をコピーし、migration:execute 20190309000000 --up を行う
(これをやらないと8.5.3でCLIツールが起動できない)
・concrete ディレクトリを8.5.3に置き換えて、c5:update を行う
という手順で解決しました。

しかし、今までのアップデートではこんなことは起こらず、2つの別々のWebサイトの環境で両方同じエラーが出てたし、アップデートで過去のマイグレーションファイルが編集されてたりするし、なんかのバグなんじゃないかな…という気はしています…。
色々と勉強になりました。ありがとうございました!
 

Re: 8.5.2 → 8.5.3のアップデートに失敗する

2020年6月15日 at 14:13
> 過去のマイグレーションファイルが編集されてたりする

すみません、これがどのファイルのことか、教えてもらえないでしょうか。
バグなのか確認してみます。
 

Re: 8.5.2 → 8.5.3のアップデートに失敗する

2020年6月15日 at 15:57
手元のリポジトリでdiffを見たところ、8.5.2 → 8.5.3のファイルで、

/concrete/src/Updater/Migrations/Migrations/Version20141024000000.php
/concrete/src/Updater/Migrations/Migrations/Version20160725000000.php
/concrete/src/Updater/Migrations/Migrations/Version20170316000000.php

の過去のマイグレーションファイルが一部編集されているようです。
今回の問題になったTreeFileFolderNodesテーブルも編集内容に入っていました。この辺の開発の作法にあまり詳しくないのですが、リリースされたマイグレーションのファイルを編集するといろいろ不具合が起こるんじゃないかなと思いまして…。
 

Re: 8.5.2 → 8.5.3のアップデートに失敗する

2020年6月15日 at 16:22
ありがとうございます。聞いてみます。
 

Re: 8.5.2 → 8.5.3のアップデートに失敗する

2020年6月16日 at 13:42
GitHubで報告しましたが、他にも漏れているマイグレーションが存在しそうです。
http://github.com/concrete5/concrete5/pull/8433

特定のバージョンのマイグレーションのみ実行する方法をお伝えしましたが、20190309000000以降全て再実行した方が良いかもしれません。

concrete/bin/concrete5 c5:update --since=20190309000000 --rerun

GitHubでは修正が議論されていますので、現時点での動作に支障がなければ次のバージョンをお待ちいただいても問題ないかと思います。
 

Re: 8.5.2 → 8.5.3のアップデートに失敗する

2020年6月16日 at 21:08
ご報告ありがとうございます。
こんな便利なコマンドがあったんですね。
ひとまず今はバージョン8.5.4で支障なく動いているので、このまま次回以降のアップデートを待とうと思います。
色々とありがとうございます。