MySQL 日志机制
日志机制:
错误日志:
当数据库无法正常启动时 第一个定位错误日志
数据库速度慢时 也可以定位错误日志得到建议(如增大缓存池 增大redologbuffer等)
查询日志:
没啥用 就是记录查询而已 应该是为了对应binlog记录修改的日志
慢查询日志:
捕获查询慢的情况
配置:
-
可以设置每分钟最多有几个语句加入慢查询日志
-
使用
mysqldumpslow
工具 可以更好的排查慢查询日志 -
默认输出为File也可以输出成table格式(成为mysql下的slow log表)
MySQL 捕获方式
-
查询时间大于long_query_time的语句
-
未走索引的语句
InnoDB 捕获方式
- 逻辑读取次数 (包含所有的磁盘/缓冲池读取)
- 物理读取次数 (物理读取次数)
归档日志:bin log
也称为二进制日志 它记录了Mysql中数据的更改
作用:PIT恢复、主从复制、审计防止注入
建议:
- 为了保证数据库的高可用性 最好在该日志每次写的时候同步到磁盘
(对性能有影响)- 可以使用mysqlbinlog工具查看binlog
binlog 共有3种格式:
statement #binlog中记录SQL日志。
rows #rows格式记录每一个行的每一个字段的具体改动
mixed #默认记录sql, 由MySQL判断,可能会造成数据不一致的情况便会使用rows格式进行记录。
重做日志:redo log
作用:
保证ACID原则中的持久性原则 在事务提交时 先写入redo log 再写入真正的数据 (也就是WAL机制) 从而保证持久性
区别:
redo log 与 bin log:
bin log只在commit的时候写入 而redo log在事务过程中一直再写
(所以redo log可以解决ACID的持久性问题)- 另外 bin log 是MySQL支持的 redo log 是InnoDB存储引擎支持的
WAL:
MySQL为了提高数据库的性能 采用了
WAL机制
(Write-Ahead Logging)
即客户端在修改数据的过程后 并不会立马对硬盘中的数据进行更新
WAL机制意义就在于削峰
这也是我们在处理高并发场景下的一个解决思路WAL机制 主要的操作是先写日志 先在一个日志中记录了MySQL要对硬盘中的存储MySQL数据的数据页中的数据进行什么样的更改 等到Mysql空闲的时候再进行同步操作到硬盘中
写日志是顺序写 直接改磁盘是随机写 所以写日志要更快
WAL还可以通过cache合并多条写操作为一条数据 减少IO操作
回滚日志: undo log
作用:
事务的回滚 以及MVCC的支持
定义:
undo log是一个逻辑日志 用来回滚使用 MySQL的InnoDB存储引擎就是利用undo log实现MVCC(多版本并发控制)的
事务中 在做任何操作之前 都会先将数据备份到undo log中 再去修改数据 如果过程中发生错误 就会利用undo log进行回滚
可以这样理解undo log的记录内容:
事务中执行了一条delete 对应的在undo log中就记录一条insert
事务中执行了一条insert 对应的在undo log中就记录一条delete
如果记录的是一条update 对应的undo log中记录的就是一条相反的update