MySQL日志主要包含:错误日志、普通查询日志、慢查询日志、事务日志、二进制日志。
查看log相关全局变量参数:
mysql> show global variables like ‘%log%’;
一. 错误日志:
1.在mysql数据库中,错误日志功能是默认开启的。并且,错误日志无法被禁止。默认情况下,错误日志存储在mysql数据库的数据文件中。 log_error 定义错误日志路径,log-warnings是定义是否将警告信息也定义至错误日志中。log_warnings 为0, 表示不记录告警信息。log_warnings 为1, 表示告警信息写入错误日志。log_warnings 大于1, 表示各类告警信息,例如有关网络故障的信息和重新连接信息写入错误日志。
注意:从MySQL 5.7.2开始,首选log_error_verbosity系统变量,而不是使用–log-warnings选项或log_warnings系统变量,这个参数从MySQL 8.0.3开始被移除了:log_error_verbosity它有三个可选值, 分别对应:1)错误信息;2)错误信息和告警信息; 3)错误信息、告警信息和通知信息。
2.错误日志如果不清理或删除,那么它会一直增长。在MySQL 5.5.7之前,可以通过mysqladmin –uroot –p flush-logs命令删除错误日志,也可以使用登录mysql数据库中使用FLUSH LOGS语句来开启新的错误日志。MySQL 5.5.7以及之后,只能通过下面方式来归档、备份错误日志:
[root@localhost ~]# mv host_name.err host_name.err-old
[root@localhost ~]#mysqladmin -u root -p flush-logs
[root@localhost ~]# mv host_name.err-old backup-directory
二. 普通查询日志:
默认情况下查询日志是关闭的。由于查询日志会记录用户的所有操作,其中还包含增删查改等信息,在并发操作大的环境下会产生大量的信息从而导致不必要的磁盘IO,会影响mysql的性能的。如若不是为了调试数据库的目的建议不要开启查询日志。general_log 定义是否开启查询日志,general_log_file 定义查询日志路径 log_output 定义日志的输出方式,一般有三种方式:file(文件),table(表),none(不保存)。
三. 慢查询日志
慢查询日志是用来记录执行时间超过指定时间的查询语句。通过慢查询日志,可以查找出哪些查询语句的执行效率很低,以便进行优化。一般建议开启,它对服务器性能的影响微乎其微,但是可以记录mysql服务器上执行了很长时间的查询语句。可以帮助我们定位性能问题的。
slow_query_log 定义是否开启;
slow_query_log_file 定义慢日志的存储位置;
log_slow_queries 被slow_query_log取代;
long_query_time: 设定慢查询的阀值,超出次设定值的SQL即被记录到慢查询日志,缺省值为10s;
min_examined_row_limit:查询检查返回少于该参数指定行的SQL不被记录到慢查询日志;
log_queries_not_using_indexes: 不使用索引的查询是否记录到慢查询日志(不建议开启,这里会把没有索引的查询都记录在日志中)。
MySQL自带了mysqldumpslow工具用来分析slow query日志,或者其它工具也可以,通过工具配合可以更好的分析。
四. 事务日志
事务日志(InnoDB特有的日志)可以帮助提高事务的效率。使用事务日志,存储引擎在修改表的数据时只需要修改其内存拷贝,再把改修改行为记录到持久在硬盘上的事务日志中,而不用每次都将修改的数据本身持久到磁盘。事务日志采用追加的方式,因此写日志的操作是磁盘上一小块区域内的顺序I/O,而不像随机I/O需要在磁盘的多个地方移动磁头,所以采用事务日志的方式相对来说要快得多。事务日志持久以后,内存中被修改的数据在后台可以慢慢的刷回到磁盘。目前大多数的存储引擎都是这样实现的,我们通常称之为预写式日志,修改数据需要写两次磁盘。
如果数据的修改已经记录到事务日志并持久化,但数据本身还没有写回磁盘,此时系统崩溃,存储引擎在重启时能够自动恢复这部分修改的数据。具有的恢复方式则视存储引擎而定。
innodb_flush_log_at_trx_commit 日志缓冲刷新频繁程度 [0-每秒刷新一次,但提交事务时不做任何事;1-默认,每次事务提交都刷新到持久化存储;2-每次提交时日志缓冲写到日志文件,但只是每秒做一次刷新;写到日志文件可能只是从innodb内存写到操作系统内存,所以0和2可能会丢失一秒内的事务];
innodb_log_files_in_group 日志组的数量,最少2个,innodb使用多个日志文件为一组循环日志;
innodb_log_group_home_dir 定义innodb事务日志组位置,参数为./,这里的当前目录是指数据文件目录;
innodb_mirrored_log_groups 对日志组做镜像 ;
innodb_log_file_size 日志文件大小,都是5M。
五. 二进制日志
二进制日志也叫作变更日志,主要用于记录修改数据或有可能引起数据改变的mysql语句,并且记录了语句发生时间、执行时长、操作的数据等等。所以说通过二进制日志可以查询mysql数据库中进行了哪些变化。一般大小体积上限为1G。
log_bin #定义是否开启二进制日志;可以直接定义为文件路径,也可以为ON|OFF,默认在数据目录下。配置文件my.cnf的[mysqld] 下添加: log_bin=mysql-bin 开启二进制日志。
sql_log_bin ={ON|OFF} #用于控制会话级别二进制日志功能的开启或关闭。默认为ON,表示启用记录功能。用户可以在会话级别修改此变量的值,但其必须具有SUPER权限。
binlog_cache_size =32768 #默认值32768 Binlog Cache用于在打开了二进制日志(binlog)记录功能的环境,是MySQL 用来提高binlog的记录效率而设计的一个用于短时间内临时缓存binlog数据的内存区域。一般来说,如果我们的数据库中没有什么大事务,写入也不是特别频繁,2MB~4MB是一个合适的选择。但是如果我们的数据库大事务较多,写入量比较大,可与适当调高binlog_cache_size。同时,我们可以通过binlog_cache_use 以及 binlog_cache_disk_use来分析设置的binlog_cache_size是否足够,是否有大量的binlog_cache由于内存大小不够而使用临时文件(binlog_cache_disk_use)来缓存了。
binlog_stmt_cache_size= 32768 #当非事务语句使用二进制日志缓存,但是超出binlog_stmt_cache_size时,使用一个临时文件来存放这些语句。
binlog-format= {ROW|STATEMENT|MIXED} #指定二进制日志的类型,默认为MIXED。如果设定了二进制日志的格式,却没有启用二进制日志,则MySQL启动时会产生警告日志信息并记录于错误日志中。
sync_binlog = 0 #如果 autocommit 开启,每个语句都写一次 bin log,否则每次事务写一次。 sync_binlog默认值是 0,不主动同步,而依赖操作系统本身不定期把文件内容 flush 到磁盘。设为 1 最安全,在每个语句或事务后同步一次 binary log,即使在崩溃时也最多丢失一个语句或事务的日志,“sync_binlog”设置为0和设置为1的系统写入性能差距可能高达5倍甚至更多。大于0就是每多少次事务刷写一次。
max_binlog_cache_size= {4096 .. 18446744073709547520} #二进定日志缓存空间大小,5.5.9及以后的版本仅应用于事务缓存,其上限由max_binlog_stmt_cache_size决定。
max_binlog_stmt_cache_size= {4096 .. 18446744073709547520} #二进定日志缓存空间大小,5.5.9及以后的版本仅应用于事务缓存
expire_log_days ={0..99} #设定二进制日志的过期天数,超出此天数的二进制日志文件将被自动删除。默认为0,表示不启用过期自动删除功能。如果启用此功能,自动删除工作通常发生在MySQL启动时或FLUSH日志时。
max_binlog_size #设置单个binlog文件最大容量
binlog_format #记录二进制日志的模式:
① STATEMENT模式(SBR)每一条会修改数据的sql语句会记录到binlog中。优点是并不需要记录每一条sql语句和每一行的数据变化,减少了binlog日志量,节约IO,提高性能。缺点是在某些情况下会导致master-slave中的数据不一致(如sleep()函数, last_insert_id(),以及user-defined functions(udf)等会出现问题)
② ROW模式(RBR)不记录每条sql语句的上下文信息,仅需记录哪条数据被修改了,修改成什么样了。而且不会出现某些特定情况下的存储过程、或function、或trigger的调用和触发无法被正确复制的问题。缺点是会产生大量的日志,尤其是alter table的时候会让日志暴涨。
③ MIXED模式(MBR)以上两种模式的混合使用,一般的复制使用STATEMENT模式保存binlog,对于STATEMENT模式无法复制的操作使用ROW模式保存binlog,MySQL会根据执行的SQL语句选择日志保存方式