erlang mnesia 數據庫備份與還原機制

我的個人博客網站雲諾說上線啦!所有文章都搬到新地址了,點擊圍觀吧!

數據庫在使用當中都會有數據庫備份工作,當數據庫發生嚴重錯誤無法啓動,或者數據丟失時可以及時有效地恢復數據。文章首先介紹如何備份和還原ErlangMnesia數據庫,然後從備份、回滾兩大方面深入探討mnesia的備份機制。

備份數據庫

在Mnesia啓動後,可以使用mnesia:backup()備份,函數原型:

 

mnesia:backup(Opaque [, BackupMod]) -> ok | {error,Reason}
#調用前,確保mnesia正常運行,保存目錄存在
mnesia:backup("d:/backup.log").

 

在mnesia啓動後,可以使用mnesia:restore()恢復,函數原型:

 

mnesia:restore(Opaque, Args) -> {atomic, RestoredTabs}|{aborted, Reason}

恢復過程相關的所有表將寫鎖,可在mnesia不用重啓的情況下恢復數據

 

 

# 調用前,確保mnesia正常運行
mnesia:restore("d:/backup.log", []).

 

好了,如果只是瞭解如何備份和還原mnesia數據庫,到這裏就結束了。

如果爲了更加深入瞭解mnesia的備份機制,那就繼續往下看。

備份與回滾

下列函數用於備份數據、安裝備份作爲回滾:

# 執行一個包含在檢查點中的表備份
mnesia:backup_checkpoint(Name, Opaque [, BackupMod])
 
# 激活一個覆蓋全部 Mnesia 表的新檢查點並且執行一次備份(備份以最大冗餘度執行)
mnesia:backup(Opaque [, BackupMod])
 
# 備份轉儲,從一個現存的備份創建一個新的備份。可以在不同介質之間複製備份。
mnesia:traverse_backup(Source,[SourceMod,]Target,[TargetMod,]Fun,Ac)
 
# 從一個現存的備份恢復表
mnesia:restore(Opaque, Args)
 
# 安裝回滾,從一個現存的備份重啓並且重新加載數據庫表。
mnesia:install_fallback(Opaque, [Mod])
 
# 移除先前安裝的回滾文件
mnesia:uninstall_fallback()

mnesia:backup()的備份過程的內部實現分爲以下3步:

1、創建檢查點:mnesia:activate_checkpoint/1
2、執行備份    :mnesia:backup_checkpoint/3
3、停用檢查點:mnesia:deactivate_checkpoint/1

對比來說,mnesia:backup方式比較野蠻,執行最大冗餘備份,也就是備份全部數據,包括所有副本(copy)。當數據量比較大時恢復過程比較久,如果只需要備份某些重要的表數據,可以使用自己創建檢查點。

創建檢查點

關於檢查點的概念,erlang的解釋如下:

A checkpoint is a consistent view of the system. A checkpointcan be activated on a set of tables. This checkpoint can then betraversed and will present a view of the system as it existed atthe time when the checkpoint was activated, even if the tables arebeing or have been manipulated.

大概意思是,檢查點被用以維護系統視圖一致性。檢查點相當於一個系統鏡像,在備份過程中,即使數據發生變化,也不會影響備份內容。

檢查點使用mnesia:activate_checkpoint函數創建,erlang會啓動所有節點的mnesia_checkpoint進程,由mnesia_checkpoint_sup進程監督。關於這部分內容可以參考mnesia_checkpoint:init/1

mnesia_checkpoint進程主要負責監視數據變化。主要行爲有add_retainer、del_retainer、add_copy、del_copy、change_copy

函數原型:mnesia:activate_checkpoint(Args) -> {ok,Name,Nodes} |{error,Reason}

參數說明:

Args參數是由下列元組構成的一個列表:

