Mysql 日志总结

本文详细介绍了MySQL中的五种日志类型:错误日志、查询日志、慢查询日志、二进制日志及事务日志。每种日志的作用、配置参数、使用场景及维护方法均有所涵盖。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Mysql 日志总结

 

主要包含:错误日志、查询日志、慢查询日志、事务日志、二进制日志

1. 错误日志

记录MySQL的启动、停止信息以及在MySQL运行过程中的错信息。

(默认启)

参数:

 

log_error(默认开启)

    log_error=[path/[file_name]],如果不指定文件名,则默认hostname.err.

修改后重启生效

 

log_warnings(在5.7.2之后被不建议使用,取而代之的是log_error_verbosity

0:数据库启动时候加载的内容+数据库启动后的错误+从库停止,

会有记录(从库)

1 (默认):Aborted connection(5.6半同步,如果从库超时,则日志会记录)

 

log_error_verbosity(5.7.2被引入)

Verbosity Value Message Types Logged

1 Errors only

2 Errors and warnings

3(默认) Errors, warnings, and notes

 

查看错误日志的位置:

show variables like 'log_error';

 

删除错误日志 —Error log

<5.5.7版本时,flush logs会将filename.err命名为filename.err_old

>5.5.7版本则只是会重建错误日志,也就是除非错误日志被删除了会重建一个;否则不会对线上错误日志有影响。

 

注意:删除错误日志后,不会自动重建。需要flush logs或者重启数

据库。

mysqladmin -u root -p flush-logs

或者

mysql>flush logs;

 

2. 查询日志

默认情况下查询日志是关闭的。由于查询日志会记录用户的所有操作,其中还包含增删查改等信息,在并发操作大的环境下会产生大量的信息从而导致不必要的磁盘IO,会影响mysql的性能的。

 

参数:

general_log(默认关闭){0-关闭,1-开启} 可以在线打开和关闭;

set global general_log='ON';

general_log_file=file_name,不指定文件名只指定路径路径则为hostname.log

 

关于表mysql.general_log表:

select * from mysql.general_log;

• 表mysql.general_log不支持insertupdatedelete

• 表是不同步的(复制),不写binlog

dump的时候会被忽略掉,5.6.6以后只能dump表结构,内容不会dump出来.

 

log_output=TABLE | FILE | NONE   --查询日志的记录方式

TABLE:便于统计,写入一个CSV引擎的表中。

FILE:默认。

TABLEFILE:便于统计,写入一个CSV引擎的表中。

NONE:任何地方都不写。

注意:如果log_output=NONE但是general_log1,则默认不写常规日志。

 

set sql_log_off=ON 当前操作不写常规日志。

 

删除、备份general 日志:

[root@mytest02 mysql]# mv mytest02.log mytest02.log.bak

[root@mytest02 mysql]# mysqladmin -uroot -proot flush-logs

一定记住flush logs;或者mysqladmin flush-logs

 

3. 慢查询日志

MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值(long_query_timemin_examined_row_limitlog_slow_admin_statements andlog_queries_not_using_indexes)的语句。(默认关闭)

 

注意:慢查询日志不会计算语句在开始执行之前等待锁的时间(initial slow query),mysqld只会从语句等待的锁释放掉,并开始执行开始计算时间(执行开始后的锁定时间会记录)。所以慢查询日志中的语句顺序和语句的发出顺序或者general log的顺序不同。

 

参数:

slow_query_log(默认关闭){0-关闭,1-开启} 可以在线打开和关闭;

set global slow_query_log='ON';

slow_query_log_file=file_name,不指定路径则为hostname-slow.log

long_query_timeSQL执行的阀值

log_output=TABLE | FILE | NONE

TABLE:便于统计,写入一个CSV引擎的表mysql.slow_log中。

FILE:默认。

TABLEFILE:便于统计,写入一个CSV引擎的表mysql.slow_log中。

NONE:任何地方都不写。

注意:如果log_output=NONE但是slow_query_log1,则默认不写常规日志。

 

log_queries_not_using_indexes:记录没有用索引的查询

log_throttle_queries_not_using_indexes:记录没有使用索引查询的语句条数在一分钟内记录的条数

*如何消除上线后未使用索引查询的隐患。线上开启5秒即可。

 

min_examined_row_limit:要检查的行数大于等于N时才记录为慢查询,前提是必须满足long_query_timelog-queries-not-using-indexes约束。

 

log_slow_admin_statements:管理语句是否记录ALTER TABLE, ANALYZE TABLE, CHECK TABLE,

CREATE INDEX, DROP INDEX, OPTIMIZE TABLE,and REPAIR TABLE.

log_slow_slave_statements:从库的语句执行是否记录

 

分析慢查询日志:

mysqldumpslow -s r -t 10 /database/mysql/slow-log

 得到返回记录集最多的10个查询。

mysqldumpslow -s t -t 10 -g  “left join”  /database/mysql/slow-log

 得到按照时间排序的前10条里面含有左连接的查询语句。

输出结果分析

 

 

4. 二进制日志

以“事件”的形式保存,描述数据的更改,包含关于每个更新数据库的语句的执行时间。

注意:binlog只记录完整事务。

目的:最大可能地恢复数据库

启用该选项数据库性能降低1%,但保障数据库完整性,对于重要数据库值得以性能换完整。

参数:

 

log_bin(默认关闭){0-关闭,1-开启} 不可以在线打开和关闭;

修改my.cnf中的参数!

log_bin_basename,不指定路径则为hostname-bin.00000N

log_bin_index,不置顶路径则为hostname-bin.index

 

注意:

所有的日志都建议自己起名字,不要用默认!

 

binlog_cache_size:内存中缓存二进制的缓冲区大小。

注意:对于大的事务,二进制日志会超过max_binlog_size设定的值。也

即是事务仅仅写入一个二进制日志。

 

 

二进制日志记录在语句或事务完成之后立即执行(而不是在任何锁释放或任何提交完成之前写入),这确保日志以提交顺序登录。对于不支持事务的表,执行之后马上会被记录到二进制日志中去。对于未提交的事务中,更改事务表(例如InnoDB表)的所有更新(UPDATEDELETEINSERT)将被缓存,直到服务器收到COMMIT语句。 在这一点上,mysqld在执行COMMIT之前将整个事务写入二进制日志。对非事务性表的修改无法回滚。 如果回滚的事务包括对非事务性表的修改,则会在最后使⽤用ROLLBACK语句记录整个事务,以确保对这些表的修改进行复制。

 

当处理事务的线程开始时,它将缓冲区语句分配一个binlog_cache_size缓冲区。 如果一个语句大于这个值,线程将打开一个临时文件来存储事务。 当线程结束时,临时文件被删除。

binlog_cache_use状态变量显示用于存储语句的此缓冲区(可能还有一个临时文件)的事务数。

binlog_cache_disk_use状态变量显示有多少这些事务实际上必须使用临时文件。

这两个变量可用于将binlog_cache_size调整到足够大的值,以避免使用临时文件。

max_binlog_cache_size系统变量(默认为4GB,也是最大值)可用于限制用于缓存多语

句事务的总大小。 如果一个事务大于这个多个字节,它将失败并回滚。 最小值为4096

 

sync_binlog{0,1}二进制内容从缓冲区落入磁盘的时机。

5.7.7以后,sync_binlog参数被默认设置为1,减少了binlog中的

不一致可能性。

 

expire_logs_days:日志过期时间,一定要和备份相结合。

binlog_formatbinlog模式。

• 基于语句句:当时语句句的原样写⼊入。

• 基于⾏行行:只记录受影响的⾏行行。

• 混合模式:默认⽤用语句句模式,遇到下⾯面情况⽤用基于⾏行行:

uuid()

UDF

temporary

rows_found/row_count

user()/current_user()

LOAD_FILE()

 

二进制日志的维护:

• 切换二进制日志:

flush logs;

• 清理所有二进制日志,并从新开始记录二进制日志:

reset master;

• 清理指定编号之前的二进制日志:

purge binary logs to 3306-bin.000005;

• 清理指定时间前的二进制日志:

purge binary logs before '2017-02-25 19:30:57';

 

不建议手动rm删除二进制日志,会造成index文件不一致。

 

 

5. 事务日志

事务日志(InnoDB特有的日志)可以帮助提高事务的效率。使用事务日志,存储引擎在修改表的数据时只需要修改其内存拷贝,再把改修改行为记录到持久在硬盘上的事务日志中,而不用每次都将修改的数据本身持久到磁盘。事务日志采用追加的方式,因此写日志的操作是磁盘上一小块区域内的顺序I/O,而不像随机I/O需要在磁盘的多个地方移动磁头,所以采用事务日志的方式相对来说要快得多。事务日志持久以后,内存中被修改的数据在后台可以慢慢的刷回到磁盘。目前大多数的存储引擎都是这样实现的,我们通常称之为预写式日志,修改数据需要写两次磁盘。

 

如果数据的修改已经记录到事务日志并持久化,但数据本身还没有写回磁盘,此时系统崩溃,存储引擎在重启时能够自动恢复这部分修改的数据。具有的恢复方式则视存储引擎而定。

 

参数:

innodb_log_group_home_dir

InnoDB重做日志文件的目录路径。 如果没有指定任何InnoDB日志变量,则默认是在

MySQL数据目录中创建两个名为ib_logfile0ib_logfile1的文件。

 

innodb_log_files_in_group

日志组中的日志文件数。 InnoDB以循环方式写入文件。 默认(和推荐)值为2.文件的位置由innodb_log_group_home_dir指定。

 

innodb_log_file_size

日志组中每个日志文件的大小(以字节为单位)。 日志文件(innodb_log_file_size *innodb_log_files_in_group)的组合大小不能超过略小于512GB的最大值。默认值为48M。最小值为4M5.7.11

 

innodb_file_per_table

可以修改InnoDB为独立表空间模式,每个数据库的每个表都会生成一个数据空间。

独立表空间优点:

1. 每个表都有自已独立的表空间。

2. 每个表的数据和索引都会存在自已的表空间中。

3. 可以实现单表在不同的数据库中移动。

4. 空间可以回收(除drop table操作处,表空不能自已回收)

 

支持在线修改:

SET GLOBAL innodb_file_per_table=1;

如何将表从系统表空间中分离出来

SET GLOBAL innodb_file_per_table=1;

ALTER TABLE table_name ENGINE=InnoDB;

 

innodb_flush_log_at_trx_commit           

0log buffer将每秒一次地写入log file中,并且log fileflush(刷到磁盘)操作同时进行。该模式下在事务提交的时候,不会主动触发写入磁盘的操作。

1:每次事务提交时MySQL都会把log buffer的数据写入log file,并且flush(刷到磁盘)中去,该模式为系统默认。

2:每次事务提交时MySQL都会把log buffer的数据写入log file,但是flush(刷到磁盘)操作并不会同时进行。该模式下,MySQL会每秒执行一次 flush(刷到磁盘)操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值