MySQL日志管理学习笔记day09

2019-09-28  本文已影响0人  我要笑

1.错误日志

1.1 作用

MySQL启动及工作过程中,状态\报错\警告\。

1.2怎么配置?

mysql> select @@log_error;
+---------------------------+
| @@log_error               |
+---------------------------+
| /data/3306/data/mysql.log |
+---------------------------+
1 row in set (0.00 sec)

默认时在datadir=/data/3306/data/hostname.err

设置

vim /etc/my.cnf
然后加一行路径即可。
log_error=路径
然后重启生效

1.3如何查看错误日志

vim /data/3306/data/mysql.log 也可以用cat 、tail都行。
关注[ERROR]的上下文。

2.二进制日志 🌟🌟🌟🌟🌟🌟

2.1 作用

数据恢复必备的日志
主从复制依赖的日志

2.2 怎么配置

2.2.1 修改配置文件

vim /etc/my.cnf
加一行参数
server_id=6 🌟🌟🌟🌟🌟必须加
log_bin=/data/binlog/mysql-bin 要提前创建好,并且修改权限。

2.2.2 创建目录授权

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

```vim里 ctrl c 锁住 ctrl q 解锁``` 

然后重启

二进制之日文件 可以用strings命令来查看版本号

strings mysql-bin.000001

2.3 二进制日志记录了什么?

2.2.1 引入

除了查询类的语句,都会记录。
所有数据库变更类的语句。

2.3.2 记录语句的种类

DDL
DCL
DML

2.3.4 不同语句的记录格式说明

DDL,DCL:直接以语句(statement)方式记录
DML语句: insert, update,delete
SBR : statement ,做什么记录什么。
RBR : row 记录数据行的变化 默认模式,记录的数据不会出现误差。
MBR:mixed 自动判断记录模式

面试题:说明SBR和RBR的区别?

SBR: statement ,做什么记录什么,记录的就是SQL,可读性较强,日志量相对较少,好处很多,日志记录可能会有误差,可能不准确。
RBR: row ,记录数据行的变化,默认模式,可读性差,日志量大,日志记录准确。也是我们推荐的模式。

mysql> select @@binlog_format;
+-----------------+
| @@binlog_format |
+-----------------+
| ROW             |
+-----------------+
1 row in set (0.00 sec)

2.3.5 binlog events(二进制日志事件)

(1)简介
二进制日志内容以事件为最小记录单元。
对于DDL和DCL,一个语句就是一个事件。
对于DML(标准的事务语句) : 只记录已提交的事务的DML语句
begin; 事件1
a 事件2
b �事件3
commit; 事件4

(2)事件的构成
查看二进制日志文件
mysqlbinlog mysql-bin000014

# at 941  事件开始的位置      (position)
#190904 19:19:30 事件发生的时间  (position)
 server id 6  end_log_pos 1029 CRC32 0x0caff37c 事件结束的位置
create database hh 事件内容

2.3.6 二进制日志的基本查看

(1) 查看二进制日志的配置信息

mysql> show variables like '%log_bin%';
+---------------------------------+------------------------------+
| log_bin                         | ON                           |
| log_bin_basename                | /data/binlog/mysql-bin       |
| sql_log_bin                     | ON                           |

(2) 二进制日志基本信息
查看

mysql> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       177 |
| mysql-bin.000002 |    692420 |
| mysql-bin.000003 |       546 |
| mysql-bin.000004 |      1517 |
| mysql-bin.000005 |       661 |
| mysql-bin.000006 |      2086 |
| mysql-bin.000007 |       397 |
| mysql-bin.000008 |       241 |
| mysql-bin.000009 |       241 |
| mysql-bin.000010 |       524 |
| mysql-bin.000011 |    964084 |
| mysql-bin.000012 |       217 |
| mysql-bin.000013 |       538 |
| mysql-bin.000014 |      1029 |
+------------------+-----------+
14 rows in set (0.01 sec)

查看当前正在使用的日志文件

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                         |
+------------------+----------+--------------+------------------+-------------------------------------------+
| mysql-bin.000014 |     1029 |              |                  | 8d2ed0d5-b75a-11e9-ba1c-000c29222c92:1-87 |
+------------------+----------+--------------+------------------+-------------------------------------------+
1 row in set (0.00 sec)

(3) 查看二进制日志的事件信息

mysql> show binlog events in 'mysql-bin.000014';

2.4 内容查看和截取

[root@db01 ~]# mysqlbinlog /data/binlog/mysql-bin.000005
[root@db01 ~]# mysqlbinlog --base64-output=decode-rows -vvv   /data/binlog/mysql-bin.000005
2.4.2 日志的截取
--start-position 
--stop-position
语法:
```便于易读```
mysqlbinlog --start-position=xxx  --stop-position=xxx /data/binlog/mysql-bin.000005>/data/bin.sql

mysqlbinlog --help

演练:
(1) 准备数据
创建一个库

mysql> create database binlog charset utf8mb4;
Query OK, 1 row affected (0.00 sec)
use binlog;

创建一张表

