MySQL【日志管理】

        日志,就是一种将行为动作记录到一个地方,这个地方可以是文件,文本等可存储的载体。Mysql日志就是记录整个mysql从启动、运行、到结束的整个生命周期下的行为。

官网链接:MySQL :: MySQL 5.7 Reference Manual :: 5.4 MySQL Server Logs

MySQL 5.7日志分类

错误日志

        默认开启,无法关闭。错误日志包含mysqld启动和关闭时间的记录。它还包含诊断消息,如服务器启动和关闭期间以及服务器运行时发生的错误、警告和注释。

通用查询日志

        主要是记录所有关于服务器的活动,包括所有客户端的连接和所有执行的SQL语句,mysql的通用日志是关闭的,如果需要设置可以通过 general_log 选项开启通用日志。通用查询日志记录了大量的信息,它可能会对数据库服务器的性能产生显著影响,特别在高负载的生产环境中。而且还会占用大量磁盘空间和磁盘 I/O 问题,所以一般调试的时候才会开启通用日志。

二进制日志(bin log):【5.7默认关闭;8.0默认开启】

        一种特殊类型的日志文件,它记录了所有修改数据库内容【增、删、改】的操作,比如 INSERT、UPDATE 和 DELETE 语句,以及数据定义语言(DDL)语句,如 CREATE TABLE、ALTER TABLE 等。MySQL 的二进制日志并不是由纯粹的0和1序列组成的简单文件。实际上,它是一种特殊的二进制格式文件,这种格式旨在高效地存储和记录数据库更改操作。这种专门为 MySQL 优化的格式,既保证了存储和传输的高效性,也便于使用相应的工具进行内容查看和分析。例如mysqlbinlog这个工具就可以查看二进制文件的内容。MySQL的二进制日志不像通用日志、慢查询日志一样耗费性能,二进制日志对性能的影响通常较小。一般在主从复制的架构中才需要开启二进制日志。

中继日志(Relay log)

        在主从复制环境中使用的一种特殊日志文件,可以理解为二进制日志换一个名字,在主从复制环境中,中继日志是存放在从服务器上的。【在 MySQL 的主从复制环境中,中继日志(Relay Log)的作用是暂存从主服务器接收的二进制日志(Binary Log)事件,并在从服务器上执行这些事件以实现数据同步。一旦这些事件在从服务器上成功执行并且数据同步完成,相应的中继日志文件就不再需要了,因此会被自动删除。】这是从服务器自动进行的,以确保不会因为长时间累积大量的中继日志而占用过多的磁盘空间。

慢查询日志

        记录了执行时间超过特定阈值的所有查询,可以根据这些信息监控和诊断数据库性能问题。一般情况下是需要调试时候才开启慢查询日志,如果长期开启可能会对数据库性能产生一定的影响,且在大型或高负载的环境中日志文件可能会快速增长,占用过多磁盘空间。

重做日志(redo log):

        InnoDB存储引擎特有的日志系统,用于保证事务的持久性和恢复能力。重做日志也是以二进制格式存储存储的,并且如果使用的引擎是innodb,默认是开启了重做日志。

回滚日志(undo log)

        mysql中比较重要的事务日志之一,顾名思义,undo log是一种用于撤销回退的日志,在事务没提交之前,MySQL会先记录更新前的数据到 undo log日志文件里面,当事务回滚时或者数据库崩溃时,可以利用 undo log来进行回退。

注意:

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

        同时日志会占用大量的磁盘空间。对于用户量非常大、操作非常频繁的数据库,日志文件需要的存储空间设置比数据库文件需要的存储空间还要大。所以不必要的日志文件尽量就不开启。

1.错误日志:

查看错误日志文件路径

1.my.cnf文件中:指定mysqld记录的错误日志文件:log-error=错误文件绝对路径
log-error=/var/log/mysqld.log

2.mysql中查看:
show variables like 'log_error';

2.通用查询日志(了解)

