返回顶部

日志管理

常用的日志

 

错误日志

作用

  • 排查MySQL运行过程的故障.

查看

select @@log_error;

  

配置

vim /etc/my.cnf
log_error=/tmp/mysql3306.log
systemctl restart mysqld

二进制日志(binlog)

作用

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

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

binlog配置 /etc/my.cnf

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

说明:

  • /data/binlog : 提前定制好的目录,而且要有mysql.mysql的权限

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

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

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

创建目录和授权

mkdir -p /data/binlog/
chown -R mysql.mysql /data

重启生效

systemctl restart mysqld

binlog记录了什么

binlog是SQL层的功能。记录的是变更SQL语句,不记录查询语句。

记录SQL语句种类

  • DDL :原封不动的记录当前

  • DDL(statement语句方式)。

  • DCL :原封不动的记录当前DCL(statement语句方式)。

  • DML :只记录已经提交的事务DML

DML记录方式

(1) 他记录的已提交的事务
(2) DML记录格式(statement,row,mixed),通过binlog_format=row参数控制
说明:
	statement:SBR,语句模式记录日志,做什么命令,记录什么命令.
	row		 :RBR,行模式,数据行的变化
	mixed	 :MBR,混合模式

SBR和RBR什么区别?怎么选择?(面试)

SBR:  可读性较强,对于范围操作日志量少,但是可能会出现记录不准确的情况.
RBR:  可读性较弱,对于范围操作日志大,不会出现记录错误.
	  高可用环境中的新特性要依赖于RBR
我们公司对数据的严谨性要求较高,也用用到了新型的架构,所以选择RBR

event(事件)

事件的简介

二进制日志的最小记录单元
对于DDL,DCL,一个语句就是一个event
对于DML语句来讲:只记录已提交的事务。
例如以下列子,就被分为了4个event
begin;      120  - 340
DML1        340  - 460
DML2        460  - 550
commit;     550  - 760

event的组成

三部分构成:
(1) 事件的开始标识
(2) 事件内容
(3) 事件的结束标识
Position:
开始标识: at 194
结束标识: end_log_pos 254
194? 254?
某个事件在binlog中的相对位置号
位置号的作用是什么?
为了方便我们截取事件

日志文件查看

查看二进制日志位置

show variables like '%log_bin%';

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

show binary logs;

flush logs;
show binary logs;

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

  • file:当前MySQL正在使用的文件名

  • Position:最后一个事件的结束位置号

show master status;

event查看

create database binlog charset utf8mb4;
use binlog
create table t1(id int);
insert into t1 values(1);
show binlog events in 'mysql-bi.000004'; 

 说明

Log_name:binlog文件名
Pos:开始的position    *****
Event_type:事件类型
Format_desc:格式描述,每一个日志文件的第一个事件,多用户没有意义,MySQL识别binlog必要信息
Server_id:mysql服务号标识
End_log_pos:事件的结束位置号 *****
Info:事件内容*****
补充:
SHOW BINLOG EVENTS
   [IN 'log_name']
   [FROM pos]
   [LIMIT [offset,] row_count]

binlog文件内容详细查看

mysqlbinlog mysql-bin.000004
mysqlbinlog --base64-output=decode-rows -vvv mysql-bi.000004
# 只查看某个库的二进制文件
mysqlbinlog -d haoge mysql-bi.000004

截取二进制日志

mysqlbinlog --start-position=219 --stop-position=335 /data/binlog/mysql-bi.000004 >/tmp/a.sql

案例:通过binlog恢复数据

模拟数据

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

模拟故障

drop database haoge;

分析

# 确认使用的是哪一个日志
show master status;
# 查看事件
show binlog events in 'mysql-bi.000004';

截取binlog(命令行)

mysqlbinlog --start-position=823 --stop-position=1420 /data/binlog/mysql-bi.000004 >/tmp/bin.sql

恢复binlog

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

binlog日志的GTID新特性

GTID介绍

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

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

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

GTID的组成

severi_uuid:TID
severi_uuid? 
cat /data/mysql/data/auto.cnf
TID是一个:自增长的数据,从1开始
server-uuid=245034f3-5dcd-11ea-b87b-00163e09c1f2:1-15 

GTID的幂等性

  • 如果拿有GTID的日志去恢复时,检查当前系统中是否有相同GTID号,有相同的就自动跳过会影响到binlog恢复和主从复制.

GTID的开启和配置

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

查看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;

 基于GTID,binlog恢复

截取日志

mysqlbinlog --include-gtids='d60b549f-9e10-11e9-ab04-000c294a1b3b:1-3' /data/binlog/mysql-bi.000005 >/tmp/gtid.sql

 恢复

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

报错

为什么报错?

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

正确的做法

mysqlbinlog --skip-gtids --include-gtids='245034f3-5dcd-11ea-b87b-00163e09c1f2:1-3' /data/binlog/mysql-bi.000005 >/tmp/gtid.sql

恢复 

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

GTID相关的参数

  • --skip-gtids

  • --include-gtids='d60b549f-9e10-11e9-ab04-000c294a1b3b:6','d60b549f-9e10-11e9-ab04-000c294a1b3b:8'

  • --exclude-gtids='d60b549f-9e10-11e9-ab04-000c294a1b3b:6','d60b549f-9e10-11e9-ab04-000c294a1b3b:8'

二进制日志其他操作

自动清理日志

# 查看过期时间
show variables like '%expire%';

设置过期时间

# 临时生效
set global expire_logs_days=8;
永久生效:
my.cnf
expire_logs_days=15;
企业建议,至少保留两个全备周期+1的binlog

手工清理

PURGE BINARY LOGS BEFORE now() - INTERVAL 3 day;
PURGE BINARY LOGS TO 'mysql-bin.000010';
PURGE BINARY LOGS BEFORE '2008-04-02 22:46:26';
注意:不要手工 rm binlog文件 1. my.cnf binlog关闭掉,启动数据库 2.把数据库关闭,开启binlog,启动数据库 删除所有binlog,并从000001开始重新记录日志

reset master; 主从关系中,主库执行此操作,主从环境必崩  

 日志是怎么滚动

flush logs; 
重启mysql也会自动滚动一个新的
日志文件达到1G大小(max_binlog_size)
| max_binlog_size                          | 1073741824     
备份时,加入参数也可以自动滚动

慢日志(slow-log)

作用

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

配置参数说明

## 开关
slow_query_log=1 
## 文件位置及名字 
slow_query_log_file=/data/mysql/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/mysql/slow.log
long_query_time=0.1
log_queries_not_using_indexes
systemctl restart mysqld

模拟慢查询

select * from city;
select * from city where name!='ds';

分析慢查询

mysqldumpslow参数说明

  • -s排序

  • -c数量

  • -t top 获取前几个

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

第三方工具分析慢日志

https://www.percona.com/downloads/percona-toolkit/LATEST/
yum install perl-DBI perl-DBD-MySQL perl-Time-HiRes perl-IO-Socket-SSL perl-Digest-MD5
toolkit工具包中的命令:
pt-query-diagest  /data/mysql/slow.log

  

 

posted @ 2020-03-05 00:19  Crazymagic  阅读(247)  评论(0编辑  收藏  举报