mysql数据库断电_MySQL 数据库忽然断电会丢数据吗转载

在上一章,我讲解了 MySQL 锁的相关内容。主要谈到了全局锁、表锁、行锁以及死锁等。通过这些学习,相信我们可以理解锁的原理,并在工作中降低锁冲突的概率。这也是优化数据库必须掌握的知识点。

从本节开始,将进入一个新的 MySQL 知识大类:MySQL 事务。

d264d47349c496e9f257b81ed337f740.png

什么是事务?

根据《高性能 MySQL》第 3 版 1.3 事务一节中定义:

事务就是一组原子性的 SQL 查询,或者说一个独立的工作单元。如果数据库引擎能够成功地对数据库应用该组查询的全部语句,那么就执行该组查询。如果其中有任何一条语句因为崩溃或其他原因无法执行,那么所有的语句都不会执行。也就是说,事务内的语句,要么全部执行成功,要么全部执行失败。

看上面的文字可以稍微抽象了一点,可以结合生活中的一个例子:

比如你给朋友转账 100 元,其大致过程是:从你的账户扣除 100 元,然后再到你朋友的账户中增加 100 元,试想,如果在这中间,因为网络问题或者程序问题,导致在你的账户中扣除了,但是没有在你朋友的账户中增加,那岂不是乱套了。

所以,类似这种情况,就可以把这两个步骤放到一个事务里面。要么全部成功,也就是从你的账户扣除之后,然后在你朋友账户中新增;要么全部失败,比如在中间出现问题,会回滚这中间所有的变更。大致操作步骤如下表:

01449fad60bf35d567c6e76d31e25dc2.png

一个良好的事务处理系统,必须具备 ACID 特性:

atomicity(原子性) :要么全执行,要么全都不执行;consistency(一致性):在事务开始和完成时,数据都必须保持一致状态;isolation(隔离性) :事务处理过程中的中间状态对外部是不可见的;durability(持久性) :事务完成之后,它对于数据的修改是永久性的。InnoDB 采用 redo log 机制来保证事务更新的一致性和持久性。什么是 redo log?下面来一起看下:

2 Redo log

Redo log 称为重做日志,用于记录事务操作变化,记录的是数据被修改之后的值。

Redo log 由两部分组成:

内存中的重做日志缓冲(redo log buffer)重做日志文件(redo log file)

a617bc5ea26de378c7ba104680f11389.png

每次数据更新会先更新 redo log buffer,然后根据 innodb_flush_log_at_trx_commit 来控制 redo log buffer 更新到 redo log file 的时机。innodb_flush_log_at_trx_commit 有三个值可选:

0:事务提交时,在事务提交时,每秒触发一次 redo log buffer 写磁盘操作,并调用操作系统 fsync 刷新 IO 缓存。

1:事务提交时,InnoDB 立即将缓存中的 redo 日志写到日志文件中,并调用操作系统 fsync 刷新 IO 缓存;

2:事务提交时,InnoDB 立即将缓存中的 redo 日志写到日志文件中,但不是马上调用 fsync 刷新 IO 缓存,而是每秒只做一次磁盘 IO 缓存刷新操作。

innodb_flush_log_at_trx_commit 参数的默认值是 1,也就是每个事务提交的时候都会从 log buffer 写更新记录到日志文件,而且会刷新磁盘缓存,这完全满足事务持久化的要求,是最安全的,但是这样会有比较大的性能损失。

b28445df86cb30419dce46fdf7935862.png

将参数设置为 0 时,如果数据库崩溃,最后 1秒钟的 redo log 可能会由于未及时写入磁盘文件而丢失,这种方式尽管效率最高,但是最不安全。

将参数设置为 2 时,如果数据库崩溃,由于已经执行了重做日志写入磁盘的操作,只是没有做磁盘 IO 刷新操作,因此,只要不发生操作系统崩溃,数据就不会丢失,这种方式是对性能和安全的一种折中处理。

3 Binlog

二进制日志(binlog)记录了所有的 DDL(数据定义语句)和 DML(数据操纵语句),但是不包括 select 和 show 这类操作。Binlog 有以下几个作用:

