错误日志 排查MySQL运行过程的故障
默认配置 默认开启 datadir/hostname.err
查看方法 [ERROR]
人为定制位置 log_error=/tmp/mysql3306.log 重启生效
查找位置 select @@log_error;
二进制日志(binlog)
主从要依赖二进制日志,数据恢复时需要依赖于二进制日志
默认没有开启,配置
server_id=6
log_bin=/data/binlog/mysql-bin
/data/binlog 提前定制好的目录,而且要有mysql.mysql的权限
mysql-bin 二进制日志文件名的前缀
binlog_format=row 5.7版本默认配置是row,可以省略
创建目录和授权
mkdir -p /data/binlog/
chown -R mysql.mysql /data
/etc/init.d/mysqld restart
二进制日志记录 记录的数据库所有变更类的操作日志(DDL,DCL,DML)
DDL和DCL 以语句的方式原模原样的记录
DML 记录的已提交的事务,DML记录格式(statement,row,mixed),通过binlog_format=row参数控制
statement SSR,语句模式记录日志,做什么命令记录什么命令
row RBR,行模式,数据行的变化
mixed MBR,混合模式
SBR和RBR的区别
SBR 可读性强,对于范围操作日质量少,但是可能会出现不准确的情况
RBR 可读性较弱,对于范围操作日志大,不会出现记录错位,高可用环境中的新特性要依赖于FBR
二进制日志记录单元
event事件 二进制日志的最小单元
对于DDL等语句是每一个语句就是一个事件
一个事务包含多个语句,多个事件
event事件的开始和结束 方便我们从日志中截取我们想要的日志事件
二进制日志管理
查看二进制日志位置 SHOW variables like '%log_bin%';
查看所有已存在的二进制日志
SHOW binary logs;
flush logs;
查看正在使用的二进制日志 SHOW master status;
查看二进制日志事件
CREATE DATABASE binlog charset utf8mb4;
use binlog;
CREATE TABLE t1(id int);
INSERT INTO t1 values(1);
SHOW master status;
SHOW binlog events in 'mysql-bin.000004';
SHOW binlog events in 'mysql-bin.000004' limit 5;
查看二进制日志内容
mysqlbinlog mysql-bin.000004
mysqlbinlog --base64-output=decode-rows -vvv mysql-bin.000004
mysqlbinlog -d haoge mysql-bin.000004
截取二进制日志
mysqlbinlog --start-position=219 --stop-position=335 mysql-bin.000004 >/tmp/a.sql
通过binlog恢复数据
模拟数据
CREATE DATABASE haoge charset utf8mb4;
CREATE TABLE t1(id int);
INSERT INTO t1 values(1);
commit;
模拟故障
DROP DATABASE haoge;
分析和截取binlog
SHOW master status; 确认使用的是哪一个日志
SHOW binlog events in 'mysql-bin.000004'; 查看事件
mysqlbinlog --start-position=823 --stop-position=1420 mysql-bin.000004 >/tmp/bin.sql
恢复binlog
set mysql_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
cat auto.cnf
TID是一个自增长的数据,从1开始
GTID的幂等性 如果拿有GTID的日志去恢复时,检查当前系统中是否有相同的GTID号,有相同的就自动跳过,会影响到binlog恢复和主从复制
GTID的开启和配置
vim /etc/my.cnf
gtid-mode=on
enforce-gtid-consistency=true
查看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;
SHOW binlog events in 'mysql-bin.000005';
DROP DATABASE gtid;
基于GTID,binlog恢复
截取日志
cd /data/binlog/
mysqlbinlog --skip-gtids --include-gtids='d60b549f-9e10-11e9-ab04-000c294a1b3b:1-3' mysql-bin.000005 >/tmp/gtid.sql
--skip-gtids 在导出时,忽略原有的gtid信息,恢复时生成最新的gtid信息
恢复
set sql_log_bin=0;
source /tmp/gtid.sql
set sql_log_bin=1;
GTID相关的参数
--skip-gtids
--include-gtids
--exclude-gtids
慢日志(slow-log)
记录运行较慢的语句,优化过程中常用的工具日志
配置
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
模拟慢查询
分析慢日志
mysqldumpslow -s -c -t 10 /data/mysql/slow.log
第三方工具
toolkit工具包中的命令
pt-query-diagest /data/mysql/slow.log
Anemometer基于pt-query-digest将MySQL慢查询可视化
二进制日志清理
自动
expire_logs_days=15
设置的依据 至少1轮全备周期长度的过期时间
手动
help purge
PURGE BINARY LOGS TO 'mysql-bin.000032';
PURGE BINARY LOGS BEFORE '2008-04-02 22:46:26';
reset master;
日志如何滚动
flush logs;
数据库重启
max_binlog_size=1073741824
slow
show variables like 'slow_query_log%';
show variables like 'long%';
show variables like '%using_indexes';
网友评论