5.15→5.17でのマイグレーションのエラーでアップデート出来ない。

【環境情報】
・baserCMSのバージョン:5.0.14
・レンタルサーバー名:さくらインターネット レンタルサーバースタンダードプラン
・使用テーマ:bc_sample
・PHPスキル(自己評価):E

以下のエラーでアップデート出来ません。
xdebugは

を参照してインストール・有効化してあります。
db/baser.db
のバックアップをとり当該テーブルを削除した後、再度アップデートしたところ別のプラグインで同様のエラーが出たため、同様に対応したところエラーでCMSが動かなくなったため、バックアップから復旧した状態です。

ドキュメントルートから、composer.phar updateしてみましたが、そちらもうまくいきませんでした。

2024-06-02 19:22:15 info: BaserCore プラグイン 5.0.17 へのアップデートを開始します。
2024-06-02 19:22:15 info: BcBlog プラグイン 5.0.17 へのアップデートを開始します。
2024-06-02 19:22:15 info: BcContentLink プラグイン 5.0.17 へのアップデートを開始します。
2024-06-02 19:22:15 info: アップデート処理が途中で失敗しました。
2024-06-02 19:22:15 info: SQLSTATE[HY000]: General error: 1 table content_links already exists
2024-06-02 19:22:15 error: Migration と アップデーターによるアップデートが失敗しました。

@tky.yuuki SQLiteの環境で、5.0.15 を作り、アップデートを実行しましたが、再現できませんでした。

db/baser.db
のバックアップをとり当該テーブルを削除した後

こちらについては、content_links already exists のことを指しているのでしょうか?
つまり、 content_links を削除してもダメだったということですか?

現在は、どのような状況でしょうか?

はい。

2024-06-11 09:30:02 info: SQLSTATE[HY000]: General error: 1 table custom_contents already exists

となり、custom_contentsを削除すると

内部エラーが発生しました

An Internal Error Has Occurred.

エラー: アドレス ‘/baser/admin/baser-core/plugins/update’ に送信されたリクエストは無効です。

となります。

現在バックアップデータを戻してそのままです。

@tky.yuuki DBのマイグレーションがうまくいっていないみたいですね。。
baser_core_phinxlog というテーブルの中身(レコード)が確認したいです。
こちらが空っぽの場合、対象の問題となる可能性が高いです。


有り難うございます。
こんな感じになっております。

@tky.yuuki ありがとうございます。

アップデート前に bc_content_link_phinxlog というテーブルは存在しますか?
また、その中身はどうなってますでしょうか?

下記のようにデータが入っている場合は、システムとして、content_links が作成済であり、そのように認識しているので、content_links を作成しようとしないはずなんです。

image

有り難うございます。
テーブルはありますが、中身は空のようです。

@tky.yuuki 確認ありがとうございます。

データベースのマイグレーションの仕様上、マイグレーションが完了している場合には、phinxlog テーブルにログが残らなければなりません。

BcContentLink プラグインにおいて、content_links テーブルができているのであれば、bc_content_link_phinxlog にログができているというのが正常な状態です。

今回、空になっていて、矛盾が発生しているので、アップデートがうまくいかないという事になります。

矛盾の再現確認

その矛盾が再現するか次の手順を実行しました。

  1. バージョン 5.0.15 を SQLiteで新規にインストール
  2. BcContentLink プラグインをインストール
  3. bc_content_link_phinxlog のレコードを確認 → ログあり
  4. アップデートを実行 → 成功

ということで再現ができず、どうしてその状況になったのかがまだ原因がわかりません。

回避策

ただ、phinxlog のログを手動で作成することで、アップデート時のエラーを回避することができます。

パターン1:SSHで phinxlog のログを作成

  1. SSHでサーバにログイン
  2. ドキュメントルートに移動
  3. コマンドを実行
bin/cake migrations mark_migrated -p BcContentLink

パターン2:PHPで phinxlog のログを作成

ロリポのエコノミープランなど、SSHが実行できない場合は、PHPで実行します。

  1. 次のファイルを作成
// migrate.php
<?php
$command = dirname(__DIR__);
$command .= '/bin/cake migrations mark_migrated -p BcContentLink';
exec($command, $output);
echo implode("<br>", $output);
  1. 上記のファイルをサーバー上の webroot ディレクトリ内にアップロード
  2. ブラウザで次のURLにアクセス
https://example.com/migrate.php
  1. bc_content_link_phinxlog のレコードを確認
  2. ログがあればアップデートを実行する
  3. migrate.php を削除

一度、試してみてください。

詳細に有り難うございます。
パターン1、の対応の繰り返しで最終的にアップデート出来ました。

bin/cake migrations mark_migrated -p BcContentLink

別プラグインで同じエラー

bin/cake migrations mark_migrated -p BcCustomContent

同様に
BcEditorTemplate 、BcFavorite 、BcUploader
とエラーが出る毎に対象プラグインに対し、同様に対応した結果無事アップデート出来ました。
(エラーが出たのは上記のプラグインのみだったようです。)

ログを確認したところ、

2024-06-15 17:19:40 info: アップデートプログラム 5.0.18 を実行します。
2024-06-15 17:19:40 info: /home/USERNAME/www/baser5/config/plugins.php に書き込み権限がありません。/home/USERNAME/www/baser5/vendor/baserproject/baser-core/config/update/5.0.18/config/plugins.php をコピーして手動で上書きしてください。

と有りましたので、SSHからcpで対象ファイルをコピーしました。

ご対応いただき有り難うございました。
必要な情報があれば分かる限りでお出しできます。