2016-01-24 43 views
-1

由於高估了實施的脆弱性,我已經損壞了我的Mnesia數據庫而無法修復。當我嘗試使用Mnesia API時,即使他們的鍵在文件中可見,我所需要的記錄也是不可見的。儘管文檔指出Mnesia文物是DETS文件,但它們不能用DETS文物打開或識別爲DETS文物。 PS:dump_to_textfile()也不起作用。mnesia文件損壞需要在法庭上轉儲所有文件

+0

你能解釋一下'mnesia:dump_to_textfile/1'不能正常工作嗎?你是否遇到錯誤或者調用是否成功,mnesia:load_textfile/1'函數調用無法導入數據? – Stratus3D

+0

@Stratus3D我對dump_to_textfile()的引用只是一個PS。隨附的文件表明它僅用於教育目的。更大的問題是我無法從數據庫中提取數據,即使文檔也指出它是DETS或ETS我無法打開任何Mnesia數據文件。 – Richard

回答

0

最終我能夠轉儲我的數據庫。它沒有結束我的Mnesia問題,但它給了我以前沒有的選擇。

設置: 最初我已經實現了一個master-master mnesia集羣。 (閱讀文檔)。事實證明,即使是經驗最豐富的Erlang程序員也沒有使用Mnesia複製,因爲存在許多缺陷。事實上,我也從Erlang內圈和一些L1團隊獲得了這些信息。但就我而言,這項工作已經投入生產。那就是問題何時開始。

我們開始獲取數據庫一致性錯誤以及我最喜歡的網絡或數據庫分區錯誤。需要一位非常熟練和知識淵博的人才能夠提前恢復以及大量計劃和編碼;我沒有。

最終我採取了兩個步驟。 (a)刪除第二個應用程序,以便即使DB處於主 - 主集羣中,一個是奴隸,因爲它從未被用作主人。 (b)在第二個實現中,我分割集羣,以便應用程序在單個數據庫的單個節點上運行。 #a正在生產中,#b是熱備份。複製是手動的,因爲寫入非常少見。

在單節點部署中有兩個節點。第一個節點是應用程序; app @ ks並且在同一硬件上有一個「erl」節點,當我需要進入應用程序並看看事情進展如何。

我的解決方案: 當我發佈這個問題時,我試圖轉儲我的Mnesia DB的內容。我遇到了很多問題,因爲我試圖在應用程序節點運行時從管理節點訪問數據庫。

因爲我試圖從erl節點訪問mnesia lib,所以數據庫對於erl節點不是LOCAL,因此dump_to_textfile產生了一個空文件。當我使用rpc告訴app @ ks節點轉儲時,我最終獲得了成功。

仍然未定義 當我啓動管理節點時,我將mnesia dir參數設置爲與app @ ks節點相同的文件夾。我有一個模糊的記憶,這是不可取的。

還有很多Mnesia問題需要解決,但沒有一個涉及我報告的問題。但我仍然不知道如何從各種數據庫文件中提取原始數據。