參數項 說明 默認值
{name,Name} Name是檢查點的名字,這個名字在關聯的節點中必須是唯一的。當檢查點被停用時,該名字可以重複使用。可以不用設置,系統會自動生成唯一的名字。 {erlang:now(), erlang:node()}
{max,MaxTabs} MaxTabs是告訴erlang哪些表需要最大冗餘備份,也就是所有副本也備份。默認值爲[] []
{min,MinTabs} MinTabs是告訴erlang哪些表需要最小冗餘備份,也就是隻備份一個副本。建議是儲存在本地節點的副本。默認值[] []
{allow_remote,Bool} Bool爲false表示所有的連接保持器必須是本地的,如果涉及的表有不屬於本地節點的,檢查點就無法創建成功。Bool爲true就是允許分配到任意節點。 true
{ram_overrides_dump,Bool} 僅適用於ram_copies。選擇你要備份的模式,true表示當最近記錄提交到RAM的時候就記錄到檢查點,false表示當記錄轉儲到DAT文件時才記錄到檢查點。這裏要注意了,RAM的記錄是應用程序運行時的數據,而DAT的記錄只是mnesia啓動需要加載的記錄。默認值false false

 

執行備份

 

先看下erlang對於這塊內容的解釋:

The tables are backed up to external media using the backupmodule BackupMod. Tables with the local contents property is beingbacked up as they exist on the current node. BackupMod is thedefault backup callback module obtained bymnesia:system_info(backup_module).

大概意思是,執行備份時,erlang會備份本地表數據和表屬性,還可以利用BackupMod參數將數據備份到其他存儲介質。

函數原型:mnesia:backup_checkpoint(Name, Opaque [, BackupMod]) ->ok | {error,Reason}

參數說明:

Opaque參數:這參數是作爲備份模塊BackupMod的傳入參數,在沒有指定備份模塊時,這個參數指的是本地文件名。

停用檢查點:

簡單的理解就是刪了之前創建的檢查點。

函數原型:mnesia:deactivate_checkpoint(Name) -> ok | {error,Reason}

這裏有一點問題需要注意。檢查點就算沒有調用mnesia:deactivate_checkpoint/1,它也可能被停用。關於這個內容,這個功能,erlang的解釋如下:

The checkpoint is automatically deactivated when some of thetables involved have no retainer attached to them. This may happenwhen nodes go down or when a replica is deleted.

大致意思是,當涉及到的任意一個表沒有連接保持器(retainer)時,檢查點會自動停用。節點掛了或者數據副本被刪除也可能會導致檢查點停用。

下面是一個手動備份的過程:

{ok, Name, _} = mnesia:activate_checkpoint( [ { max, [tb_message] } ] ).
{ok,{{1387,505130,66000},nonode@nohost},[nonode@nohost]}
mnesia:backup_checkpoint( Name, "d:/backup.log", [] ).
ok
 mnesia:deactivate_checkpoint( Name ).
ok

恢復數據

用於恢復之前備份過的數據,恢復過程相關的所有表將寫鎖,可在mnesia不用重啓的情況下恢復數據

函數原型:

 

mnesia:restore(Opaque, Args) -> {atomic, RestoredTabs}|{aborted, Reason}

參數說明:

 

Opaque參數:這參數是作爲備份模塊BackupMod的傳入參數,在沒有指定備份模塊時,這個參數指的是本地文件名。

Args參數是由下列元組構成的一個列表:

參數項 說明
{module, BackupMod} BackupMod用於使用自定義的模塊來處理恢復數據,忽略這個參數項則使用系統模塊
{skip_tables, TabList} TabList告訴erlang哪些表不需要恢復
{clear_tables, TabList} TabList告訴erlang哪些表在恢復數據前要清除表中所有記錄。注意了,這裏不會刪除表,只是恢復所有記錄
{keep_tables, TabList} TabList告訴erlang哪些表在恢復數據前記錄不會被清除,而備份中的記錄將會新增到表中。注意了,這裏不會刪除表,只是新增所有記錄
{recreate_tables, TabList} TabList告訴erlang哪些表在恢復數據前需要重新創建表。這些表將被刪除然後重建。注意了,這裏會刪除表
{default_op, Operation} Operation參數值爲skip_tables,clear_tables,keep_tables或recreate_tables。這個參數用於指定erlang恢復表的默認行爲,也就是說那些在沒指定恢復方式的表將以這種方式處理。如果這個參數沒有設置,默認是clear_tables