mysql> create table t1(id int)engine=innodb charset=utf8mb4;
Query OK, 0 rows affected (0.03 sec)

插入一条数据

insert into t1 values(1),(2)(3);
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0

commit;
mysql> insert into t1 values(11),(12),(13);
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

(2) 变更数据

mysql> update t1 set id=10 where id>10;
Query OK, 3 rows affected (0.02 sec)
Rows matched: 3  Changed: 3  Warnings: 0

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

删除binlog数据库

mysql> drop database binlog;
Query OK, 1 row affected (0.04 sec)

(3) 数据恢复
确认起点和终点

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                         |
+------------------+----------+--------------+------------------+-------------------------------------------+
| mysql-bin.000014 |     3433 |              |                  | 8d2ed0d5-b75a-11e9-ba1c-000c29222c92:1-97 |
+------------------+----------+--------------+------------------+-------------------------------------------+

查看事件内容

show binlog events in 'mysql-bin.000014';

找到起点 (建库语句)
| mysql-bin.000014 | 1666 | Query | 6 | 1782 | create database binlog charset utf8mb4

找到终点(drop)
| mysql-bin.000014 | 3335 | Query | 6 | 3433 | drop database binlog

(4)截取日志
注意记得加:--skip-gtids参数

[root@db01 ~]#mysqlbinlog --start-position=1666 --skip-gtids  --stop-position=3335 /data/binlog/mysql-bin.000014>/data/bin.sql;
[root@db01 ~]# 

确认下是不是我们要截取的日志

[root@db01 /data]# vim bin.sql

(5) 恢复日志
临时关闭当前会话的binlog记录

mysql>  set  sql_log_bin=0;
Query OK, 0 rows affected (0.00 sec)

用source恢复

mysql> source /data/bin.sql
Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

然后查看数据库
show databases;
发现数据已恢复成功。
mysql>

(6)扩展
过滤库

mysqlbinlog  -d binlog--start-position=1666 --skip-gtids  --stop-position=3335 /data/binlog/mysql-bin.000014>/data/bin.sql;

可以借助中间库

2.5 基于gtid的binlog管理(扩展、)

2.5.0 引入

5.6版本以后,binlog加入了新的日志记录方式,GTID。
主要作用:
简化binlog截取
提供在主从复制中的高级功能
5.7 版本之后,进行了GTID增强
主从性能, 高可用环境,集群,

2.5.1 什么是GTID (Global Transaction ID)

全局唯一的事务编号
幂等性:
GTID:Server_uuid:Tx_id
545fd699-be48-11e9-8f0a-000c2980e248:1-10

2.5.2配置、

show variables like '%gtid%';
gtid_mode = on #开关
enforce_gtid_consistency=true #强制GTID一致性
log_slave_updates=1 #主从复制中从库记录binlog,并统一GTID信息。
mysql> show variables like '%log_slave_updates%';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| log_slave_updates | ON |
+-------------------+-------+

配置的话加入mysql配置文件中即可。

2.5.3 查看gtid日志信息

DDL,DCL 一个操作就是GTID
DML,一个完整的事务就是一个GTID
begin;
xxx
xxx
commit

oldguo[db1]>show master status ;
+------------------+----------+--------------+------------------+------------------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                        |
+------------------+----------+--------------+------------------+------------------------------------------+
| mysql-bin.000009 |      906 |              |                  | 545fd699-be48-11e9-8f0a-000c2980e248:1-3 |
+------------------+----------+--------------+------------------+------------------------------------------+
1 row in set (0.00 sec)
oldguo[db1]>show binlog events in 'mysql-bin.000009';
| mysql-bin.000009 | 154 | Gtid           |         6 |         219 | SET @@SESSION.GTID_NEXT= '545fd699-be48-11e9-8f0a-000c2980e248:1' 

2.5.4 基于gtid截取日志

--include-gtids=
--exclude-gtids=
--skip-gtids=
截取1-3号事务:

[root@db01 ~]# mysqlbinlog --include-gtids='545fd699-be48-11e9-8f0a-000c2980e248:1-3' /data/binlog/mysql-bin.000009>/data/gtid.sql

截取 1-10 gtid事务,跳过6号和8号事务.

[root@db01 ~]# mysqlbinlog --include-gtids='545fd699-be48-11e9-8f0a-000c2980e248:1-10' --exclude-gtids='545fd699-be48-11e9-8f0a-000c2980e248:6,545fd699-be48-11e9-8f0a-000c2980e248:8'    /data/binlog/mysql-bin.000009>/data/gtid.sql

2.5.5 演练

(1)准备环境

mysql> create database gtid1 charset utf8mb4;
Query OK, 1 row affected (0.00 sec)

mysql> use gtid1
Database changed

mysql> create table t1(id int) engine=innodb charset utf8mb4;
Query OK, 0 rows affected (0.00 sec)

插入几行数据

