今天因為團隊需要蝌借,協(xié)助幫忙看Confluence的這個問題,通過大半天的分析研究也得到不少收獲,在此記錄一下問題的原因以及最后的解決方案贩汉,希望對各位在遷移中碰到類似問題的大神們有所幫助。
遷移步驟
先大致說一下基本的遷移步驟:
創(chuàng)建備份
- 使用管理員賬戶登錄Confluence锚赤,點擊右上角“齒輪”圖標匹舞,選擇
General Configuration
- 在側(cè)邊欄中,選擇
Backup & Restore
- 勾選
Archive to backups folder
讓生成的備份創(chuàng)建歸檔至Confluence自動備份目錄线脚,如果不點選會生成在臨時目錄中赐稽,并且會在24小時后自動清除 - 勾選
Backup attachments
,將附件內(nèi)容加入到備份中 - 點擊
Backup
按鈕浑侥,等待備份完畢姊舵。
系統(tǒng)恢復(fù)
- 在新安裝的Confluence中,用管理員賬號登陸锭吨,點擊右上角“齒輪”圖標蠢莺,選擇
General Configuration
- 在側(cè)邊欄中,選擇
Backup & Restore
- 點擊
Choose File
零如,在彈出框中選擇上一步中創(chuàng)建的備份文件 - 點擊
Upload and Restore
躏将,進行上傳和恢復(fù)
基本步驟如上所述,若沒有碰到任何問題那是最好的考蕾。若沒有成功祸憋,在日志中查看到類似這樣的錯誤:
com.atlassian.confluence.importexport.ImportExportException: Unable to complete import: Error while importing backup: could not insert: [com.atlassian.confluence.content.ContentProperty#32178794]
……
ERROR [Long running task: Importing data] [sf.hibernate.util.JDBCExceptionReporter] logExceptions Data truncation: Data too long for column 'STRINGVAL' at row 1
注:錯誤信息只截取了重要內(nèi)容,省略部分異常堆棧內(nèi)容肖卧。
關(guān)于這個錯誤在官方JIRA中已有Issue蚯窥,但還是open狀態(tài),所以應(yīng)該無法通過升級來解決塞帐,所以如果碰到類似的問題拦赠,那就繼續(xù)往下看,若是其他錯誤葵姥,可以查看這里是否有類似的錯誤原因:Troubleshooting XML backups that fail on restore
解決方法
由于Confluence沒有開源荷鼠,無法為其貢獻Patch,所以主要從備份文件的角度去分析與處理榔幸。
- 報錯信息分析:我們可以定位是在插入數(shù)據(jù)庫的時候
STRINGVAL
字段超長允乐,并且該字段位于ContentProperty對象中 - 查看數(shù)據(jù)庫中有相對應(yīng)的
CONTENTPROPERTY
表矮嫉,表結(jié)構(gòu)如下,可以看到STRINGVAL
字段長度為255
+--------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+-------+
| PROPERTYID | bigint(20) | NO | PRI | NULL | |
| PROPERTYNAME | varchar(255) | NO | MUL | NULL | |
| STRINGVAL | varchar(255) | YES | MUL | NULL | |
| LONGVAL | bigint(20) | YES | MUL | NULL | |
| DATEVAL | datetime | YES | MUL | NULL | |
| CONTENTID | bigint(20) | YES | MUL | NULL | |
+--------------+--------------+------+-----+---------+-------+
解壓開備份文件牍疏,可以看到我們有下面三個內(nèi)容蠢笋,通過查看內(nèi)容大致可以定位導(dǎo)入出錯的數(shù)據(jù)來源自
entities.xml
entities.xml
exportDescriptor.properties
plugin-data
看看
entities.xml
的結(jié)構(gòu),大致如下:
<object class="ContentProperty" package="com.atlassian.confluence.content">
<id name="id">1705394</id>
<property name="name"><![CDATA[inline-original-selection]]></property>
<property name="stringValue"><![CDATA[XXXXXXX]]></property>
<property name="longValue"/><property name="dateValue"/>
</object>
- 大致可以判斷出超長的字段特點為:
class
屬性為ContentProperty
的Object
標簽下鳞陨,name
為stringValue
的property
標簽內(nèi)容昨寞。根據(jù)此特點,可通過下面的代碼找到超長的內(nèi)容厦滤。
File file = new File(getClass().getResource("/entities.xml").getFile());
SAXReader reader = new SAXReader();
Document document = reader.read(file);
List<Element> list = document.getRootElement().selectNodes("http://object[@class='ContentProperty']");
for(Element e : list) {
Element element = (Element)e.elements("property").get(1);
String text = element.getText();
if(text.length() > 255) {
System.out.println(text);
}
}
- 在找到對應(yīng)內(nèi)容后编矾,可以刪除一些內(nèi)容,再嘗試導(dǎo)入馁害。讀者也可以根據(jù)上述代碼稍作修改窄俏,來生成新的xml使用。
后記
由于數(shù)據(jù)庫定義字段為255碘菜,那么從數(shù)據(jù)庫中取出數(shù)據(jù)時凹蜈,肯定是255的不會錯,因此猜測是在export組織xml時增加了一些東西導(dǎo)致忍啸。根據(jù)我們這邊異常數(shù)據(jù)來看仰坦,最后超出部分正好是三個點:...
,不知道遇到類似問題的大家是否也是類似情況计雌,歡迎留言一起找找具體原因悄晃。最近實在太忙,大致反編譯看了一些export的內(nèi)容凿滤,但是未找到具體原因妈橄,后續(xù)有時間再看看吧。
另外翁脆,confluence的這部分class并不在confluence/WEB-INF/classes
目錄下眷蚓,大家有欲望研究的需要去confluence/WEB-INF/lib
下解壓confluence-5.x.x.jar
,并反編譯獲得反番,有讀者找到具體原因的話沙热,歡迎留言或郵件交流 _