目录:
1.查询日志
2.慢查询日志
3.错误日志
4.二进制日志
5.中断日志
6.事物日志
一、查询日志 general query log
查询日志记录了服务器接收到的每一个查询或是命令,无论这些查询或是命令是否正确甚至是否包含语法错误,general log 都会将其记录下来 ,记录的格式为 {Time ,Id ,Command,Argument }。也正因为mysql服务器需要不断地记录日志,开启General log会产生不小的系统开销。查询写入日志是在客户端执行命令,并且释放锁之前,写入日志。
说明:对除了慢查日志中记录的查询信息都将记录下来,这将对服务器主机产生大量的压力,所以对于繁忙的服务器应该关闭这个日志。
查看日志的存放方式 show variables like 'log_output';
与查询日志相关的变量:
log = {ON|OFF} #是否启用查询日志,该指令在mysq5.6中已废弃
general_log = {ON|OFF} #启动或关闭查询日志,默认是关闭的
general_log_file = ---日志存放的方式,是表还是文件
log_output = {TABLE|FILE|NONE} # 指定存放查询日志的位置,可以放在文件中,也可以放在数据库的表中,放在表中比放在文件中更容易查看,一般不开启
开启general log: set global general_log=on; ---不需要服务器的重启
关闭general log: set global general_log=off;
二、慢查询日志
慢查询日志是查询时长超出指定时长的查询操作记下的日志。其默认为关闭状态。建议开启以可以方便用来排查错误和调优。
与查询日志相关的变量:
low_query_log = {ON | OFF}#是否开启慢慢查询日志,默认是关闭的
slow_query_log_file =/path/mysql-slow.log#慢查询日志的存放位置,默认在数据目录下
log_query_time = 10#定义默认的时长,默认时长为10秒
log_query_not_using_indexes = {ON|OFF}#设定是否将没有使用索引的查询操作记录到慢查询日志
log_output = {TABLE|FILE|NONE}#定义一般查询日志和慢查询日志的保存方式,可以是TABLE、FILE、NONE,也可以是TABLE及FILE的组合(用逗号隔开),默认为FILE。如果组合中出现了NONE,那么其它设定都将失效,同时,无论是否启用日志功能,也不会记录任何相关的日志信息
log_slow_rate_limit=1 记录查询数率
log_slow_verbosity 记录日志的详细级别
设置慢查询时长 :SET GLOBAL log_query-time =时间
如:
mysql> set long_query_time=0.01; #设置大于0.1s的sql语句记录下来
mysql> show VARIABLES like "%slow%";
mysql> show variables like "long_query_time"
三、错误日志
错误日志并不完全是错误信息其包含 :
1.记录了服务器运行中产生的错误信息
2.记录了服务在启动和停止是所产生的信息
3.在从服务器上如果启动了复制进程的时候,复制进程的信息也会被记录
4.记录event错误日志
通常以主机名+.eer 命名的文件
其配置文件有:
log_erro=/path/hostname.err#指定错误日志的位置,默认是在数据目录下,这个位置mysql用户必须有写权限
log_warning = {0|1}#默认开启,服务器运行中的警告日志也会记录在错误日志中
指定日志路径两种方法
编辑my.cnf 写入 log-error=[path]
通过命令参数错误日志mysqld_safe --user=mysql --log-error=[path] &
四、二进制日志
二进制日志:默认开启,精确的记录了用户对数据库中的数据进行操作的命令和操作的数据的sql 语句。
注意: 二进制日志二进制格式(以二进制方式存储),不要用cat 命令打开,需要用mysql提供的mysqlbinlog工具查看。
/usr/local/mysql/bin/mysqlbinlog mysql-bin.000001
二进制日志文件的作用:(总结为:1.恢复 2.复制)
1.提供了增量备份的功能
2.提供了数据基于时间点的恢复,这个恢复的时间点可以由用户控制
3.为mysql的复制架构提供基础,将这主服务器的二进制日志复制到从服务器上并执行同样的操作,就可将数据进行同步
开启二进制日志:
在/etc/my.cnf下的[mysqld]添加
log-bin=mysql
如果只对某个库进行日志文件记录,那么再添加binlog-do-db=test,这样就只记录test数据库的日志,而放弃其他的。
添加完后,重新启动MYSQL的服务,日志文件开始工作了.
二进制日志记录方式:
基于语句 statement 记录的是语句
基于行 row 记录数据结果
混合方式 mixed需要系统自我判定是记录语句还是数据结果。
二进制日志的查看与删除方式:
mysql>show master status; 查看当前正在使用的二进制日志
mysql>show binlog events in 'mysql-bin.000001'; 查看二进制日志记录的事件[from position]
mysql>flush logs; 二进制日志滚动
mysql>show binary logs; 查看所有二进制日志
mysql>purge binary logs to'mysql-bin.000003'; 删除二进制日志
mysql> reset master; 删除所有日志,新日志重新从000001开始编号
mysql> purge master logs to before 'YYYY-MM-DD HH:MM:SS' 命令可以删除'YYYY-MM-DD HH:MM:SS'之前的产生的所有日志
在my.cnf 中指定日志过期 expire_logs-days=n
可以使用purgebinary logs语句来清除 二进制日志。
文件系统中查看二进制日志的命令:
mysqlbinlog
相关选项:
--start-position#开始位置
--stop-position#结束位置
--start-datetime'yyyy-mm-dd hh:mm:ss';#开始时间
--stop-datetime'';#结束时间
pos文件的当前位置:(单位为字节)
Event_type:事件的类型
server_id:在那个服务器执行,每一个服务器在主从复制都有唯一的标示
End_log_post:下一个事件的启示位置
Info:记录事件本身
max_binlog_size #记录二进制文件最大的存储,默认为1G
二进制滚动要注意:
1.到达最大值会自动滚动
2.文件大小达到的最大上限未必是一个精确值,有可能会超出一些
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)来缓存了
当使用事务的存储引擎InnoDB时,所有未提交的事务会记录到一个缓存中,等待事务提交时,直接将缓冲中的二进制日志写入二进制日志文件,而该缓冲的大小由binlog_cache_size决定,默认大小为32KB,此外,binlog_cache_size是基于回话的,也就是,当一个线程开始一个事务时,mysql会自动分配一个大小为binlog_cache_size的缓存,因此该值得设置需要相当小心,可以通过show global status查看binlog_cache_use、binlog_cache_disk_use的状态,可以判断当前binlog_cache_size的设置是否合适。
binlog_stmt_cache_size = 32768#当非事务语句使用二进制日志缓存,但是超出binlog_stmt_cache_size时,使用一个临时文件来存放这些语句
log_bin = mysql-bin#指定binlog的位置,默认在数据目录下
binlog-format= {ROW|STATEMENT|MIXED}#指定二进制日志的类型,默认为MIXED。如果设定了二进制日志的格式,却没有启用二进制日志,则MySQL启动时会产生警告日志信息并记录于错误日志中。
sync_binlog = {1|0}#设定多久同步一次二进制日志至磁盘文件中,0表示不同步,任何正数值都表示对二进制每多少次写操作之后同步一次。当autocommit的值为1时,如果将N设置为1,则表示采用同步写磁盘的方式来写二进制日志,该参数很重要,这个以后还会提到。值得注意的是,在将该参数设置为1时,也应该将innodb_support_xa设为1来解决,这可以确保二进制日志和InnoDB存储引擎数据文件的同步
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_logs_days = {0..99}#设定二进制日志的过期天数,超出此天数的二进制日志文件将被自动删除。默认为0,表示不启用过期自动删除功能。如果启用此功能,自动删除工作通常发生在MySQL启动时或FLUSH日志时
binlog-ignore-db=db_name:显示的指定忽略某个数据库的binlog记录。
binlog-do-db=db_name 指定保存更新到 binlog 的数据库
binlog-ignore-db=db_name 指定不保存更新到 binlog 的数据库
注:一般建议将binlog日志与数据文件分开存放,不但可以提高mysql性能,还可以增加安全性!
五、中继日志
说明:主要是在mysql服务器的中从架构中的从服务器上用到的,当从服务器想要和主服务器进行数据的同步时,从服务器将主服务器的二进制日志文件拷贝到己的主机上放在中继日志中,然后调用SQL线程按照拷中继日志文件中的二进制日志文件执行以便就可达到数据的同步。中继日志也是二进制日志,用来给slave 库恢复。
开启的方法:(只在从服务器上开启)
relay-log = file_name #指定中继日志的位置和名字,默认为host_name-relay-bin。也可以使用绝对路径,以指定非数据目录来存储中继日志
relay-log-index = file_name #指定中继日志的名字的索引文件的位置和名字,默认为数据目录中的host_name-relay-bin.index
relay-log-info-file = file_name #设定中继服务用于记录中继信息的文件,默认为数据目录中的relay-log.info
relay_log_purge = {ON|OFF} #设定对不再需要的中继日志是否自动进行清理。默认值为ON
relay_log_space_limit =0#设定用于存储所有中继日志文件的可用空间大小。默认为0,表示不限定。最大值取决于系统平台位数
max_relay_log_size = {4096..1073741824} #设定从服务器上中继日志的体积上限,到达此限度时其会自动进行中继日志滚动。此参数值为0时,mysqld将使用max_binlog_size参数同时为二进制日志和中继日志设定日志文件体积上限
六、事物日志
说明:详细的记录了在什么时间发生了什么时候,在哪个时间对哪些数据进行了改变,能后实现事件的重放,一般只记录对数据进行改变的操作,对于读操作一般不进行记录。
事物日志为数据库服务器实现以下功能:
(1).将随机IO转换为顺序IO,大大的提高了数据库的性能,存储的数据可能存在在磁盘的不同位置,降低了数据的读取和操作性能。转换为顺序IO的原理为,先将数据存放在日志文件中,然后由RDBSM的后台将日志中的数据存放到磁盘上,这样就保证了存储的数据是连续的。
(2).为事件重放提供基础,事务日志详细的记录了时间发生的时间以及操作的数据对象,事务进程可以根据这些信息进行时间重放。
默认的事务日志文件有两个,位于数据目录下以ibdata+number结尾的数字,我们可以对事务日志的位置、文件大小、增长方式进行定义,定义的方法
总结:
日志直接性能损耗数据库系统中最为昂贵的IO 资源,在默认情况下,系统仅打开错误日志,关闭了其他所有日志,以达到尽可能减少IO 损耗提高系统性能的目的。
但在实际应用场景中,都至少需要打开二进制日志,因为这是MySQL 很多存储引擎进行增量备份的基础,也是MySQL 实现复制的基本条件。有时候为了进一步的性能优化,定位执行较慢的SQL 语句,很多系统也会打开慢查询日志来记录执行时间超过特定数值的SQL 语句。
一般情况下,在生产系统中很少有系统会打开查询日志。因为查询日志打开之后会将MySQL 中执行的每一条Query 都记录到日志中,会该系统带来比较大的IO 负担,而带来的实际效益却并不是非常大。
一般只有在开发测试环境中,为了定位某些功能具体使用了哪些SQL 语句的时候,才会在短时间段内打开该日志来做相应的分析。所以,在MySQL 系统中,会对性能产生影响的MySQL日志(不包括各存储引擎自己的日志)主要是Binlog
参考: