iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >Mysql-binlog的查看
  • 217
分享到

Mysql-binlog的查看

mysql数据库sql 2023-09-03 10:09:47 217人浏览 八月长安
摘要

介绍 简介 Mysql的二进制日志可以说是mysql最重要的日志了,它记录了所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,Mysql的二进制日志是事务安全

介绍

简介

Mysql的二进制日志可以说是mysql最重要的日志了,它记录了所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,Mysql的二进制日志是事务安全型的。一般来说开启二进制日志大概会有1%的性能损耗(参见MySQL官方中文手册 5.1.24版)。二进制有两个最重要的使用场景:
其一:MySQL Replication在Master端开启binlog,Mster把它的二进制日志传递给slaves来达到master-slave数据一致的目的。
其二:自然就是数据恢复了,通过使用mysqlbinlog工具来使恢复数据。

binlog日志概念

binlog全称为:binary,翻译就是二进制文件,主要记录了MySQL在进行DML(数据操作语言)过程中的操作日志。在执行SQL语句的过程中,作为使用者,无需关注程序执行的过程,但是当数据库数据丢失,或者需要搭建数据库主从复制时,则此时的binlog日志文件的重要性就展现出来了。

二进制日志包括两类文件:二进制日志索引文件(文件名后缀为.index)用于记录所有的二进制文件,二进制日志文件(文件名后缀为.00000*)记录数据库所有的DDL和DML(除了数据查询语句)语句事件。

binlog本身是一类二进制文件。二进制文件更省空间,写入速度更快,是无法直接打开来查看的。
因此mysql提供了命令mysqlbinlog进行查看。

一般的statement格式的二进制文件,用下面命令就可以(后面会讲到什么是statement格式)

mysqlbinlog mysql-bin.000001

如果是row格式,加上-v或者-vv参数就行,如

mysqlbinlog -vv mysql-bin.000001 

使用场景

以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的。binlog 的主要目的是复制和恢复。

  • MySQL主从复制:MySQL Replication在Master端开启binlog,Master把它的二进制日志传递给slaves来达到master-slave数据一致的目的
  • 数据恢复:通过使用 mysqlbinlog工具来使恢复数据
  • 查看数据更改记录

数据库操作类型:

在对数据库的日常操作中,MySQL的操作语法,经常使用的几种MySQL指令类型如下

DQL:数据查询语言,例如 where 、group by 、 orderby
DML:数据操作语言,例如 insert、delete、update等
DPL:事务处理语言,例如begin transaction、commit、rollback
DCL:数据控制语言,例如grant 、revoke控制用户访问权限等
DDL:数据定义语言,例如create、drop删除表、索引添加类等

binlog三种模式

fORMat定义优点缺点
statem ent记录的是修改SQL语句日志文件小,节约I0,提高性能准确性差,对一些系统函数不能准确复制或不能复制,如now0.uuid0等
row记录的是每行实际数据的变更准确性强,能准确复制数据的变更日志文件大,较大的网络10和磁盘lO
mixedstatement和row模式的混合准确性强,文件大小适中有可能发生主从不一致问题

业内目前推荐使用的是row模式,准确性高,虽然说文件大,但是现在有SSD和万兆光纤网络,这些磁盘IO和网络IO都是可以接受的。

那么,大家一定想问,为什么不推荐使用mixed模式,理由如下
假设master有两条记录,而slave只有一条记录。
master的数据为

+----+------------------------------------------------------+| id | n |+----+------------------------------------------------------+| 1 | d24c2c7e-430b-11e7-bf1b-00155d016710 || 2 | DDD |+----+------------------------------------------------------+

slave的数据为

+----+-------------------------------------------------------+| id | n |+----+-------------------------------------------------------+| 1 | d24c2c7e-430b-11e7-bf1b-00155d016710 |+----+-------------------------------------------------------+

当在master上更新一条从库不存在的记录时,也就是id=2的记录,你会发现master是可以执行成功的。而slave拿到这个SQL后,也会照常执行,不报任何异常,只是更新操作不影响行数而已。并且你执行命令show slave status,查看输出,你会发现没有异常。但是,如果你是row模式,由于这行根本不存在,是会报1062错误的。

