MySQL日志管理

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySQL日志管理

屏幕截图 2023-08-28 195743.png

1. 表空间

1.1 说明

独立表空间 : 5.6 开始的默认表空间,一个表一个ibd文件,存储数据行和索引.  *****

共享表空间 : 5.5 默认的模式, 所有表的行和索引都存储到ibdata1

说明: 从5.6 开始,不再使用共享表空间模式

5.6版本  数据字典信息 + UNDO + tmp

5.7版本  把tmp独立了

8.0版本  把UNDO独立

1.2 表空间迁移   *****

(1)创建和原表结构相同的表

(2)新建表的ibd删除

alter table  t1 discard tablespace ;

(3)拷贝原表ibd到新位置

(4)导入ibd到新表

alter table t1 import tablespace;

1.3 ibtmp1 保存临时表

1.4 undo 重做的日志存储位置

2. ACID

原子性

一致性

隔离性

持久性

3. redo   *****

(1) 记录 内存数据页变化日志

(2) 提供 快速的事务的提交(commit)

(3) CSR  redo提供的前滚的功能

4. undo  *****

(1) 记录 数据修改之前的状态

(2) 提供 事务工作过过程中回滚操作(rollback)

(3) CSR 中将未提交的事务进行回滚

5. 隔离级别 *****

RU         : 读未提交,会有脏读 , 幻读 ,不可重复读

RC *****: 读已提交,会有 幻读,不可重复读. 在大部分互联网企业中是可以容忍的.

RR *****: 可重复读:(MVCC ,undo快照)防止不可重复读, 有可能出现幻读,可以用通过GAP+Next LOCK来防止幻读(索引).

SR         : 可串行化:  

6. 不可重复读(现象) *****

7. 幻读(现象)*****

8.  InnoDB核心参数的介绍

#存储引擎默认设置

default_storage_engine=innodb

#表空间模式

innodb_file_per_table=1

# 共享表空间文件个数和大小

innodb_data_file_path=ibdata1:512M:autoextend

# "双一" 标准的其中一个 ******

innodb_flush_log_at_trx_commit=1

Innodb_flush_method=(O_DIRECT, fsync) *****

作用: 控制的是 Redo buffer  和 buffer pool

fsync    :

O_DIRECT :

O_DSYNC  :

最高安全模式

innodb_flush_log_at_trx_commit=1

innodb_flush_method=O_DIRECT

最高性能:

innodb_flush_log_at_trx_commit=0

innodb_flush_method=fsync

redo日志设置有关的

show variables like "innodb_log_buffer_size"; #查看当前日志缓冲区大小

vim /etc/my.cnf

添加:

innodb_log_buffer_size=16777216        #内存日志缓冲区大小
innodb_log_file_size=50331648        #磁盘日志文件大小
innodb_log_files_in_group = 2        #磁盘日志文件文件个数

脏页刷写策略

innodb_max_dirty_pages_pct=25

还有哪些机制会触发写磁盘?

CSR

redo满了

二. 日志管理

1. 错误日志 ***

1.1 作用

排查MySQL运行过程的故障.

1.2 默认配置

默认就开启了.

默认路径和名字: datadir/hostname.err

查看方法: [ERROR]

1.3 人为定制位置

log_error=/tmp/mysql3306.log

重启生效.

select @@log_error;

2. 二进制日志(binlog)******

2.1 作用

(1) 主从要依赖二进制日志

(2) 数据恢复时需要依赖于二进制日志

2.2 如何配置?

(1)参数介绍

默认没有开启.

server_id=6

log_bin=/data/binlog/mysql-bin

说明:

mysql-bin      : 二进制日志文件名的前缀

例如: mysql-bin.000001  ,mysql-bin.000002 ......

binlog_format=row ---> 5.7版本默认配置是row,可以省略.

(2) 参数配置

server_id=6
log_bin=/data/binlog/mysql-bin
binlog_format=row

(3)创建目录和授权

mkidr -p /data/binlog
chown -R mysql.mysql /data
systemctl restart mysqld

2.3 二进制日志记录了什么?

2.3.1 概括

记录的数据库所有变更类的操作日志.

DDL: create  drop alter 
DCL: grant   revoke
DML: insert  update  delete

2.3.2 DDL 和 DCL

以语句的方式,原模原样的记录.

2.3.3 DML

(1) 他记录的已提交的事务

(2) DML记录格式(statement,row,mixed),通过binlog_format=row参数控制 ****

说明:

   statement:SBR,语句模式记录日志,做什么命令,记录什么命令.

   row     :RBR,行模式,数据行的变化

   mixed     :MBR,混合模式

面试问题: SBR和RBR什么区别?怎么选择? ***

SBR:  可读性较强,对于范围操作日志量少,但是可能会出现记录不准确的情况.

RBR:  可读性较弱,对于范围操作日志大,不会出现记录错误.高可用环境中的新特性要依赖于RBR

为什么用RBR? 我们公司对数据的严谨性要求较高,也用到了新型的架构,所以选择RBR

2.4 二进制日志记录单元

2.4.1 event 事件

二进制日志的最小单元

DDL :  

