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

2020年6月9日 at 18:06

PHPのバージョンは7.4.6です。
concrete5 8.5.2から、いつものように"concrete"フォルダを置き換えてのアップデートを試みたところ、
添付画像のようなデータベースのエラーが出てしまいます。
一旦8.5.2にファイルを戻したら、正しく表示されます。
キャッシュを消して再挑戦してもエラーは変わりませんでした。
CLIから c5:update しようとしても、CLI上でも同じエラーが表示されました。
テーブルが見つからないとのことですが、どう対処すればよいでしょうか?

Doctrine \ DBAL \ Exception \ TableNotFoundException
An exception occurred while executing 'SELECT * FROM TreeFileFolderNodes WHERE treeNodeID = ?' with params ["5"]: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'concrete5.TreeFileFolderNodes' doesn't exist
Previous exceptions
SQLSTATE[42S02]: Base table or view not found: 1146 Table 'concrete5.TreeFileFolderNodes' doesn't exist (42S02)
SQLSTATE[42S02]: Base table or view not found: 1146 Table 'concrete5.TreeFileFolderNodes' doesn't exist (42S02)

タグ:

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で支障なく動いているので、このまま次回以降のアップデートを待とうと思います。
色々とありがとうございます。
 

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

2020年9月11日 at 11:51
8.5.2 → 8.5.4のアップデートで同様のエラーを生じています。


Doctrine \ DBAL \ Exception \ TableNotFoundException
An exception occurred while executing 'SELECT * FROM TreeFileFolderNodes WHERE treeNodeID = ?' with params ["7"]: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'データベース名.TreeFileFolderNodes' doesn't exist
Previous exceptions

SQLSTATE[42S02]: Base table or view not found: 1146 Table 'データベース名.TreeFileFolderNodes' doesn't exist (42S02)
SQLSTATE[42S02]: Base table or view not found: 1146 Table 'データベース名.TreeFileFolderNodes' doesn't exist (42S02)


当方ではお話の内容について行けず、次のバージョンを待つことにいたしましたが、先月にはアップデートを促す投稿もあり、どうしたものかと対応を思案しております。
http://www.concrete5.org/about/blog/security/press-articles-about-rce-file-upload-vulnerability-cve-2020-11476-friendly-reminder-update-version-854-security-and-bug-fi...

この問題に解消の予定はありますでしょうか。
このエラーを生じたら、ご回答いただいている手順で解消すれば良いという方向でしょうか。
現在の状況や見通しについて知りたいです。


# concrete5 バージョン
8.5.2

# PHP バージョン
7.2.x

# サーバー
エックスサーバー
 

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

2020年9月11日 at 12:03
ファイルアップロードの脆弱性ですが、「管理者が管理画面からアップロードするとまずいphpファイルなどのアップロードを許可することができる」というもので、要するに「セキュリティ意識のない管理者がうっかりミスをやらかす可能性がある」というものです。直ちに危険というものではありません。

脆弱性がどのように修正されたかというと、ファイルアップロードの許可拡張子の設定画面で、危ない拡張子は入力してもはじかれるようになりました。要するに「うっかりミス防止機能」です。これをどう捉えるかは、各自でご判断いただければと思います。
 

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

2020年9月11日 at 13:10
hishikawa様

ブログで指摘されている内容について理解できました。
ご説明いただきありがとうございました。

このエラーはこちらで提示されている手順で解決済みなので、早くアップデートしましょう!というトーンなのかな?とお尋ねしました。
concrete5は管理画面からアップデートできないことが多かったり(当方だけでしょうか?)、WordPressより上級者向けという印象なので…
次のバージョンで解消されることを期待しつつ、状況を見守りたいと思います。