mnesia存储过程(dump)

本文介绍了Mnesia数据库的dump操作,涉及disc_copies和disc_only_copies表类型的数据处理。dump会将latest.log的数据转存到.DCD和.DCL文件中,主要在手动执行、定时触发和达到特定执行次数时触发。尽管通过disk_log实现,但存在丢数据风险。
摘要由CSDN通过智能技术生成

1.表类型为disc_copies和disc_only_copies的操作会记录到latest.log中

disc_copies类型的表在事务提交后,数据并不会直接落地,而是先写入latest.log中
disc_only_copies则直接写进dets落地,同时也会写入latest.log

2.dump操作会将latest.log的数据转存并落地

  1. disc_copies类型会转存到.DCD和.DCL文件(通过disk_log.erl实现)
  2. ram_copies和disc_only_copies类型不在dump中处理

3.dump的触发时机

1. 手动执行mnesia:dump_log/0

2. 通过mnesia_controller定时触发dump

mnesia_controller.erl

init([Parent]) ->
    process_flag(trap_exit, true),
    ...
    %% 发起定时器
    Ref = next_async_dump_log(),
    ...
    Empty = gb_trees:empty(),
    {
   ok, #state{
   supervisor = Parent, dump_log_timer_ref = Ref,
		loader_queue = Empty,
		late_loader_queue = Empty}}.
		
next_async_dump_log() ->
    %% 时间间隔为dump_log_time_threshold, 默认为3分钟
    Interval = mnesia_monitor:get_env(dump_log_time_threshold),
    Msg = {
   next_async_dump_log, time_threshold},
    %% 向自身发消息
    Ref = erlang:send_after(Interval, self(), Msg),
    Ref.

%% 默认为3分钟
default_env(dump_log_time_threshold) ->
    timer:minutes(3);
    
%% 收到dump消息的处理
handle_info({
   next_async_dump_log, InitBy}, State) ->
    async_dump_log(InitBy),
    Ref = next_async_dump_log(),
    noreply(State#state{
   dump_log_timer_ref=Ref});

3. 执行mnesia_log:log/1时,累计执行次数等于dump_log_write_threshold时,触发dump

mnesia_dumper.erl

incr_log_writes() ->
    Left = mnesia_lib:incr_counter(trans_log_writes_left, -1)</
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值