mysql 日志管理

1 错误日志
1.1查看错误日志路径
  mysql> select @@log_error;
+--------------------+
| @@log_error        |
+--------------------+
| /tmp/mysql3306.log |
+--------------------+
1.2.错误日志默认开启
默认路径在datadir/hostname.err
修改默认路径
vim /etc/my.cnf
log_error=/tmp/mysql3306.log
重启生效 
/etc/init.d/mysqld restart

1.3作用:排查MySQL运行过程的故障.

2 二进制日志(binlog)
2.1二进制日志:默认没有开启.
vim /etc/my.cnf
server_id=6   #(值为1-65535)
log_bin=/data/binlog/mysql-bin
binlog_format=row
#建立目录和授权属主
mkdir -p /data/binlog/
chown -R mysql.mysql /data
重启生效 
/etc/init.d/mysqld restart

查看[root@mysql ~]# ll /data/binlog/
total 8
-rw-r----- 1 mysql mysql 154 Nov  3 21:52 mysql-bin.000001
-rw-r----- 1 mysql mysql  30 Nov  3 21:52 mysql-bin.index

[root@mysql ~]# cat /data/binlog/mysql-bin.index
/data/binlog/mysql-bin.000001

说明: 
/data/binlog : 提前定制好的目录,而且要有mysql.mysql的权限
mysql-bin      : 二进制日志文件名的前缀
例如: mysql-bin.000001  ,mysql-bin.000002 ......
binlog_format=row ---> 5.7版本默认配置是row,可以省略. 
2.2 作用
(1) 主从要依赖二进制日志
(2) 数据恢复时需要依赖于二进制日志

2.3 二进制日志记录了什么?
2.3.1 概括
记录的数据库所有变更类的操作日志.
DDL
DCL
DML

2.3.2 DDL 和 DCL 
以语句的方式,原模原样的记录.

2.3.3 DML 
(1) 他记录的已提交的事务
(2) DML记录格式(statement,row,mixed),通过binlog_format=row参数控制
说明:
    statement:SBR,语句模式记录日志,做什么命令,记录什么命令.
    row         :RBR,行模式,数据行的变化
    mixed     :MBR,混合模式

面试问题: SBR和RBR什么区别?怎么选择?
SBR:  可读性较强,对于范围操作日志量少,但是可能会出现记录不准确的情况.
RBR:  可读性较弱,对于范围操作日志大,不会出现记录错误.
      高可用环境中的新特性要依赖于RBR
我们公司对数据的严谨性要求较高,也用用到了新型的架构,所以选择RBR

① STATEMENT模式(SBR)

  1. 每一条会修改数据的sql语句会记录到binlog中。优点是并不需要记录每一条sql语句和每一行的数据变化,

  2. 减少了binlog日志量,节约IO,提高性能。缺点是在某些情况下会导致master-slave中的数据不一致(如

  3. sleep()函数, last_insert_id(),以及user-defined functions(udf)等会出现问题)

② ROW模式(RBR)

  1. 不记录每条sql语句的上下文信息,仅需记录哪条数据被修改了,修改成什么样了。而且不会出现某些特定情况下

  2. 的存储过程、或function、或trigger的调用和触发无法被正确复制的问题。缺点是会产生大量的日志,尤其是

  3. alter table的时候会让日志暴涨。

③ MIXED模式(MBR)

  1. 以上两种模式的混合使用,一般的复制使用STATEMENT模式保存binlog,对于STATEMENT模式无法复制的操作使用

  2. ROW模式保存binlog,MySQL会根据执行的SQL语句选择日志保存方式

2.4 二进制日志记录单元
2.4.1 event 事件
二进制日志的最小单元
DDL :  
create database oldguo;  事件1

对于DDL等语句是每一个语句就是一个事件
DML: 一个事务包含了多个语句
begin;         事件1
a          事件2
b         事件3
commit;          事件4 

2.4.2 event事件的开始和结束号码
作用,方便我们从日志中截取我们想要的日志事件.

2.5 二进制日志的管理
2.5.1 查看二进制日志位置
mysql> show variables like '%log_bin%';

2.5.2 查看所有已存在的二进制日志
mysql> show binary logs;
mysql> flush logs;
mysql> show binary logs;

2.5.3 查看正在使用的二进制日志
mysql> show master status ;

2.5.4 查看二进制日志事件 
mysql> create database binlog charset utf8mb4;
mysql> use binlog
mysql> create table t1(id int);
mysql> insert into t1 values(1);


mysql> show master status ;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000004 |      501 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

mysql> show binlog events in 'mysql-bin.000004';
mysql> show binlog events in 'mysql-bin.000004' limit 5;

2.5.5 查看二进制日志内容
[root@db01 binlog]# mysqlbinlog mysql-bin.000004
[root@db01 binlog]# mysqlbinlog --base64-output=decode-rows -vvv mysql-bin.000004 
[root@db01 binlog]# mysqlbinlog -d haoge mysql-bin.000004 