create database event;  事件1

对于DDL等语句是每一个语句就是一个事件

DML: 一个事务包含了多个语句

begin;         事件1

a              事件2

b             事件3

commit;      事件4

2.4.2 event事件的开始和结束号码

作用,方便我们从日志中截取我们想要的日志事件.

2.5 二进制日志的管理

2.5.1 查看二进制日志位置

mysql> show variables like '%log_bin%';

2.5.2 查看所有已存在的二进制日志

mysql> show binary logs;

mysql> flush logs;            #刷新,产生新的二进制日志

mysql> show binary logs;

2.5.3 查看正在使用的二进制日志

mysql> show master status ;

2.5.4 查看二进制日志事件

create database binlog charset utf8mb4;
use binlog
create table t1(id int);
insert into t1 values(1);
show master status ;
show binlog events in 'mysql-bin.000001';    #查看日志中详细事件

2.5.5 查看二进制日志内容

mysqlbinlog mysql-bin.000001        #看语句级日志,不能看行数据
mysqlbinlog --base64-output=decode-rows -vvv mysql-bin.000001   #使用解码的方式,可看行数据
mysqlbinlog -d event mysql-bin.000001     #摘要显示事件号码

2.5.6 截取二进制日志,还原

mysqlbinlog --start-position=219 --stop-position=758 mysql-bin.000001 >/tmp/a.sql
set sql_log_bin=0;  
source /tmp/a.sql;
set sql_log_bin=1;

2.5.7 通过binlog恢复数据

(1) 模拟数据

create database hehe charset utf8mb4;
use hehe;
create table t1(id int);
insert into t1 values(1);
commit;

(2)模拟故障

mysql> drop database hehe;

(3)分析和截取binlog

mysql> show master status ;                            --->确认使用的是哪一个日志
mysql> show binlog events in 'mysql-bin.000001' ;   --->查看事件
说明: 找到起点和终点,进行截取
 mysqlbinlog  --start-position=219 --stop-position=758 /data/binlog/mysql-bin.000002 >/tmp/bin.sql

(4)恢复binlog

mysql> set sql_log_bin=0;    --->临时关闭恢复时产生的新日志
mysql> source /tmp/bin.sql
mysql> set sql_log_bin=1;   --->改回来

2.6 binlog的gtid记录模式的管理 ****

2.6.1 GTID介绍

对于binlog中的每一个事务,都会生成一个GTID号码

DDL ,DCL 一个event就是一个事务,就会有一个GTID号.

DML语句来讲,begin到commit,是一个事务,就是一个GTID号

2.6.2 GTID的组成

server_uuid:TID

cat /usr/local/mysql/data/auto.cnf

[auto]

server-uuid=e2e9b01e-9687-11eb-b577-000c29b0384b

TID是一个:自增长的数据,从1开始

e2e9b01e-9687-11eb-b577-000c29b0384b:1-15

2.6.3 GTID的幂等性

如果拿有GTID的日志去恢复时,检查当前系统中是否有相同GTID号,有相同的就自动跳过

会影响到binlog恢复和主从复制.

2.6.4 GTID的开启和配置

vim /etc/my.cnf
gtid-mode=on
enforce-gtid-consistency=true

2.6.5 查看GTID信息

create database gtid charset utf8mb4;
show master status;
use gtid;
create table t1(id int);
show master status;
insert into t1 values(1);
commit;
show master status;
drop database gtid;

2.6.6 基于GTID,binlog恢复

(1) 截取日志

cd /usr/local/mysql/data/binlog/
mysqlbinlog --include-gtids='820f8917-d358-11ec-b243-000c29cbdce4:1-3' mysql-bin.000001 >/tmp/gtid.sql

(2)恢复

mysql> set sql_log_bin=0;
mysql> source /tmp/gtid.sql
mysql> set sql_log_bin=1;

(3) 报错

ERROR 1049 (42000): Unknown database 'gtid'
Query OK, 0 rows affected (0.00 sec)
ERROR 1046 (3D000): No database selected

为什么报错?

因为幂等性的检查,1-3事务已经做过了.

(4)正确的做法?

mysqlbinlog --skip-gtids --include-gtids='820f8917-d358-11ec-b243-000c29cbdce4:1-3' mysql-bin.000001 >/tmp/gtid.sql
--skip-gtids 作用:在导出时,忽略原有的gtid信息,恢复时生成最新的gtid信息

(5) 恢复

set sql_log_bin=0;
source /tmp/gtid.sql
set sql_log_bin=1;

2.6.7 GTID相关的参数

--skip-gtids 
--include-gtids='e2e9b01e-9687-11eb-b577-000c29b0384b:6','e2e9b01e-9687-11eb-b577-000c29b0384b:8'
--exclude-gtids='e2e9b01e-9687-11eb-b577-000c29b0384b:6','e2e9b01e-9687-11eb-b577-000c29b0384b:8'

3.慢日志(slow-log)

3.1 作用

记录运行较慢的语句,优化过程中常用的工具日志.

3.2 如何配置

## 查看慢日志状态

show variables like '%slow_query_log%';

## 开关

slow_query_log=1

## 文件位置及名字