在 MySQL 5.7.7 之前,默认的格式是 STATEMENT,在 MySQL 5.7.7 及更高版本中,默认值是 ROW。

开启binlog

一般来说开启binlog日志大概会有1%的性能损耗。

需要先输入mysql 进入mysql命令行模式

mysql> show variables like 'log_%'; #注意有分号
+----------------------------------------+---------------------------------------+| Variable_name                          | Value     |+----------------------------------------+---------------------------------------+| log_bin    | ON        | ------> ON表示已经开启binlog日志| log_bin_basename                       | /usr/local/mysql/data/mysql-bin       || log_bin_index                          | /usr/local/mysql/data/mysql-bin.index || log_bin_trust_function_creators        | OFF       || log_bin_use_v1_row_events              | OFF       || log_error  | /usr/local/mysql/data/martin.err      || log_output | FILE      || log_queries_not_using_indexes          | OFF       || log_slave_updates                      | OFF       || log_slow_admin_statements              | OFF       || log_slow_slave_statements              | OFF       || log_throttle_queries_not_using_indexes | 0         || log_warnings                           | 1         |+----------------------------------------+---------------------------------------+

如果没有开启

启用binlog,通过配置 /etc/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf 或mysql\bin\my.ini 配置文件的 log-bin 选项:

在配置文件中加入 log-bin 配置,表示启用binlog,如果没有给定值,写成 log-bin=,则默认名称为主机名。(注:名称若带有小数点,则只取第一个小数点前的部分作为名称)

[mysqld]log-bin=my-binlog-name

log-bin后面是binlog的文件名,譬如 log-bin=mysql-bin, 则生成的文件名为:
在这里插入图片描述
然后需要重启mysql

也可以通过 SET SQL_LOG_BIN=1 命令来启用 binlog,通过 SET SQL_LOG_BIN=0 命令停用 binlog。启用 binlog 之后须重启MySQL才能生效。

binlog文件介绍

binlog日志包括两类文件:

二进制日志索引文件(文件名后缀为.index)用于记录所有有效的的二进制文件

二进制日志文件(文件名后缀为.00000*)记录数据库所有的DDL和DML语句事件

binlog是一个二进制文件集合,每个binlog文件以一个4字节的魔数开头,接着是一组Events:

魔数:0xfe62696e对应的是0xfebin;

Event:每个Event包含header和data两个部分;header提供了Event的创建时间,哪个服务器等信息,data部分提供的是针对该Event的具体信息,如具体数据的修改;

第一个Event用于描述binlog文件的格式版本,这个格式就是event写入binlog文件的格式;

其余的Event按照第一个Event的格式版本写入;

最后一个Event用于说明下一个binlog文件;

binlog的索引文件是一个文本文件,其中内容为当前的binlog文件列表

当遇到以下3种情况时,MySQL会重新生成一个新的日志文件,文件序号递增:

  • MySQL服务器停止或重启时

  • 使用 flush logs 命令;

  • 当 binlog 文件大小超过 max_binlog_size 变量的值时;

max_binlog_size 的最小值是4096字节,最大值和默认值是 1GB (1073741824字节)。事务被写入到binlog的一个块中,所以它不会在几个二进制日志之间被拆分。
因此,如果你有很大的事务,为了保证事务的完整性,不可能做切换日志的动作,只能将该事务的日志都记录到当前日志文件中,直到事务结束,你可能会看到binlog文件大于 max_binlog_size 的情况。

binlog日志内容查看

binlog日志有二种查看方式,具体如下:

1、mysql查看binlog

这种方法相当于执行sql语句 在图形化工具中也可直接执行

