Linux之MySQL日志
前言
数据库就像一个庞大的图书馆,而日志则是记录这个图书馆内每一本书的目录。正如在图书馆中找到特定书籍一样,数据库日志帮助我们追溯数据的变更、定位问题和还原状态。
在MySQL
中,日志是非常重要的一个组成部分,它记录了数据库运行状态的各种信息,包括错误信息、查询信息、事务信息等等,是进行异常排查、性能优化、数据恢复和备份的关键基础。
MySQL日志分类及介绍
MySQL
中的日志主要分为两种类型:Server层和引擎层的日志(本次课程主要介绍Server层日志)。
Server层日志简介
用于记录MySQL Server
层的各种操作和异常情况
- Error Log (错误日志) :记录
MySQL
服务的启动、运行或停止过程中出现的问题和错误信息。用于了解服务器的状态和故障排除。 - Binary Log (二进制日志):记录对
MySQL
数据库执行的更改操作,包括语句的发生时间、执行时长等信息,主要用于数据库恢复和主从复制。 - Relay Log ( 中继日志):用于主从服务器架构中,从服务器用来存放主服务器二进制日志内容的中间文件,从服务器通过读取中继日志的内容来同步主服务器上的操作。
- **DDL Log **:记录数据定义语句执行的元数据操作。
- General Log(查询日志) :记录所有连接到数据库的客户端发送给数据库服务器的指令,包括连接和断开连接信息、执行的查询和
SQL
语句等。 - Slow Query Log (慢查询日志):记录执行时间超过阈值的
SQL
查询语句,用于识别性能瓶颈、定位慢查询并进行优化。
InnoDB层日志简介
-
重做日志(redo log):
InnoDB
使用重做日志来确保事务的持久性。当事务提交时,InnoDB
会将该事务对数据库的修改记录到重做日志中。在数据库发生崩溃或意外关闭时,InnoDB
可以通过重做日志来恢复未提交的事务,以保持数据的一致性。 -
回滚日志(undo log):
InnoDB
使用回滚日志来实现事务的原子性和隔离性。当事务执行时,InnoDB
会为该事务创建一个回滚日志,记录事务执行前的数据状态。如果事务需要回滚,InnoDB
可以使用回滚日志将数据恢复到事务执行前的状态。此外,回滚日志还用于支持多版本并发控制(MVCC
),使不同事务可以同时读取和修改相同的数据而不会相互干扰。
Server层日志
错误日志
错误日志是MySQL
中最重要的日志之一,它记录了当mysqld
启动和停止时,以及服务器在运行过程中发生任何严重错误时的相关信息。当数据库出现任何故障导致无法正常使用时,建议首先查看此日志。
该日志是默认开启的,默认存放目录/var/log/,默认的日志文件名为mysqld.log。查看日志位置:
show variables like '%log_error%'
切换至root用户,然后编辑/var/lib/mysql/auto.cnf
。随机修改server_uuid
信息,然后再重启mysqld
服务信息,最后通过查看错误日志信息。
sudo vim /var/lib/mysql/auto.cnf
# 修改成功之后,退出并保存
# 重启mysql服务
sudo systemctl restart mysql
设置拥有者为mysql
sudo chown mysql auto.cnf
注意:修改之前,先保存好原有的
server_uuid
,防止忘记。
重启mysql
服务之后,通过查看错误信息后发现是修改了server_uuid
导致服务无法正常启动。
# 查看mysql日志
sudo tail -f /var/log/mysql/error.sql
二进制日志
- 介绍
二进制日志(BINLOG
)记录了所有的DDL
(数据定义语言)和DML
(数据操作语言)语句,但不包括数据查询(SELECT、SHOW
)语句。
作用:1)灾难时的数据恢复;2)
MySQL
的主从复制。在MySQL8
版本中,默认二进制是开启的;在MySQL5.7
版本中需要手动开启。
查看命令如下:
show variables like '%log_bin%';
修改/etc/mysql/mysql.conf.d/mysqld.cnf
,开启log_bin
二进制日志功能。在[mysqld]
配置中添加以下信息:
[mysqld]
...
# 开启log_bin
log_bin=mysql_bin
# 设置唯一id
server-id=1
# 设置log_bin的日志格式(默认ROW)
binlog_format=ROW
最后,保存并退出,重启mysql
服务。再次登陆mysql
查看修改情况:
# 重启mysql服务
sudo systemctl restart mysql
# 再次登陆mysql
mysql -u root -p
# 输入root密码
主要参数介绍
参数 | 说明 |
---|---|
log_bin | 是否开启log_bin日志,NO表示开启,OFF表示关闭 |
log_bin_basename | binlog 日志的基本文件名,产生的bin-log 文件名即为bin-log.* |
log_bin_index | binlog 文件的索引文件,管理所有binlog 文件 |
切换到/var/lib/mysql
目录下,查看二进制日志文件。(注意:请使用root账号切换目录)
# 切换root账号
su root
# 切换目录
cd /var/lib/mysql
# 查看目录下的文件信息
ll
- 日志格式
MySQL
服务器中提供了多种格式来记录二进制日志,具体格式及特点如下:
日志格式 | 说明 |
---|---|
STATEMENT | 基于SQL语句的日志记录,记录的是SQL语句,对数据进行修改的SQL都会记录在日志文件中。 |
ROW | 基于行的日志记录,记录的是每一行的数据变更。(默认) |
MIXED | 混合了STATEMENT和ROW两种格式,默认采用STATEMENT,在某些特殊情况下会自动切换为ROW进行记录。 |
查看binlog
的日志格式命令如下:
show variables like '%binlog_format%';
创建一个数据库db1
,并在数据库下创建t_score成绩表。
mysql> create database db1;
mysql> use db1;
mysql> create table t_score(id int primary key auto_increment,name varchar(20) not null,course varchar(20) not null,score float default 0);
mysql> insert into t_score(name,course,score) values('张三','语文',99),('张三','数学',98),('里斯','语文',90),('里斯','数学',87);
mysql> commit;
- 日志查看
由于日志是以二进制方式存储的,不能直接读取,需要通过二进制日志查询工具mysqlbinlog
来查看,具体语法:
mysqldbinlog [参数选项] logfilename
参数选项说明:
参数 | 说明 |
---|---|
-d | 指定数据库名称,只列出指定的数据库相关操作 |
-o | 忽略点日志中的前n行命令 |
-v | 将行事件(数据变更)重构为SQL 语句 |
-w | 将行事件(数据变更)重构为SQL 语句,并输出注释信息 |
示例1:查看上一步骤的操作日志
切换到/var/lib/mysql
目录,执行以下命令,查看执行日志:
# 切换目录
cd /var/lib/mysql
# 通过mysqlbinlog命令查看日志信息(看不到有效信息)
mysqlbinlog mysql_bin.000001
# 通过配置指定参数再次查看(可以清晰的看到SQL语句)
mysqlbinlog -v mysql_bin.000001
示例2:更换日志格式为STATEMENT
修改/etc/mysql/mysql.conf.d/mysqld.cnf
文件。
# 编辑mysql配置文件
vim /etc/mysql/mysql.conf.d/mysqld.cnf
将[mysqld]
配置中binlog_format=ROW
修改成binlog_format=STATEMENT
,其他配置不变。
[mysqld]
...
# 设置log_bin的日志格式(默认ROW)
binlog_format=STATEMENT
修改完成之后,重启mysql
服务。(重要!!!)
这时可以在/var/lib/mysql
目录下看到一个新的二进制日志文件。
注意:这里因为修改了日志格式,重启
mysql
服务之后,将重新产生一个全新的二进制日志文件,如图上所示mysql-bin.000002
。
基于日志格式STATEMENT,修改t_score表中所有人的成绩后,再次查看日志情况。
mysql> update t_score set score=score+1;
mysql> commit;# 切换目录
cd /var/lib/mysql
# 查看日志
mysqlbinlog -v mysql-bin.000002
- 日志删除
对于比较繁忙的业务系统,每天生成的binlog数据巨大,如果长时间不清除,将会占用大量磁盘空间。可以通过以下几种方式清理日志:
指令 | 说明 |
---|---|
reset master | 删除全部binlog日志,删除之后,日志编号将从binlog.000001重新开发 |
purge master logs to 'binlog.******************' | 删除 ****************** 编号之前的所有日志 |
purge master logs before 'yyyy-mm-dd hh24:mi:ss' | 删除日志为 “yyyy-mm-dd hh24:mi:ss”之前产生的日志 |
示例1:删除指定编号之前的所有日志
mysql> purge master logs to 'mysql-bin.000002'
示例2:删除全部日志
mysql> reset master
mysql8.0
以下版本查看当前数据库日志binlog
保存时效 以天为单位,默认0永不过期,最多只能设置99天。
show variables like '%expire_logs_days%';
mysql8.0
以上版本通过设置全局参数binlog_expire_logs_seconds
修改binlog
保存时间,以秒为单位;默认30天。
show variables like '%binlog_expire_logs_seconds%'
SHOW VARIABLES LIKE 'log_bin';
示例2:数据备份和恢复
数据备份
mysqldump -u root -p db1 t_score > backup_t_score.sqlroot:链接名
db1:数据库名
t_score:表名
backup_t_score.sql:备份文件名
查询日志
查询日志中记录了客户端的所有操作语句,而二进制日志不包含查询数据的SQL语句。默认情况下,查询日志是未开启的。
show variables like '%general%';
如果需要开启查询日志,修改/etc/mysql/mysql.conf.d/mysqld.cnf
文件。可以设置以下配置:
[mysqld]
# 该选项用来开启查询日志,可选值:0或1,0代表关闭,1代表开启
general_log=1
# 设置日志的文件名,如果没有指定,默认的文件名为host_name.log
general_log_file=mysql_query.log
修改完毕之后,需要重启mysql
服务。
使用tail
命令实时查看mysql_query.log
日志文件信息。
tail -f mysql_query.log
然后再登录到mysql
,执行以下操作后,在切换到mysql_query.log
日志文件中查看信息。
mysql> show databases;
mysql> use db1;
mysql> show tables;
mysql> select * from t_score;
mysql> select * from t_score where id = 1;
mysql> update t_score set score = score - 1;
....
慢查询日志
慢查询日志记录了所有执行时间超过参数long_query_time
设置值并且扫描记录数不小于min_examined_row_limit
的所有的SQL
语句的日志,默认未开启。long_query_time
默认为10秒,最小为0,精度可以到微秒。
show variables like '%slow_query%';
如果需要开启查询日志,修改/etc/mysql/mysql.conf.d/mysqld.cnf
文件。可以设置以下配置:
[mysqld]
# 慢查询日志
slow_query_log=1
# 执行时间参数
long_query_time=2
修改完毕之后,需要重启mysql
服务。
使用tail
命令实时查看zking-slow.log
日志文件信息。
tail -f zking-slow.log
然后再登录到mysql
,切换至db1
数据库并创建t_log
表(参考资料db.txt
)。将资料中t_log.sql
上传至虚拟机并导入到数据库中。
# 上传t_log.sql
rz t_log.sql
# 导入数据
mysql -uroot -密码 数据库名 < t_log.sql
最后登录mysql
,执行以下SQL
语句并查看慢查询日志文件信息。
mysql> select * from t_log limit 120000,10;
默认情况下,不会记录管理语句,也不会记录不使用索引进行查找的查询。可以使用log_slow_admin_statements
和更改此行为log_queries_not_using_indexes
,如下所示:
[mysqld]
# 记录执行较慢的管理语句
log_slow_admin_statements=1
# 记录执行较慢的未使用索引的语句
log_queries_not_using_indexes=1
相关文章:

