遇到 POSKeyError 怎麼辦?

遇到 POSKeyError 怎麼辦?

真的是千年一遇…

這種情況真的不常見,但一出現還真是會要人命…

POSKeyError 屬於底層的 ZODB 錯誤,從 Plone 的層面來看,可以說是無解

參照底下這篇文章,依照實際情況稍作修改,可以完成操作並修復問題

http://plonechix.blogspot.tw/2009/12/definitive-guide-to-poskeyerror.html

POSKeyError 發生的原因很多,主要的狀況描述就是某筆資料已經不可逆毀損,無法正常讀寫,但是對於站點的其他內容並無影響

解決的方法就是定位出該筆 content, 並且將其刪除(已經是不可逆毀損了,所以只能刪了它),最後回到 plone 在 zmi 中將 catalog 重新 index 即可修復

實際操作範例如下:

執行 bin/zopepy 進入命令提示模式

載入模組

from AccessControl.SecurityManagement import newSecurityManager
from Testing import makerequest
from ZODB import FileStorage, DB
import transaction

連線 ZODB 並取得根節點

storage = FileStorage.FileStorage('path_to/Data.fs')
db = DB(storage)
connection = db.open()
root = connection.root()
app = root['Application']

取得管理員帳號權限

admin = app.acl_users.getUserById('admin')
admin = admin.__of__(app.acl_users)
newSecurityManager(None, admin)

定位到有毀損 content 的目錄,並且刪掉有問題的內容

req=makerequest.makerequest(app.mysite.bad_folder)
req.manage_delObjects(['bad_content'])
transaction.commit()

到此完成,離開後,回到 zmi 將 catalog 重新 reindex, 完成後就完成修復

有問題的內容將被刪除,必須重建,但網站的其他內容則不受影響。