問題
- 7.4へのアップグレードを実行しているのですが、以下のようなエラーが出て失敗します:
com.liferay.portal.kernel.log.LogSanitizerException: com.liferay.portal.kernel.upgrade.UpgradeException: java.sql.BatchUpdateException: Batch entry 155 insert into DDMFieldAttribute (mvccVersion, ctCollectionId, fieldAttributeId, companyId, fieldId, storageId, attributeName, languageId,largeAttributeValue, smallAttributeValue) values (0, 0, 221906, 10108, 197794, 15585405, '', '',NULL, 'Optimized by JPEGmini 3.18.2.210033067-TBTBLN 0xa358ba22Optimized by JPEGmini 3.18.2.210033067-TBTBLN 0xa358ba22_') was aborted:ERROR: invalid byte sequence for encoding "UTF8": 0x00 Call getNextException to see other errors in the batch. [Sanitized]
Environment
- 7.2〜7.4
- 7.3〜7.4
解決策
- 問題は、データベースに "\u0000" という文字列を含むデータがある(またはある)ことです(例えば、SELECT * FROM DDMContent WHERE data like '%\u0000 %' というコマンドで見つけることができます)。 そのような記録は、アップグレード時にそのエラーを引き起こします。
- この記事を書いている時点では、まだ深い根本的な原因は判明していません。例えば、これらの部品、これらの文字は、通常の操作でどのようにデータベースに追加されるのか
- これは、アップグレード前のオリジナルのデータベースで実行する必要があるgroovyスクリプトで処理することができます。 このスクリプトはDDMContentテーブルをスキャンし、"\u0000"リテラル文字列のインスタンスを削除します(注:DDMContent全体を削除するのではなく、DDMContentのデータから "\u0000" 文字列を削除するだけです)。
- RemoveUnicodeNullValuesFromDDMContentData.groovy 7.2用スクリプトはこの記事に添付されています。
まとめると
- 元のデータベース(またはそのコピー)に戻ってください。 失敗したアップグレードスクリプトを実行したほうを落とすことができます。
- 必ずバックアップをとっておいてください。
- その上でgroovyスクリプトを実行します。 (UIから、サーバー管理/スクリプトで)
- その後、このデータベースで再度upgrade.shを実行してみてください。
スクリプトによって問題のある文字が削除されたので(ステップ3)、アップグレードによってこの問題が発生することはもうありません。
追加情報