MySQL 学习<十五> 日志

日志简介


MySQL日志主要分为4类,使用这些日志文件,可以查看MYSQL内部发生的事情。分别是:

1.误日志:记录MySQL服务的启动、运行、停止MySQL服务时出现的问题 error log

2.查询日志:记录建立的客户端连接和执行的语句 gerenal log

3.二进制日志:记录所有更改数据的语句,可以用于数据复制 binary log

4.慢查询日志:记录所有执行时间超过long_query_time的所有查询或不使用索引的查询 slow log

默认情况下,所有日志创建于MySQL数据目录中。通过刷新日志,可以强制MySQL关闭和重新打开日志文件(或者在某些情况下切换到一个新的日志)。当执行一个FLUSH LOGS语句或执行mysqladmin flush-logs 或mysqladmin refresh 时,将刷新日志。

如果使用MySQL复制功能,在复制服务器上可以维护更多日志文件,这种日志称为接替日志

其他日志功能会降低MySQL数据库的性能。例如,在查询非常频繁的MySQL数据库系统中,如果开启了通用查询日志和慢查询日志,MySQL数据库会花费很多时间记录日志。同时,日志会占用大量的磁盘空间。


二进制日志


二进制日志就是我们经常说的binlog,主要记录MySQL数据库的变化。二进制日志以一种有效的格式,并且是事务安全的方式包含更新日志中可用的所有信息。

二进制日志包含关于每个更新数据库的语句的执行时间信息。他不包含没有修改任何数据的语句,例如select语句;使用二进制日志的最大目的是最大可能地恢复数据库,因为二进制日志包含备份后进行的所有更新。

启动和设置二进制日志

默认情况下,二进制日志是关闭的,可以通过修改MySQL的配置文件来启动和设置二进制日志

my.ini中[mysqld]组下面有几个设置是关于二进制日志的:


log-bin[=PATH/[FILENAME]]
expire_logs_days=10
max_binlog_size=100M

log-bin定义开启二进制日志;path表明日志文件所在的目录路径;filename指定了日志文件的名称,如文件的全名是filename.0001,filename.0002等。除了上述文件之外,还有一个成为filename.index的文件,文件内容为所有日志的清单,可以使用记事本打开该文件。

expire_logs_days定义了MySQL清除过期日志的时间,即二进制日志自动删除的天数。默认值为0,表示“没有自动删除”。当MySQL启动或刷新二进制日志时可能删除该文件。

max_binlog_size定义了单个文件的大小限制,如果二进制日志写入的内容大小超出给定值,日志就会发生滚动(关闭当前文件,重新打开一个新的日志文件)。不能将该变量设置为大于1GB或小于4096字节。默认值是1GB。

如果正在使用大事务 ,二进制日志文件大小还可能超过max_binlog_size的定义大小。在my.ini配置文件中的[mysqld]组下,添加以下几个参数与参数值:

[mysqld]
log-bin
expire_logs_days=10
max_binlog_size=100M


添加完毕之后,关闭并重启MySQL服务进程,即可打开二进制日志,然后可以通过SHOW VARIABLES语句来查询日志设置:


可以看到log_bin为ON,表明二进制日志已经打开。


查看二进制日志

MySQL二进制日志是经常用到的。当MySQL创建二进制日志文件时,首先创建一个以filename为名称,以index为后缀的文件;再创建一个以filename为名称,以“.000001”为后缀的文件。当MySQL服务重新启动一次,以“.000001”为后缀的文件会增加一个,
并且后缀名加1递增;如果日志长度超过了max_binlog_size的上限(默认是1GB)也会创建一个新的日志文件。

show binary logs语句可以查看当前二进制日志文件个数和文件名。mysql二进制日志并不能直接查看,如果要查看日志内容,可以通过mysqlbinlog命令查看。

使用show binary logs语句查看二进制日志文件个数和文件名:



使用mysqlbinlog查看二进制日志,如果直接使用mysqlbinlog,这里如截图中所示,会提示错误,unknown option(同上文数据备份和恢复中使用mysqldump命令一样)

查找了下解决方法,说查看 my.ini 发现[clien]下有 no-beep 参数,mysql客户端将会读取此参数(该参数作用暂时不知)。这里具体解决办法有两种:

1.删除my.ini [client]下的 no-beep 参数;

2.在 mysqldump 后加--no-defaults参数。
经测试,这两种方法有效。


删除二进制日志

MySQL的二进制日志可以配置自动删除,同时MySQL也提供了安全的手动删除二进制日志的方法。

1.删除所有的二进制日志文件使用RESET MASTER;语法如下:

RESET MASTER;


