mysql日志总结
一、binlog日志
什么是binlog?
binlog是用于记录数据库表结构和表数据变更的二进制日志,比如insert、update、delete、create、truncate等等操作,不会记录select、show操作,因为没有对数据本身发生变更。
使用命令show variables like ‘%log_bin%’;查看binlog是否打开。
执行SHOW MASTER STATUS;可以查看当前写入的binlog文件名。(没有开启就不存在)
开启binlog,找到my.cnf配置文件,增加下面的配置(mysql版本5.7.31):
# 打开binlog
log-bin=mysql-bin
# 选择ROW(行)模式
binlog-format=ROW
binlog是用来干什么的?
第一,用于主从复制。一般在公司中做一主二从的结构时,就需要master节点打开binlog日志,从机订阅binlog日志信息,因为binlog日志记录了数据库数据的更改,所以当master发生数据变更时,从机也能随着master节点的数据变更而变更,做到主从复制的效果。
第二,用于数据恢复。因为binlog记录了数据库的变更,所以可以用于数据恢复。我们看到上面图中有个字段叫Position和–stop–positiion,或者指定–star-datetime和–stop-datetime,那就可以恢复指定区间的数据。
二、redo log
假设有一条update语句:
UPDATE 'user' SET 'name'='吴彦祖' WHERE 'id'='1';
我们想象一下mysql修改数据的步骤,先把id='1’的数据查出来,然后将名称修改成‘吴彦祖’。再深层一点就是,mysql是使用页作为存储结构,所以Mysql会先把这条记录所在的页加载到内存中,然后对记录进行修改。但是我们都知道mysql持久化,最终数据都要存储在磁盘中。假设需要修改的数据加载到内存中,并且修改成功了,但是还没有来得及刷新到磁盘中,这时数据库宕机了,那么这次修改成功后的数据就丢失了。
为了避免出现这种问题,mysql引入了redo log。
如图所示,当执行数据变更操作时,首先把数据也加载到内存中,然后在内存中进行更新,更新完成后写入到redo log buffer中,然后由redo log buffer在写入到redo log file中。
redo log file记录着xxx页做了xxx修改,所以即使mysql发生宕机,也可以通过redo log进行数据恢复,也就是说在内存中更新成功后,即使没有刷新到磁盘中,但也不会因为宕机而导致数据丢失。
redo log与事务机制是如何配合工作的?
如图所示:
第1-3步骤就是把数据变更,然后写入到内存中。
第4步记录到redo log中,然后把记录置为prepare(准备)状态。
第5,6步提交事务,提交事务之后,第7步把记录状态改成commit(提交)状态。
保证了事务与redo log的一致性。
binlog和redolog都可以恢复数据,有什么区别?
redolog是恢复在内存更新后,还没有来得及刷新到磁盘的数据。
binlog是存储所有数据变更的情况,理论上只要记录在binlog上的数据,都可以恢复。
举个例子,假如不小心整个数据库的数据被删除了,能使用redo log文件恢复数据吗?
不可以使用redo log文件恢复,只能使用binlog文件恢复。因为redo log文件不会存储历史所有的数据的变更,当内存数据刷新到磁盘中,redo log的数据就失效了,也就是redo log文件内容是会被覆盖的。
binlog又是在什么时候记录的呢?
回答:在提交的时候。
三、undo log
undo log的作用主要用于回滚,mysql数据库的事务的原子性就是通过undo log实现的。我们都知道原子性是指对数据库的一系列操作,要么全部成功,要么全部失败。
undo log主要存储的是数据的逻辑变化日志,比如说我们要insert一条数据,那么undo log就会生成一条对应的delete日志。简单点说,undo log记录的是数据修改之前的数据,因为需要支持回滚。
那么当需要回滚时,只需要利用undo log的日志就可以恢复到修改前的数据。
undo log另一个作用是实现多版本控制(MVCC),undo记录中包含了记录更改前的镜像,如果更改数据的事务未提交,对于隔离级别大于等于read commit的事务而言,不应该返回更改后数据,而应该返回老版本的数据。
show query log
慢查询日志用于记录在mysql执行过程超过指定时间的查询语句,出于性能考虑,一般只有在排查慢查询、调试参数时候才会开启,默认情况下时关闭,默认时间是10s。
general query log
一般查询日志用来记录用户的所有操作,包括客户端何时连接服务器、客户端发送的所有sql以及其他等事情。出于性能考虑,该日志功能默认也是关闭的。
error log
错误日志记录mysql服务每次启动和停止的时间以及诊断和出错信息,默认开启,可通过show variables like ‘log_error’ 查找存放路径。
不要把错误日志狭隘的认为只有错误日志,其中还包括如何启动INNODB的表空间文件、如何初始化自己的存储引擎、初始化缓存池等信息。