遇到 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, 完成後就完成修復
有問題的內容將被刪除,必須重建,但網站的其他內容則不受影響。