恢复:数据恢复时可以使用二进制日志。复制:通过传输二进制日志到从库,然后进行恢复,以实现主从同步。审计:可以通过二进制日志进行审计数据的变更操作。

2fce2b5bcd312285da19cfcabde341cb.png

可以通过参数 sync_binlog 来控制累积多少个事务后才将二进制日志 fsync 到磁盘。

sync_binlog=0,表示每次提交事务都只write,不fsync。sync_binlog=1,表示每次提交事务都会执行fsync。sync_binlog=N(N>1),表示每次提交事务都write,累积N个事务后才fsync。比如要加快写入数据的速度或者机器磁盘 IO 瓶颈时,可以将 sync_binlog 设置成大于 1 的值,但是如果设置为 N(N>1)时,如果数据库崩溃,可能会丢失最近 N 个事务的 binlog。

4 怎样确保数据库突然断电不丢数据?

通过上面的讲解,只要 innodb_flush_log_at_trx_commit 和 sync_binlog 都为 1(通常称为:双一),就能确保 MySQL 机器断电重启后,数据不丢失。

因此建议在比较重要的库,比如涉及到钱的库,设置为双一,而你的测试环境或者正式业务不那么重要的库(比如日志库)可以将 innodb_flush_log_at_trx_commit 设置为0,sync_binlog 设置成大于100 的数值,提高更新效率。

de306f027b7ce29bbd5f6e944cd6b434.png

5 总结

本节讲解了什么是事务?

所谓事务:是指一组原子性的 SQL 查询,事务里的 SQL 要么全部执行成功,要么全部执行失败。

一个良好的事务处理系统,必须具备 ACID 特性: atomicity(原子性)、consistency(一致性)、 isolation(隔离性)、 durability(持久性)。

另外讲解了 Redo log 和 Binlog:

Redo log:称为重做日志,用于记录事务操作变化,记录的是数据被修改之后的值。

Binlog:记录了所有变更操作,其作用有:恢复、复制、审计等。

如果想要数据库达到最安全的状态,可以将 innodb_flush_log_at_trx_commit 和 sync_binlog 都设置为 1。

6 问题

你工作中有遇到过丢数据的场景吗?是什么原因导致的呢?下一章我们统一作答。希望大家可以踊跃评论。谢谢大家的支持。

本文百家号首发 王者小哆啦原创 欢迎大家关注,收藏。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/268909.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用云安监控和管理云

云工程师有责任支持组织跨多个云的持续集成、交付、部署系统和管道的持续开发和维护。 一旦工作需要云迁移,他们需要为各种关键业务服务或应用程序提供和协调对云基础设施和云服务的支持。 他们还需要密切关注可能遇到资源限制的系统或不再使用的系统。 用户对云…

Wi-Fi Expert专业无线网测试软件

量化网络在个体用户上体验一直是很困难的工作,而测量无线网络性能的挑战性则更高。因为WLAN环境确实非常复杂,因此真的没有任何一个工具可以一次性测量无线性能的各个方面 通常,网络支持人员能够采用的方法是使用大量的工具尽可能详尽地描绘…

This dependency was not found: * !!vue-style-loader!css-loader?……解决方案

