【MySQL高级篇笔记-其他数据库日志(下) 】

此笔记为尚硅谷MySQL高级篇部分内容

目录

一、MySQL支持的日志

1、日志类型

2、日志的弊端

二、慢查询日志(slow query log)

三、通用查询日志(general query log)

1、问题场景 

2、查看当前状态

3、启动日志

方式 1 :永久性方式

方式2:临时性方式 

4、查看日志

5、停止日志

方式1:永久性方式 

方式2:临时性方式

6、 删除\刷新日志

四、错误日志(error log)

1、启动日志

2、查看日志

3、删除\刷新日志

五、二进制日志(bin log)

1、查看默认情况

2、日志参数设置

方式1:永久性方式

方式2:临时性方式

3、查看日志

4、使用日志恢复数据

5、删除二进制日志

6、其它场景

六、再谈二进制日志(binlog) 

1、写入机制

2、binlog与redolog对比

3、两阶段提交 

七、中继日志(relay log)

1、介绍

2、查看中继日志 

3、恢复的典型错误


千万不要小看日志。很多看似奇怪的问题,答案往往就藏在日志里。很多情况下,只有通过查看日志才能发现问题的原因,真正解决问题。所以,一定要学会查看日志,养成检查日志的习惯,对提升你的数据库应用开发能力至关重要。

MySQL8.0 官网日志地址:MySQL :: MySQL 8.0 Reference Manual :: 5.4 MySQL Server Logs

一、MySQL支持的日志


1、日志类型

MySQL有不同类型的日志文件,用来存储不同类型的日志,分为 二进制日志 、 错误日志 、 通用查询日志慢查询日志 ,这也是常用的4种。MySQL 8又新增两种支持的日志: 中继日志数据定义语句日志 。使用这些日志文件,可以查看MySQL内部发生的事情。

这 6 类日志分别为:

  • 慢查询日志: 记录所有执行时间超过long_query_time的所有查询,方便我们对查询进行优化。

  • 通用查询日志: 记录所有连接的起始时间和终止时间,以及连接发送给数据库服务器的所有指令,对我们复原操作的实际场景、发现问题,甚至是对数据库操作的审计都有很大的帮助。

  • 错误日志: 记录MySQL服务的启动、运行或停止MySQL服务时出现的问题,方便我们了解服务器的状态,从而对服务器进行维护。

  • 二进制日志: 记录所有更改数据的语句,可以用于主从服务器之间的数据同步,以及服务器遇到故障时数据的无损失恢复。

  • 中继日志: 用于主从服务器架构中,从服务器用来存放主服务器二进制日志内容的一个中间文件。从服务器通过读取中继日志的内容,来同步主服务器上的操作。

  • 数据定义语句日志: 记录数据定义语句执行的元数据操作。

除二进制日志外,其他日志都是文本文件。默认情况下,所有日志创建于MySQL数据目录

2、日志的弊端

  • 日志功能会降低MySQL数据库的性能。例如,在查询非常频繁的MysQL数据库系统中,如果开启了通用查询日志和慢查询日志,MySQL数据库会花费很多时间记录日志。

  • 日志会占用大量的磁盘空间。对于用户量非常大、操作非常频繁的数据库,日志文件需要的存储空间设置比数 据库文件需要的存储空间还要大二、

二、慢查询日志(slow query log)


前面章节《性能分析工具的使用》已经详细讲述。

三、通用查询日志(general query log)


通用查询日志用来 记录用户的所有操作 ,包括启动和关闭MySQL服务、所有用户的连接开始时间和截止时间、发给 MySQL 数据库服务器的所有 SQL 指令等。当我们的数据发生异常时,查看通用查询日志还原操作时的具体场景,可以帮助我们准确定位问题。

1、问题场景 

【MySQL高级篇笔记-其他数据库日志(下) 】_第1张图片

2、查看当前状态

mysql> SHOW VARIABLES LIKE '%general%';
+------------------+------------------------------+
| Variable_name | Value |
+------------------+------------------------------+
| general_log | OFF | #通用查询日志处于关闭状态
| general_log_file | /var/lib/mysql/atguigu01.log | #通用查询日志文件的名称是atguigu01.log
+------------------+------------------------------+
2 rows in set (0.03 sec)

