本文深入解析MySQL数据库的日志系统,全面介绍四种核心日志(通用日志、错误日志、二进制日志、慢查询日志)的功能特性、配置管理和实际应用。重点剖析二进制日志(binlog)的配置优化、数据恢复机制、日志截取与备份策略,以及慢查询日志的分析方法。涵盖从日志基础概念到高级管理技巧的完整知识体系,为数据库管理员提供日志管理与故障恢复的实战指南。
1.概述
任何一种数据库中,都会有各种各样的日志,记录这数据库工作的方方面面,以帮助数据库管理员追踪数据库曾经发生过的各种事件;
主要是针对数据库server层产生的数据信息,主要用于记录和数据库服务运行本身有关的日志、以及SQL语句操作执行相关的日志;
日志是数据库系统的"黑匣子",记录数据库运行的各种事件和操作信息,帮助管理员追踪系统状态、诊断问题、恢复数据。MySQL日志系统主要记录与数据库服务器运行相关的各种信息,包括连接会话、错误事件、数据变更和性能瓶颈等。
2.日志常用分类
| 序号 | 日志名称 | 解释说明 |
|---|---|---|
| 01 | general_log | 表示查询日志(通用日志),默认日志状态处于关闭,可以进行在线调整配置 作用:记录了客户端从会话连接开始,执行过的所有SQL语句信息; |
| 02 | log_error | 表示错误日志(运行日志),默认日志状态处于激活 作用:记录了数据库服务启动和停止时,以及服务器在运行过程中发生任何严重错误时的相关信息; |
| 03 | log_bin | 表示二进制日志(binlog日志),默认日志状态处于激活(8.0之后) 作用:记录了所有的DDL语句和DML语句,但是不包括数据库查询语句;语句以事件的形式保存,描述了数据的更改过程,此日志对于灾难时的数据恢复起着极其重要的作用。 |
| 04 | slow_query_log | 表示慢查询日志,记录了所有执行时间超过参数long_query_time设置值并且扫描记录数小于min_examined_row_limit的所有SQL语句的日志。 |
3.general_log(通用日志)
sh
#查看日志
mysql> show variables like '%log%';
#查看通用日志是否开启
mysql> select @@general_log;
+---------------+
| @@general_log |
+---------------+
| 0 |
+---------------+
1 row in set (0.00 sec)
-- 默认日志功能处于关闭,建议在需要做调试工作时(功能测试、语句审计)可以打开;
general_log_file=/data/3306/data/general-01.log
-- 定义日志文件存储的路径信息,建议日志文件路径与数据存放路径进行分离;
# 修改日志默认状态(激活日志):
mysql > set global general_log=1;
说明:企业真实环境,由于日志记录量比较大,所以不建议打开此日志记录功能,可以在有需要时打开,支持在线配置调整;
4. log_error(错误日志)
sh
mysql> select @@log_error;
+-------------+
| @@log_error |
+-------------+
| ./db01.err |
+-------------+
1 row in set (0.00 sec)
# 修改日志存储路径(永久配置):
[root@db01 ~]# vim /etc/my.cnf
log_error=/data/3306/log_error/mysql3306.err
-- 配置文件编写完毕后,需要重启数据库服务生效
说明:企业真实环境,日志处于默认激活记录状态,可以使用错误日志信息做故障诊断,记录错误信息级别为note warning error;
5. log_bin(二进制日志)
-
在进行增量恢复数据时,需要先了解什么是binlog日志,此日志文件其实就是用于记录对数据库进行操作更改的语句信息的;
-
并且记录更改的语句信息以事件形式进行记录,但是需要注意的是查询相关的语句是不会被记录的,比如:select、show;
-
然而作为所有对数据库的改操作事件信息都会被记录,比如:insert、update、create、drop...
01 日志信息基本配置
sh
mysql> show variables like '%log_bin%';
+---------------------------------+------------------------------+
| Variable_name | Value |
+---------------------------------+------------------------------+
| log_bin | ON |
| log_bin_basename | /data/3306/data/binlog |
| log_bin_index | /data/3306/data/binlog.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
| sql_log_bin | ON |
+---------------------------------+------------------------------+
-- 默认处于激活状态
# 配置信息简写方式:开启数据库binlog日志记录功能
[root@db01 ~]# vim /etc/my.cnf
-- 激活binlog日志记录功能,需要对数据库服务配置文件进行编辑修改
[mysqld]
server_id=6
log_bin=/data/3306/data/binlog/mysql-bin
-- 进行binlog日志目录路径信息修改时,需要创建指定的目录并设置权限信息,最后需要重新启动数据库服务生效;
或者
log_bin=binlog
-- 只是设置日志名称信息,日志会自动保存到数据库服务指定的数据目录中;
# 配置文件修改后需要重启数据库服务,加载配置文件改动的信息:
[root@db01 ~]# /etc/init.d/mysqld restart
[root@db01 ~]# ll -h /data/3306/data/binlog*
-rw-rw----. 1 mysql mysql 245 6月 24 02:19 /data/3306/data/binlog.000001
-rw-rw----. 1 mysql mysql 16 6月 24 02:19 /data/3306/data/binlog.index
-- 数据库服务重启后,已经可以在数据库的数据存储目录中,看到binlog日志文件的踪影
说明:企业真实环境,日志处于默认激活记录状态,可以使用日志信息进行灾难数据恢复,以及可以用于实现主从复制;
02 参数补充
sql
# 参数一:sync_binlog 表示刷新日志到磁盘策略
mysql> select @@sync_binlog;
-- 在进行主从同步过程的双一标准的其中一个1的信息配置,主要是控制缓冲区里的binlog日志信息如何刷写到磁盘中;
-- 此参数信息是有三种方式进行配置的:
-- 参数信息配置0:表示由操作系统缓存自己决定,什么时候刷新日志到磁盘中;
-- 参数信息配置1:表示每次事务提交,立即刷新日志到磁盘中;(此方式配置更安全)
-- 参数信息配置N:表示每组事务提交,按照组的事务次数定义,确定刷新日志到磁盘中的频次;(可以有效减少IO性能损耗)
-- 参数官方资料链接:https://dev.mysql.com/doc/refman/8.0/en/replication-options-binary-log.html
MySQL双一设置参考文档:
https://www.cnblogs.com/oldboy-heqing/articles/16952280.html
# 参数二:binlog_format 定义binlog日志的格式信息
mysql> select @@binlog_format;
-- 在进行主从同步数据恢复时,此参数配置可能会影响数据恢复的一致性问题;
-- 此参数信息是有三种方式进行配置的,确定了主从复制的级别,只针对DML语句的日志才有效;
-- 参数信息配置 statement(SBR):语句格式记录binlog;
create database A; -- DDL DCL语句只能使用statement 表示的就是原原本本的语句信息,即做什么就记录什么;
-- 参数信息配置 row(RBR):行格式记录binlog(默认模式)
update t1 set a=10 where id<10; -- 会记录行的变化信息,属于底层的记录信息,可能会有多个变化日志信息记录
-- 参数信息配置 mixed(MBR):混合格式记录binlog
-- 由数据库服务自行决定,是记录语句信息,还是记录行的变化信息;
| 记录方式 | 优点说明 | 缺点说明 |
|---|---|---|
| statement(SBR) | 可读性强,日志量相对较少; | 数据信息可能不准确,数据一致性不足 |
| row(RBR) | 数据信息记录更准确,数据一致性更强 | 可读性弱,日志量相对较多,数据记录准确 |
03 日志信息查看
sql
方式一:确认数据库binlog日志数量
mysql> show binary logs;
-- 获取数据库服务运行过程中,使用的binlog日志的情况
mysql> flush logs;
-- 可以执行flush刷新命令,从而生成新的binlog日志文件,类似于实现了日志切割功能;
方式一:确认数据库binlog日志状态
mysql> show master status;
+---------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000019 | 332 | | | |
+---------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
方式三:查看数据库binlog日志信息
mysql> show binlog events in 'binlog.000002';
-- binlog日志信息是以事件方式进行记录的,所以日志查看过程是查看事件信息
-- 一般binlog日志的前两行,表示日志格式头信息(日志简单的描述信息)
-- 一般binlog日志中的query信息,就是对数据库的操作语句,其中包含了创建数据库的语句;
方式四:筛选数据库binlog日志事件
# 模拟生成binlog日志事件信息
mysql> source ~/world.sql;
mysql> drop database world;
mysql> source ~/world.sql;
# 获取删除数据库的事件信息:
# 筛选数据库日志方式一:
[root@liux data]# mysql -e "show binlog events in 'binlog.000002'"|grep "drop database"
binlog.000002 722789 Query 1 722896 drop database world /* xid=5363 */
-- 获取指定事件信息产生的起点位置和终点位置信息;
# 筛选数据库日志方式二:
mysql> pager less
-- 在数据库中定义pager功能,数据库连接会话退出即失效;
mysql> show binlog events in 'binlog.000002';
-- 此时查看日志事件信息具有了翻页功能
/drop database
| binlog.000002 | 722789 | Query | 1 | 722896 | drop database world /* xid=5363 */
mysql> pager grep "drop database"
PAGER set to 'grep "drop database"'
-- 表示开启数据库pager的过滤功能
mysql> show binlog events in 'binlog.000002';
| binlog.000002 | 722789 | Query | 1 | 722896 | drop database world /* xid=5363 */
-- 再次查看binlog事件信息时,只过滤显示删除数据库的操作事件日志
方式五:mysqlbinlog 查看日志
[root@db01 ~]# mysqlbinlog /data/3306/data/binlog.000019
[root@db01 ~]# mysqlbinlog --base64-output=decode-rows -vvv /data/3306/data/binlog.000019
-- --base64-output=decode-rows -vvv 参数信息,表示将DML的ROW格式语句信息,进行格式化处理输出
说明:在实际生产环境中,若binlog日志量比较大时,需要快速过滤关键日志事件行,可以使用以上查看日志方法;
04 通过二进制日志恢复数据库
sh
# 需要恢复建库开始,删除之前的所有操作(即所有binlog日志信息),实现日志信息的截取
mysql> show binlog events in 'binlog.000002';
-- 查看截取日志信息事件区域范围
[root@db01 ~]# mysqlbinlog --start-position=233 --stop-position=1162 /data/3306/data/binlog.000003 >/tmp/bin.sql
-- 依据binlog日志的position号码,即可获取到想要恢复数据信息;
# 根据截取的日志信息,进行数据库服务数据恢复
mysql> set sql_log_bin=0;
-- 建议在进行数据日志恢复数据时,将数据恢复时执行的SQL语句信息,不做binlog日志记录;
mysql> source /tmp/bin.sql
# 查看确认数据信息是否恢复
05 日志截取
所需日志跨越多个文件,如何进行日志信息的截取
解决方案:
-
A计划:只有position号的方式,可以进行分段截取,进行分段恢复数据;
-
B计划:根据Datatime时间信息方式,可能会出现准确性不高的情况(因为每一秒可能有多个事件产生);
-
C计划:启用GTID(全局事务ID)方式,无论跨越多少个日志文件,每个事务操作的事件ID信息都是唯一且递增的(5.6+引入);
基于GTID方式对binlog进行管理(利用GTID实现日志截取)
-
GTID概念介绍:
GTID(global transation id)称为全局事务(事件)ID,标识binlog日志记录的唯一性;
| 表现形式 | 关键列 | 解释说明 |
|---|---|---|
| server_uuid:N | server_uuid | 表示数据库初始化启动之后,自动生成的随机数信息(唯一的) |
| N | 表示第几个相关的事务或事件信息,会不断进行自增 |
-
GTID功能作用:
利用GTID方式管理binlog,实质上就是对于数据库的每个事务产生事件信息打上唯一标识信息(id号);
利用GTID方式管理binlog,主要目的是处理数据库主从问题,解决主从数据库的数据一致性问题;
简单描述:标识事务的唯一性,保证日志恢复时的一致性,并且具备"幂等性";
sql
1. server_uuid信息查看
方式一:
mysql> select @@server_uuid;
方式二:
[root@db01 ~]# cat /data/3306/data/auto.cnf
[auto]
server-uuid=67a92c4d-5c3d-11ee-abf2-000c2992b86e
2. gtid参数配置查看是否开启
mysql> select @@gtid_mode;
+-------------+
| @@gtid_mode |
+-------------+
| OFF |
+-------------+
-- 设置是否开启显示gtid信息功能(在5.7之后是有个匿名的gtid,是数据库系统自己维护的)
mysql> select @@enforce_gtid_consistency;
+----------------------------+
| @@enforce_gtid_consistency |
+----------------------------+
| OFF |
+----------------------------+
-- 设置是否开启GTID强制一致性功能
-- 对某些 SQL 会有限制,例如 CREATE TABLE ... SELECT 必须得分成两条语句执行。
-- OFF: 表示事务允许违反 GTID 一致性。
-- ON: 表示事务不允许违反 GTID 一致性,有相关 SQL 会直接返回异常。
-- WARN:表示事务允许违反 GTID 一致性,但会将警告信息记录到 ERROR LOG。
mysql> select @@log_slave_updates;
+---------------------+
| @@log_slave_updates |
+---------------------+
| 1 |
+---------------------+
-- 和配置主从有关(在8.0.26开始 推荐配置log_replica_updates替代log_slave_updates参数)
-- 此参数表示从服务器从主服务器接收的更新信息,是否也会记录在从服务器本地的二进制文件中
3. gtid功能激活
[root@db01 ~]# vim /etc/my.cnf
[mysqld]
gtid_mode=on
enforce_gtid_consistency=1
log_slave_updates=on
-- 配置文件信息修改完毕后,重启数据库服务使配置生效
利用GTID恢复数据:
sh
1. 数据库异常恢复情况环境准备:
# 刷新新的binlog日志进行操作
mysql> flush logs;
-- 生成新的binlog日志信息
# 确认新的日志编号是否是连续的
mysql> create database test5;
mysql> show binlog events in 'binlog.000021';
-- 可以看出新的binlog日志文件中,记录的gtid编号信息是延续了上一个binlog日志gtid集合信息,继续连续进行记录;
# 进行基本的数据库SQL语句操作:
mysql> create database gtdb;
mysql> use gtdb;
mysql> create table t1(id int);
mysql> insert into t1 values(1);
mysql> insert into t1 values(2);
mysql> insert into t1 values(3);
# 进行binlog事件信息查看
mysql> show binlog events in 'binlog.000021';
-- 可以获取以上的数据操作事件信息
2. 数据库模拟异常情况破坏操作
mysql> drop database gtdb;
3. 数据库异常情况数据恢复操作
# 根据日志信息查看相关的事件情况(获取GTID编号范围)
mysql> show binlog events in 'binlog.000021';
# 需要恢复建库开始,删除之前的所有操作(即所有binlog日志信息),实现日志信息的截取
[root@db01 ~]# mysqlbinlog --include-gtids='67a92c4d-5c3d-11ee-abf2-000c2992b86e:2-6' /data/3306/data/binlog.000021 >/tmp/gtid.sql
[root@db01 ~]# cat /tmp/gtid.sql
-- 依据binlog日志的GTID信息,即可获取到想要恢复数据信息;
# 根据截取的日志信息,进行数据库服务数据恢复
mysql> set sql_log_bin=0;
-- 建议在进行数据日志恢复数据时,将数据恢复时执行的SQL语句信息,不做binlog日志记录;恢复后别忘在改为1;
mysql> source /tmp/gtid.sql
-- 默认此时报错恢复失败,因为GTID截取的日志恢复数据时,具有幂等性,由于binlog中已经记录了2-6的GTID事件信息
# 利用GTID日志信息恢复报错处理方式一:将系统中日志中的GTID信息清除掉(不建议)
# 利用GTID日志信息恢复报错处理方式二:删除与幂等性冲突的记录信息
[root@db01 ~]# mysqlbinlog --skip-gtids --include-gtids='67a92c4d-5c3d-11ee-abf2-000c2992b86e:2-6' /data/3306/data/binlog.000021 >/tmp/gtid.sql
--skip-gtids表示跳过gtid的检查过程,即截取的日志中不再含有GTID的配置语句信息,自然解决了幂等性冲突问题;
-- 开启了GTID之后,依然可以使用pos方式进行日志信息截取与恢复;
# 查看确认数据信息是否恢复
mysql> use gtdb;
mysql> show tables;
mysql> select * from t1;
-- 查看test1数据库中的t1表的数据信息是否恢复
#扩展知识:可以实现排除指定gtid信息不做日志记录截取
--exclude-gtids='7afe4f8c-5e36-11ed-b083-000c29d44f34:4'
06 利用日志恢复数据
如何从日志文件中恢复单库、单表、或者部分行数据信息
解决方案:
-
A计划:可以利用命令单独截取某个数据库的日志信息;
mysqlbinlog -d world xxx > xxxx -
B计划:可以借助第三方工具实现单表或部分数据恢复;
binlog2sql(python)过滤指定表数据或过滤指定表的部分数据;
A计划:单库日志信息截取,企业实战过程:
sh
1. 数据库异常恢复情况环境准备
# 查看获取当前binlog日志状态信息
mysql> flush logs;
mysql> show master status;
# 进行基本的数据库SQL语句操作:
# 进行基本的数据库SQL语句操作:
mysql> create database test1;
mysql> use test1;
mysql> create table t1 (id int);
mysql> insert into t1 values(1);
mysql> insert into t1 values(2);
mysql> select * from t1;
-- 创建了一个test1数据库,并在数据库中创建了一个表,在表中插入了一些数据信息
mysql> create database test2;
mysql> use test2;
mysql> create table t2 (id int);
mysql> insert into t2 values(1);
mysql> insert into t2 values(2);
-- 创建了一个test2数据库,并在数据库中创建了一个表,在表中插入了一些数据信息
mysql> use test1;
mysql> insert into t1 values(3);
mysql> insert into t1 values(4);
mysql> use test2;
mysql> insert into t2 values(3);
mysql> insert into t2 values(4);
mysql> select * from test1.t1;
mysql> select * from test2.t2;
-- 通过操作不同的数据库,以及不同的数据表,实现binlog日志事件信息的交叉
2. 数据库模拟异常情况破坏操作
mysql> drop database test1;
3. 数据库异常情况数据恢复操作
# 根据日志信息查看相关的事件情况
mysql> show binlog events in 'binlog.000024';
# 需要恢复建库开始,删除之前的所有操作(即所有binlog日志信息),实现日志信息的截取
[root@db01 ~]# mysqlbinlog --skip-gtids --start-position=648 --stop-position=3529 -d test1 /data/3306/data/binlog.000024 >/tmp/bin.sql
-- 依据binlog日志的position号码,即可获取到想要恢复数据信息,并利用-d参数导出指定数据库相关数据;
# 根据截取的日志信息,进行数据库服务数据恢复
mysql> set sql_log_bin=0;
-- 建议在进行数据日志恢复数据时,将数据恢复时执行的SQL语句信息,不做binlog日志记录;恢复后别忘在改为1;
mysql> source /tmp/bin.sql
# 查看确认数据信息是否恢复
mysql> use test1;
mysql> show tables;
mysql> select * from t1;
-- 查看test1数据库中的t1表的数据信息是否恢复
mysql> use test2;
mysql> show tables;
mysql> select * from t2;
-- 查看test2数据库中的t2表的数据信息是否破坏
mysql> set sql_log_bin=1;
B计划:可以借助第三方工具实现单表或部分数据恢复
利用binlog2sql工具可以处理上面的企业需求,此软件是利用python语言开发的,主要用来处理binlog日志信息;
从软件应用方面来说主要包含两个核心功能:
- 可以友好的展示或者管理二进制日志信息(binlog),进而可以过滤出单独表的信息,甚至表中指定行的信息;
- 可以快速的实现DML操作语句的闪回功能,即实现通过日志信息翻转方式,进行数据信息的恢复;
说明:binlog2sql工具是模拟了一个从库,进行日志信息分析,需要保证数据库服务启动状态,且不支持离线方式分析日志内容;
sh
1. 数据库异常恢复情况环境准备:
[root@db01 ~]# cd /opt/
[root@db01 opt]# git clone https://github.com/danfengcao/binlog2sql.git
[root@db01 opt]# ll
drwxr-xr-x 6 root root 138 Oct 9 16:09 binlog2sql
[root@db01 opt]# cd /opt/binlog2sql
-- 此工具在mariadb中可以通过打补丁方式,进行部署安装;但是在mysql 8.0中暂时还没有集成,需要单独安装
# 部署第三方工具运行环境
[root@db01 binlog2sql]# yum install -y python3
[root@db01 binlog2sql]# pip3 install -r requirements.txt
[root@db01 binlog2sql]# pip3 show pymysql
[root@db01 binlog2sql]# pip3 install --upgrade pymysql (此步骤可以忽略)
-- 以上pip3下载软件缓慢,可以优化pip3下载源
-- 下载源优化方法:https://developer.aliyun.com/mirror/pypi?spm=a2c6h.13651102.0.0.3e221b11H9Q7La
# 在指定数据库中创建多个数据表
mysql> use test1;
mysql> create table t11 (id int);
mysql> insert into t11 values (1),(2);
2. 数据库日志信息工具分析查看:(解析日志事件SQL)
[root@db01 binlog2sql]# python3 binlog2sql.py -h10.0.0.51 -uroot -p12366 -d test1 -d t1 --start-file='binlog.000024'
-- sql-type参数只能过滤DML类型语句信息,一般常见过滤的是 insert update delete
-- 在获取删除操作语句命令后加 -B 参数,正好获得了反转语句的操作信息
07 日志滚动切割
在应用binlog日志过程中,经常需要对日志文件进行日志切割(滚动更新),可以有效避免日志文件数据量过大问题;
在某些场景中,如果需要对binlog日志文件进行备份操作时,也可以对原有使用的binlog日志文件进行滚动更新;
sh
# 方法一:
mysql> flush logs;
-- 滚动更新前的日志文件就会处于静止状态,不会在进行数据信息的更新
# 方式二:(可以写个定时任务自动刷新)
[root@liux ~ ]# mysqladmin -uroot -p12366 -h10.0.0.51 flush-logs
# 方式三:
mysql> restart;
-- mysql 8.0之后支持的数据库中重启服务;之前的版本只支持shutdown关闭数据库;
[root@liux ~ ]# /etc/init.d/mysqld restart
# 方式四:
mysql> select @@max_binlog_size;
-- 配置binlog日志最大数据存储量,默认大小为1G,到达最大日志存储量也会进行自动切割;
08 日志信息清理方法
在系统中日志信息,随着时间的推移将会越来越多,将严重占用磁盘空间,因此需要对日志做相应清理工作;
sql
方式一:进行日志信息自动清理
mysql> show variables like '%expire%';
+--------------------------------+---------+
| Variable_name | Value |
+--------------------------------+---------+
| binlog_expire_logs_seconds | 2592000 |
| expire_logs_days | 0 |
+--------------------------------+---------+
3 rows in set (0.00 sec)
-- 在最新数据库8.0中,可以以秒为单位进行日志信息清理,默认是30天进行日志清理,或者也可以以天为单位进行清理;
-- 在最先数据库8.0前,主要是以天为单位进行清理,但默认清理功能并未激活;
-- 在企业实战环境中,建议过期时间最少保留一轮全备周期以上,有条件最好是保留两轮+1;
方式二:进行日志信息手工清理
mysql> help purge binary logs;
-- 获取清理日志命令帮助信息
mysql> purge binary logs to 'binlog.000015'
-- 删除到指定日志文件前结束
mysql> PURGE BINARY LOGS BEFORE '2019-04-02 22:46:26';
-- 可以基于日志时间点信息进行日志清理
说明:在对数据库服务日志信息进行清理时,最好使用数据库服务自带的清理工具进行清理,不建议使用rm做日志清理;
09 日志信息远程备份(mysqlbinlog)
可以实现将数据库中(特别是主库)生成的binlog日志文件,及时备份保存到专门的日志备份服务器中,并且整个备份操作都是在线的;
sql
[root@db02 ~]# mkdir -p /binlog_backup
[root@db02 binlog_backup]# cd /binlog_backup/
[root@db02 binlog_backup]# mysqlbinlog -R --host=10.0.0.51 --user=root --password=12366 --raw --stop-never binlog.000008 &
-- 备份过程可以放后台一直运行,但是需要注意当连接的数据库服务器停止或重启了,也会导致备份中断;
# 数据库服务多实例情况binlog日志备份
mysqlbinlog -R --host=10.0.0.51 -P 3306 --user=root --password=12366 --raw --stop-never binlog.000002 &
mysqlbinlog -R --host=10.0.0.51 -P 3307 --user=root --password=12366 --raw --stop-never binlog.000002 &
-- 需要考虑备份后日志文件名称一样的覆盖问题
-R 读取binlog日志文件从数据库服务端
--raw 指定binlog日志信息记录二进制信息
--stop-never 指定binlog日志信息将会一直备份记录
binlog.000008 代表从哪个binlog日志开始进行备份
6. slow_log(慢日志)
慢日志主要是用于以文本形式记录数据库服务运行过程中,执行过程较慢的语句;
利用慢日志信息生成的信息,可以在日常巡检过程中,通过日志定位SQL语句性能问题;
sql
1. 慢日志基本配置
mysql> select @@slow_query_log;
-- 此参数配置信息,表示是否激活启动慢日志记录功能,默认处于关闭状态
mysql> select @@slow_query_log_file;
-- 此参数配置信息,表示慢日志文件保存的路径信息;建议日志文件路径与数据存放路径进行分离;
mysql> select @@long_query_time;
-- 此参数信息配置,表示记录慢日志的条件,默认是大于10s执行的语句,就会记录为慢查询语句;(建议时间为0.01~0.1)
mysql> select @@log_queries_not_using_indexes;
-- 此参数信息配置,表示慢日志中会记录没有使用索引的语句信息;
# 修改日志默认状态(激活日志):
mysql> set global slow_query_log=1;
mysql> set global long_query_time=0.01;
mysql> set global log_queries_not_using_indexes=1;
-- 可以对以上参数信息进行在线调整,也可以将以上参数编写到数据库my.cnf配置文件中,作为永久配置;
2. 查看核实慢日志文件是否生成
ll /data/3306/data/db01-slow.log
cat /data/3306/data/liux-01-slow.log
-- 会按照执行语句的操作时间顺序,进行慢查询日志信息的记录
3. 日志信息分析方法
[root@xdb01 ~]# mysqldumpslow -s c -t 3 /data/3306/data/db01-slow.log
-- 按照慢查询语句的重复执行次数(c)进行排序(-s),取出其中靠前(t)的前三名慢查询语句
-- 还可以扩展使用pt-query-digest更好的分析慢查询日志,支持图形化展示
-- what to sort by (al, at, ar, c, l, r, t), 'at' is default
7.总结
MySQL日志系统是数据库管理的核心组件,掌握日志管理技术对于保障数据安全、优化系统性能、快速故障恢复至关重要。通过本文的系统学习,您应该能够:
- 全面理解:掌握MySQL四大日志的核心功能和应用场景
- 熟练配置:能够根据业务需求合理配置和优化日志参数
- 实战恢复:具备利用二进制日志进行数据恢复的能力
- 性能优化:通过慢查询日志分析和优化SQL性能
- 生产管理:建立完善的日志监控、备份和维护体系
在数据驱动决策的时代,可靠的日志系统不仅是技术保障,更是业务连续性的基石。通过系统化的日志管理,可以构建透明、可靠、高效的数据平台,为企业的数字化转型提供坚实支撑。
日志管理是一项需要持续学习和实践的技术,随着MySQL版本的演进和新技术的发展,日志管理的理念和工具也在不断更新。保持学习的态度,结合实际工作不断积累经验,才能成为真正的日志管理专家。