Linux之MySQL日志
前言 数据库就像一个庞大的图书馆,而日志则是记录这个图书馆内每一本书的目录。正如在图书馆中找到特定书籍一样,数据库日志帮助我们追溯数据的变更、定位问题和还原状态。 在MySQL中,日志是非常重要的一个组成部分,它记录了数据…...

Redis集群模式—主从集群、哨兵集群、分片集群
主从集群 主从模式中,包括一个主节点(Master)和一个或多个从节点(Slave)。主节点负责处理所有写操作和读操作,而从节点则复制主节点的数据,并且只能处理读操作。当主节点发生故障时,…...

并发工具类(二):CyclicBarrier
1、CyclicBarrier 介绍 从字面上看 CyclicBarrier 就是 一个循环屏障,它也是一个同步助手工具,它允许多个线程 在执行完相应的操作后彼此等待共同到达一个屏障点。 CyclicBarrier可以被循环使用,当屏障点值变为0之后,可以在接下来…...
Spring Cloud全解析:负载均衡之Ribbon简介
Ribbon简介 Ribbon是一种客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起,提供了一系列完善的配置如连接超时、重试等,Ribbon会自动的帮助基于某种规则(如简单轮询、随机连接等)去连接那些机器,也可以自定义的负载均衡…...
Kettle安装与使用指南
1. 介绍 什么是Kettle? Kettle,全称Pentaho Data Integration (PDI),是Pentaho BI套件的一部分。它提供了一个可视化的ETL工具,允许用户通过图形界面设计复杂的数据集成流程。Kettle支持多种数据源,包括关系型数据库…...

