MySQL 日志(二)

本篇将继续介绍MySQL日志的相关内容

目录

一、二进制日志

简介

注意事项 

删除二进制日志

查看二进制日志

二进制日志的格式  

二、服务器日志维护



一、二进制日志

简介

二进制日志中主要记录了MySQL的更改事件(不包含SELECT和SHOW),例如:表的创建和表中数据的修改(增删改)。二进制日志还会将这些更改语句的执行时间记录下来,开启二进制日志会对服务器的性能产生一定消耗。二进制日志中还会记录可能进行数据修改的语句,例如没有匹配到具体行的删除和更新语句。

二进制日志主要用于下面这两种场景:

  • 主从节点数据复制:在主从复制时,从节点服务器会去获取主节点的二进制日志文件,并在从节点服务器上重新执行日志中所记录的修改语句,从而保证主从服务器数据的一致性。
  • 数据恢复:当服务器根据某一时间点的备份文件进行数据恢复时,会去重新执行二进制日志文件中记录的该时间后记录的修改语句,以使服务器恢复到一个最新的状态。

二进制日志中记录的语句中如果包含了用户的密码等信息,会对该信息进行加密处理,不会以文本的形式显示,以保证安全。

我们可以通过下面这条SQL来查询有关二进制日志的相关系统变量

show variables like '%bin%'

 

对于与二进制日志有关的状态变量,我们可以根据下面这条SQL查询:

SHOW STATUS LIKE '%bin%';

                                         

注意事项 

接下来我们来看一下二进制日志相关的注意事项:

• 在Linux中默认启用二进制日志,也就是说,log_bin的默认值为on,如果需要禁用二进制日志可以值定--skip-log-bin 或者 --disable-log-bin选项,如果同时指定了--log-bin选项则后指定的选项优先

• 选项--log-bin的值会被用于指定二进制日志文件的基本名,如果没有指定该选项的值,则默认使用基本名称binlog,通常建议指定一个名称

• 二进制日志文件的文件名由基本名 + 数字扩展名组成,服务器每创建一个新的二进制日志文件时,都会在上一个日志文件的数字扩展名的基准上加1来新的数字扩展名。当服务器中发生如下事件时,会自动创建一个新的二进制日志文件:

  • 服务器启动或者重新启动
  • 服务器执行刷新日志操作
  • 当日志文件大小超过max_binlog_size(该选项表示为单个日志的最大字节数,最小值为4kb,最大为1GB),需要注意的是,二进制日志的值可能会超过max_binlog_size,因为二进制日志是以事务为单位的,它会完整的记录整个任务,,不会出现拆分的情况,因此当记录一个大事务时,即使当前已经超过max_binlog_size指定的值了,也会继续把事务记录完。

 • mysqld会生成一个包含二进制日志文件名的日志索引文件,默认情况下,该索引文件与二进制日志文件具有相同的基本名,扩展名为index。该名称可以通过--log-bin-index来修改。

• 二进制日志文件及其索引文件默认保存在数据目录中,可以通过--log-bin指定绝对路径加基本名来进行修改。--log-bin对应的系统变量为log_bin_basename

• 在MySQL5.7中,启用二进制日志必须指定服务器ID,具体为指定sever_id的值。而在MySQL8.0中,server_id默认为1,在集群环境中,每台MySQL服务器都必须有一个唯一的服务器id.

• 二进制日志会在事务或者语句完成之后,释放锁和提交事务之前进行日志的记录,以保证日志按事务提交的顺序进行记录

• 在一个未提交的事务中,对支持事务的表(InnoDB表)的修改的更改会被缓存,直到服务器收到commit语句,并在commit执行之前,才会将之前的缓存写入到二进制日志文件中。

• 如果发生回滚,则在整个事务中记录一个回滚语句,但是对不支持事务的表(MyISAM表)的修改不能回滚,所有这些修改都会被记录到日志文件,然后复制到从节点

• 非事务的表在执行后会立即存储到二进制日志文件中。而事务表如果没有手动开启事务,则会在每次执行修改语句时都会自动开启一个事务。