mysql> show binlog events; #只查看第一个binlog文件的内容(全部的 怎么只看部分呢)mysql> show binlog events ``in 'mysql-bin.000002'``;#查看指定binlog文件的内容 mysql> show binary logs; #获取binlog文件列表 mysql> show master status; #查看当前正在写入的binlog文件
mysql> show binary logs; #获取binlog文件列表 
参数名含义
log bin = (onoff base name)
sql log bin =( onoff )
expire logs days指定自动删除二进制日志的时间,即日志过期时间
log bin index指定mysql-bin.index文件的路径
binlog format = [ mixed | row | statement ]指定二进制日志基于什么模式记录
max binlog size指定二进制日志文件最大值
binlog cache size指定事务日志缓存区大小
max binlog cache size指定二进制日志缓存最大大小
sync binlog = { 0 | n }指定写缓冲多少次,刷一次盘
SHOW BINLOG EVENTS   [IN 'log_name']   [FROM pos]   [LIMIT [offset,] row_count]在二进制日志中显示事件。如果未指定,则显示第一个二进制日志。需要特权。'log_name'SHOW BINLOG EVENTSREPLICATION SLAVE该LIMIT子句与该语句具有相同的语法SELECT。请参见“ SELECT语句”。mysql> show binlog events limit 10;+------------------+-------+----------------+-----------+-------------+-----------------------------------------------------+| Log_name         | Pos   | Event_type     | Server_id | End_log_pos | Info                    |+------------------+-------+----------------+-----------+-------------+-----------------------------------------------------+| mysql-bin.000001 |     4 | Format_desc    |         1 |         123 | Server ver: 5.7.27-log, Binlog ver: 4               || mysql-bin.000001 |   123 | Previous_gtids |         1 |         154 |                         || mysql-bin.000001 |   154 | Anonymous_Gtid |         1 |         219 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                || mysql-bin.000001 |   219 | Query          |         1 |         300 | BEGIN                   || mysql-bin.000001 |   300 | Table_map      |         1 |         412 | table_id: 392 (cactus_000510.360exthost_examinemgr) || mysql-bin.000001 |   412 | Delete_rows    |         1 |        8617 | table_id: 392           || mysql-bin.000001 |  8617 | Delete_rows    |         1 |       12732 | table_id: 392 flags: STMT_END_F                     || mysql-bin.000001 | 12732 | Xid            |         1 |       12763 | COMMIT     || mysql-bin.000001 | 12763 | Anonymous_Gtid |         1 |       12828 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                || mysql-bin.000001 | 12828 | Query          |         1 |       12917 | BEGIN                   |+------------------+-------+----------------+-----------+-------------+-----------------------------------------------------+10 rows in set (0.13 sec)

Binlog Event 简要分析
从一个最简单的实例来分析Event,包括创建表,插入数据,更新数据,删除数据;

