函数原型:mnesia:deactivate_checkpoint(Name) -> ok | {error, Reason}
这里有一点问题需要注意。检查点就算没有调用mnesia:deactivate_checkpoint/1 ,它也可能被停用。关于这个内容,这个功能,erlang的解释如下:
The checkpoint is automatically deactivated when some of the tables involved have no retainer attached to them. This may happen when nodes go down or when a replica is deleted.
大致意思是,当涉及到的任意一个表没有连接保持器(retainer)时,检查点会自动停用。节点挂了或者数据副本被删除也可能会导致检查点停用。
下面是一个手动备份的过程:
4> {ok, Name, _} = mnesia:activate_checkpoint( [ { max, [tb_message] } ] ).
{ok,{{1387,505130,66000},nonode@nohost},[nonode@nohost]}
5> mnesia:backup_checkpoint( Name, "d:/backup.log", [] ).
ok
6> 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. The fallback will be used to restore the database at the next start-up. Installation of fallbacks requires Erlang to be up and running on all the involved nodes, but it does not matter if Mnesia is running or not. The installation of the fallback will fail if the local node 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 has been used to restore the database. This is normally a distributed operation that is either performed on all nodes with disc resident schema or none. Uninstallation of fallbacks requires Erlang to be up and running on all involved nodes, but it does not matter if Mnesia is running or not. Which nodes that are considered as disc-resident nodes is determined from the schema info in the local fallback.
大概意思就是卸载回滚这个功