slow_query_log_file=/data/slow.log

## 设定慢查询时间

long_query_time=0.1

## 没走索引的语句也记录

log_queries_not_using_indexes
vim /etc/my.cnf
slow_query_log=1 
slow_query_log_file=/data/slow.log
long_query_time=0.1
log_queries_not_using_indexes

3.3 模拟慢查询

create database test;
use test;
source /root/t100w.sql
select * from t100w limit 100;
select * from t100w where id=1568;
select * from t100w where num=1100;
select * from t100w where num=102000 order by k1;
select * from t100w where k2='MN88';

3.4 分析慢日志

mysqldumpslow -s c -t 10 /usr/local/mysql/data/slow.log

# 3.5  第三方工具(自己扩展)

下载地址:https://www.percona.com/downloads/percona-toolkit/LATEST/
yum -y install perl-DBI perl-DBD-MySQL perl-Time-HiRes perl-IO-Socket-SSL perl-Digest-MD5 perl-TermReadKey
rpm -ivh percona-toolkit-3.3.0-1.el7.x86_64.rpm
toolkit工具包中的命令:
pt-query-digest  /usr/local/mysql/data/slow.log
Anemometer基于pt-query-digest将MySQL慢查询可视化


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
7天前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
本文介绍了MySQL InnoDB存储引擎中的数据文件和重做日志文件。数据文件包括`.ibd`和`ibdata`文件,用于存放InnoDB数据和索引。重做日志文件(redo log)确保数据的可靠性和事务的持久性,其大小和路径可由相关参数配置。文章还提供了视频讲解和示例代码。
113 11
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
|
1月前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1625 14
|
3天前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL的撤销日志文件和错误日志文件
本文介绍了MySQL的物理存储结构,重点讲解了InnoDB存储引擎中的撤销日志文件(undo log)和错误日志文件。从MySQL 8.0开始,默认生成两个10MB的undo表空间文件,并支持动态扩容和收缩。错误日志文件记录了MySQL启动、运行、关闭过程中的问题,通过示例展示了如何查看和使用这些日志。
|
1月前
|
SQL 存储 关系型数据库
Mysql主从同步 清理二进制日志的技巧
Mysql主从同步 清理二进制日志的技巧
27 1
|
1月前
|
关系型数据库 MySQL 数据库
DZ社区 mysql日志清理 Discuz! X3.5数据库可以做定期常规清理的表
很多站长在网站日常维护中忽略了比较重要的一个环节,就是对于数据库的清理工作,造成数据库使用量增加必须多的原因一般有2个:后台站点功能开启了家园,此功能现在很少有论坛会用到,但是灌水机会灌入大量垃圾信息致使站长长时间未能发觉;再有就是程序默认的一些通知类表单会存放大量的、对于网站日常运行并无意义的通知信息。
68 2
|
25天前
|
存储 关系型数据库 MySQL
MySQL中的Redo Log、Undo Log和Binlog:深入解析
【10月更文挑战第21天】在数据库管理系统中,日志是保障数据一致性和完整性的关键机制。MySQL作为一种广泛使用的关系型数据库管理系统,提供了多种日志类型来满足不同的需求。本文将详细介绍MySQL中的Redo Log、Undo Log和Binlog,从背景、业务场景、功能、底层实现原理、使用措施等方面进行详细分析,并通过Java代码示例展示如何与这些日志进行交互。
50 0
|
3月前
|
API C# 开发框架
WPF与Web服务集成大揭秘:手把手教你调用RESTful API,客户端与服务器端优劣对比全解析!
【8月更文挑战第31天】在现代软件开发中,WPF 和 Web 服务各具特色。WPF 以其出色的界面展示能力受到欢迎,而 Web 服务则凭借跨平台和易维护性在互联网应用中占有一席之地。本文探讨了 WPF 如何通过 HttpClient 类调用 RESTful API,并展示了基于 ASP.NET Core 的 Web 服务如何实现同样的功能。通过对比分析,揭示了两者各自的优缺点:WPF 客户端直接处理数据,减轻服务器负担,但需处理网络异常;Web 服务则能利用服务器端功能如缓存和权限验证,但可能增加服务器负载。希望本文能帮助开发者根据具体需求选择合适的技术方案。
157 0
|
11天前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
117 30
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
1月前
|
XML JSON Java
Logback 与 log4j2 性能对比:谁才是日志框架的性能王者?
【10月更文挑战第5天】在Java开发中,日志框架是不可或缺的工具,它们帮助我们记录系统运行时的信息、警告和错误,对于开发人员来说至关重要。在众多日志框架中,Logback和log4j2以其卓越的性能和丰富的功能脱颖而出,成为开发者们的首选。本文将深入探讨Logback与log4j2在性能方面的对比,通过详细的分析和实例,帮助大家理解两者之间的性能差异,以便在实际项目中做出更明智的选择。
216 3
|
3月前
|
Kubernetes Ubuntu Windows
【Azure K8S | AKS】分享从AKS集群的Node中查看日志的方法(/var/log)
【Azure K8S | AKS】分享从AKS集群的Node中查看日志的方法(/var/log)
131 3