CREATE TABLE `test` (  `id` bigint(20) NOT NULL AUTO_INCREMENT,  `age` int(11) DEFAULT NULL,  `name` varchar(255) DEFAULT NULL,  PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;insert into test values(1,22,"小旋锋");update test set name='whirly' where id=1;delete from test where id=1;

日志格式为STATEMENT,查看所有的Event
在这里插入图片描述
日志格式为ROW时是下面这样,可以发现又有一些不同

在这里插入图片描述

2、使用mysqlbinlog工具

以下为普通bash命令 非mysql模式下的了

发出SHOW BINLOG EVENTS with no LIMIT子句可能会启动一个非常耗时和资源消耗的过程,因为服务器将二进制日志的完整内容(包括服务器修改数据的所有语句)返回给客户端。作为替代SHOW BINLOG EVENTS,使用mysqlbinlog实用程序将二进制日志保存到文本文件中,以供以后检查和分析。
而且 show event命令查看了binlog的简单信息,如何查看执行时间、执行花费的时间等详细信息需要使用工具包中的mysqlbinlog命令。

mysqlbinlog是一个查看mysql二进制日志的工具,可以把mysql上面的所有操作记录从日志里导出,这个工具默认的安装路径为:/usr/local/mysql/bin/mysqlbinlog

可以通过find / -name "mysqlbinlog"或者which mysqlbinlog命令查找mysqlbinlog的工具路径。

至于日志文件,参照前面的开启binlog章

基于开始/结束时间:

/usr/local/mysql/bin/mysqlbinlog --start-datetime=``"2013-03-01 00:00:00" --stop-datetime=``"2014-03-21 23:59:59" /usr/local/mysql/``var``/mysql-bin.000007 -r test2.sql
# mysqlbinlog 的执行格式mysqlbinlog [options] log_file ...# 查看bin-log二进制文件(shell方式)mysqlbinlog -v --base64-output=decode-rows /var/lib/mysql/master.000003# 查看bin-log二进制文件(带查询条件)mysqlbinlog -v --base64-output=decode-rows /var/lib/mysql/master.000003 \    --start-datetime="2019-03-01 00:00:00"  \    --stop-datetime="2019-03-10 00:00:00"   \    --start-position="5000"    \    --stop-position="20000"

截取结果其中的一段进行分析:

# at 21019#190308 10:10:09 server id 1  end_log_pos 21094 CRC32 0x7a405abc     Query   thread_id=113   exec_time=0 error_code=0SET TIMESTAMP=1552011009;BEGIN;

上面输出包括信息:

position: 位于文件中的位置,即第一行的(# at 21019),说明该事件记录从文件第21019个字节开始timestamp: 事件发生的时间戳,即第二行的(#190308 10:10:09)server id: 服务器标识(1)end_log_pos 表示下一个事件开始的位置(即当前事件的结束位置+1)thread_id: 执行该事件的线程id (thread_id=113)exec_time: 事件执行的花费时间error_code: 错误码,0意味着没有发生错误type:事件类型Query

在这里插入图片描述
发现BINLOG 处的内容我们看不明白。。。_

增加 --base64-output=decode-rows –v 选项解析

(base64-output,可以控制输出语句输出base64编码的BINLOG语句;decode-rows:选项将把基于行的事件解码成一个SQL语句)

/mysql/app/mariadb/bin/mysqlbinlog --no-defaults --database=db --base64-output=decode-rows -v --start-datetime='2019-04-11 00:00:00' --stop-datetime='2019-04-11 15:00:00' mysql-bin.000007 | more

在这里插入图片描述
变成人类可以读懂的SQL语句了;

PS: 可以把binlog解析后的内容放到一个文件后,在分析,利用如下脚本

/mysql/app/mariadb/bin/mysqlbinlog --no-defaults --database=db --base64-output=decode-rows -v --start-datetime='2019-04-11 00:00:00' --stop-datetime='2019-04-11 15:00:00' mysql-bin.000007 >/tmp/binlog007.sql
mysqlbinlog --no-defaults --base64-output=decode-rows -v   mysql-bin.000002 

怎么删binlog

删binlog的方法很多,有三种是常见的
(1) 使用reset master,该命令将会删除所有日志,并让日志文件重新从000001开始。
(2) 使用命令

PURGE { BINARY | MASTER } LOGS { TO ‘log_name’ | BEFORE datetime_expr }
1
例如

purge master logs to “binlog_name.00000X”
1
将会清空00000X之前的所有日志文件.
(3) 使用–expire_logs_days=N选项指定过了多少天日志自动过期清空。

来源地址:https://blog.csdn.net/S_ZaiJiangHu/article/details/129936072

您可能感兴趣的文档:

--结束END--

本文标题: Mysql-binlog的查看

本文链接: https://www.lsjlt.com/news/392048.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Mysql-binlog的查看
    介绍 简介 MySQL的二进制日志可以说是MySQL最重要的日志了,它记录了所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全...
    99+
    2023-09-03
    mysql 数据库 sql
  • mysql 怎么查看binlog
    怎查看binlog binlog本身是一类二进制文件。二进制文件更省空间,写入速度更快,是无法直接打开来查看的。 因此mysql提供了命令mysqlbinlog进行查看。 一般的statement格式...
    99+
    2023-09-15
    mysql 数据库 sql
  • mysql binlog如何查看
    小编给大家分享一下mysql binlog如何查看,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!    &n...
    99+
    2024-04-02
  • MySQL的binlog日志的简介与查看
    您好,我是码农飞哥(wei158556),感谢您阅读本文,欢迎一键三连哦。 💪🏻 1. Python基础专栏,基础知识一网打尽,9.9元买不了吃亏,买不了上当。 P...
    99+
    2023-10-22
    mysql 数据库 java SpringBoot 原力计划
  • Mysql Binlog数据查看的方法详解
    binlog介绍 binlog,即二进制日志,它记录了数据库上的所有改变. 改变数据库的SQL语句执行结束时,将在binlog的末尾写入一条记录,同时通知语句解析器,语句执行完毕. binlog格式 基于语...
    99+
    2024-04-02
  • mysql binlog查看历史sql执行记录
    前情提要 最近有开发同学把测试库的数据干没了,反馈说是orm做了字段text转mediumtext操作导致的。 作为变更字段类型,且是兼容的理论上不可能存在这个问题,所以为了一探究竟他到底说的是不是假...
    99+
    2023-09-03
    mysql sql 数据库
  • mysql查看binlog日志乱码怎么解决
    在MySQL中查看binlog日志时出现乱码可能是因为字符编码不匹配的原因。可以尝试以下方法解决: 确保客户端和服务端的字符编码设...
    99+
    2024-04-09
    mysql
  • 如何使用SHOW binlog events查看binlog内容
    本篇内容主要讲解“如何使用SHOW binlog events查看binlog内容”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用SHOW binlog ...
    99+
    2024-04-02
  • mysql中如何查看binlog二进制日志
    这篇文章给大家分享的是有关mysql中如何查看binlog二进制日志的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。例如,在创建新表或更新现有表上的数据时,这些事件将存储在mysq...
    99+
    2024-04-02
  • 如何使用mysqlbinlog查看binlog
    这篇文章主要介绍了如何使用mysqlbinlog查看binlog,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。示例[root@iz2ze6j...
    99+
    2024-04-02
  • 【mysql实践】如何查看阿里云RDS的MySQL库中的binlog日志
    背景: 工作中我们为了查看MySQL中数据修改的历史记录时,会通过查看binlog日志。但由于binlog日志是二进制文件,需要解析之后,才能用文本查看工具打开。这次笔者使用flink进行实时统计时就...
    99+
    2023-10-12
    mysql 阿里云 数据库
  • MySQL如何查询Binlog 生成时间
    目录前言脚本介绍使用案例1. 查询 binlog index 文件2. 使用脚本查询时间前言 本篇文章介绍如何查询 Binlog 的生成时间。云上 RDS 有日志管理,但是自建实例没有,该脚本可用于自建实例闪回定位 Bi...
    99+
    2023-03-19
    mysql查询Binlog
  • MySQL如何查询Binlog生成时间
    目录前言脚本介绍使用案例1. 查询 binlog index 文件2. 使用脚本查询时间前言 本篇文章介绍如何查询 Binlog 的生成时间。云上 RDS 有日志管理,但是自建实例没...
    99+
    2023-03-19
    mysql查询Binlog 生成时间 mysql查询Binlog
  • MySQL怎么查询Binlog生成时间
    这篇文章主要介绍“MySQL怎么查询Binlog生成时间”,在日常操作中,相信很多人在MySQL怎么查询Binlog生成时间问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL怎么查询Binlog生成时间...
    99+
    2023-07-05
  • 清理MySQL中的binlog
    Mysql的binlog开启后一直没清理,占用太大空间 1.查看binlog过期时间 show variables like 'expire_logs_days'; expire_logs_days=0: 这里的值如果为0,表示所...
    99+
    2023-08-31
    mysql 服务器 数据库 linux 运维
  • MySQL查看锁的sql
    MySQL查看锁的sql 查看数据库状态 # 会显示加锁的信息等等show engine innodb status; 查看正在执行的线程信息 show full processlist; 查看正在锁的表 show open table...
    99+
    2023-08-18
    mysql sql 数据库
  • 怎么根据日期来查询mysql的binlog日志
    本篇内容介绍了“怎么根据日期来查询mysql的binlog日志”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成...
    99+
    2024-04-02
  • 【mysql】binlog日志
    目录 1.1 基本说明1.2 binlog日志格式1.3 binlog日志查看1.4 binlog日志删除1.5 binlog操作示例 1.1 基本说明 1....
    99+
    2023-09-01
    mysql 数据库 sql
  • MySQL Binlog Digger V4.7
    ### 描述 ###  MySQL Binlog Digger是一个基于图形界面的binlog挖掘分析工具,可以为数据恢复提供undo sql回滚语句,它免安装,能对在线binlog与离线binlog进...
    99+
    2024-04-02
  • MySQL的binlog怎么使用
    这篇文章主要介绍了MySQL的binlog怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MySQL的binlog怎么使用文章都会有所收获,下面我们一起来看看吧。MySQ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作