1、数据库 ”动起来“之后,会发生什么?
1、产生日志数据
数据库在更新时候,会产生binlog、redo log、undo log
binlog : server 层产生的逻辑日志
redo log : InnoDB 产生的物理日志,保证持计划 【innoDB 独有】
undo log : InnoDB 产生的逻辑日志、保证隔离性、原子性 【innoDB 独有】
2、客户端之间因为锁而相互影响
1、客户端执行 SQL 时候,会产生各种行锁,表锁,元数据锁
2、一个客户端产生的锁,会干扰其他客户端 SQL 的执行
3、两个客户端之间可能产生死锁
3、事务造成查询的数据与磁盘上的不一致
1、客户端可能暂时看不到已经更新的数据
2、事务可能产生隐式锁,造成性能问题
2、MySQL 日志体系
1、MySQL 为了满足主从复制,事务等,有复杂的日志体系。
2、Server 产生binlog,用来进行数据复制
3、InnoDB 产生的 undo log 、redo log,用来实现事务的 ACID
4、MySQL 的日志体系主要不是用来看的,而是运行必要的
1、binlog 归档日志
1、Binlog 是 server 层产生的逻辑日志
2、用来进行数据复制和数据传送
3、Binlog 完整记录数据库每次的数据操作,可以作为闪回手段
4、Binlog 记录在专门的文件中
代码
show binary logs ;
查看其中具体的
mysql> show binlog events in 'mysql-bin.000003' \G;
通过二进制日志文件的内容可以看出对数据库操作的记录,给管理员对数据库进行管理和数据恢复提供了依据。
2、undo log 回滚日志
1、InnoDB 自身产生的逻辑日志,用于事务的回滚和展示就版本
2、对任何数据(缓存)的更新,都先写 undo log
3、redo log 重做日志
1、InnoDB 自身产生的物理日志,记录数据页的变化
2、InnoDB ”日志优先于数据“,记录 redo log 视为数据已经更新
3、内存中的数据更新后写 redo log, 数据被写入硬盘后删除
4、只要 redo log 不丢,数据就不会丢失
3、数据的更新流程
1、查询数据,从数据页读入一条或者多条数据到内存。
2、在内存中修改数据,然后写 undo log 日志
3、更新内存中的数据页【这个时候如果有读取这条数据的,直接取出这条数据】
4、redo log 写入内存 (prepare)
5、这个时候客户端,继续 update , 重新执行 1 ~ 4
6、如果客户端,rollback ,这个时候取出 undo log 执行
7、如果客户端,commit,binlog 写入内存,然后提交事务。
redo log 刷盘
innodb_flush_log_at_trx_commit 参数控制 redo log 刷盘
1、0 :异步每秒刷盘
2、1 : 每 1 个事务刷盘
3、0 :每 N 个事务刷盘
建议设置为 1, 保证数据安全。
binlog 刷盘
sync_binlog 参数控制 binlog 刷盘
1、0 :异步每秒刷盘
2、1 : 每 1 个事务刷盘
3、0 :每 N 个事务刷盘
建议设置为 1, 保证数据安全。
标签:binlog,MKZS515,log,数据,并发,Mysql,日志,redo,刷盘 From: https://www.cnblogs.com/dogHuang/p/16833304.html