2.5.6 截取二进制日志
[root@db01 binlog]# mysqlbinlog --start-position=219 --stop-position=335 mysql-bin.000004 >/tmp/a.sql

2.5.7 通过binlog恢复数据
(1) 模拟数据
mysql> create database haoge charset utf8mb4;
mysql> use haoge;
mysql> create table t1(id int);
mysql> insert into t1 values(1);
mysql> commit;

(2)模拟故障 
mysql> drop database haoge;

(3)分析和截取binlog
mysql> show master status ;                            --->确认使用的是哪一个日志
mysql> show binlog events in 'mysql-bin.000004' ;   --->查看事件
说明: 找到起点和终点,进行截取
 mysqlbinlog --start-position=823 --stop-position=1420 /data/binlog/mysql-bin.000004 >/tmp/bin.sql

(4)恢复binlog

mysql> set sql_log_bin=0;    --->临时关闭恢复时产生的新日志
mysql> source /tmp/bin.sql
mysql> set sql_log_bin=1; set sql_log_bin=1;    --->改回来

2.6 binlog的gtid记录模式的管理 ****
2.6.1 GTID介绍
对于binlog中的每一个事务,都会生成一个GTID号码
DDL ,DCL 一个event就是一个事务,就会有一个GTID号.
DML语句来讲,begin到commit,是一个事务,就是一个GTID号
2.6.2 GTID的组成
severi_uuid:TID
severi_uuid? 
[root@db01 data]# cat auto.cnf 
[auto]
server-uuid=d60b549f-9e10-11e9-ab04-000c294a1b3b

TID是一个:自增长的数据,从1开始
d60b549f-9e10-11e9-ab04-000c294a1b3b:1-15

2.6.3 GTID的幂等性
如果拿有GTID的日志去恢复时,检查当前系统中是否有相同GTID号,有相同的就自动跳过
会影响到binlog恢复和主从复制.

2.6.4 GTID的开启和配置
vim /etc/my.cnf
gtid-mode=on
enforce-gtid-consistency=true

2.6.5 查看GTID信息
mysql> create database gtid charset utf8mb4;
mysql> show master status;
mysql> use gtid;
mysql> create table t1(id int);
mysql> show master status;
mysql> insert into t1 values(1);
mysql> commit;
mysql> show master status;
mysql> drop database gtid;


2.6.6 基于GTID,binlog恢复
(1) 截取日志
[root@db01 data]# cd /data/binlog/
[root@db01 binlog]# mysqlbinlog --include-gtids='d60b549f-9e10-11e9-ab04-000c294a1b3b:1-3' mysql-bin.000005 >/tmp/gtid.sql

(2)恢复 
mysql> set sql_log_bin=0;
mysql> source /tmp/gtid.sql
mysql> set sql_log_bin=1;
(3) 报错
ERROR 1049 (42000): Unknown database 'gtid'
Query OK, 0 rows affected (0.00 sec)
ERROR 1046 (3D000): No database selected
为什么报错?
因为幂等性的检查,1-3事务已经做过了.


(4)正确的做法?
mysqlbinlog --skip-gtids --include-gtids='d60b549f-9e10-11e9-ab04-000c294a1b3b:1-3' mysql-bin.000005 >/tmp/gtid.sql
--skip-gtids 作用:在导出时,忽略原有的gtid信息,恢复时生成最新的gtid信息

(5) 恢复

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

2.6.7 GTID相关的参数
--skip-gtids 
--include-gtids='d60b549f-9e10-11e9-ab04-000c294a1b3b:6','d60b549f-9e10-11e9-ab04-000c294a1b3b:8'
--exclude-gtids='d60b549f-9e10-11e9-ab04-000c294a1b3b:6','d60b549f-9e10-11e9-ab04-000c294a1b3b:8'

3.慢日志(slow-log)
3.1 作用
记录运行较慢的语句,优化过程中常用的工具日志.
3.2 如何配置
## 开关
slow_query_log=1 
## 文件位置及名字 
slow_query_log_file=/data/mysql/slow.log
## 设定慢查询时间
long_query_time=0.1
## 没走索引的语句也记录
log_queries_not_using_indexes

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

3.3 模拟慢查询
略.

3.4 分析慢日志
mysqldumpslow -s c -t 10 /data/mysql/slow.log

# 3.5  第三方工具(自己扩展)
https://www.percona.com/downloads/percona-toolkit/LATEST/
yum install perl-DBI perl-DBD-MySQL perl-Time-HiRes perl-IO-Socket-SSL perl-Digest-MD5
toolkit工具包中的命令:
pt-query-diagest  /data/mysql/slow.log

Anemometer基于pt-query-digest将MySQL慢查询可视化

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值