Webstorm2017.1.4 new里找不到vue文件的处理方法 这一篇中说到加的模板是这样的。 但是当你新建一个vue项目时,需要重新安装stylus,否则报错: This dependency was not found: * !!vue-style-loader!css-loader?{"minimize":false…

Windows Server 2008 磐石风暴系列课程

转自电驴下载页面:[url]http://www.verycd.com/topics/251739/[/url]中文名称:Windows Server 2008 磐石风暴系列课程资源类型:ISO发行时间:2007年地区:***语言:普通话简介:*******************…

关于SimpleDateFormat时间转换总是显示1970年的问题

前端传一个时间戳,后端解析的时候 就是这么简单的几句代码。这个值输出的值居然是1970,应该是20081104, 但是为什么返回的是1970了 后面想想发现是时间戳不对 postman请求 修改后的代码 queryBarnSwallowDto.getGraduateDate()替换成自己的…

xul 创建一个按钮

MDN Mozilla 产品与私有技术 Mozilla 私有技术 XUL Toolbars 添加工具栏按钮 (定制工具栏)添加工具栏按钮 (定制工具栏) 在本文章中创建一个 overlay在工具栏添加按钮为按键应用风格图标大小CSS 样式表应用样式表常见错误常见工具栏的 overlayed windows更多信息此文…

MySQL预读失效_华为云MySQL新增“逻辑预读”特性,轻松解决线性预读失效问题...

随着用户对数据访问速度的日益重视,MySQL数据库在最初的设计中,采用了线性预读的方式,提前将即将使用的数据预读到Buffer pool中,来提升数据的访问速度,但在实际使用过程中,线性预读失效的问题愈来愈突出。对于存在时间比较长,变更又比较频繁,除非我们对于这张表进行重建,否则该…

Mac下的Parallel Windows忘记密码怎么办?

由于工作或是生活,在国内的环境下我们总有些时候要用到Windows才能完成某些任务,对于不经常使用Windows的用户,相信在虚拟机上安装一个Windows是不错的选择。小编就使用了Paralles Desktop安装了 Win 7 系统。但是在使用过程中由于不知道是Wi…

Unity shader学习之Grab Pass实现玻璃效果

GrabPass可将当前屏幕的图像绘制在一张纹理中,可用来实现玻璃效果。 转载请注明出处:http://www.cnblogs.com/jietian331/p/7201324.html shader如下: // Upgrade NOTE: replaced mul(UNITY_MATRIX_MVP,*) with UnityObjectToClipPos(*)Shade…

ef core mysql 生成迁移失败_EFCore + MySql codeFirst 迁移 Migration出现的问题

第二次使用Migration update-database的时候出现以下错误:System.NotImplementedException: The method or operation is not implemented. at Microsoft.EntityFrameworkCore.Migrations.MigrationsSqlGenerator.Generate(RenameColumnOperation operation, IModel…

Rsync:一个很实用的文件同步命令

rsync是Linux系统下的文件同步和数据传输工具,可用于同步文件、代码发布 1.安装. yum insatll -y rsync 2.配置 打开rsync功能vim /etc/xinetd.d/rsync service rsync {disable no #把yes改成noflags IPv6socket_type streamwait n…

spring整合dubbo和springboot整合dubbo,实现服务暴露区别

spring整合dubbo的时候实现服务暴露是这么做的,在xml里配置 那么springboot整合dubbo的时候,是通过dubbo的Service 注解实现的 之前我们是通过Autowired注入一个接口 现在我们通过Reference注解引用接口

mysql 查询超过60分钟的_mysql基础级《简单查询》60分钟搞定

初学者,推荐大家使用----emp(雇员信息表)和dept(部门表),这两张表的字段及数据内容都设计的比较经典。来吧!先跟着我的操作,导入我提供的数据库脚本。导入两张表sql脚本到数据库create database testdb;use testdb;drop table if …

数据结构1-树及常用算法

(一)将数据库存储结构转化为内存树型结构算法 树节点定义public class TNode {public string id { get; set; }public string pid { get; set; }public string name { get; set; }public string flag { get; set; } }树定义public class Tree {TNode nod…

Error(6,35)java: 程序包 不存在,解决办法

spring boot项目,运行就提示找不到程序包,执行了maven clean install,maven依赖没有标红,但启动就报错 解决办法 检查maven依赖是否成功导入 根据报错信息,检查本地仓库是否有jar,有些jar包不会自动导入&a…

再学 GDI+[91]: TGPImage(11) - 转灰度图像

本例效果图:代码文件:unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;typeTForm1 class(TForm)CheckBox1: TCheckBox;procedure FormCreate(Sender: TObject);procedure FormPaint(Sender: TObject);…

GUI阅读字号和触点面积设计 (可用性设计)

今天在博客园开启第一篇,附上我多年工作的研究总结以表诚意。 此文已收入UXPA大会文集,出版于四川大学出版社。 《GUI阅读字号和触点面积设计》 --可用性设计理论研究与实践案例 作者刘玲 前华为UCD中心交付经理 277169188qq.com 摘要: 本文演绎论证了当…