Confluence 6 找到在創建 XML 備份的時候出現的錯誤
完美解決方案
Production Backup Strategy 備份方案是完美並且最有效的備份方案。如果你在備份 XML 方式遇到了問題,不管是因為內存溢出還是下面描述的問題,我們建議你使用 SQL 的備份方案為你可選的備份方案。
識別並更正問題
希望找到數據庫備份的錯誤或者中斷的原因,修改狀態信息的日誌,能夠讓你獲得更多的有用的信息,然後根據日誌修改每一個數據庫的配置:
停止 Confluence。
如果你使用的是外部數據庫,請使用數據庫管理工具來創建一個手動的數據庫備份。
備份你的 Confluence home 目錄。你可以使用這個數據庫的 SQL 備份來恢復你的整個站點。
打開
my_confluence_install/confluence/WEB-INF/classes/log4j.properties
然後在文件的後面添加下面的行,並保存。log4j.logger.com.atlassian.confluence.importexport.impl.XMLDatabinder=DEBUG, confluencelog
log4j.additivity.com.atlassian.confluence.importexport.impl.XMLDatabinder=
false
找到你的 atlassian-confluence.log。移動或者刪除所有已經存在的 Confluence 日誌,這個能夠讓你更加容易找到輸出的錯誤信息。
重啟 Confluence 並且登錄。
開始備份,並等待錯誤出現。
你必須現在就要查看你的日誌文件來找到是哪一個對象沒有被正確轉換為 XML 格式。打開
confluence-home/logs/atlassian-confluence.log
,並滾動到文件的末尾。進行查找 'ObjectNotFoundException'。你應該能夠看到類似下面的錯誤:
01 2005-08-24 00:00:33,743 DEBUG [DOCPRIV2:confluence.importexport.impl.XMLDatabinder] Writing object: com.atlassian.confluence.core.ContentPermission with ID: 5 to XML. 02 2005-08-24 00:00:33,743 DEBUG [DOCPRIV2:confluence.importexport.impl.XMLDatabinder] Writing property: type 03 2005-08-24 00:00:33,743 DEBUG [DOCPRIV2:confluence.importexport.impl.XMLDatabinder] Writing property: group 04 2005-08-24 00:00:33,743 DEBUG [DOCPRIV2:confluence.importexport.impl.XMLDatabinder] Writing property: expiry 05 2005-08-24 00:00:33,743 DEBUG [DOCPRIV2:confluence.importexport.impl.XMLDatabinder] Writing property: content 06 [DOCPRIV2:ERROR] LazyInitializer - Exception initializing proxy <net.sf.hibernate.ObjectNotFoundException: No row with the given identifier exists: 2535, 07 of class: com.atlassian.confluence.core.ContentEntityObject>net.sf.hibernate.ObjectNotFoundException: 08 No row with the given identifier exists: 2535, of class: com.atlassian.confluence.core.ContentEntityObject 09 at net.sf.hibernate.ObjectNotFoundException.throwIfNull(ObjectNotFoundException.java:24) 10 at net.sf.hibernate.impl.SessionImpl.immediateLoad(SessionImpl.java:1946) 11 at net.sf.hibernate.proxy.LazyInitializer.initialize(LazyInitializer.java:53) 12 at net.sf.hibernate.proxy.LazyInitializer.initializeWrapExceptions(LazyInitializer.java:60) 13 at net.sf.hibernate.proxy.LazyInitializer.getImplementation(LazyInitializer.java:164) 14 at net.sf.hibernate.proxy.CGLIBLazyInitializer.intercept(CGLIBLazyInitializer.java:108) 15 at com.atlassian.confluence.core.ContentEntityObject$$EnhancerByCGLIB$$cc2f5557.hashCode(<generated>) 16 at java.util.HashMap.hash(HashMap.java:261) 17 at java.util.HashMap.containsKey(HashMap.java:339) 18 at com.atlassian.confluence.importexport.impl.XMLDatabinder.toGenericXML(XMLDatabinder.java:155)
打開一個數據庫管理工具,例如 DbVisualizer 然後連接到你的數據庫實例。找到的表名字,你需要修改這些表中的某些記錄。
希望找到是哪個數據表出現了錯誤,打開
catalina.out
,找到的異常的第一行。這裏有錯誤說是在寫入ContentPermission
id 為 5 的對象到 XML 的時候出現了錯誤。換句話說,這個意思就是在主鍵為 5 的行需要更正,這個在表 CONTENTLOCK 中。希望找到數據庫中是哪個表的那個對象,下面對應了內容存儲的表:頁面,博客頁面,評論(Pages, blogposts, comments) --> CONTENT 表
附件(attachments )--> ATTACHMENTS 表
有關更多的信息可以在頁面 schema documentation 中找到。
現在你必須找到不正確記錄在表中的主鍵。在這個例子中,你可以看到在錯誤的第一行定義的主鍵為 5。
每一個屬性都被寫入到列中,因此最後寫入的屬性有不正確的值。當寫入的時候出現了異常,拋出了
CONTENT
(line 5) 的值2535
(line 6)。現在你已經知道了列和值。值2535
為一個一個不再存在的實體 ID。使用數據庫管理工具,登錄 Confluence 數據庫。找到相關的表然後更正實體。檢查表中其他行的默認值,可能為 null ,0 或者 blank。使用默認的值來重寫不正確的值。
重啟 Confluence。
嘗試繼續進行備份。如果備份還是失敗了,你也找不到合適的信息,請使用下面的連接 lodge a support request 提交給我們進行解決,請提供完整的日誌信息。
"Duplicate Key" 相關的問題解決
如果你在備份的時候遇到了下面的錯誤:
could not insert: [bucket.user.propertyset.BucketPropertySetItem#bucket.user.propertyset.BucketPropertySetItem@a70067d3]; SQL []; Violation of PRIMARY KEY constraint 'PK_OS_PROPERTYENTRY314D4EA8'. Cannot insert duplicate key in object 'OS_PROPERTYENTRY'.; nested exception is java.sql.SQLException: Violation of PRIMARY KEY constraint 'PKOS_PROPERTYENTRY_314D4EA8'. Cannot insert duplicate key in object 'OS_PROPERTYENTRY'.
這個錯誤信息說的是定義為'PK_OS_PROPERTYENTRY_314D4EA8' 的主鍵在表 'OS_PROPERTYENTRY' 中重復了。
你可以在 'OS_PROPERTYENTRY' 表中找到 'PK_OS_PROPERTYENTRY_314D4EA8' 中定義的主鍵,然後找到重復的值後刪除重復的值。需要確定 "PRIMARY KEY" 必須保持不重復。一個可以找到 'OS_PROPERTYENTRY' 表中是否有重復主鍵的 SQL 如下:
SELECT ENTITY_NAME,ENTITY_ID,ENTITY_KEY,COUNT(*) FROM OS_PROPERTYENTRY GROUP BY ENTITY_NAME,ENTITY_ID,ENTITY_KEY HAVING COUNT(*)>1
希望避免這些問題重復發生
如果你使用的是嵌入數據庫,請註意這個數據庫僅僅被用來進行測試,並且這個數據庫沒有完整的事物管理,可能因為計算機斷電而導致數據庫異常和其他問題。因此我們推薦你針對生產環境中使用外部數據庫,請參考整合到外部數據庫進行操作。
如果你正在使用的是一個較老的 Confluence 版本,而不是最新的 Confluence 的版本,這個時候你應該考慮升級你的 Confluence。
https://www.cwiki.us/display/CONFLUENCEWIKI/Troubleshooting+failed+XML+site+backups
Confluence 6 找到在創建 XML 備份的時候出現的錯誤