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…...

【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...

select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...

基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...

20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...