教育行业解决方案:智能PPT在教育行业的创新应用
在信息化时代,教育行业面临着巨大的变革。随着人工智能技术的不断发展,传统教学方式正在被重新定义。彩漩科技作为 AI 技术的先行者,推出了歌者 PPT &彩漩 PPT,为教师、学生和家长提供了一种全新的教育体验,实现了…...

Matlab程序练习
Part1 1.求 [100,999] 之间能被 21整除的数的个数。 程序: 主文件:main.m clear; start_num 100; end_num 999; div_num 21; res div(start_num,end_num,div_num); fprintf("[%d,%d]之间能被%d整除的数的个数为%d个\n",start_num,end_…...

cesium可不可以改变影像底图颜色,如何给地球底图影像添加一层滤镜蒙版?
废话:你的球是不是很丑?是不是没有科技感?是不是没有好看的影像? 因果: 因:客户问,底图可不可以改变颜色,想让球更漂亮一些。 答:可以改变影像饱和度,透明度…...

MyBatis-MappedStatement什么时候生成?QueryWrapper如何做到动态生成了SQL?
通过XML配置的MappedStatement 这部分MappedStatement主要是由MybatisXMLMapperBuilder进行解析,核心逻辑如下: 通过注解配置的MappedStatement 核心逻辑就在这个里面了: 继承BaseMapper的MappedStatement 我们看看这个类,里…...
Netty系列-2 NioServerSocketChannel和NioSocketChannel介绍
背景 本文介绍Netty的通道组件NioServerSocketChannel和NioSocketChannel,从源码的角度介绍其实现原理。 1.NioServerSocketChannel Netty本质是对NIO的封装和增强,因此Netty框架中必然包含了对于ServerSocketChannel的构建、配置以及向选择器注册&am…...

智能客服的四大优势,提升企业服务效率
在这个信息化快速发展的时代,客户服务的重要性越来越凸显。传统的客服方式已经无法满足企业日益增长的服务需求,于是智能客服服务应运而生。智能客服服务不仅改变了企业与客户的互动方式,还提高了服务效率和客户满意度。本文将深入探讨智能客…...
AutoGPT开源项目解读
AutoGPT开源项目解读 (qq.com) AutoGPT旨在创建一个自动化的自我改进系统,能够自主执行和学习各种任务 项目基本信息 首先阅读项目的README.md,下述代理和智能体两个名词可互换 项目简介:一个创建和运行智能体的工具,这些智能体…...

Linux离线安装fontconfig
Linux离线下载yum包,安装字体库 一、下载安装包 以CentOS Linux release 7.9.2009下载fontconfig的rpm包的为例 http://mirror.centos.org/centos/7/按提示跳转历史库 找到对应版本的centos https://vault.centos.org/7.9.2009/os/x86_64/Packages/在Packages目…...

海山数据库(He3DB)+AI:(一)神经网络基础
文章目录 1 引言2 基本结构2.1 神经元2.2 模型结构 3 训练过程3.1 损失函数3.2 反向传播3.3 基于梯度的优化算法 4 总结 1 引言 神经网络可以被视为一个万能的拟合器,通过深层的隐藏层实现输入数据到输出结果的映射。神经网络的思想源于对大脑的模拟,在…...
CSS中选择器有哪些?(史上最全选择器)
CSS选择器是用来选择和应用样式到HTML元素上的工具。以下是所有主要的CSS选择器的详细分类和描述: 1. 基本选择器 通配符选择器 (*):选择所有元素。例如,* { color: red; } 会将所有元素的文字颜色设置为红色。元素选择器:选择指…...

本地部署 AI 智能体,Dify 搭建保姆级教程(下):知识库 RAG + API 调用,我捏了一个红楼解读大师
话接上篇: 本地部署 AI 智能体,Dify 搭建保姆级教程(上):工作流 Agent,把 AI 接入个人微信 相信大家已经在本地搭建好 Dify 了。 今日分享,继续介绍 Dify 的另外两项重要功能: 知…...
HarmonyOS应用开发者高级认证,Next版本发布后最新题库 - 答案纯享版
这篇文章是高级题库答案纯享版,只有需要选择的选项。如果需要查看所有选项,可以点击下方链接跳转。以考代学,还是推荐点击下方链接,查看完整的题库,边看边学习鸿蒙应用开发。此题库已更新完毕,笔者将不继续…...
基于PHP的文件包含介绍
引言:在实际开发过程中,经常会遇到部分模块功能需要重复使用的情况,比如数据库的增删改查,文件包含通过将需要重复使用的功能模块代码引入其他文件的内容,实现重用代码、分离配置等。然而,如果文件包含操作…...

K7系列FPGA多重启动(Multiboot)
Xilinx 家的 FPGA 支持多重启动功能(Multiboot),即可以从多个 bin 文件中进行选择性加载,从而实现对系统的动态更新,或系统功能的动态调整。 这一过程可以通过嵌入在 bit 文件里的 IPROG 命令实现上电后的自动加载。而…...

关于武汉芯景科技有限公司的RS232通信接口芯片XJ3243EEUI开发指南(兼容MAX3243EEUI)
一、芯片引脚介绍 1.芯片引脚 2.引脚描述 二、典型应用电路 三、功能描述 1.Transmitter 通过T1,T2可以将TTL电平转换为RS232电平 2.Receiver 通过R1,R2可以将RS232电平转换为TTL电平 3.工作模式控制 4.INVALID引脚...

测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
基于鸿蒙(HarmonyOS5)的打车小程序
1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...
第八部分:阶段项目 6:构建 React 前端应用
现在,是时候将你学到的 React 基础知识付诸实践,构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段,你可以先使用模拟数据,或者如果你的后端 API(阶段项目 5)已经搭建好,可以直接连…...

HTTPS证书一年多少钱?
HTTPS证书作为保障网站数据传输安全的重要工具,成为众多网站运营者的必备选择。然而,面对市场上种类繁多的HTTPS证书,其一年费用究竟是多少,又受哪些因素影响呢? 首先,HTTPS证书通常在PinTrust这样的专业平…...
stm32进入Infinite_Loop原因(因为有系统中断函数未自定义实现)
这是系统中断服务程序的默认处理汇编函数,如果我们没有定义实现某个中断函数,那么当stm32产生了该中断时,就会默认跑这里来了,所以我们打开了什么中断,一定要记得实现对应的系统中断函数,否则会进来一直循环…...
深入浅出JavaScript中的ArrayBuffer:二进制数据的“瑞士军刀”
深入浅出JavaScript中的ArrayBuffer:二进制数据的“瑞士军刀” 在JavaScript中,我们经常需要处理文本、数组、对象等数据类型。但当我们需要处理文件上传、图像处理、网络通信等场景时,单纯依赖字符串或数组就显得力不从心了。这时ÿ…...

关于 ffmpeg设置摄像头报错“Could not set video options” 的解决方法
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/148515355 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…...