3、启动日志

方式 1 :永久性方式

修改my.cnf或者my.ini配置文件来设置。在[mysqld]组下加入log选项,并重启MySQL服务。

格式如下:

[mysqld]
general_log=ON
general_log_file=[path[filename]] #日志文件所在目录路径,filename为日志文件名   

如果不指定目录和文件名,通用查询日志将默认存储在MySQL数据目录中的hostname.log文件中,hostname表示主机名。

方式2:临时性方式 

SET GLOBAL general_log=on;  # 开启通用查询日志
SET GLOBAL general_log_file=’path/filename’; # 设置日志文件保存位置

对应的,关闭操作SQL命令如下:

SET GLOBAL general_log=off;  # 关闭通用查询日志

查看设置后情况:

SHOW VARIABLES LIKE 'general_log%';

4、查看日志

通用查询日志是以文本文件的形式存储在文件系统中的,可以使用文本编辑器直接打开日志文件。每台MySQL服务器的通用查询日志内容是不同的。

  • 在Windows操作系统中,使用文本文件查看器;

  • 在Linux系统中,可以使用vi工具或者gedit工具查看;

  • 在Mac OSX系统中,可以使用文本文件查看器或者vi等工具查看。

SHOW VARIABLES LIKE 'general_log%';结果中可以看到通用查询日志的位置

【MySQL高级篇笔记-其他数据库日志(下) 】_第2张图片 

在通用查询日志里面,我们可以清楚地看到,什么时候开启了新的客户端登陆数据库,登录之后做了什么 SQL 操作,针对的是哪个数据表等信息。

5、停止日志

方式1:永久性方式 

【MySQL高级篇笔记-其他数据库日志(下) 】_第3张图片

方式2:临时性方式

【MySQL高级篇笔记-其他数据库日志(下) 】_第4张图片

6、 删除\刷新日志

【MySQL高级篇笔记-其他数据库日志(下) 】_第5张图片

四、错误日志(error log)


1、启动日志

【MySQL高级篇笔记-其他数据库日志(下) 】_第6张图片

2、查看日志

【MySQL高级篇笔记-其他数据库日志(下) 】_第7张图片

3、删除\刷新日志

【MySQL高级篇笔记-其他数据库日志(下) 】_第8张图片

【MySQL高级篇笔记-其他数据库日志(下) 】_第9张图片

五、二进制日志(bin log)


binlog可以说是MySQL中比较 重要 的日志了,在日常开发及运维过程中,经常会遇到。
binlog即binary log,二进制日志文件,也叫作变更日志(update log)。它记录了数据库所有执行的DDL DML 等数据库更新事件的语句,但是不包含没有修改任何数据的语句(如数据查询语句select、show等)。
binlog主要应用场景:

  • 一是用于 数据恢复
  • 二是用于 数据复制 

【MySQL高级篇笔记-其他数据库日志(下) 】_第10张图片

1、查看默认情况

【MySQL高级篇笔记-其他数据库日志(下) 】_第11张图片

2、日志参数设置

方式1:永久性方式

【MySQL高级篇笔记-其他数据库日志(下) 】_第12张图片

方式2:临时性方式

【MySQL高级篇笔记-其他数据库日志(下) 】_第13张图片

3、查看日志

【MySQL高级篇笔记-其他数据库日志(下) 】_第14张图片

【MySQL高级篇笔记-其他数据库日志(下) 】_第15张图片

【MySQL高级篇笔记-其他数据库日志(下) 】_第16张图片

【MySQL高级篇笔记-其他数据库日志(下) 】_第17张图片

4、使用日志恢复数据

【MySQL高级篇笔记-其他数据库日志(下) 】_第18张图片

5、删除二进制日志

【MySQL高级篇笔记-其他数据库日志(下) 】_第19张图片

【MySQL高级篇笔记-其他数据库日志(下) 】_第20张图片

6、其它场景