• 当处理事务的线程启动时,会分配一个大小为binlog_cache_size的缓冲区来缓存修改语句,如果语句的大小比缓冲区的值大,线程则打开一个临时文件来存储事务,临时文件在线程结束时删除。binlog_cache_use状态变量表示缓冲区存储事务的数量,binlog_cache_disk_use则表示有缓冲区中的事务有多少使用了临时文件,结合这两个状态变量的值,可以将binlog_cache_size的值进行调优,以获得一个最为合适的大小,从而避免使用临时文件。max_binlog_cache_size用来设置缓冲区的最大空间,设置的默认值和最大值都为 4GB,最小为4096字节,如果事务语句大于这个值,事务将会执行失败然后回滚。

删除二进制日志

我们可以使用reset master语句来删除所有的二进制日志文件,或者使用purge binary logs来删除一部分二进制日志文件,具体如下:

reset master #重置二进制日志文件和索引文件为初始状态

purge binary logs to 二进制日志文件 #删除指定的二进制日志文件前面的所有日志文件并更新索引文件

purge binary logs before 时间  #删除指定时间前的所有二进制日志文件并更新索引

查看二进制日志

下面我们来看一下如何查看二进制日志文件:

首先,我们可以通过前面提到过多mysqlbinlog程序来查看,语法如下:

mysqlbinlog 二进制日志文件 > 要导出到的文件地址

其次我们还可以通过SQL语句来查看 ,具体如下:

show  binlog events in 日志名称 from 从第几条语句开始查 limit 查多少条

二进制日志的格式  

在二进制日志中有三种不同的格式,具体如下:

  • 基于语句的日志格式(STATEMENT),记录具体执行的SQL语句
  • 基于行的日志格式(ROW , 默认),记录表中每一行所受到的影响
  • 混合日志记录格式(MIXED),该种格式下,默认使用基于语句的日志记录。如果MySQL认为基于语句的格式不能保证主从复制的数据安全,会自动切换到基于行的日志格式,例如主节点在语句中用了UUID函数,如果记录原始语句会导致从节点生成的值和主节点的不一样,从而导致主从节点数据不一样,因此次时使用基于行的格式来记录UUID的真实值,而不再记录原始SQL语句。

我们可以通过--binlog-format来指定使用哪种格式。 

基于行与基于语句的区别,可以参考下面的内容:

基于语句: update student set age = 18 where id betwenn 10 and 20;

基于行 : update student set age = 18 where id = 10

                 update student set age = 18 where id = 11

                 update student set age = 18 where id = 12

                 update student set age = 18 where id = 13

                .   ....

                 update student set age = 18 where id = 20

                        

二、服务器日志维护

MySQL服务器会创建很多日志文件来记录MySQL的执行情况,但是,随着时间的推移,日志文件可能会增长的非常大,从而耗费大量的磁盘空间,因此我们需要定期备份或者删除旧的日志文件。

在MySQL中,二进制日志文件默认的过期时间为30天,过期后会自动进行删除,,该期限可以通过系统变量binlog_expire_logs_sencond来指定单位为秒,当我们需要使用新的日志文件时,我们可以执行FLUSH LOGS 、 mysqladmin flush-logs,mysqladmin refresh、mysqldump --flush-logs、mysqldump -- master -date等命令来刷新日志。另外当二进制日志文件大小达到max_binlog_size时会自动刷新日志。flush logs支持刷新某一种日志,具体如下:

FLUSH BINARY LOGS # 刷新⼆进制⽇志

FLUSH ERROR LOGS # 刷新错误⽇志

FLUSH GENERAL LOGS # 刷新⼀般查询⽇志

FLUSH RELAY LOGS # 刷新中继⽇志

FLUSH SLOW LOGS # 刷新慢查询⽇志 1

需要注意的是一般查询日志、错误日志,慢查询日志只是关闭并重新打开日志,因此在执行日志刷新时需要特殊操作一下,具体可以参考前面错误日志的刷新。

