MySQL-数据库日志

MySQL支持的日志

  1. 6类日志
  • 慢查询日志:记录所有执行时间超过long_query_time的所有查询,方便对查询进行优化
  • 通用查询日志:记录所有连接的起始时间和终止时间,以及连接发送给数据库服务器的所有指令,对复原操作的实际场景、发现问题,甚至是对数据库操作的审计都有很大的帮助
  • 错误日志:记录MySQL服务的启动、运行或停止MySQL服务时出现的问题,方便了解服务器的状态,从而对服务器进行维护
  • 二进制日志:记录所有更改数据的语句,可以用于主从服务器之间的数据同步,以及服务器遇到故障时数据的无损失恢复
  • 中继日志:用于主从服务器架构中,从服务器用来存放主服务器二进制日志内容的一个中间文件从服务器通过读取中继日志的内容,来同步主服务器上的操作
  • 数据定义语句日志:记录数据定义语句执行的元数据操作
  1. 日志创建位置
  • 默认情况下,所有日志创建于 MySQL数据目录 中
  1. 日志弊端
  • 日志功能会 降低MySQL数据库的性能
  • 日志会 占用大量的磁盘空间

通用查询日志(general query log)

  1. 查看当前日志状态
  • general_log:日志的状态
  • general_log_file :通用查询日志文件的地址和名称
sql 复制代码
SHOW VARIABLES LIKE '%general%';
  1. 启动日志
  • 永久性方式,修改my.cnf或者my.ini配置文件,并重启MySQL服务

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

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

  • 临时性方式

sql 复制代码
SET GLOBAL general_log=on;  # 开启通用查询日志
SET GLOBAL general_log_file='path/filename';  # 设置日志文件保存位置
SET GLOBAL general_log=off;  # 关闭通用查询日志
SHOW VARIABLES LIKE 'general_log%';  # 查看设置后参数
  1. 停止日志
  • 永久性方式

    [mysqld]
    general_log=OFF

  • 临时性方式

sql 复制代码
SET GLOBAL general_log=off;
  1. 删除\刷新日志
  • 手动删除文件

  • Linux命令重新生成查询日志文件,需要先开启通用日志

    mysqladmin -uroot -p flush-logs

错误日志(error log)

  1. 启动日志
  • 在MySQL数据库中,错误日志功能是 默认开启 的。而且,错误日志 无法被禁止

  • 默认情况下,错误日志存储在MySQL数据库的数据文件夹下,名称默认为 mysqld.log (Linux系统)或 hostname.err (mac系统)

  • 修改文件名,需要在my.cnf或者my.ini中做如下配置,重启MySQL服务

    [mysqld]
    log-error=[path/[filename]] #path为日志文件所在的目录路径,filename为日志文件名

  1. 查看日志
sql 复制代码
SHOW VARIABLES LIKE 'log_err%';
  1. 删除\刷新日志
  • 手动删除文件

  • Linux命令进行日志刷新,需要进行两步操作:

    install -omysql -gmysql -m0644 /dev/null /var/log/mysqld.log
    mysqladmin -uroot -p flush-logs

  1. flush-logs指令操作
  • MySQL 5.5.7以前的版本,flush-logs将错误日志文件重命名为filename.err_old,并创建新的日志文件
  • MySQL 5.5.7开始,flush-logs只是重新打开日志文件,并不做日志备份和创建的操作;如果日志文件不存在,MySQL启动或者执行flush-logs时会自动创建新的日志文件。重新创建错误日志,大小为0字节

二进制日志(bin log)

  1. bin log介绍
  • binlog即binary log,二进制日志文件,也叫作变更日志(update log)
  • 记录了数据库所有执行的DDL 和 DML 等数据库更新事件的语句,但是不包含没有修改任何数据的语句(如数据查询语句select、show等)
  • 主要应用于数据恢复数据复制
  1. 查看默认情况
  • 在MySQL8中默认情况下,二进制文件是开启的
sql 复制代码
show variables like '%log_bin%';
  1. 日志参数设置
  • 永久性方式:修改MySQL的 my.cnf 或 my.ini 文件,重新启动MySQL服务

  • log-bin :打开日志(主机需要打开)

  • binlog_expire_logs_seconds:此参数控制二进制日志文件保留的时长,单位是秒,默认2592000,30天

  • max_binlog.size:控制单个二进制日志大小,当前日志文件大小超过此变量时,执行切换动作。此参数的最大和默认值是1GB

    [mysqld]
    #启用二进制日志
    binlog_expire_logs_seconds=600
    max_binlog_size=100

    设置日志文件的目录和名称

    log-bin="/var/lib/mysql/binlog/xxx-bin"

  • 临时性方式:在mysql8中只有 会话级别 的设置,没有了global级别的设置

