1.表类型为disc_copies和disc_only_copies的操作会记录到latest.log中
disc_copies类型的表在事务提交后,数据并不会直接落地,而是先写入latest.log中
disc_only_copies则直接写进dets落地,同时也会写入latest.log
2.dump操作会将latest.log的数据转存并落地
- disc_copies类型会转存到.DCD和.DCL文件(通过disk_log.erl实现)
- 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)</