热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

mnesia之dump

2019独角兽企业重金招聘Python工程师标准在《mnesia之transaction》里提到事务操作的数据及最终结果都会记录到latest.log文件中。注意只有涉及类型

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

在《mnesia之transaction》里提到事务操作的数据及最终结果都会记录到latest.log文件中。注意只有涉及类型为disc_copies和disc_only_copies的表的操作才会记录日志到latest.log文件中,仅针对ram_copies类型的表的操作不会记录日志。

log(C) when C#commit.disc_copies == [],C#commit.disc_only_copies == [],C#commit.schema_ops == [] ->ignore;

为了防止日志文件不断增长从而导致占用大量的磁盘空间,mnesia会进行dump工作。所谓dump就是分析日志文件中记录的事务操作及最终结果,将实际的数据记录到*.DAT,*.DCL,*.DCD等文件中。

说明:mnesia数据存储实际上使用的是ets和dets,对于ram_copies类型的表使用ets;disc_copies类型的表使用也是ets,通过mnesia的dump将数据保存到后缀名为DCD(disc copy data)或者后缀名为DCL(disc copy log)的文件中,以做到数据的持久化;而disc_only_copies类型的表使用的是dets,保存的文件后缀名为DAT;schema表比较特殊,虽然使用的是dets表,但是同时会在内存中保存相关信息。

有几种情况会触发mnesia的dump:

(1)定时触发

mnesia启动后,由mnesia_controller进程设置定时器,触发dump

代码片段:

init([Parent]) ->process_flag(trap_exit, true),mnesia_lib:verbose("~p starting: ~p~n", [?SERVER_NAME, self()]),All = mnesia_lib:all_nodes(),Diff = All -- [node() | val(original_nodes)],mnesia_lib:unset(original_nodes),mnesia_recover:connect_nodes(Diff),Ref = next_async_dump_log(),mnesia_dumper:start_regulator(),Empty = gb_trees:empty(),{ok, #state{supervisor = Parent,dump_log_timer_ref = Ref,loader_queue = Empty,late_loader_queue = Empty}}.next_async_dump_log() ->Interval = mnesia_monitor:get_env(dump_log_time_threshold),Msg = {next_async_dump_log, time_threshold},Ref = erlang:send_after(Interval, self(), Msg),Ref.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});

定时dump的默认的时间间隔为3分钟

default_env(dump_log_time_threshold) ->timer:minutes(3); 可以在程序启动是增加参数 -mnesia dump_log_time_threshold 300000 来设置时间间隔。

(2)一定数量的日志记录后触发

每次调用mnesia_log:log(C)或者mnesia_log:slog(C)进行日志记录时,都会将trans_log_writes_left的值减1,当该值小于等于0时,触发dump

mnesia_log:
log(C) ->case mnesia_monitor:use_dir() oftrue ->...mnesia_dumper:incr_log_writes();false ->ignoreend.mnesia_dumper:
incr_log_writes() ->Left = mnesia_lib:incr_counter(trans_log_writes_left, -1),ifLeft > 0 ->ignore;true ->adjust_log_writes(true)end.adjust_log_writes(DoCast) ->...case DoCast offalse ->ignore;true ->mnesia_controller:async_dump_log(write_threshold)end,...
默认情况下,写入100条记录到latest文件中,便会触发dump

mnesia_monitor:
init(Parent) ->...Left = get_env(dump_log_write_threshold),mnesia_lib:set_counter(trans_log_writes_left, Left),...

同样可以通过在程序启动是增加参数 -mnesia dump_log_write_threshold 5000 进行设置。

dump操作会做如下几个事情:

(1) dump latest.log文件

将latest.log文件改名为previous.log,然后新建latest.log文件,然后分析previous.log文件中的内容,对于存储类型为disc_copies的表(非schema),检查DCL与DCD文件中的数据量,当sizeof(DCD)/sizeof(DCL)小于指定的阈值时,把表中的内容全部存储到DCD文件中,否则直接写到DCL文件中。默认的阈值大小为4,可以通过-mnesia dc_dump_limit Num进行设置。对于存储类型为disc_only_copies的表不做任何处理。

open_disc_copies(Tab, InitBy) ->DclF &#61; mnesia_lib:tab2dcl(Tab),DumpEts &#61;case file:read_file_info(DclF) of{error, enoent} ->false;{ok, DclInfo} ->DcdF &#61; mnesia_lib:tab2dcd(Tab),case file:read_file_info(DcdF) of{error, Reason} ->mnesia_lib:dbg_out("File ~p info_error ~p ~n",[DcdF, Reason]),true;{ok, DcdInfo} ->Mul &#61; case ?catch_val(dc_dump_limit) of{&#39;EXIT&#39;, _} -> ?DumpToEtsMultiplier;Val -> Valend,DcdInfo#file_info.size &#61;<(DclInfo#file_info.size * Mul)endend,ifDumpEts &#61;&#61; false; InitBy &#61;&#61; startup ->mnesia_log:open_log({?MODULE,Tab},mnesia_log:dcl_log_header(),DclF,mnesia_lib:exists(DclF),mnesia_monitor:get_env(auto_repair),read_write),put({?MODULE, Tab}, {opened_dumper, dcl}),true;true ->mnesia_log:ets2dcd(Tab),put({?MODULE, Tab}, already_dumped),falseend.

&#xff08;2&#xff09;dump mnesia_decision表

将当前mnesia_decision表中的数据以覆盖形式存储到decision_tab.log文件中

&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;

另外&#xff0c;mnesia启动和执行schema transaction时都会触发dump&#xff0c;schema transaction触发的dump会忽略日志文件中的内容&#xff0c;也不会对mnesia_decision表进行dump&#xff0c;仅针对本次操作涉及的内容进行dump&#xff0c;并且schema transaction触发的dump不会和其他情况触发的dump并行执行。

prepare_commit时锁住&#xff1a;

mnesia_schema:prepare_commit(Tid, Commit, WaitFor) ->...case Ops of[] ->ignore;_ ->%% We need to grab a dumper lock here, the log may not%% be dumped by others, during the schema commit phase.mnesia_controller:wait_for_schema_commit_lock()end... do_commit时进行dump&#xff0c;然后释放锁

mnesia_tm:do_commit(Tid, C, DumperMode) ->mnesia_dumper:update(Tid, C#commit.schema_ops, DumperMode),...mnesia_dumper:update(Tid, SchemaOps, DumperMode) ->UseDir &#61; mnesia_monitor:use_dir(),Res &#61; perform_update(Tid, SchemaOps, DumperMode, UseDir),mnesia_controller:release_schema_commit_lock(),Res.




转:https://my.oschina.net/hncscwc/blog/161763



推荐阅读
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 解决VS写C#项目导入MySQL数据源报错“You have a usable connection already”问题的正确方法
    本文介绍了在VS写C#项目导入MySQL数据源时出现报错“You have a usable connection already”的问题,并给出了正确的解决方法。详细描述了问题的出现情况和报错信息,并提供了解决该问题的步骤和注意事项。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • 如何使用Python从工程图图像中提取底部的方法?
    本文介绍了使用Python从工程图图像中提取底部的方法。首先将输入图片转换为灰度图像,并进行高斯模糊和阈值处理。然后通过填充潜在的轮廓以及使用轮廓逼近和矩形核进行过滤,去除非矩形轮廓。最后通过查找轮廓并使用轮廓近似、宽高比和轮廓区域进行过滤,隔离所需的底部轮廓,并使用Numpy切片提取底部模板部分。 ... [详细]
  • AFNetwork框架(零)使用NSURLSession进行网络请求
    本文介绍了AFNetwork框架中使用NSURLSession进行网络请求的方法,包括NSURLSession的配置、请求的创建和执行等步骤。同时还介绍了NSURLSessionDelegate和NSURLSessionConfiguration的相关内容。通过本文可以了解到AFNetwork框架中使用NSURLSession进行网络请求的基本流程和注意事项。 ... [详细]
  • SpringBoot简单日志配置
     在生产环境中,只打印error级别的错误,在测试环境中,可以调成debugapplication.properties文件##默认使用logbacklogging.level.r ... [详细]
  • 本文讨论了在ASP中创建RazorFunctions.cshtml文件时出现的问题,即ASP.global_asax不存在于命名空间ASP中。文章提供了解决该问题的代码示例,并详细解释了代码中涉及的关键概念,如HttpContext、Request和RouteData等。通过阅读本文,读者可以了解如何解决该问题并理解相关的ASP概念。 ... [详细]
  • 【重识云原生】第四章云网络4.8.3.2节——Open vSwitch工作原理详解
    2OpenvSwitch架构2.1OVS整体架构ovs-vswitchd:守护程序,实现交换功能,和Linux内核兼容模块一起,实现基于流的交换flow-basedswitchin ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • 本文详细介绍了使用C#实现Word模版打印的方案。包括添加COM引用、新建Word操作类、开启Word进程、加载模版文件等步骤。通过该方案可以实现C#对Word文档的打印功能。 ... [详细]
  • 本文提供了关于数据库设计的建议和注意事项,包括字段类型选择、命名规则、日期的加入、索引的使用、主键的选择、NULL处理、网络带宽消耗的减少、事务粒度的控制等方面的建议。同时还介绍了使用Window Functions进行数据处理的方法。通过遵循这些建议,可以提高数据库的性能和可维护性。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有