sql 复制代码
# global 级别
set global sql_log_bin=0;

# session级别
SET sql_log_bin=0;
  1. 查看日志
  • MySQL创建二进制日志文件时,先创建一个以"filename"为名称、以".index"为后缀的文件
  • 再创建一个以"filename"为名称、以".000001"为后缀的文件
  • MySQL服务 重新启动一次 ,以".000001"为后缀的文件就会增加一个,并且后缀名按1递增
  • 如果日志长度超过了 max_binlog_size 的上限(默认是1GB),就会创建一个新的日志文件
sql 复制代码
-- 查看当前的二进制日志文件列表及大小
SHOW BINARY LOGS;
  • Linux命令查看日志,使用mysqlbinlog命令工具

    mysqlbinlog -v "日志路径"

  • MySQL语句show binlog查看日志

    • IN 'log_name':指定要查询的binlog文件名(不指定就是第一个binlog文件)
    • FROM pos:指定从哪个pos起始点开始查起(不指定就是从整个文件首个pos点开始算)
    • LIMIT[offset]:偏移量(不指定就是0)
    • row_count:查询总条数(不指定就是所有行)
sql 复制代码
show binlog events[IN 'log_name'] [FROM pos] [LIMIT[offset,] row_count];
  1. 使用日志恢复数据
  • option之 --start-date 和 --stop-date :可以指定恢复数据库的起始时间点和结束时间点
  • option之 --start-position 和 --stop-position :可以指定恢复数据的开始位置和结束位置
  • 使用mysqlbinlog命令进行恢复操作时,必须是编号小的先恢复
bash 复制代码
mysqlbinlog [option] filename|mysql --uuser -ppass;

# 按照行数恢复
/usr/bin/mysqlbinlog --start-position=464 --stop-position=1308 --database=xxx
/var/1ib/mysql/binlog/xxx-bin.000005 | /usr/bin/mysql -uroot -p123456 -v xxx

# 按照时间恢复
/usr/bin/mysqlbinlog --start-datetime="2022-01-05 15:39:22" 
--stop-datetime="2022-01-05 15:48:19" 
--database=xxx 
/var/1ib/mysql/binlog/xxx-bin.000005 | /usr/bin/mysql -uroot -p123456 -v xxx
  1. 删除二进制日志
  • 可以配置自动删除,也可以安全的手动删除
  • PURGE MASTER LOGS:删除指定日志文件
sql 复制代码
-- 指定日志文件名 之前的文件都删除
PURGE {MASTER | BINARY} LOGS TO '指定日志文件名'
-- 指定日期 之前的文件都删除
PURGE {MASTER | BINARY} LOGS BEFORE '指定日期'
  • RESET MASTER :删除所有二进制日志文件,新日志继续从0001开始编号
bash 复制代码
RESET MASTER;

中继日志(relay log)

  1. 中继日志概念
  • 中继日志只在主从服务器架构的从服务器上存在
  • 从服务器为了与主服务器保持一致,要从主服务器读取二进制日志的内容,并且把读取到的信息写入 本地的日志文件 中,这个从服务器本地的日志文件就叫中继日志
  • 从服务器读取中继日志,并根据中继日志的内容对从服务器的数据进行更新,完成主从服务器的 数据同步
  • 中继日志默认会保存在从服务器的数据目录下
  • 文件名的格式是: 从服务器名 -relay-bin.序号
  • 中继日志的索引文件: 从服务器名 -relaybin.index ,用来定位当前正在使用的中继日志
  1. 查看中继日志
  • 中继日志与二进制日志的格式相同,可以用 mysqlbinlog 工具进行查看
  1. 恢复的典型错误之重装系统
  • 重装操作系统,这样就可能会导致你的 服务器名称 与之前 不同 。而中继日志里是 包含从服务器名 的
  • 需要把从服务器的名称改回之前的名称
相关推荐
阿里嘎多哈基米4 小时前
Mac系统,Docker的MySQL + 本地 Canal
mysql·macos·docker·canal
七夜zippoe4 小时前
微服务配置中心高可用设计:从踩坑到落地的实战指南(一)
java·数据库·微服务
重启的码农4 小时前
kv数据库-leveldb (11) 版本集 (VersionSet / Version)
数据库
数智顾问4 小时前
实战:基于 BRPC+Etcd 打造轻量级 RPC 服务——从注册到调用的核心架构与基础实现
数据库
咖啡Beans4 小时前
SpringBoot集成p6spy监控sql耗时
spring boot·mysql·spring cloud
知其然亦知其所以然4 小时前
MySQL 社招必考题:如何优化WHERE子句?
后端·mysql·面试
丶西红柿丶4 小时前
Mysql分区
数据库