最后还需要注意在运行时对一般日查询日志和慢查询日志进行改名时,需要先禁用日志(设置general_log、slow_query_log为OFF),然后再重命名,最后再重新启用这两个日志。因为当我们在运行时重命名日志后,MySQL会因找不到原来的日志而保错

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/853519.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java关键字

一、什么是关键字? 关键字是java语言中一些被赋予特定意义的一些单词,不可以把它当做标识符来使用。 在java中有两个特殊的关键字goto、const,我们称这两个关键字为保留字。 二、Java中的关键字有哪些? 1)48个关键…

【刷力扣】23. 合并 K 个升序链表(dummy节点技巧 + 分治思维 + 优先队列)

目录 一、合并升序链表问题二、题目:[21. 合并两个有序链表](https://leetcode.cn/problems/merge-two-sorted-lists/description/)1、掌握dummy节点的技巧 三、题目:[23. 合并 K 个升序链表](https://leetcode.cn/problems/merge-k-sorted-lists/descri…

模拟题1(考虑周全以及情况较多)

牛客小白月赛96(重现赛)D题 题目解析以及注意事项 该题主要是找线路最多和最少的各种情况&#xff0c;从而达到整体连通图的构建代价最小的情况。 注意事项&#xff1a;a,b的正负影响着这个图的线尽可能的多还是少 思路图 { a ≥ b { b < 0 a < 0 : 能连的线都连上 b…

Android 工程副总裁卸任

Android 工程副总裁卸任 Android工程副总裁Dave Burke宣布&#xff0c;他将辞去领导Android工程的职位&#xff0c;将重心转向“AI/生物”项目。不过&#xff0c;他并没有离开Alphabet&#xff0c;目前仍将担任Android系统开发顾问的角色。 Burke参与了Android系统的多个关键…

CSS伪类与伪元素的区别

CSS中的伪类&#xff08;Pseudo-classes&#xff09;和伪元素&#xff08;Pseudo-elements&#xff09;是两个不同的概念&#xff0c;它们的主要区别在于它们的作用和目标。 伪类&#xff08;Pseudo-classes&#xff09; 伪类用于选择处于特定状态的元素。这些状态并不是由HT…

【TypeScript】类型兼容(协变、逆变和双向协变)

跟着小满zs 学习 ts&#xff0c;原文&#xff1a;学习TypeScript进阶类型兼容_typescript进阶阶段类型兼容 小满-CSDN博客 类型兼容&#xff0c;就是用于确定一个类型是否能赋值给其他的类型。如果A要兼容B 那么A至少具有B相同的属性。 // 主类型 interface A {name: string,a…

边界内聚和耦合

内聚 功能内聚 功能内聚是软件工程中一个重要的概念&#xff0c;它描述了一个模块内部各个元素之间的紧密程度。一个具有高功能内聚的模块意味着其内部的各个组件都共同完成一个具体的、明确的功能&#xff0c;并且这些组件之间的联系不是偶然的&#xff0c;而是因为它们共同服…

快手爬票概述

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 无论是出差还是旅行&#xff0c;都无法离开交通工具的支持。现如今随着科技水平的提高&#xff0c;高铁与动车成为人们喜爱的交通工具。如果想要知道…

【C语言】联合(共用体)

目录 一、什么是联合体 二、联合类型的声明 三、联合变量的创建 四、联合的特点 五、联合体大小的计算 六、联合的应用&#xff08;判断大小端&#xff09; 七、联合体的优缺点 7.1 优点 7.2 缺点 一、什么是联合体 联合也是一种特殊的自定义类型。由多个不同类型的数…

SqlSugar 集成

1 关于 SqlSugar SqlSugar 是 .NET/C# 平台非常优秀的 ORM 框架&#xff0c;目前 Nuget 总下载突破 700K&#xff0c;Github 关注量也高达 3.2K&#xff0c;是目前当之无愧的国产优秀 ORM 框架之一。 SqlSugar 官方地址&#xff1a;果糖网 &#xff08; SqlSugar 官网 &#…

LVS三种负载均衡模式:NAT、Tunneling和DR的技术对比

1. LVS-NAT 模式的特性 IP使用&#xff1a;RS&#xff08;Real Server&#xff09;应使用私有地址&#xff0c;RS的网关必须指向DIP&#xff08;Director IP&#xff09;。网络范围&#xff1a;DIP和RIP必须在同一个网段内。数据包处理&#xff1a;请求和响应报文都需要经过Di…

Vue 3 组合式编程:革新前端开发的新时代

Vue.js作为一种流行的前端框架&#xff0c;因其简洁、灵活和高性能而深受开发者喜爱。随着前端开发需求的不断演变和复杂度的增加&#xff0c;Vue.js也在不断地进化和改进。Vue 3的推出标志着Vue.js进入了一个新的阶段&#xff0c;其中最重要的一个变化就是引入了组合式编程&am…

数据库开发——并发控制(第十一章)

文章目录 前言并发执行例题一、封锁二、封锁协议三、可串行调度四、总结 学习目标&#xff1a;重点为并发控制的基本概念及几个基本协议 前言 数据库管理系统必须提供并发控制机制&#xff0c;保证事务的隔离性和一致性 并发执行例题 一、封锁 排他锁称为写锁&#xff0c;共…

react-redux搭建及不同版本间的对比

一.经典版 1. 安装Redux和React Redux npm install redux react-redux 2. 创建action // actions/counterActions.js export const increment () > {return {type: INCREMENT}; };export const decrement () > {return {type: DECREMENT}; };export const add (amo…

atmega8 上传程序

使用icsp 烧写时先关闭串口程序&#xff0c;与串口uart连接相关的电路勿于电脑连接 接触不良 1.使用icsp 上传 1&#xff09;可以直接上传程序 如官方示例blink 或是 serial示例 2&#xff09;可以先烧录bootload 方便下次使用串口上传程序代码 A)使用专门的icsp 上传器上传…

关于二分法的理解(以JS为例)

算法介绍 基本概念 二分查找算法&#xff0c;又称折半查找算法&#xff0c;是一种在有序数组中查找特定元素的高效方法。它的核心思想是将数组分成两半&#xff0c;然后根据目标值与中间元素的比较结果来决定是继续在左半部分还是右半部分进行搜索。 工作原理 初始化&#…

【iOS】如何断点看系统方法在哪一个库

如何断点看系统方法在哪一个库 开源网站如何断点看系统方法在哪一个库1 下符号断点2 符号断点中输入 load &#xff0c;并且开启断点&#xff08;Enable&#xff09;。3 运行程序&#xff0c;触发断点&#xff0c;在堆栈信息中找到load方法&#xff0c;可以看到其在libobjc.A.d…

程序员的wsl2

坑 wsl无法打开 上班时打开wsl2提示 WSL 正在完成升级... Could not write value to key \SOFTWARE\Classes\Directory\shell\WSL. Verify that you have sufficient access to that key, or contact your support personnel. 原因未知&#xff0c;之前并没有更新过&#xff…

【AI+编程】工作日常场景随时可以AI编程,记一个问答SQL快速导出数据日常示例

今天有个场景&#xff0c;我们有个老项目&#xff0c;由于历史原因差不多1年多没使用了&#xff0c;恰巧客户紧急情况要使用。因为当时没有需求&#xff0c;所以V1.0上线后 就没做更新。 需求很简单&#xff1a;我们假定 项目问题表、客户表、问题答案表&#xff0c; 实时查询…

TCP协议报头详解

目录 前言 TCP特点 TCP报头 1.源端口和目的端口 2.序号 3.确认号 4.数据偏移 5.保留 6.控制位 ① 紧急URG&#xff08;URGent&#xff09; ② 确认ACK&#xff08;ACKnowledgment&#xff09; ③ 推送PSH&#xff08;PuSH&#xff09; ④复位RST&#xff08;ReSeT&…