《MySQL数据库》MySQL ERRORLOG,BINLOG,SLOWLOG日志详解
前言
MySQL 经常出现启动错误或者执行错误等等,这个时候我们需要查询error日志
在数据库使用中,经常会出现需要恢复数据的情况,MySQL如果需要恢复数据的话需要开启binlog(二进制日志)。
Error Log
错误日志默认设置如下:
1. error log 默认路径在数据文件下。
2. error log 默认文件名为主机名.err,例如:iZm5e5v2zi93osbr5z21fvZ.err。
自定义设置文件名和路径:
打开MySQL的配置文件 vim /etc/my.cnf 加入如下配置
log_error=/usr/local/mysql/log/mysql.log
Bin Log
1. 配置
mysql 8.0 版本之前,默认不开启,生成建议开启。
my.cnf 文件夹下面参数设置。
server_id = 5 ; # 服务编号,5.7必须要。
log_bin=/data/binlog/mysql-bin # binlog 日志存放目录+前缀,日志文件名例如:mysql-bin.0001 ,注意目录需要提前存在。
sync_binlog=1 # binlog 刷写的策略。1:表示提交只有立即写入磁盘。
binlog_format=row # binlog的记录格式为row模式
重启MySQL之后再对应目录下可以看到如下日志:
其中 mysql-bin.index 是日志索引文件。
重要:binlog 日志建议和数据盘分开存放,防止硬盘坏了的情况。
mysql> select @@log_bin_basename; -- 查询bin_log 存放位置
mysql> select @@log_bin; -- 查询bin_log 是否开启 1:开启
2. 说明
1. binlog 记录内容
binlog 会记录下以下操作:
DDL 操作表结构,字段的语句。
DCL 权限等一些控制语句。
DML 操作表的语句(insert,update,delete),并且是已经提交的,未提交的不会记录
DDL 和 DCL 记录的是你写了啥就记录啥。 DML语句记录方式可以通过参数控制
mysql> select @@binlog_format; -- 5.7 默认ROW, statement:写啥记啥,ROW:记录数据页变化,mixed:混合前两种记录
statement : 可读性高(文本),日志量少,不够严谨(遇到获取当前日期的时候,因为语句是故障时执行的,但是后续通过这种方式无法获取当时的时间点)。
row : 可读性低(二进制),日志量大,严谨。
3. bin log 查看
mysql> show binary logs; -- 查询mysql存在的binlog日志文件
mysql> show master status; -- 查询现在正在使用binlog 日志文件
mysql> show binlog events in 'mysql-bin.000002'; -- 查看当前被使用的binlog 信息
mysqlbinlog mysql-bin.000002 -- 使用mysqlbinlog 命令查看binlog 日志。
mysqlbinlog --base64-output=decode-rows -vvv mysql-bin.000002 -- 该命令可以翻译binlog 下的DML 操作语句,只能用于查看。
mysql> flush logs -- 创建新的日志。后续binlog 就从这个新日志开始
查询日志就可以看到新的日志:
4. 通过binlog 恢复数据
模拟误操作的情况:第9步删除和第13步的drop。
(0) drop database if exists testdb ;
(1) create database testdb charset utf8;
(2) use testdb;
(3) create table t1 (id int);
(4) insert into t1 values(1),(2),(3);
(5) insert into t1 values(4),(5),(6);
(6) commit
(7) update t1 set id=30 where id=3;
(8) commit;
(9) delete from t1 where id=4;
(10)commit;
(11)insert into t1 values(7),(8),(9);
(12)commit;
(13)drop database testdb;
我们要恢复第9步删除和第13步的drop 操作之前的数据
截取binlog 日志,找到起点和终点。 我现在要恢复到drop 操作前: 找到开始位置点和结束位置点, 我需要的 383 到 2048 ,下面的语句就是将日志转化成语句。
mysqlbinlog --start-position=383 --stop-position=2048 /usr/local/mysql/binlog/mysql-bin.000003 > /usr/local/mysql/bin2.sql
还有一种通过实践截取的方式:
mysqlbinlog --start-datetime=200812 21:08:26 --stop-datetime=200912 21:09:09 mysql-bin.000001 mysql-bin.000002 mysql-bin.000003 > /usr/local/mysql/bin2.sql
接下来就是导入SQL文件即可,重点因为这是恢复,所以我们不需要他再记录binlog日志,故导入SQL文件前,先临时关闭binlog. 操作如下:
mysql> set sql_log_bin = 0; -- 关闭binlog日志
mysql> source /usr/local/mysql/bin2.sql -- 导入sql脚本(通过binlog截取出来的)
mysql> set sql_log_bin = 1; -- 开启binlog日志
指定数据库的binlog导出(-d 数据库名):
mysqlbinlog -d testdb --start-position=383 --stop-position=2048 /usr/local/mysql/binlog/mysql-bin.000003 > /usr/local/mysql/bin2.sql
binlog实际场景中的运用方式:
binlog 主要是配和备份数据一起恢复数据库, 先通过备份数据库恢复到比如一个星期前的数据,然后剩下的数据由binlog恢复。
5. binlog 维护命令
mysql> select @@max_binlog_size;
binlog 不要直接删除物理文件:
mysql> select @@expire_logs_days; -- binlog保存天数,0特殊表示永久保存。
mysql> purge binary logs to 'mysql-bin.000002'; -- 删除binlog日志到mysql-bin.000002,也就是把mysql-bin.000001 删除。
purge binary logs before now() - interval 3 day; 根据时间删除,删除3天前的日志。
mysql> reset master; -- 全部删除,操作不建议使用,主从必然会down。
6. binlog(GTID)
GTID(Global Transaction ID) :
mysql> select @@session.gtid_next = 'anonymous'; -- GTID是否开启,1开启
GTID 定义
GTID = source_id :transaction_id 例如:7E11FA47-31CA-19E1-9E56-C43AA21293967:29
gtid-mode=on -- 和参数enforce-gtid-consistency一起开启gtid功能。
enforce-gtid-consistency=true -- 见gtid-mode说明
开启GTID之后对数据库的操作会记录GTID
binlog日志中也记录了GTID。
mysql> select @@server_uuid; -- 查看gtid的uuid
数据文件目录下会存在一个文件:
/usr/local/mysql/mysql-5.7.22-linux-glibc2.12-x86_64/data/auto.cnf 里面也记录了server_uuid。
通过案例说明如何使用gtid恢复数据
(1) create database gtiddb charset utf8;
(2) use gtiddb ;
(3) create table t1 (id int);
(4) insert into t1 values(1),(2),(3);
(5) insert into t1 values(4),(5),(6);
(6) commit
(7) update t1 set id=30 where id=3;
(8) commit;
(9) delete from t1 where id=4;
(10)commit;
(11)insert into t1 values(7),(8),(9);
(12)commit;
(13)glush logs;
(14)insert into t1 values(10);
(15)drop database gtiddb ;
第13步模拟切换日志, 第15步误操作。 需要恢复到第14步。
根据(show binlog events in 'mysql-bin.000002';) 找到恢复数据的gtid起点:8993a5f5-2921-11ea-a866-00163e046b75:2 终点:8993a5f5-2921-11ea-a866-00163e046b75:9
下面是截取命令,我们取2到9 的gtid数据,并且排除7,delete 我们也不要删除。
mysqlbinlog --include-gtids='8993a5f5-2921-11ea-a866-00163e046b75:2-9' --exclude-gtids='8993a5f5-2921-11ea-a866-00163e046b75:7' mysql-bin.000002 mysql-bin.000003 > /usr/local/mysql/gtid.sql
恢复操作和之前是一样的
mysql> set sql_log_bin = 0; -- 关闭binlog日志
mysql> source /usr/local/mysql/gtid.sql; -- 导入sql脚本(通过binlog截取出来的)
mysql> set sql_log_bin = 1; -- 开启binlog日志
上述操作你会发现恢复不了数据,那是为什么呢?
重点:GTID的幂等性:开启GTID后,MySQL恢复Binlog时,重复GTID的事务不会再执行。 那要如何处理呢?
截取日志的时候过滤掉gtid 需要在截取命令中加入参数 --skip-gtids。
mysqlbinlog --skip-gtids --include-gtids='8993a5f5-2921-11ea-a866-00163e046b75:2-9' --exclude-gtids='8993a5f5-2921-11ea-a866-00163e046b75:7' mysql-bin.000002 mysql-bin.000003 > /usr/local/mysql/gtid.sql
小结:binlog 重要性不言而喻,后续真正备份恢复中也需要binlog日志,才能达到真正的恢复如初。
Slow Log
作用:记录慢SQL语句的日志,定位低效SQL语句的工具日志,默认不开启。
配置:
mysql> select @@slow_query_log; -- 控制慢日志是否开启的开关0:不开启,1:开启
mysql> select @@slow_query_log_file; -- 慢日志存放的位置
mysql> select @@long_query_time; --设置时间规则执行多少时间算慢。
mysql> select @@log_queries_not_using_indexes; -- 开启是否记录不走索引的语句,0:关,1:开
案例:准备100万数据量的表。然后执行查询语句,然后查看日志
当你日志庞大的时候,你会发现vi 看不方便,mysql给我们提供了方便看这个信息的命令:
mysqldumpslow -s c -t 5 /usr/local/mysql/mysql-5.7.22-linux-glibc2.12-x86_64/data/iZm5e5v2zi93osbr5z21fvZ-slow.log -- c 表示数量,-t 5 显示前5条。
扩展可以实现:更加方便的展示slowlog日志信息。
Anemometer基于pt-query-digest将MySQL慢查询可视化。
总结
会看MySQL日志是非常重要的,并且MySQL提供的日志非常重要,我们需要能够理解日志原理,更好为MySQL的数据安全,性能提供帮助。
《MySQL数据库》MySQL ERRORLOG,BINLOG,SLOWLOG日志详解的更多相关文章
- Mysql数据库-多实例主从复制-主从故障详解
一.mysql结构 1.实例 1.什么是单实例 一个进程 + 多个线程 + 一个预分配的内存空间 2.多实例 多个进程 + 多个线程 + 多个预分配的内存空间 ](http://shelldon.51 ...
- mysql数据库,安装 !创建!...详解!
package cn.jiayou; /* 一.mysql? a.MySQL是Web世界中使用最广泛的数据库服务器. SQLite的特点? 1.是轻量级.可嵌入,但不能承受高并发访问,适合桌面和移动应 ...
- MySql中innodb存储引擎事务日志详解
分析下MySql中innodb存储引擎是如何通过日志来实现事务的? Mysql会最大程度的使用缓存机制来提高数据库的访问效率,但是万一数据库发生断电,因为缓存的数据没有写入磁盘,导致缓存在内存中的数据 ...
- mysql数据库外键、主键详解
一.什么是主键.外键: 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键 比如 学生表(学号,姓名,性别,班级) 其中每个学生的学 ...
- 【夯实Mysql基础】MySQL在Linux系统下配置文件及日志详解
本文地址 分享提纲: 1. 概述 2. 详解配置文件 3. 详解日志 1.概述 MySQL配置文件在Windows下叫my.ini,在MySQL的安装根目录下:在Linux下叫my.cnf,该文件位于 ...
- MySQL慢查询(二) - pt-query-digest详解慢查询日志 pt-query-digest 慢日志分析
随笔 - 66 文章 - 0 评论 - 19 MySQL慢查询(二) - pt-query-digest详解慢查询日志 一.简介 pt-query-digest是用于分析mysql慢查询的一个工具,它 ...
- MySQL日志文件之错误日志和慢查询日志详解
今天天气又开始变得很热了,虽然很热很浮躁,但是不能不学习,我在北京向各位问好.今天给大家分享一点关于数据库日志方面的东西,因为日志不仅讨厌而且还很重要,在开发中时常免不了与它的亲密接触,就在前几天公司 ...
- mysql二进制日志详解
一.什么是二进制日志 二进制日志主要记录mysql数据库的变化,二进制日志包含所有更新了数据或者潜在更新了数据(如没有匹配到任何行的delete语句),语句以时间的形式保存,描述了数据的更改.二进制日 ...
- mysql用户授权、数据库权限管理、sql语法详解
mysql用户授权.数据库权限管理.sql语法详解 —— NiceCui 某个数据库所有的权限 ALL 后面+ PRIVILEGES SQL 某个数据库 特定的权限SQL mysql 授权语法 SQL ...
随机推荐
- Python程序设计pdf|网盘下载内附提取码
点击此处下载提取码:5o7z 本书提出了以理解和运用计算生态为目标的Python语言教学思想,不仅系统讲解了Python语言语法,同时介绍了从数据理解到图像处理的14个Python函数库,向初学Pyt ...
- HDU Typewriter 6583 dp SAM 卡常
LINK:Typewriter 好久没写SAM了 什么都给忘了. 写了大概2h.感觉被卡常还看了题解. 考虑dp 然后容易想到维护前面的一个j决策 尽可能小. 然后每次考虑向后加一个字符 不过不行就跳 ...
- AT5200 [AGC038C] LCMs 莫比乌斯反演
LINK:LCMs 随便找了道题练习了一下莫比乌斯反演 式子有两个地方化简错误 导致查了1h的错. 讲一下大致思路 容易发现直接做事\(n^2logn\)的. 观察得到数字集合大小为1e6. 可以设\ ...
- 第二次作业:卷积神经网络 part 1
第二次作业:卷积神经网络 part 1 视频学习 数学基础 受结构限制严重,生成式模型效果往往不如判别式模型. RBM:数学上很漂亮,且有统计物理学支撑,但主流深度学习平台不支持RBM和预训练. 自编 ...
- jquery的父级和兄弟级能做多少网页特效
这里说的父级就是parent 兄弟级就是siblings 我这里说一个导航栏用到的特效 主要jquery代码$(this).parent().addClass(“active”).siblings( ...
- Linux集群配置离线ntp时间同步服务
集群中时间不同步有可能会让大数据的应用程序运行混乱,造成不可预知的问题,比如Hbase.mongodb副本集等,Hbase当时间差别过大时就会挂掉,mongodb如果副本时间过快,会出现时间栈帧溢出提 ...
- 618购物节要到了,Python帮你实现商品有货的微信提醒
时间过的真快,不知不觉一年已过了一半,又快到618购物狂欢节了,剁手党们都希望无论是618购物节还是双11购物节,都能够买到便宜又实惠的商品,但是真心实惠的东西往往是紧俏的,经常会出现无货的情况,我们 ...
- 【lhyaaa】2020深圳大湾区比赛总结
又名花样丢分锦集 首先,我们需要来吐槽一下垃圾szccf,毁我青春 居然没有提醒不能用万能头文件,导致一题爆0,据说还有一些结果不是自己答的 emmm-- 进正题 选择题 对包含n个数的序列进行冒泡排 ...
- 洛谷 P4198 楼房重建
思路 此题可转化为以下模型 给定序列\(a[1...n]\),支持单点修改,每次求区间单调栈大小 \(n,Q\le 10^5\) 区间单调栈是什么呢?对于一个区间,建立一个栈,首先将第一个元素入栈,从 ...
- ElasticSearch 7.X版本19个常用的查询语句
整理一篇常用的CRUD查询语句,之前这篇文件是在17年左右发表的,从英文翻译过来,现在采用7.x 版本进行实验,弃用的功能或者参数,我这边会进行更新,一起来学习吧. 为了演示不同类型的 Elastic ...