二进制日志可以通过数据库的 全量备份 和二进制日志中保存的 增量信息 ,完成数据库的 无损失恢复 。但是,如果遇到数据量大、数据库和数据表很多(比如分库分表的应用)的场景,用二进制日志进行数据恢复,是很有挑战性的,因为起止位置不容易管理。
在这种情况下,一个有效的解决办法是 配置主从数据库服务器 ,甚至是 一主多从 的架构,把二进制日志文件的内容通过中继日志,同步到从数据库服务器中,这样就可以有效避免数据库故障导致的数据异常等问题。

六、再谈二进制日志(binlog) 


1、写入机制

【MySQL高级篇笔记-其他数据库日志(下) 】_第21张图片

【MySQL高级篇笔记-其他数据库日志(下) 】_第22张图片

【MySQL高级篇笔记-其他数据库日志(下) 】_第23张图片

2、binlog与redolog对比

  • redo log 它是物理日志,记录内容是“在某个数据页上做了什么修改”,属于 InnoDB 存储引擎层产生的。

  • 而 binlog 是逻辑日志,记录内容是语句的原始逻辑,类似于“给 ID=2 这一行的 c 字段加 1”,属于MySQL Server 层

  • 虽然它们都属于持久化的保证,但是则重点不同。

    • redo log让InnoDB存储引擎拥有了崩溃恢复能力。

    • binlog保证了MySQL集群架构的数据一致性。

3、两阶段提交 

在执行更新语句过程,会记录redo log与binlog两块日志,以基本的事务为单位,redo log在事务执行过程中可以不断写入,而binlog只有在提交事务时才写入,所以redo log与binlog的 写入时机 不一样。

【MySQL高级篇笔记-其他数据库日志(下) 】_第24张图片

redo log与binlog两份日志之间的逻辑不一致,会出现什么问题?

【MySQL高级篇笔记-其他数据库日志(下) 】_第25张图片

由于binlog没写完就异常,这时候binlog里面没有对应的修改记录。

【MySQL高级篇笔记-其他数据库日志(下) 】_第26张图片

为了解决两份日志之间的逻辑一致问题,InnoDB存储引擎使用两阶段提交方案。

【MySQL高级篇笔记-其他数据库日志(下) 】_第27张图片

使用两阶段提交后,写入binlog时发生异常也不会有影响 

【MySQL高级篇笔记-其他数据库日志(下) 】_第28张图片

另一个场景,redo log设置commit阶段发生异常,那会不会回滚事务呢?

【MySQL高级篇笔记-其他数据库日志(下) 】_第29张图片

并不会回滚事务,它会执行上图框住的逻辑,虽然redo log是处于prepare阶段,但是能通过事务id找到对应的binlog日志,所以MySQL认为是完整的,就会提交事务恢复数据。

七、中继日志(relay log)


1、介绍

中继日志只在主从服务器架构的从服务器上存在。从服务器为了与主服务器保持一致,要从主服务器读取二进制日志的内容,并且把读取到的信息写入 本地的日志文件 中,这个从服务器本地的日志文件就叫中继日志 。然后,从服务器读取中继日志,并根据中继日志的内容对从服务器的数据进行更新,完成主从服务器的 数据同步


搭建好主从服务器之后,中继日志默认会保存在从服务器的数据目录下。


文件名的格式是: 从服务器名 -relay-bin.序号 。中继日志还有一个索引文件: 从服务器名 -relay-bin.index ,用来定位当前正在使用的中继日志。

2、查看中继日志 

【MySQL高级篇笔记-其他数据库日志(下) 】_第30张图片

3、恢复的典型错误

如果从服务器宕机,有的时候为了系统恢复,要重装操作系统,这样就可能会导致你的 服务器名称 与之前 不同 。而中继日志里是 包含从服务器名 的。在这种情况下,就可能导致你恢复从服务器的时候,无法从宕机前的中继日志里读取数据,以为是日志文件损坏了,其实是名称不对了。
解决的方法也很简单,把从服务器的名称改回之前的名称。

 

高级篇笔记PDF自取

链接:https://pan.baidu.com/s/1pVqrTwIZFoED77i-EFmw6g?pwd=3333 
提取码:3333

你可能感兴趣的:(MySQL,笔记,mysql,数据库)