mysql> insert into t1 values(1),(2),(3);
Query OK, 3 rows affected (0.02 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t1 values(11),(12),(13);
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from t1;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
|   11 |
|   12 |
|   13 |
+------+

(2) 搞破坏

mysql> drop database gtid1;
Query OK, 1 row affected (0.01 sec)

(找起点和终点(gtid))

mysql> show master status;
+------------------+----------+--------------+------------------+--------------------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                          |
+------------------+----------+--------------+------------------+--------------------------------------------+
| mysql-bin.000015 |     1256 |              |                  | 8d2ed0d5-b75a-11e9-ba1c-000c29222c92:1-108 |
+------------------+----------+--------------+------------------+--------------------------------------------+
1 row in set (0.00 sec)

mysql> show binlog events in 'mysql-bin.000015';

开始截取:
建库操作

mysql-bin.000015 |  194 | Gtid           |         6 |         259 | SET @@SESSION.GTID_NEXT= '8d2ed0d5-b75a-11e9-ba1c-000c29222c92:104' |

不能截取删库操作 也就是截取到104-107

| mysql-bin.000015 | 1096 | Gtid           |         6 |        1161 | SET @@SESSION.GTID_NEXT= '8d2ed0d5-b75a-11e9-ba1c-000c29222c92:108' |
| mysql-bin.000015 | 1161 | Query          |         6 |        1256 | drop database gtid1 

(4)截取日志 记得--skip-gtids

mysqlbinlog --skip-gtids --include-gtids='8d2ed0d5-b75a-11e9-ba1c-000c29222c92:104-107'  /data/binlog/mysql-bin.000015>/data/gtid.sql;

(5)恢复
临时关闭输出

mysql> set sql_log_bin=0;
Query OK, 0 rows affected (0.00 sec)

恢复

source  /data/gtid.sql;
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| binlog             |
| gtid               |
| gtid1              |
| hh                 |
| mysql              |
| performance_schema |
| school             |
| sys                |
| test               |
| wordpress          |
| wordpress1         |
| world              |
| wp                 |
| xuexiao            |
+--------------------+
15 rows in set (0.00 sec)

mysql> 
mysql> show tables;
+-----------------+
| Tables_in_gtid1 |
+-----------------+
| t1              |
+-----------------+
1 row in set (0.00 sec)

mysql> select * from t1;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
|   11 |
|   12 |
|   13 |
+------+
6 rows in set (0.00 sec)

2.6二进制日志其他操作

2.6.1 自动清理日志

show variables like '%expire%';
expire_logs_days  0  

自动清理时间,是要按照全备周期+1

set global expire_logs_days=8;

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

2.6.2 手工清理

PURGE BINARY LOGS BEFORE now() - INTERVAL 3 day;
PURGE BINARY LOGS TO 'mysql-bin.000009';
mysql> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000015 |      1303 |
| mysql-bin.000016 |       194 |
+------------------+-----------+
2 rows in set (0.00 sec)

从1开始

mysql> reset master; ###危险操作
Query OK, 0 rows affected (0.00 sec)
mysql> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       154 |
+------------------+-----------+

1 row in set (0.00 sec)注意:不要手动 rm binlog文件

  1. my.cnf binlog关闭掉,启动数据库
    2.把数据库关闭,开启binlog,启动数据库
    删除所有binlog,并从000001开始重新记录日志
    *reset master; 主从关系中,主库执行此操作,主从环境必崩

2.6.3 binlog的滚动机制

2
flush logs;
重启数据库
select @@max_binlog_size;
备份时,某些参数会触发.

3.慢日志(slow-log)

简介

记录运行较慢的语句记录:slowlog
功能是辅助优化的工具日志
应激性的慢---> show processlist;
一段时间慢 --->slow记录,统计

3.1 配置

oldguo[(none)]>show variables like '%slow%';
oldguo[(none)]>select @@long_query_time;
oldguo[(none)]>show variables like '%not_using_indexes%';
slow_query_log=1 
slow_query_log_file=/data/3306/data/db01-slow.log
long_query_time=0.1
log_queries_not_using_indexes
mysql> select @@long_query_time;
+-------------------+
| @@long_query_time |
+-------------------+
|          0.100000 |
+-------------------+
1 row in set (0.00 sec)

3.3 慢语句模拟

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

mysql> select count(*) from t100w;
+----------+
| count(*) |
+----------+
|  1000000 |
+----------+
1 row in set (0.32 sec)

随便模拟

select * from t100w where k1='aa' limit 10;
select * from t100w where k1!='aa' limit 10;
select * from t100w where k1!='aa' order by dt limit 10;

然后我们可以去cd /data/3306/data/ vim db01-slow.log文件查看记录的慢语句

分析处理慢语句

mysqldumpslow -s c -t 5  /data/3306/data/db01-slow.log

-s, 是表示按照何种方式排序,c、t、l、r分别是按照记录次数、时间、查询时间、返回的记录数来排序,ac、at、al、ar,表示相应的倒叙;
-t, 是top n的意思,即为返回前面多少条的数据;
-g, 后边可以写一个正则匹配模式,大小写不敏感的;

pt-query-digest工具
https://blog.csdn.net/xiaoweite1/article/details/80299754
分析慢日志,二进制日志,错误日志...

上一篇下一篇

猜你喜欢

热点阅读