アップグレードのトラブルシューティング
アップグレード手順をスキップしたり、Liferayデータベースへのカスタム参照を作成したりすると、アップグレードの問題が発生する可能性があります。 以下の質問と回答では、よくある状況を取り上げています。
外部キー制約によって引き起こされるアップグレード例外をどのように処理すればよいですか?
Liferayテーブルは外部キーを使用しません。 新しいLiferayバージョンでLiferayテーブルにプライマリーキーが追加され、テーブルに外部キーが関連付けられている場合、外部キーが壊れてアップグレードが失敗します。
たとえば、Liferay 7.3では、ctCollectionId
というプライマリーキーがuser_
テーブルに追加されました。 user_
テーブルに関連付けられた外部キーにより、user_
テーブルのアップグレードが失敗し、次のようなメッセージが表示されることがあります。
INFO [main][LoggingTimer:44] Completed com.liferay.portal.kernel.upgrade.UpgradeCTModel#doUpgrade#User_ in 750 ms
INFO [main][UpgradeProcess:115] Failed upgrade process com.liferay.portal.kernel.upgrade.UpgradeCTModel in 4703 ms
INFO [main][UpgradeProcess:115] Failed upgrade process com.liferay.portal.upgrade.PortalUpgradeProcess in 53125 ms
com.liferay.portal.kernel.upgrade.UpgradeException: com.liferay.portal.kernel.upgrade.UpgradeException: java.sql.SQLException: Error on rename of '.\liferaydxp\#sql-908_12f' to '.\liferaydxp\user_' (errno: 150 - Foreign key constraint is incorrectly formed)
最後のUpgradeException
メッセージは、アップグレードで外部キー制約の名前をuser_
テーブルに変更できないことを示しています。
Liferayテーブルに関連付けられた外部キーを使用するカスタムテーブルがある場合は、外部キーを、Liferayモデルの変更に基づいてカスタムテーブルを更新するモデルリスナーに置き換えます。 たとえば、カスタムテーブルに現在user_
テーブルを参照する外部キーがある場合は、User
インスタンスが追加または削除されたときにカスタムテーブルを更新するモデルリスナーを作成します。
置き換える方法は次のとおりです。
-
カスタムテーブルデータに関連するモデルイベント用のモデルリスナーを作成します。
-
テスト環境でモデルリスナーを検証します。
-
アップグレード環境で、カスタムテーブルを外部キーを使用しないテーブルに置き換えます。
-
データベースをアップグレードします。
-
新しいLiferayインストールにモデルリスナーをデプロイします。
-
Liferayサーバーを起動します。
モデルリスナーは、リッスンしているモデルイベントに基づいて新しいカスタムテーブルを更新します。
仮想列式で使用されるテーブル列の名前変更に関するアップグレードプロセスの警告はどのように処理すればよいですか?
一部の新しいLiferayバージョンでは、テーブル列の名前が変更されています。 これらの列に関連付けられている 仮想列 はデータベースのアップグレードを妨げるため、アップグレードの前に削除する必要があります。 アップグレード後、同等の仮想列を追加できます。
たとえば、Liferay 7.0では、JournalArticle
テーブルのstructureId
列とtemplateId
列の名前をそれぞれDDMStructureKey
とDDMTemplateKey
に変更しました。 Liferay Portal 6.2からアップグレードしていて、仮想列をJournalArticle
テーブルに関連付けている場合は、アップグレードする前にそれらを削除してください。 たとえば、Oracleデータベースでは、次のようなクエリを使用して仮想列を確認できます。
select column_name, data_default, hidden_column from user_tab_cols where table_name = 'JOURNALARTICLE';
テーブルをアップグレードした後、同等の仮想列をデータベースに追加できます。