通用查询日志可以帮助我们了解操作发生的具体时间和操作的细节,对找出异常发生的原因极其关键。

#mysql中查看:
show variables like '%general%';

# 在配置文件中修改:
vim /etc/my.cnf
# 加入:
general_log=ON                               # ON表示开启 OFF表示关闭
general_log_file=/var/log/mysql/general.log  #通用日志的存放位置和文件名

# 创建目录和日志文件
mkdir /var/log/mysql
touch /var/log/mysql/general.log
# 修改权限和属主属组
chmod -R 755  /var/log/mysql
chown -R mysql.mysql /var/log/mysql
# 重启服务:
systemctl restart mysqld

# 再次查看通用日志
show variables like '%general%';

#注意:当配置文件无法生效时,删除‘/var/log/mysql/general.log’文件,重启

3.二进制日志【重要】:增删改

MySQL 5.7中二进制(bin log)默认是关闭状态MySQL 8.0默认开启状态,可以通过添加my.cnf配置参数开启二进制日志。binlog可以说是MySQL中比较重要的日志了,在日常开发及运维过程中,经常会遇到。

binlog即binary log,二进制日志文件,也叫作变更日志(update log)。它记录了数据库所有执行的 DDL 和 DML 等数据库更新事件的语句,但是不包含没有修改任何数据的语句(如数据查询语句select、show等)。

binlog主要应用场景:

  1. 一是用于数据恢复
  2. 二是用于数据复制
# 查看二进制文件是否开启:
select @@global.log_bin;
+------------------+
| @@global.log_bin |
+------------------+
|                0 |  # 0未开启
+------------------+

# 或者:
show variables like '%log_bin%';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| log_bin                         | OFF   |
| log_bin_basename                |       |
| log_bin_index                   |       |
| log_bin_trust_function_creators | OFF   |
| log_bin_use_v1_row_events       | OFF   |
| sql_log_bin                     | ON    |
+---------------------------------+-------+

开启二进制日志:

1.打开配置文件
vim /etc/my.cnf

2.添加:
log-bin=/var/log/mysql/binlog   #开启二进制日志,binlog为二进制日志文件前缀
server-id=1                     #AB复制的时候使用,为了防止相互复制,会设置一个ID,来标识谁产生的日志

3.重启:
systemctl restart mysqld

4.查看:新建的文件夹需要更改为mysql属主和属组,且需要具有755权限
ll /var/log/mysql/

查看二进制日志:

        当MySQL创建二进制日志文件时,先创建一个以“binlog”为名称、以“.index”为后缀的文件,再创建一 个以“binlog”为名称、以“.000001”为后缀的文件。 MySQL服务 重新启动一次 ,以“.000001”为后缀的文件就会增加一个,并且后缀名按1递增。即日志文件的 个数与MySQL服务启动的次数相同;

        如果日志长度超过了 max_binlog_size 的上限(默认是1GB),就会创建一个新的日志文件。 查看当前的二进制日志文件列表及大小。指令如下:

 show binary logs;
+---------------+-----------+
| Log_name      | File_size |
+---------------+-----------+
| binlog.000001 |       154 |
+---------------+-----------+

# 在命令终端:输入:
mysqlbinlog -v /var/log/mysql/binlog.000001

# 或者:
mysqlbinlog  -v --base64-output=decode-rows "/var/log/mysql/binlog.000001"

二进制日志三种格式:

# 查看二进制日志格式
show variables like 'binlog_format';

STATEMENT 格式(语句模式,出现在 MySQL 5.1 之前):

在这种格式下,binlog 记录的是执行的 SQL 语句的文本。

优点:日志文件通常较小,复制效率较高。

缺点:在某些情况下,由于数据库环境的差异(如表结构、字符集等),在从服务器上重放这些 SQL 语句可能会导致不一致的结果。例如,获取当前时间的函数或存储过程等,可能会导致数据不一致。

