来吧,了解下mysql有哪些log

概述

mysql里面有不少log,好比用于主从同步的bin_log,防止数据丢失的redo_log,慢查询日志slow_log等等mysql

redo log

InnoDB有buffer pool(简称bp)。
bp是数据库页面的缓存, 对InnoDB的任何修改操做都会首先在bp的page上进行,而后这样的页面将被标记为dirty并被放到专门的flush list上,后续将由master thread或专门的刷脏线程阶段性的将这些页面写入磁盘(disk or ssd)。这样的好处是避免每次写操做都操做磁盘致使大量的随机IO,阶段性的刷脏能够将屡次对页面的修改merge成一次IO操做,同时异步写入也下降了访问的时延。然而,若是在dirty page还未刷入磁盘时,server非正常关闭,这些修改操做将会丢失,若是写入操做正在进行,甚至会因为损坏数据文件致使数据库不可用。为了不上述问题的发生,Innodb将全部对页面的修改操做写入一个专门的文件,并在数据库启动时今后文件进行恢复操做,这个文件就是redo log file。 这样的技术推迟了bp页面的刷新,从而提高了数据库的吞吐,有效的下降了访问时延。 带来的问题是额外的写redo log操做的开销(顺序IO,固然很快),以及数据库启动时恢复操做所需的时间。

Undo Log

Undo
Log是为了 实现事务的原子性,在MySQL数据库InnoDB存储引擎中,还用UndoLog来实现多版本并发控制(简称:MVCC)。
事务的原子性(Atomicity)
事务中的全部操做,要么所有完成,要么不作任何操做,不能只作部分操做。若是在执行的过程当中发了错误,要回滚(Rollback)到事务开始前的状态,就像这个事务历来没有执行过。

bin-log

binlog有三种格式: Statement、Row以及Mixed

Statement

基于SQL语句的复制(statement-based replication,SBR),
每一条会修改数据的sql语句会记录到binlog中。优势是并不须要记录每一条sql语句和每一行的数据变化,减小了binlog日志量,节约IO,提升性能。缺点是在某些状况下会致使master-slave中的数据不一致(如sleep()函数, last_insert_id(),以及user-defined functions(udf)等会出现问题)c++

Row

基于行的复制(row-based replication,RBR),默认
不记录每条sql语句的上下文信息,仅需记录哪条数据被修改了,修改为什么样了。并且不会出现某些特定状况下的存储过程、或function、或trigger的调用和触发没法被正确复制的问题。缺点是会产生大量的日志,尤为是alter table的时候会让日志暴涨。sql

Mixed

混合模式复制(mixed-based replication,MBR)。
以上两种模式的混合使用,通常的复制使用STATEMENT模式保存binlog,对于STATEMENT模式没法复制的操做使用ROW模式保存binlog,MySQL会根据执行的SQL语句选择日志保存方式。
查看binlog_format
show variables like 'binlog_format'数据库

relay_log:

Mysql 主节点将binlog写入本地,从节点定时请求增量binlog,主节点将binlog同步到从节点。 从节点单独进程会将binlog
拷贝至本地 relaylog中。
从节点定时重放relay log

slow-log

慢查询就是经过设置来记录超过必定时间的SQL语句,通常经过slowlog找到影响系统性能的sql

开启slow-log

在my.conf 中增长缓存

slow_query_log = 1 // 开启slow-log long_query_time = 1 //
查询时间超过1s的sql会被记录

分析slow-log

在slow-log目录下执行
more slow-query.log
clipboard.png并发

Query_time: 查询耗时
Rows_examined: 检查了多少条记录
Rows_sent : 返回了多少行记录(结果集)
经过分析slow-log文件,能够找到最慢的sql
按Rows_examined 逆序,列出前100条
grep Rows_examined slow-query.log | sort -g -k9 -r|uniq -u |head -100
指定Rows_examined一值,查找
grep -A 1 -B 2 "Rows_examined: 24460" slow-query.log
看到每秒的慢查询统计
awk '/^#Time:/{print $3,$4,c;c=0}/^# User /{c++}' slow-query.log >/tmp/aaa.log

mysqldumpslow命令

访问时间最长的10个sql语句异步

mysqldumpslow -t 10 /usr/local/mysql/log/3304/slowquery.log

访问次数最多的10个sql语句函数

mysqldumpslow -s c -t 10 /usr/local/mysql/log/3304/slowquery.log

访问记录集最多的10个sql性能

mysqldumpslow -s r -t 10 /usr/local/mysql/log/3304/slowquery.log

获得按照时间排序的前10条里面含有左链接的查询语句spa

mysqldumpslow -s t -t 10 -g “left join” /usr/local/mysql/log/3304/slowquery.log

详见mysqldumpslow -h

general_log

general_log能够 记录全部执行过的sql,用于排查分析sql性能,但记录log会增长系统负担,能够暂时开启,分析完以后再关闭general_log

开启general_log

clipboard.png

查看general_log

clipboard.png

相关文章
相关标签/搜索