mysql 日志,首先记住一个mysql原则 : 日志先行。
下文总结:html
MySQL有两层,一层是Server层,一层是存储引擎层。
1.binary log 和 relay log。 它Server层的日志。
2.redo log 和 undo log。 它是InnoDB引擎特有的日志mysql
binlog的一主一从复制,基本过程:算法
在 Master 与 Slave 之间实现整个主从复制的过程是由三个线程参与完成的。其中有两个线程(SQL 线程和 IO 线程)在 Slave 端,另一个线程(IO 线程)在 Master 端。sql
参看文章:http://www.javashuo.com/article/p-xlecglii-ey.html数据库
crash-safe 概念
slave crash-unsafe 的缘由在于应用 binlog 和更新文件的非原子性。
也就是上文的第e步骤会有问题。segmentfault
开始解释:
IO thread 的执行状态信息保存在 master.info 文件, SQL thread 的执行状态信息保存在 relay-log.info 文件。缓存
下面出现这样一个场景:
SQL thread 已经应用 relay-log.01 的4个事务安全
trx1(pos:10)
trx2(pos:20)
trx3(pos:30)
trx4(pos:40) 服务器
可是 SQL thread 更新位点 (relay-log.01,30) 到 relay-log.info 文件中,忽然系统崩溃了。slave 实例重启的时候 sql thread 会重复执行事务 trx4。这就是典型的crash-unsafe了。并发
crash-safe 的原理:
crash-safe 状况下 SQL_thread 的工做模式 SQL thread 执行事务和更新 mysql.slave_replay_log_info 的语句合并为同一个事务,由 MySQL 系统来保障事务的原子性。
绿色的表明实际业务的事务,蓝色的是开启 MySQL 执行的更新slave_replay_log_info 相关位点信息的 sql ,而后将这两个 sql 合并在一个事务中执行,利用 MySQL 事务机制和 InnoDB 表保障原子性。不会出现应用 binlog 和更新位点信息两个动做割裂致使不一致的问题。
buffer pool 概念 -- innodb存储引擎带的一个缓存池
用户对数据库的最基本要求就是能高效的读取和存储数据,可是读写数据都涉及到与低速的设备交互,为了弥补二者之间的速度差别,全部数据库都有缓存池,用来管理相应的数据页,提升数据库的效率,固然也因 为引入了这一中间层,数据库对内存的管理变得相对比较复杂。 ---buffer pool是innodb存储引擎带的一个缓存池,查询数据的时候,它首先会从内存中查询,若是内存中存在的话,直接返回,从而提升查询响应时间。(功能) ---修改更新等操做会改变buffer pool的一些数据,经过LRU算法更新,将buffer pool的命中率维持在一个比较高的水平。 (内存管理) ---是怎么将buffer pool中的数据同步到磁盘。想一想若是更新一次buffer pool就写一次磁盘,那这样子的效率和直接读写磁盘并无提升多少,这里就须要设计出同步策略来解决这个问题。(redo.log,undo.log) ---引入buffer pool会致使更新的数据不会实时地将数据持久化到硬盘,当系统崩溃时,虽然buffer pool中的数据丢失,数据没有持久化。可是系统能够根据redo log的内容,将全部数据恢复到最新的状态。 ---修改buffer pool的数据后,同时还要将此操做记录在事务日志中去,保证事物安全的。事务日志文件是InnoDB引擎申请连续物理空间的固定大小的一个文件,对日志文件的读写基本上是顺序读写,寻址操做甚少。(redo.log顺序读写,减小寻址操做) ---Myisam引擎有Key Cache:只缓存索引文件,数据文件的缓存交由操做系统自己来完成。而buffer pool存放各类数据的缓存,包括索引页和数据页。
参看文章:https://www.cnblogs.com/iamsu...
redo log
介绍:由于最开始MySQL里并无InnoDB引擎。MySQL自带的引擎是MyISAM,可是MyISAM没有crash-safe的能力,binlog日志只能用于归档。 而InnoDB是另外一个公司以插件形式引入MySQL的,既然只依靠binlog是没有crash-safe能力的,因此InnoDB使用另一套日志系统——也就是redo log来实现crash-safe能力。
redo log是固定大小的,好比能够配置为一组4个文件,每一个文件的大小是1GB,那么总共就能够记录4GB的操做。从头开始写,写到末尾就又回到开头循环写。因此redo log 不想binlog同样会有归档功能。
将redo log的写入拆成了两个步骤:prepare和commit,这就是"两阶段提交"。 两阶段提交主要解决 binlog 和 InnoDB redo log 的数据一致性的问题.
以下图:
undo log
Undo Log 是为了实现事务的原子性,在MySQL数据库InnoDB存储引擎中,还用Undo Log来实现多版本并发控制(简称:MVCC)。