# 打开配置文件
vim /etc/my.cnf
# 添加:
[mysqld]
binlog_format = STATEMENT

ROW 格式(行模式,诞生于 MySQL 5.1):

在这种格式下,binlog 记录的是每一行数据更改的具体内容。

优点:能够精确地记录数据的变化,避免了 STATEMENT 格式中的环境依赖问题,提供了更强的一致性保证。

缺点:日志文件可能会比 STATEMENT 格式大,因为记录了每一行的详细变化。此外,ROW 格式的日志在进行大量数据更新时可能会导致更高的 I/O 开销。

# 打开配置文件
vim /etc/my.cnf
# 添加:
[mysqld]
binlog_format = ROW

MIXED 格式(混合模式):【了解】

在这种格式下,binlog 可以根据具体的 SQL 语句和操作自动选择使用 STATEMENT 或 ROW 格式。

优点:结合了 STATEMENT 和 ROW 格式的优点,能够在保证一致性的同时尽可能地优化日志大小和复制性能。

缺点:由于混合使用了两种格式,可能需要更复杂的管理和监控。在某些特定情况下,MIXED 格式可能无法达到最优的性能或一致性。

# 打开配置文件
vim /etc/my.cnf
# 添加:
[mysqld]
binlog_format = MIXED

在Mysql运行时修改:

修改二进制日志格式需要具有超级用户权限(SUPER 权限),并且只对新的会话生效,已有会话不受影响。

SET GLOBAL binlog_format = 'STATEMENT';

MySQL 5.7二进制日常管理事项

- 每次重启MySQL实例,都会重新生成新的二进制文件

- 执行flush logs,会重新生成新的二进制日志文件

- 执行reset master,会删除所有的binlog日志文件。危险操作

- 可以通过 purge binary logs to 'binlog.000002' 删除binlog.000002之前的二进制文件。

- 可以通过set sql_log_bin=0关闭当前会话的执行操作记录至二进制日志文件,需要具有 SUPER 权限。在复制环境中使用 sql_log_bin = 0 时要小心,以避免主从数据不一致。

# 查看sql_log_bin状态信息
SHOW VARIABLES LIKE 'SQL_LOG_BIN';

4.慢查询日志:

慢查询日志(Slow Query Log)是 MySQL 中用于记录执行时间超过指定阈值的 SQL 查询的日志文件。慢查询日志对于诊断和优化数据库性能非常有用。

启动慢查询日志

# 修改MySQL配置文件
vim /etc/my.cnf
# 写入:
slow_query_log = 1                                     # 启用慢查询日志
slow_query_log_file = /var/log/mysql/slow_query.log    # 慢查询日志文件路径
long_query_time = 3                                    # 查询超过2秒的SQL语句将被记录

#重启:
systemctl restart mysqld

查看慢查询日志参数

SHOW VARIABLES LIKE '%slow_query%';

验证

# 测试SQL语句
select sleep(6);

# 查看慢查询日志文件
cat /var/log/mysql/slow_query.log 

5.中继日志【重要】

        中继日志(Relay Log)是从服务器(Slave)用于记录从主服务器(Master)接收到的二进制日志事件的日志文件。这些事件在从服务器上被重新执行以保持主从数据的一致性。中继日志的主要作用是存储从主服务器复制过来的二进制日志事件。在复制过程中,从服务器上的 I/O 线程从主服务器读取二进制日志事件,并将其写入中继日志文件。从服务器上的 SQL 线程读取中继日志,并执行其中的事件,从而更新从服务器上的数据。

扩展:

UNIX Socket连接方式其实不是一个网络协议,所以只能在MySQL客户端和数据库实例在同一台服务器上的情况下使用。本地进程间通信的一种方式

# 通过socket方式登录
# 查看sock的存放路径
cat /etc/my.cnf | grep sock
socket=/var/lib/mysql/mysql.sock
#
mysql -uroot -p'QianFeng@123!' -S /var/lib/mysql/mysql.sock
  • 15
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值