MySQL---DBA---陆(日志管理)

一. 错误日志(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号)

  1. show binary logs;(显示)
  2. flush logs;(刷新一个二进制日志,之后的二进制日志都会记录在刷新后的日志文件中)

2.5.3 查看MySQL当前正在使用的二进制文件及position号

  1. 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介绍

  1. GTID他是mysql5.6版本新加特性,5.7版本增强。一种新的binlog日志记录方式(事务号,保留position号)。并且在5.7版本中即使不开启也会自动生成(建议开启)
  2. 全称为(Global Transaction ID),是对于一个已经提交的事务的编号,并且是一个全局唯一性的编号(就算刷新二进制文件个数他也会接着上一个号依次往下)
  3. GTID=Server_UUID+TX_ID.其中Server_UUID在创建mysql数据库时就已经存才与数据存放目录(/data/3306/data)下的auto.cnf文件中

2.7.2 GTID作用

  1. 简化binlog截取
  2. 提供主从复制的高级功能
  3. 5.7版本进行增强,比如在主从性能,高可用环境集群等方面

2.7.3 GTID的幂等性

  1. 即在开启GTID后,mysql恢复binlog后,重复的GTID事务不会再执行了

2.7.4 GTID重要参数及配置

  1. gtid_mode=on GTID功能开关
  2. enforce_gtid_consistency=true 强制GTID一致性
  3. log_slave_updates=1 主从复制中,从库记录二进制日志binlog,并同意GTID信息
  4. 配置(/etc/my.cnf)
    ---配置在配置文件[mysqld]下
    ---重启数据库生效(/etc/init.d/mysqld restart)
    ---开启GTID后,登录数据库(show master status;)会有Excuted显示

2.7.5 不同语句对于GTID的查询范围

  1. 对于DDL与DCL语句来说,一条SQL语句就是一个GTID
  2. 对于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的),查看语句各项属性,进行适当优化

你可能感兴趣的:(MySQL---DBA---陆(日志管理))