一、简介

1. 分类

Mysql有不同的日志文件,用来存储不同类型和功能的日志,分为二进制日志错误日志通用查询日志慢查询日志。Mysql8.0又新增两种日志:中继日志数据定义语句日志

2. 弊端

  • 日志会降低mysql数据库的性能,需要花费额外时间记录日志。
  • 日志会占用大量磁盘空间。

二、通用查询日志(general query log)

1. 介绍

正如他的名字一样,该日志会记录用户的所有操作,包括启动和关闭mysql服务,所有用户的连接开始时间和结束时间、发给mysql的所有sql指令。

2. 相关变量

show variables like '%general%'

set GLOBAL general_log=on;
set GLOBAL general_log_file='/path/filename'

如果开启了以后,可以直接通过vim查看通用查询日志。

3.备份

如果删除或者改名了原来的日志文件,使用如何命令重新生成查询日志文件:

mysqldadmin -uroot -p flush-logs

三、错误日志(error log)

1. 介绍

错误日志记录了mysql服务器启动、停止运行的时间,以及系统启动、运行和停止过程中的诊断信息,包括错误、警告和提示等。
该日志默认是开启的,而且无法被禁止。
默认情况下,错误日志存储/var/log下,名称默认为mysqld.log

2. 备份

#mysql5.5.7以前不用执行第一句
install -omysql -gmysql -m0644 /dev/null /var/log/mysqld.log
mysqldadmin -uroot -p flush-logs

四、二进制日志(bin log)

1. 介绍

它记录了数据库所有执行的ddl和dml等数据库更新事件语句,但是不包括没有修改数据的语句(select、show等)。
它的主要应用场景有两个:

  • 用于数据恢复,通过查看用户执行了哪些操作,可以实现数据的增量恢复。
  • 用于数据复制,master把二进制文件传递给slaves来达到master-slave数据一致的目的。

2. 相关变量

show variables like '%log_bin%'


log_bin_trust_function_creators:表示是否信任存储函数
log_bin_use_v1_row_events: on表示使用版本1二进制日志行,off表示使用版本2二进制日志行

show variables like '%binlog_format%'


binglog有如下3种格式:

  • statement: 每一条修改的sql都会记录在binlog中。好处是不需要记录每行的变化,减少日志量,节约io。
  • row: 保存那条记录被修改。可以避免存储过程或函数无法正确复制的问题。
  • mixed:5.1.8以后提供,是statement和row的结合。

3. 永久性设置

修改mysql的my.cnf或my.ini文件:

log_bin = xxxx # 日志名
binlog_expire_logs_seconds=600 # 日志保存时间,s
max_binlog_size=100M # 单个日志大小,当前日志文件大小超过此变量,执行切换动作。默认大小为1GB。该设置不是严格遵守的。

4. 查看日志

mysql每重启一次,就会生成一个bin log文件。查看当前binlog列表及其大小:

show binary logs


所有对数据库的修改都会记录在binlog中,单binlog是二进制文件,无法直接查看,想要查看需要借助mysqlbinlog命令工具。

mysqlbinlog "日志文件路径/名字"

默认打开后,并没有具体的sql语句,而是记录了一些事件:

  • Query事件,负责开始一个事务。
  • Table_map事件,负责映射需要的表。
  • Update_rows事件,复制写入数据。
  • Xid事件,复制结束事务。
mysqlbinlog -v "日志文件路径/名字" # 将行事件以伪sql形式表示出来

5. 恢复数据

可以使用mysqlbinlog工具从指定时间点开始到另外一个时间点的日志中恢复数据。

mysqlbinlog [option] filename | mysql -uroot -p

option有几个重要参数:

  • --start-date--stop-date :可以指定数据库恢复的起始时间和结束时间
  • --start-position--stop-position :可以指定恢复数据的开始位置和结束为止
  • --database=“”:指定数据库

如果是用位置恢复,需要使用如下命令来获取为止:

show binlog events in 'binlog 文件名'

6. 删除二进制日志

mysql的二进制文件可以配置自动删除,也可以安全的手动删除的方法。
PURGE MASTER LOGS 删除指定部分:

PURGE {MASTER | BINARY} LOGS TO '指定文件名' # 删除创建时间早于xxx的日志
PURGE {MASTER | BINARY} LOGS BEFORE '指定日期' # 删除xxxx时间前创建的所有日志。

RESET BINARYLOGS 删除所有:

7. 两阶段提交

binglog的写入策略由参数sync_binlog控制,默认是0。表示每次提交都只写到操作系统缓存中,由系统判断什么时候执行刷盘。为1时,表示每次提交都会刷盘。当大于1时,表示累计到n个事务时才刷盘。
innodb更新一条指定数据的过程如下:

edo log与binlog都写一次的话,也就是存在以下两种情况:

  1. 先写binlog,再写redo log:当前事务提交后,写入binlog成功,之后主节点崩溃。在主节点重启后,由于没有写入redo log,因此不会恢复该条数据。而从节点依据binlog在本地回放后,会相对于主节点多出来一条数据,从而产生主从不一致。
  2. 先写redo log,再写binlog:当前事务提交后,写入redo log成功,之后主节点崩溃。在主节点重启后,主节点利用redo log进行恢复,就会相对于从节点多出来一条数据,造成主从数据不一致。

