Confluence 6 找到在建立 XML 備份的時候出現的錯誤

錯誤多是由於數據庫忽然不可訪問而產生。若是你在你的日誌中看到了錯誤  'Couldn't backup database data' ,這個指南將會幫助你更正這個錯誤。咱們強烈推薦你備份 Confluence 數據庫和 Confluence 的 home 目錄這種備份方式來備份你的 Confluence 服務器。你可使用 Restoring Data from other Backups 的方法來恢復你的備份,若是須要的話。若是你對數據庫 SQL 並不熟悉的話,咱們建議你聯繫你的數據庫管理員來得到相關的幫助。java

完美解決方案

Production Backup Strategy 備份方案是完美而且最有效的備份方案。若是你在備份 XML 方式遇到了問題,無論是由於內存溢出仍是下面描述的問題,咱們建議你使用 SQL 的備份方案爲你可選的備份方案。sql

識別並更正問題

但願找到數據庫備份的錯誤或者中斷的緣由,修改狀態信息的日誌,可以讓你得到更多的有用的信息,而後根據日誌修改每個數據庫的配置:數據庫

  1. 中止 Confluence。
  2. 若是你使用的是外部數據庫,請使用數據庫管理工具來建立一個手動的數據庫備份。
  3. 備份你的 Confluence  home 目錄。你可使用這個數據庫的 SQL 備份來恢復你的整個站點
  4. 打開 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=falsejsp

  5. 找到你的 atlassian-confluence.log。移動或者刪除全部已經存在的 Confluence 日誌,這個可以讓你更加容易找到輸出的錯誤信息。
  6. 重啓 Confluence 而且登陸。
  7. 開始備份,並等待錯誤出現。
  8. 你必須如今就要查看你的日誌文件來找到是哪個對象沒有被正確轉換爲 XML 格式。打開 confluence-home/logs/atlassian-confluence.log,並滾動到文件的末尾。
  9. 進行查找 '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)
  10. 打開一個數據庫管理工具,例如 DbVisualizer 而後鏈接到你的數據庫實例。找到的表名字,你須要修改這些表中的某些記錄。
  11. 但願找到是哪一個數據表出現了錯誤,打開 catalina.out,找到的異常的第一行。這裏有錯誤說是在寫入 ContentPermission id 爲 5 的對象到 XML 的時候出現了錯誤。換句話說,這個意思就是在主鍵爲 5 的行須要更正,這個在表 CONTENTLOCK 中。但願找到數據庫中是哪一個表的那個對象,下面對應了內容存儲的表:
    • 頁面,博客頁面,評論(Pages, blogposts, comments) --> CONTENT 表
    • 附件(attachments )--> ATTACHMENTS 表
    • 有關更多的信息能夠在頁面 schema documentation 中找到。
  12. 如今你必須找到不正確記錄在表中的主鍵。在這個例子中,你能夠看到在錯誤的第一行定義的主鍵爲 5。
  13. 每個屬性都被寫入到列中,所以最後寫入的屬性有不正確的值。當寫入的時候出現了異常,拋出了 CONTENT (line 5) 的值 2535 (line 6)。如今你已經知道了列和值。值 2535 爲一個一個再也不存在的實體 ID。
  14. 使用數據庫管理工具,登陸 Confluence 數據庫。找到相關的表而後更正實體。檢查表中其餘行的默認值,可能爲 null ,0 或者 blank。使用默認的值來重寫不正確的值。
  15. 重啓 Confluence。
  16. 嘗試繼續進行備份。若是備份仍是失敗了,你也找不到合適的信息,請使用下面的鏈接 lodge a support request 提交給咱們進行解決,請提供完整的日誌信息。

"Duplicate Key" 相關的問題解決

若是你在備份的時候遇到了下面的錯誤:ide

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

但願避免這些問題重複發生

  1. 若是你使用的是嵌入數據庫,請注意這個數據庫僅僅被用來進行測試,而且這個數據庫沒有完整的事物管理,可能由於計算機斷電而致使數據庫異常和其餘問題。所以咱們推薦你針對生產環境中使用外部數據庫,請參考整合到外部數據庫進行操做。
  2. 若是你正在使用的是一個較老的 Confluence 版本,而不是最新的 Confluence 的版本,這個時候你應該考慮升級你的 Confluence。

 

https://www.cwiki.us/display/CONFLUENCEWIKI/Troubleshooting+failed+XML+site+backupspost

相關文章
相關標籤/搜索