一. 错误日志(log_error)
1.1 错误日志作用
记录mysql数据库启动以及工作过程中的状态,报错及警告等
1.2 错误日志配置(/etc/my.cnf)
- select @@log_error;
- vim /etc/my.cnf
log_error=/data/3306/data/mysql.log
重启mysql生效
默认位置在构建mysql时存放数据目录下(/data/3306/data)以主机名命名(hostname.err)
1.3 如何利用错误日志
查看错误日志中[ERROR]项用来排错
二. 二进制日志(binlog)binary logs
2.1 二进制日志作用
- 是备份恢复的必备日志
- 主从环境必须依赖二进制日志
2.2 二进制日志文件配置(/etc/my.cnf)
[mysqld]
server_id=6
---主要是在主从复制环境中必须加的,但是在5.7版本需要以下参数(log_bin)来开启binlog功能,即使是单机状态也是必须加的
log_bin=/data/binlog/mysql-bin
---开启二进制日志功能
---设置二进制日志所在位置
2.3 二进制日志记录内容
2.3.1 二进制日志记录范围
- binlog是SQL层的功能,记录的是变更的SQL语句,不记录查询语句
2.3.2 记录语句种类
- DDL语句 DCL语句 DML语句
2.3.3 不同语句记录格式说明
1. DDL与DCL语句
- 直接以SQL语句方式(statement)记录,原语句如何执行,他就怎样记录,原封不动的记录语句
2. DML语句 - (1)statement(5.6默认):SBR(statement based replaication)语句模式原封不动的记录当前的DML语句
- (2)ROW(5.7默认):RBR(ROW based replication)记录数据行的变化,用户看不懂,需要借助工具进行分析
- (3)Mixed(混合上述两种方式):MBR(Mixed based replication)
2.3.4 面试题(SBR与RBR对比)
1. SBR(statement)
- 可读性较高,日志量少,但是语句不够严谨
2. RBR(ROW) - 可读性较低,日志量大,足够严谨(建议使用)
2.4 二进制日志事件(binlog event)
2.4.1 事件的简介
- 1. event事件是二进制日志的最小记录单元
- 2. 对于DCL,DDL语句来说,一个语句就是一个event事件
- 3. 对于DML语句来说(标准事务语句),只记录已经提交的事务
begin; 120---340 事件1
DML1; 340---460 事件2
DML2; 460---550 事件3
commit; 550---760 事件4
2.4.2 event事件的构成
查看binlog命令: mysqlbinlog /data/binlog/mysql-bin.000001
- 1. 事件的开始标志 #at 219
- 2. 时间的结束标志 #end_log_pos 319
- 3. 事件发生的时间 #190814 18:46:35
- 4. 事件内容 #create database oldboy
2.5 二进制日志查看
2.5.1 参数信息查看
select @@
1. log_bin; 二进制日志开关
2. log_bin_basename; 二进制日志名称及路径
3. server_id; 二进制服务id号
4. binlog_format; 二进制日志格式
5. sync_binlog; 双一标准之一
---show variables like '%log_bin%';
---show variables like '%binlog%';
2.5.2 查看二进制日志个数以及显示最后事件的业务号(position号)
- show binary logs;(显示)
- flush logs;(刷新一个二进制日志,之后的二进制日志都会记录在刷新后的日志文件中)
2.5.3 查看MySQL当前正在使用的二进制文件及position号
- show master status;
2.5.4 二进制日志内容查看(event查看)
1. 先 show master status; 查询当前正在使用的二进制日志
2. 再 show binlog events in '你所使用的二进制日志文件';
3. 显示结果如下:
---Log_name:指binlog文件名
---Pos:指event开始的position号
---Event_type:指event事件类型
---Server_id:mysql服务的标识(主从使用)
---End_log_pos:指event事件结束的position号
---Info:指事件event的具体内容
2.5.5 二进制binlog文件内容详细查看(命令行)
1. mysqlbinlog /data/binlog/mysql-bin.000001
- 此命令查看二进制文件后是ROW模式(基本看不懂)
2. mysqlbinlog --base64-output=decode-rows -vvv /data/binlog/mysql-bin.000001 - 加上此参数对二进制文件进行简单处理(好看些)
2.6 二进制日志基于position号进行日志截取
1. 截取语法
1. --start-position=321
_指定截取event事件的开头position号
2. --stop-position=513
_指定截取event事件的结尾position号
3. mysqlbinlog --start-positon=321 --stop-position=513 /data/binlog/mysql-bin.000001 >/tmp/bin.sql
_截取这一段事件到文件中(应用到简单的数据恢复)
2. 二进制基于position号截取日志案例
1. 准备环境(一个有表有数据的完整的库)
- create database binlog charset utf8mb4;
- use binlog;
- create table t1(id int)engine=innodb charset=utf8mb4;
- insert into t1 values(1),(2),(3);
- commit;
- insert into t1 values(11),(22),(33);
- commit;
- select * from t1;
2. 搞破坏
- drop database binlog;
3. 数据日志截取
- show master status;
- show binlog events in 'mysql-bin.000003';
- 命令行:mysqlbinlog --start-position=219 --stop-position=1412 /data/binlog/mysql-bin.000003 >/data/bin.sql
4. 数据恢复日志
- set sql_log_bin=0; #临时关闭当前回话的binlog记录
- source /data/bin.sql; #恢复激活截取日志,恢复数据
- set sql_log_bin=1; #再次开启binlog日志记录
5. 扩展:针对binlog单库的截取日志
- mysqlbinlog -d binlog --start-position=219 --stop-position=1412 /data/binlog/mysql-bin.000003 >/data/bin.sql
- 借用中间库与备份进行数据恢复
2.7 二进制日志基于GTID的管理
2.7.1 GTID介绍
- GTID他是mysql5.6版本新加特性,5.7版本增强。一种新的binlog日志记录方式(事务号,保留position号)。并且在5.7版本中即使不开启也会自动生成(建议开启)
- 全称为(Global Transaction ID),是对于一个已经提交的事务的编号,并且是一个全局唯一性的编号(就算刷新二进制文件个数他也会接着上一个号依次往下)
- GTID=Server_UUID+TX_ID.其中Server_UUID在创建mysql数据库时就已经存才与数据存放目录(/data/3306/data)下的auto.cnf文件中
2.7.2 GTID作用
- 简化binlog截取
- 提供主从复制的高级功能
- 5.7版本进行增强,比如在主从性能,高可用环境集群等方面
2.7.3 GTID的幂等性
- 即在开启GTID后,mysql恢复binlog后,重复的GTID事务不会再执行了
2.7.4 GTID重要参数及配置
- gtid_mode=on GTID功能开关
- enforce_gtid_consistency=true 强制GTID一致性
- log_slave_updates=1 主从复制中,从库记录二进制日志binlog,并同意GTID信息
- 配置(/etc/my.cnf)
---配置在配置文件[mysqld]下
---重启数据库生效(/etc/init.d/mysqld restart)
---开启GTID后,登录数据库(show master status;)会有Excuted显示
2.7.5 不同语句对于GTID的查询范围
- 对于DDL与DCL语句来说,一条SQL语句就是一个GTID
- 对于DML语句来说,一个完整的事务就是一个GTID
2.7.6 基于GTID截取binlog日志
1. --include-gtids=截取日志范围
举例:截取1-3号事务(GTID)
- show master status;
- mysqlbinlog --include-gtids='Server_UUID:1-3' /data/binlog/mysql-bin.000009 >/data/gtid.sql
2. --exclude-gtids=排除截取日志范围
举例:截取1-10号binlog,排除6号和8号
- mysqlbinlog --include-gtids='Server_UUID:1-10' --exclude-gtids='Server_UUID:6,Server_UUID:8' /data/binlog/mysql-bin.000009 >/data/gtid2.sql
3. --skip-gtids
---此参数是指开启GTID后,会进行一个幂等性的检查,原来数据库有GTID,备份中也有GTID,
两个GTID都存在的话备份无法恢复,所以开了GTID功能截取binlog时一定要加此参数,也可以直接写入
配置文件(/etc/my.cnf)
2.7.7 基于GTID的binlog日志恢复案例
1. 准备环境
- create database gtid charset utf8mb4;
- use binlog;
- create table t1(id int)engine=innodb charset=utf8mb4;
- insert into t1 values(1),(2),(3);
- commit;
- insert into t1 values(11),(22),(33);
- commit;
- select * from t1;
2. 搞破坏
- drop database gtid;
3. 查找正在使用的binlog,找到起点与终点
- show master status;
- show binlog events in '正在使用的binlog日志文件';
4. 截取日志
- mysqlbinlog --include-gtids='Server_UUID:TX_ID' /data/binlog/mysql-bin.000009 >/data/gtid.sql
5. 恢复数据日志
- set sql_log_bin=0;
- source /data/gtid.sql;
- set sql_log_bin=1;
2.8 二进制日志其它操作(binlog日志清理与滚动)
2.8.1 自动清理日志binlog
1. expire_logs_days
---此参数代表着自动清理日志周期,默认为0(永不过期)。设置时按照全备周期加1
2. show variables like '%expire%';查看
3. 配置(临时):set global expire_logs_day=8;
4. 配置(永久):在配置文件(/etc/my.cnf)下的[mysqld]标签下
expire_logs_day=15 企业建议至少保留两个全备周期+1的binlog
2.8.2 收工清理日志binlog
1. show binary logs;(查看binlog所有日志文件)
2. purge binary logs to 'mysql-bin.0000079';(指删除了第79个binlog日志之前的日志文件)
3. purge binary logs before now() -interval 3 day;(删除现在到3天前的binlog)
4. reset master; (重置日志) 注意:不要rm binlog文件
5. 在配置文件(/etc/my.cnf)注释binlog日志功能,重启数据库,再开启binlog日志
2.8.3 日志binlog如何滚动
1. show master statsu; #显示当前所使用的binlog文件
2. flush logs; #刷新出一个新的binlog,之后的binlog日志都会记录新的binlog文件
3. 重启数据库也会自动滚动一个新的binlog
4. 日志文件到达1G大小(max_binlog_size)也会滚动一个新的
5. 备份时加入此参数也会滚动,备份数据则记录在新的那个
三. 慢日志(slow log)
3.1 慢日志简介
指根据你所设定的语句查询时间进行判断,当超出你所设定时间范围则会把语句日志记录在慢日志文件中(运行较慢的语句)
3.2 慢日志功能
他是一个辅助优化的工具日志,根据查询慢日志进行对应的内容优化
3.3 慢日志类型
1. 应激性的慢
- show processlist;
2. 一段时间慢 - slow log记录进行统计
3.4 慢日志配置(参数)
以下参数直接配置在/etc/my.cnf中
1. slow_query_log=1 #慢日志开关,1位开启
2. slow_query_log_file=/data/mysql/slow.log #慢日志文件位置
3. long_query_time=0.1 #设定查询时间,超出则记录在慢日志文件
4. log_queries_not_using_indexs #不走索引的页记录
3.5 满语句模拟
1. 根据3.4进行慢日志配置。开启慢日志功能
2. 创建一个临时库
3. 创建一个临时表并插入大量数据
4. 进行SQL查询语句(最好长点,执行时间长点),这些查询时间长的语句则会记录在慢日志文件
5. mysqldumpslow -s -c -t 5 /data/mysql/slow.log(利用mysqldumpslow处理满语句日志)
6. 利用explain语句分析上述处理的语句
7. desc (处理结果语句5的),查看语句各项属性,进行适当优化