执行该语句,所有二进制日志将被删除,MySQL会重新创建二进制日志,新的日志文件扩展名将重新从000001开始编号。

2.只删除部分二进制日志文件使用PURGE MASTER LOGS,语法如下:

PURGE {MASTER | BINARY} LOGS TO 'log_name'
PURGE {MASTER | BINARY} LOGS BEFORE 'date'


第一种方法指定文件名,执行该命令将删除文件名编号比指定文件名编号小的所有日志文件;
第二种方法指定日期,执行该命令将删除指定日期以前的所有日志文件;


例如,使用PURGE MASTER LOGS;删除创建时间比binlog.000015早的所有日志文件:



使用 PURGE MASTER LOGS 删除2017年5月30日前创建的所有日志文件,执行完毕之后,2013年3月30日前的日志文件都被删除,但2013年3月30日的日志会被保留;执行命令如下:


使用二进制日志恢复数据库

如果MySQL服务器启用了二进制日志,在数据库出现意外丢失数据时,可以使用mysqlbinlog工具从指定的时间点开始(例如,最后一次备份)直到现在,或另外一个指定的时间点的日志中恢复数据。

要想从二进制日志恢复数据,需要知道当前二进制日志文件的路径和文件名。一般可以从配置文件(即my.cnf或者my.ini,文件名取决于MySQL服务器的操作系统)中找到路径

mysqlbinlog恢复数据的语法如下:

mysqlbinlog [option] filename |mysql -uuser -ppass

option是一些可选项,filename是日志文件名,比较重要的两对option参数是

--start-datetime、--stop-datetime

--start-position、--stop--position

--start-date、--stop-date可以指定恢复数据库的起始时间点和结束时间点

--start-position、--stop--position可以指定恢复数据的开始位置和结束位置

例如,使用mysqlbinlog恢复MySQL数据库到2017年5月1日08:08:08时的状态,执行下面命令

mysqlbinlog --stop-datetime="2017-05-02 08:08:08 "  选中的二进制日志文件具体路径 |mysql -u u+sername -p+password
该命令执行成功后,会根据选中的日志文件恢复2017年5月1日08:08:08前的所有操作。这种方法对误操作的删除数据比较有效


暂时停止二进制日志功能

如果在MySQL的配置文件配置启动了二进制日志,MySQL会一直记录二进制日志,修改配置文件,可以停止二进制日志,但是需要重启MySQL数据库。MySQL提供了暂时停止二进制日志的功能。通过 SET SQL_LOG_BIN 语句可以使MySQL暂停或者启动二进制日志,语法如下:

SET sql_log_bin={0|1}

执行下面语句将暂停二进制日志
SET sql_log_bin=0;

执行下面语句将恢复记录二进制日志
SET sql_log_bin=1;


错误日志

错误日志文件包含了当MySQLd启动和停止时,以及服务器在运行过程中发生任何严重错误时的相关信息。在MySQL中,错误日志也是非常重要的,MySQL启动和停止数据库信息以及一些错误信息记录到错误日志中。

启动和设置错误日志

在默认情况下,错误日志会记录到数据库的数据目录下。如果没有在配置文件中指定文件名,则文件名默认为hostname.err。
例如:MySQL所在服务器主机名为mysql-db,记录错误信息的文件名为mysql-db.err。如果执行了FLUSH LOGS,错误日志文件会重新加载。

错误日志的启动和停止以及日志文件名,都可以通过修改my.ini(或者my.cnf)来配置。错误日志的配置项是log-error。在[mysqld]下配置log-error,在启动错误日志。如果需要指定文件名,则配置项如下:


[mysqld]
log-error=[path / [file_name]]


path为日志文件所在的目录路径,filename为日志文件名。修改配置项后,需要重启MySQL服务才生效。


查看错误日志

通过错误日志可以监视系统的运行状态,便于及时发现故障,修复故障。MySQL错误日志是以文本文件形式存储的,可以使用文本编辑器直接查看MySQL错误日志。

如果不知道日志文件的存储路径,可以使用 show variables; 语句查看错误日志的存储路径。语句如下:

SHOW AVARIABLES LIKE 'log_error';



删除错误日志

MySQL的错误日志以文本文件的形式存储在文件系统中,可以直接删除。

对于MySQL5.5.7以前的版本,flush logs可以将错误日志文件重命名为filename.err_old,并创建新的日志文件。但是从MySQL5.5.7开始,flush logs只是重新打开日志文件,并不做日志备份和创建的操作。如果日志文件不存在,mysql启动或者执行flush logs时会创建新的日志文件

