概述
mysql里面有很多log,比如用于主从同步的bin_log,防止数据丢失的redo_log,慢查询日志slow_log等等
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)等会出现问题)
Row
基于行的复制(row-based replication,RBR),默认
不记录每条sql语句的上下文信息,仅需记录哪条数据被修改了,修改成什么样了。而且不会出现某些特定情况下的存储过程、或function、或trigger的调用和触发无法被正确复制的问题。缺点是会产生大量的日志,尤其是alter table的时候会让日志暴涨。
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
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条里面含有左连接的查询语句
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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。