六mysql日志管理
Posted 哭泣的馒头
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了六mysql日志管理相关的知识,希望对你有一定的参考价值。
此处主要记录binlog日志、慢日志和错误日志,如果日志名称没注明,会使用mysql服务器的主机名
一、binlog日志
binlog是SQL层的功能。记录的是变更SQL语句,不记录查询语句。
1、作用
(1)备份恢复必须依赖二进制日志
(2)主从环境必须依赖二进制日志
2、配置
[mysqld]
server_id=6
log_bin=/data/mysql/data/mysql-bin
binlog_format=row
重启生效
3、binlog功能
binlog是SQL层的功能,记录的是变更SQL语句,不记录查询语句。
DDL、DCL、DML
DDL和DCL
以语句的方式,原样记录
DML记录格式(statement、row、mixed),通过binlog_format=row参数控制
(1)SBR:statement(5.6默认)SBR(statement based replication) :语句模式原封不动的记录当前DML
(2)RBR:row(5.7 默认值) RBR(ROW based replication) :记录数据行的变化(用户看不懂,需要工具分析)
(3)MBR:mixed(混合)MBR(mixed based replication)模式 :以上两种模式的混合(由mysql自行判断使用哪种)
SBR和RBR区别
SBR:可读性高,日志量少(比如sql范围更新语句),可能会产生错误数据(比如sql语句中带now()日期函数)
RBR:可读性差,日志量多,数据安全
数据库默认使用RBR
4、binlog基本操作
(1)查看binlog日志设置
show variables like \'%log_bin%\';
(2)查看当前正在使用的binlog
show master status;
(3)binlog日志文件切换
flush logs
数据库重启
reset master #binlog日志文件名又会从1开始
binlog日志文件达到单个文件最大值
(4)查看binlog单个文件大小设置
show variables like \'max_binlog_size\';
(5)binlog文件的清理
自动清理:
show variables like \'expire_logs_days\';
0代表不清理,如果要设置,就设置全备周期+1的过期时间
手动清理:
purge binary logs to \'mysql-bin.000008\'; #会把mysql-bin.000008之前的清理掉,不会清理mysql-bin.000008
purge binary logs before \'2021-08-21 10:00:00\'; #根据时间清理
5、查看binlog事件
create database qingchen charset utf8mb4;
use qingchen
create table test1(id int,name varchar(10));
insert into test1 values (1,\'aa\'),(2,\'bb\');
show master status;
show binlog events in \'mysql-bin.000001\';
event(事件)二进制日志的最小记录单元
对于DDL,DCL,一个语句就是一个event
对于DML语句来讲:只记录已提交的事务。
例如以下列子,就被分为了4个event
begin; 663 - 742
DML1 742 - 805
DML2 805 - 856
commit; 856 - 887
6、binlog文件内容详细查看
mysqlbinlog /data/mysql/data/mysql-bin.000001
mysqlbinlog --base64-output=decode-rows -vvv /data/mysql/data/mysql-bin.000001 #比较友好一点
mysqlbinlog --start-datetime=\'2021-08-21 10:20:29\' --stop-datetime=\'2021-08-21 11:20:29\' /data/mysql/data/mysql-bin.000001
可以通过mysqlbinlog --help查看帮助命令
7、基于position进行日志截取和恢复
drop database qingchen;
show master status;
show binlog events in \'mysql-bin.000001\';
从创建数据库开始232到drop之前964
mysqlbinlog --start-position=232 --stop-position=964 /data/mysql/data/mysql-bin.000001 >/tmp/qingchen.sql
登录mysql
set sql_Log_bin=0; #暂时关闭binlog日志记录,不然恢复过程的事件也会写进binlog日志文件
source /tmp/qingchen.sql;
set sql_Log_bin=1;
8、binlog的GTID记录模式管理
是对于一个已提交事务的编号,并且是一个全局唯一的编号
对于binlog中的每一个事物都会生成一个GTID号码
DDL和DCL一个event就是一个事物,就会有一个GTID号码
DML语句,begin到commit是一个事物,就会有一个GTID号码
(1)配置
[mysqld]
gtid-mode=on
enforce-gtid-consistency=true #强制GTID一致性
重启生效
(2)查看binlog事件
create database gtid charset utf8mb4;
use gtid
create table test1(id int,name varchar(10));
insert into test1 values (1,\'aa\'),(2,\'bb\');
show master status;
insert into test1 values (3,\'cc\');
insert into test1 values (4,\'dd\');
show master status;
show binlog events in \'mysql-bin.000004\';
(3)GTID日志截取
--include-gtids=\'d133a09b-f889-11eb-8854-000c2924e11c:1-5\',\'d133a09b-f889-11eb-8854-000c2924e11c:8\' ##截取哪些
--exclude-gtids=\'d133a09b-f889-11eb-8854-000c2924e11c:6\',\'d133a09b-f889-11eb-8854-000c2924e11c:9\' ##排除哪些
GTID幂等性:
开启GTID后,如果拿有GTID的日志去恢复,检查当前系统中是否有相同GTID号,有相同的就会跳过,影响binlog操作和主从复制
需要备份的时候添加--skip-gtids参数
(4)基于GTID进行日志截取与恢复
create table test2(id int);
insert into test1 values (5,\'ee\');
drop database gtid;
现在要恢复gtid库和test1表的所有数据,不需要test2
需要gtid 1-7,不包含6
mysqlbinlog --skip-gtids --include-gtids=\'d133a09b-f889-11eb-8854-000c2924e11c:1-7\' --exclude-gtids=\'d133a09b-f889-11eb-8854-000c2924e11c:6\'
/data/mysql/data/mysql-bin.000004 >/tmp/gtid.sql
mysql登录
set sql_Log_bin=0;
source /tmp/gtid.sql;
set sql_Log_bin=1;
二、慢日志
记录慢SQL语句的日志,定位低效SQL语句的工具日志
1、配置
[mysqld]
slow_query_log=1 #开启慢日志
slow_query_log_file=/data/mysql/data/slow.log
long_query_time=0.1 #设置慢查询时间
log_queries_not_using_indexes #设置不走索引的语句也记录
重启生效
2、分析慢日志
mysqldumpslow -s c -t 10 /data/mysql/data/slow.log
三、错误日志
记录启动\\关闭\\日常运行过程中,状态信息,警告,错误
1、配置
[mysqld]
log_error=/var/log/mysql.log
log_timestamps=system #log_timestamps控制记录日志显示时间的参数
重启生效
show variables like \'log_error\';
2、日志内容查看
主要关注[ERROR],看上下文
以上是关于六mysql日志管理的主要内容,如果未能解决你的问题,请参考以下文章