此时,如果发生崩溃,就可以根据redolog和binlog进行恢复。
在写入redo log时,会顺便记录XID,即当前事务id。在写入binlog时,也会写入XID。因此存在以下三种情况:

  1. 如果在写入redo log之前崩溃,那么此时redo log与binlog中都没有,是一致的情况,崩溃也无所谓。
  2. 如果在写入redo log prepare阶段后立马崩溃,之后会在崩恢复时,由于redo log没有被标记为commit。于是拿着redo log中的XID去bin log中查找,此时肯定是找不到的,那么执行回滚操作。
  3. 如果在写入bin log后立马崩溃,在恢复时,由redo log中的XID可以找到对应的bin log,这个时候直接提交即可。

总的来说,在崩溃恢复后,只要redo log不是处于commit阶段,那么就拿着redo log中的XID去binlog中寻找,找得到就提交,否则就回滚。在这样的机制下,两阶段提交能在崩溃恢复时,能够对提交中断的事务进行补偿,来确保redo log与binlog的数据一致性。


MySQL高级篇——日志相关推荐

  1. MySQL高级篇知识点——其它数据库日志

    目录 1.其他数据库日志 1.1.日志类型 1.2.日志的弊端 2.慢查询日志 (slow query log) 3.通用查询日志 (general query log) 3.1.问题场景 3.2.查 ...

  2. 【MySQL高级篇笔记-MySQL事务日志(下) 】

    此笔记为尚硅谷MySQL高级篇部分内容 目录 一.redo日志 1.为什么需要REDO日志 2.REDO日志的好处.特点 3.redo的组成 4.redo的整体流程 5.redo log的刷盘策略 6 ...

  3. mysql高级篇学习笔记

    目录 前言 1 mysql安装及运行(linux环境) 1.1 安装前检查 1.2 MySQL卸载 ①**关闭 mysql 服务** ②**查看当前 mysql 安装状况** ③**卸载上述命令查询出 ...

  4. mysql高级篇(二)mysql索引优化分析

    mysql高级篇笔记 mysql高级篇(一)mysql的安装配置.架构介绍及SQL语句的复习. mysql高级篇(二)mysql索引优化分析. mysql高级篇(三)查询截取分析(慢查询日志).主从复 ...

  5. MySQL高级篇知识点——索引优化与查询优化

    目录 1.数据准备 1.1.建库建表 1.2.创建相关函数 1.3.创建存储过程 1.4.调用存储过程 1.5.删除某表上的索引 2.索引失效案例 2.1.全值匹配 2.2.最佳左前缀匹配原则 2.3 ...

  6. MySQL高级篇(事务视图存储过程与函数)

    目录 一.事务 1.1什么是事务? 1.2事务的特性 1.3事务的分类 1.4事务的操作步骤 1.5事务的隔离级别(面试题常考) 二.视图 2.1视图的操作 2.1.1视图的创建 2.1.2视图更新( ...

  7. MySQL高级篇知识点——MySQL 事务日志

    目录 1.redo 日志 1.1.为什么需要 REDO 日志? 1.2.REDO 日志的好处与特点 1.3.redo 的组成 1.4.redo 的整体流程 1.5.redo log 的刷盘策略 1.6 ...

  8. MySQL高级篇——聊聊MySQL的慢查询日志

    文章目录: 1.数据库服务器的优化步骤 2.查看系统性能参数 3.定位执行慢的 SQL:慢查询日志 4.查看 SQL 执行成本:SHOW PROFILE 1.数据库服务器的优化步骤 当我们遇到数据库调 ...

  9. 程序猿必备技能之MySQL高级篇

      MySQL是我们非常常用的关系型数据库,非常重要,所以在这里给大家整理下MySQL的高级内容. 1. MySQL高级特性 1.1. MySQL体系结构 Client Connectors: 接入方 ...

最新文章

  1. php python 函数互相翻译的网站
  2. C#学习笔记-stream,win8.1开发小记
  3. zentao这php,ZenTaoPHP后面计划
  4. DW1000 TX POWER (发射功率) 解析
  5. C语言第五次博客作业
  6. 微信小程序之换肤的功能
  7. PHP Socket编程(转)
  8. SAP License:STMS权限
  9. CSS和CSS3中的伪元素和伪类(总结)
  10. python 拼音 英文识别_识别同音字词pypinyin, 分词 jieba
  11. 关于期权池Option Pools与Vesting:码农创业防身必备法器
  12. tensorflow+python flask进行手写识别_python+flask搭建CNN在线识别手写中文网站!简直太屌了!...
  13. 电脑有网,microsoft edge浏览器无法上网
  14. 第50节:初识搜索引擎_上机动手实战多搜索条件组合查询
  15. etcdctl的使用[v3版本]
  16. QQ邮箱验证码登录(移动端邮箱验证登录)
  17. 星际争霸汉化java_星际争霸2地图编辑器:银河编辑器语言类似Java/C/PHP
  18. 教程get | K8S部署OpenStack容器云(下)
  19. 科技巨头Software AG遭攻击,关闭445高危端口后,Windows共享用不了,怎么办?
  20. Square:从今天开始抛弃Fragment吧!

热门文章

  1. 解决Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask
  2. Kali Linux 与 BackTrack Linux
  3. sysbench花式采坑之一:自增值导致的TPS不可靠
  4. mp3文件怎么转换格式
  5. 数学无敌—王老菊教你当典狱长
  6. Java 蜡烛图_7-13 日K蜡烛图 - osc_9vrg5zhs的个人空间 - OSCHINA - 中文开源技术交流社区...
  7. Unity中实现赛车游戏
  8. 鸿蒙开发(2)---Button组件
  9. go使用zap + lumberjack重构项目的日志系统
  10. 洛谷题目AC代码总结(未完成,日更题目中)