回滾

首先要明確,什麼是回滾,爲什麼要使用回滾,什麼時候下要使用回滾?

還是先看下erlang對這塊內容的解釋:

This function is used to install a backup as fallback. Thefallback will be used to restore the database at the next start-up.Installation of fallbacks requires Erlang to be up and running onall the involved nodes, but it does not matter if Mnesia is runningor not. The installation of the fallback will fail if the localnode is not one of the disc resident nodes in the backup.

回滾用於在下一次系統啓動時恢復數據庫,也就是說安裝回滾後系統不會立即恢復數據,而是等待mnesia重啓後恢復數據。

爲什麼要使用回滾?前面一種恢復方式(restore)被作爲一個單獨事務執行,在恢復過程中相關的所有表寫鎖,如果數據庫過於龐大,會影響其他程序運行,或無法成功恢復。在這種情況下,數據庫必須通過安裝一個回滾來恢復,然後重新啓動。

使用回滾的另一種場合是當mnesia無法啓動時,還可以使用回滾還恢復數據。在mnesia崩潰,也就是表結構損毀(schema)或者數據發生嚴重錯誤時,mnesia將無法啓動,原來的恢復方式(restore)也無法使用。

回滾是一個分佈式的操作,要麼在所有數據庫節點上執行,要麼不執行。安裝回滾要求 Erlang所有數據庫相關節點都啓動和運行,就算Mnesia進程沒有運行也不受影響。

函數原型:

 

mnesia:install_fallback(Opaque, Args) -> ok |{error,Reason}

Opaque參數:這參數是作爲備份模塊BackupMod的傳入參數,在沒有指定備份模塊時,這個參數指的是本地文件名。

 

Args參數是由下列元組構成的一個列表:

 

參數項 說明
{module, BackupMod} BackupMod用於使用自定義的模塊來處理恢復數據,忽略這個參數項則使用系統模塊
{scope, Scope} Scope配置回滾的影響範圍,既可以是全部數據庫節點(global),也可以是一個本地節點(local)。默認是global。至於哪個節點是磁盤存儲類型,由導入的備份文件確定。
{mnesia_dir, AlternateDir} 當scope參數項爲local有效。一般來說,回滾的安裝都是以mnesia的默認目錄爲準。這裏還可以通過配置AlternateDir來修改回滾的安裝地址,回滾安裝後這個目錄就成了一個有效的mnesia目錄。這個參數項是危險的,請謹慎使用,否則可能會導致數據庫不一致

 

卸載回滾

還是給一個erlang解釋的機會:

This function is used to de-install a fallback before it hasbeen used to restore the database. This is normally a distributedoperation that is either performed on all nodes with disc residentschema or none. Uninstallation of fallbacks requires Erlang to beup and running on all involved nodes, but it does not matter ifMnesia is running or not. Which nodes that are considered asdisc-resident nodes is determined from the schema info in the localfallback.

大概意思就是卸載回滾這個功能,用於在數據庫已被恢復之前移除回滾。

卸載回滾也是一個分佈式的操作,要麼在所有數據庫節點執行,要麼不執行。安裝回滾要求 Erlang所有數據庫相關節點都啓動和運行,就算Mnesia進程沒有運行也不受影響。

函數原型:

 

mnesia:uninstall_fallback(Args) -> ok | {error,Reason}

Args參數含義可以參考回滾的Args參數介紹。

 

博文轉摘:http://blog.sina.com.cn/s/blog_b3e618c20101p9rm.html

 

      祝生活愉快!!
 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章