一、介绍
mysql日志记录是mysql重要组成部分如redolog和undolog是实现acid和mvcc是重要部分。八种日志是我们了数据库运行状态的各种信息,包括错误信息、查询信息、事务信息等等,是进行异常排查、性能优化、数据恢复和备份的关键基础。
二、介绍
这里注意是redo Log和Undo Log是innnodb的日志其他引擎不一定有哦。二其他的六种日志中只有Error Log日志是默认开启的其他五种日志都是默认关闭的。下面就带大家一起看看这些日志吧。
三、八种日志的作用
- Error Log(错误日志)
介绍:启动、运行或停止 mysqld时遇到的问题记录的日志。错误日志包含mysqld 启动和关闭次数的记录。它还包含诊断消息,例如服务器启动和关闭期间以及服务器运行期间发生的错误、警告和注释。例如,如果mysqld注意到需要自动检查或修复一个表,它会在错误日志中写入一条消息。
使用场景:在整个mysql启动或运行出问题时候查看找到原因。 - Binary Log(二进制日志)
**介绍:**这个是我们常说的binglog日志。二进制日志包含描述数据库更改的“事件”,例如表创建操作或表数据更改。它还包含可能已进行更改的语句的事件(例如, DELETE没有匹配行的语句),除非使用基于行的日志记录。二进制日志还包含有关每个语句花费更新数据多长时间的信息。
使用场景::做主从实现原理就是通过二进制日志,做数据恢复操作需要使用二进制日志。
注意::biglog有三种文件模式分别是1)STATMENT(默认):每一条会修改数据的sql语句会记录到binlog 2)ROW:记录修改的数据 3)MIXED:一般的复制使用STATEMENT模式保存binlog,对于STATEMENT模式无法复制的操作使用ROW模式保存binlog - Relay Log(中继日志)
介绍::主从复制过程中使用的一种日志类型,在从服务器上记录主服务器上所有的二进制日志(Binary log)的信息
使用场景::查看主从复制的情况。 - DDL Log
介绍:记录DDL操作的一种日志类型。 - General Log((查询日志))
介绍:当客户端连接或断开连接时,服务器将信息写入此日志,并记录从客户端收到的每个 SQL 语句。当您怀疑客户端有错误并想确切地知道客户端发送给mysqld的内容时,通用查询日志可能非常有用。
使用场景:当遇到一些事务或者有关sql执行情况问题时候可以开启查看。 - slow Query Log(慢查询日志)
**介绍:**慢速查询日志由执行时间超过 long_query_time几秒并且至少 min_examined_row_limit需要检查行的 SQL 语句组成。
**使用场景:**开启后排查系统执行时间太长的sql。默认是超过十秒的查询哦。 - Redo log
介绍:记录事务过程中的修改操作,以保证事务的安全性
使用场景:是mysql的acid和mvcc实现重要一环
注意:有三种刷盘策略innodb_flush_log_at_trx_commit,0-一秒刷新一次,1:提交事务刷新一次,2:事务提交后将数据刷入磁盘
8. Undo log
介绍:用于撤销与事务相关的修改操作,以保证事务的原子性。
使用场景:是mysql的acid和mvcc实现重要一环
四、使用查看八种日志方式
- Error Log(错误日志)
查看日志位置
# 查看error日志位置
show variables like 'log_error'
查看日志
tail -n 10 /var/log/mysqld.log
head -n 100 /var/log/mysqld.log
总结:可以看到error.log日志中有一些用户连接信息和启用信息和报错。
- Binary Log(二进制日志)
开启binglog日志
注意:需要在my.cnf配置并重启mysql
vi /mydata/mysql-master/conf/my.cnf
- my.cnf配置中增加配置
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=101
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能
log-bin=mall-mysql-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
- 从起mysql后查看binglog状态
其中注意binlog_format
为binglog的格式,log_bin
为是否开启binglog。
# 查看状态:show
show global variables like '%binlog%';
- 查看binglog的位置
# 查看位置:
show variables like '%log_bin%';
查看binlog
时间过滤 --start-datetime="Y-m-d H:i:s"和–stop-datetime=“Y-m-d H:i:s”
位置过滤 --start-positinotallow=the_position_integer和–stop-positinotallow=the_position_integer
数据库过滤 --database=the_database_name, 或者 -d the_database_name
偏移量 --offset=N, -o N
mysqlbinlog --start-position=10 /home/data/mysql/mall-mysql-bin.000261
- 我的binlog读取报错。
- Relay Log(中继日志)
注意:relayLog需要在主从服务器中的从服务器才会有
- 查看relayLog日志位置
show variables like '%relay_log%'
- 查看relayLog日志
mysqlbinlog --stop-position=1000 mall-mysql-relay-bin.000443
- DDL Log(貌似网上找不到)
- General Log(查询日志)
查看状态并开启(默认是关闭的)
# 查看查询日志情况
show variables like '%General_Log%';
开启日志
# 开启查询日志
set global general_log=on;
查看日志
tail -n 100 /home/data/mysql/tdengineone.log
总结:可以看到有增删查改的语句,在时间后面的是session号
6. slow Query Log(慢查询日志)
查看日志情况并开启
# 查看满查询日志情况
show variables like '%query_log%';
# 开启慢查询日志
set global slow_query_log='ON';
查看日志文件
head -n 100 /home/data/mysql/tdengineone-slow.log
总结:可以看到有用户查询信息还有查询语句和时间
- Redo log
介绍:是mysql实现acid种持久性的重要方式,在mysql突然宕机重启后mysql会在磁盘种加载redoLog把没有写入磁盘的数据恢复。
如图:
因为在进行了修改BufferPool中数据后,将修改记录写入内存中以页形式存储的redoLog中,所以衍生出了redoLog的刷盘策略如下
#查看刷盘策略
show variables like 'innodb_flush_log_at_trx_commit'
set global innodb_flush_log_at_trx_commit =1
- 设置为0的时候,表示每次事务提交时不进行刷盘操作
- 设置为1的时候,表示每次事务提交时都将进行刷盘操作(默认值)
- 设置为2的时候,表示每次事务提交时都只把redo log buffer内容写入page cache
每条redo记录由“表空间号+数据页号+偏移量+修改数据长度+具体修改的数据”
- Undo log
介绍:undoLog是实现acid中原子性,在事务发生错误时候会会对数据进行回滚
在数据页中会记录回滚的索引
五、参考文章
https://zhuanlan.zhihu.com/p/684441867 https://zhuanlan.zhihu.com/p/383824552 https://mysql.net.cn/doc/refman/8.0/en/server-logs.html