我没想到mysql会问这些问题...
不久前,我的大哥问我,“你知道如何保证mysql的原子性吗?”。我很困惑。mysql如何保证原子性?我不会的。
每个人都知道事务中原子性的含义:“一个事务包含多个操作,这些操作要么全部执行,要么不执行。”
所以我大哥告诉我,“使用撤销日志”。
我:“躺在水槽里是知识的盲点。”
后来,我在网上翻了翻。mysql中有几种常见的日志,它们是:
撤消日志
binlog
重做日志
如果你没有注意这些日志,请在评论区给我留言,这样我就不会认为我是唯一一个上这道菜的人了,好吗?
后来,我又搜索了一遍。事实上,这些日志在采访中经常被问到。简单地说,我希望这篇文章能对大家有所帮助。
首先,什么是binlogbinlog实际上在日常开发中经常听到,因为数据更新通常依赖于binlog。
举一个非常简单的例子:我们的数据存储在数据库中,但是现在我们已经更改了某个商品的某个字段的内容(数据库更改),用户检索的数据通过搜索引擎。为了让用户搜索最新数据,我们需要更改引擎数据。
底线:如果数据库改变了,搜索引擎的数据也需要改变。
因此,我们将监控binlog的变化。如果binlog已经更改,我们需要将更改写入相应的数据源。
什么是binlog?
binlog记录数据库表结构和表数据的变化,如更新/删除/插入/截断/创建。它不记录选择(因为它不改变表格)
宾格长什么样?
binlog可以简单地理解为:存储每一个变化的sql语句(当然,从下图来看,不仅是sql,还有xid的“事务标识”,等等)。(
binlog通常做什么
有两个主要功能:复制和恢复数据
当公司使用mysql时,它通常是一个主从结构,从服务器需要与主服务器的数据保持一致,这是由binlog实现的
数据库中的数据已经被删华阳除,我们可以通过binlog恢复数据。
因为binlog记录了数据库表的变化,所以我们可以使用binlog来复制(主从副本)和恢复数据。
第二,什么是重做日志假设我们有一个sql语句:
更新用户_表集名称= & # 39;java3y & # 39其中id = & # 393 & # 39;
当mysql执行这个sql语句时,它必须首先找到id=3的记录,然后更改名称字段。可以吗?
系统的黑科技网吧txt下载
事实上,mysql的基本存储结构是页面(记录存储在页面中),所以mysql首先找到该记录所在的页面,然后将该页面加载到内存中并修改相应的记录。
现在可能有一个问题:如果内存中的数据发生了变化,而数据库此时被挂起了,该怎么办?显然,这种变化已经消失了。
如果每个请求都需要立即将数据放入磁盘,速度会很慢,mysql可能无法支持。那么mysql是如何做到的呢?
mysql引入了重做日志,当内存用完时,会写一个重做日志,记录这次在某个页面上做了什么改变。
实际上,在写入重做日志时,还会有缓冲区,它首先被写入,然后实际上落入磁盘。至于何时从缓冲区中删除磁盘,将有一个配置供我们配置。
写重做日志也需要写磁盘,但它的优势是顺序输入输出(我们都知道顺序输入输出比随机输入输出快得多)。
因此,重做日志的存在是因为:当我们修改它时,我们完成了对内存的写入,但数据并没有真正写入磁盘。此时,我们的数据库已经死了,我们可以根据重做日志恢复数据。由于重做日志是顺序io,写入速度非常快,而且重做日志记录物理变化(xxxx页被xxx修改),因此文件大小非常小,恢复速度非常快。
文章来自网络,请联系删除侵权
请添加微信获取更多资源:学姐077
文章来源:www.atolchina.com