在运行状态下删除错误日志文件后,MySQL并不会自动创建日志文件。flush logs在重新加载日志的时候,如果文件不存在,则会自动创建。所以在删除错误日志之后,如果需要重建日志文件需要在服务器端执行以下命令:

mysqladmin -u root -p flush-logs

或者在客户端登录MySQL数据库,执行flush logs语句:
flush logs;


通用查询日志

通用查询日志记录了MySQL的所有用户操作,包括启动和关闭服务、执行查询和更新语句等

启动和设置通用查询日志

MySQL服务器默认情况下并没有开启通用查询日志。如果需要通用查询日志,可以通过修改my.ini或my.cnf配置文件来开启。在my.ini或my.cnf的[mysqld]组下加入log选项,形式如下:

[mysqld]
log[=path/[filename]]

path为日志文件所在目录路径,filename为日志文件名。如果不指定目录和文件名,通用查询日志将默认存储在mysql数据目录中的hostname.log文件中。hostname是MySQL数据库的主机名。这里在[mysqld]下面增加选项log,后面不指定参数值

[mysqld]
log

查看通用查询日志

通用查询日志中记录了用的所有操作。通过查看通用查询日志,可以了解用户对MySQL进行的操作。通用查询日志是以文本文件形式存储在文件系统中的,可以使用文本编辑器直接打开通用日志文件进行查看,Windows下可以使用记事本,Linux下可以使用vim、gedit等。

删除通用查询日志

通用查询日志是以文本文件的形式存储在文件系统中的。通用查询日志记录用户的所有操作,因此在用户查询、更新频繁的情况下,通用查询日志会增长得很快。DBA可以定期删除比较早的通用日志,以节省磁盘空间。

可以用直接删除日志文件的方式删除通用查询日志。要重新建立新的日志文件,可使用语句:

mysqladmin -u root -p flush-logs

或者在客户端登录MySQL数据库,执行flush logs语句:
flush logs;


慢查询日志


慢查询日志是记录查询时长超过指定时间的日。慢查询日志主要用来记录执行时间较长的查询语句。通过慢查询日志,可以找出执行时间较长、执行效率较低的语句,然后进行优化。

启动和设置慢查询日志


MySQL中慢查询日志默认是关闭的,可以通过配置文件my.ini或my.cnf中的log-slow-queries选项打开,也可以在MySQL服务
启动的时候使用--log--slow-queries[=file_name]启动慢查询日志。启动慢查询日志时,需要在my.ini或者my.cnf文件中配置long_query_time选项指定记录阀值,如果某条查询语句的查询时间超过了这个值,这个查询过程将被记录到慢查询日志文件中。

在my.ini或者my.cnf文件中开启慢查询日志的配置如下:

[mysqld]
log-slow-queries[=path/[filename]]
long_query_time=n

path为日志文件所在目录路径,filename为日志文件名。如果不指定目录和文件名称,默认存储在数据目录中文件名为hostname-slow.log,hostname是MySQL服务器的主机名。参数n是时间值,单位是秒。如果没有设置long-query_time选项,默认时间为10秒。

开启慢查询日志:

[mysqld]
log-slow-queries
long_query_time=1

查看慢查询日志

MySQL的慢查询日志是以文本形式存储的,可以直接使用文本编辑器查看。在慢查询日志中,记录着执行时间较长的查询语句,用户可以从慢查询日志中获取执行效率较低的查询语句,为查询优化提供重要的依据,查看慢查询日志的一些参数

SHOW AVARIABLES LIKE  '%slow%';

删除慢查询日志

和通用查询日志一样,慢查询日志也可以直接删除。删除后在不重启服务器的情况下,需要执行mysqladmin -u root -p flush logs
重新生成日志文件,或者在客户端登录到服务器执行 flush logs; 语句重建日志文件。

官方MySQL的慢查询日志在这里有一个缺陷,就是查询阀值只能是1秒或以上,如果要设置一秒以下就无能为力了。



几点建议就是:

1.日志既会影响MySQL的性能,又会占用大量磁盘空间。因此,如果不必要,应尽可能少地开启日志。根据不同的使用环境,考虑开启不同的日志。

2.例如开发环境中优化查询效率低的语句,可以开启慢查询日志,或者生产环境中发现某些SQL执行特别慢也可以开启;如果磁盘空间不是特充足可以在高峰期间开启,在捕获到查询慢的SQL之后再关闭慢查询日志。

3.如果需要搭建复制环境,那么就一定要开启二进制日志,如果数据特别重要也建议开启二进制日志,以便数据库损坏的时候也可以通过二进制日志挽救一部分数据。

4.通用日志无论在哪种情况下,一般不建议开启 。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值