前言

的日志是帮助数据库管理员,追踪分析数据库曾经发生的各种事件的有力依据,中提供了错误日志、binlog日志(二进制日志)、查处日志、慢查询日志。在此,我力求解决以下问题:各个日志的作用是什么?怎样去控制这些日志呢?怎样去使用这些日志提供的信息呢?

错误日志

1.错误日志作用

错误日志记录了mysql启动和停止时,以及服务器运行过程中发生任何严重性错误的相关信息。当数据库出现任何故障导致无法启动时候,比如mysql启动异常,我们可首先检查此日志。在mysql中,错误日志日志(还有其他日志),不仅仅可以存储在文件中,当然还可以存储到数据的表中,至于实现方式,笔者也正在研究中···

2.错误日志控制与使用

1.配置

通过log-error=[file-name]来配置(在mysql的配置文件中),如果没有指定file_name,mysqld使用错误日志名为host_name.err(host_name为主机名),并默认在参数datadir(保存数据的目录)指定的目录中写入日志文件。

比如我本地使用的是WampServer集成环境

其中log-error=D:/wamp/logs/mysql.log

如下图

如果我将log-error注释掉(#log-error=D:/wamp/logs/mysql.log),重启服务器,则可以查看到错误日志文件在datadir指定的目录下

2.查看错误日志

错误日志的格式:时间 [错误级别] 错误信息

如果你感觉通过mysql配置文件来定位错误日志所在位置比较麻烦,你完全可以通过再客户端通过命令来查看错误日志所在位置

使用命令式:show variables like 'log_error';

以下是mysql启动日志

二进制日志

1.作用

二进制日志(又叫binlog日志)记录了所有的DDL(数据定义语言)语句和DML(数据操作语言)语句,但是不包括数据查询语句,语句是以“事件”的形式保存的,它描述数据更改的过程。该日志的两个主要功能是:数据的恢复与数据的复制。

数据的恢复:MySQL本身具备数据备份和恢复功能。比如,我们每天午夜12:00进行数据的备份。如果某天,下午13:00,数据库出现故障,导致数据库内容丢失。我们可以通过二进制日志解决这个问题。解决思路是,可以先将前一天午夜12:00的数据备份文件恢复到数据库,然后再使用二进制日志回复从前一天午夜12:00到当天13:00对数据库操作。

数据复制:MySQL支持主从服务器间的数据复制功能,并通过该功能实现数据库的冗余机制以保证数据库的可用性和提高数据库德性能。MySQL正是通过二进制日志实现数据的传递。主服务器上的二进制日志内容会被发送到各个从服务器上,并在每个从服务器上执行,从而保证了主从服务器之间数据的一致性。

2.二进制日志控制与使用

1.开启

在默认情况下,mySQL不会记录二进制日志。怎样才能开启MySQL的二进制日志记录功能呢?

我们可以通过MySQL的配置文件来控制MySQL启动二进制日志记录功能。通过修改参数log-bin=[base_name]来启动MySQL二进制日志。mySQL会将修改的数据库内容的语句记录到以 base_name-bin.0000x为名的日志文件中,其中bin代表binary,后缀00000x代表二进制日志文件的顺序,每次启动Mysql,日志文件顺序会自动加1.如果base_name没有定义,MySQL将使用pid-file参数设置的值作为二进制日志文件的基础名字。

比如我将log-bin文件名定为mybinlog,那么将会在D:/wamp/bin/mysql/mysql5.6.17/data目录下,生成mybinlog.00000x的二进制日志文件。

二进制日志文件如下图

通过使用show variables like'log_bin'检查bin-log日志是否开启。

2.查看

MySQL二进制日志主要是供MySQL内部使用的,并不是为了数据库管理员阅读使用,因此,二进制日志与其他日志一个重要的不同就是,二进制文件的格式不是文本格式,其内容不能通过记事本直接查看,为了便于管理员管理,MySQL提供了mysqlbinlog工具查看二进制日志内容。

比如:mysqlbinlog D:\wamp\bin\mysql\mysql5.6.17\data\mybinlog.000003

执行结果如下:

现在我们来做一个测试,看看bin日志是否记录了我更新数据库的操作

比如我将数据表t2中id2=2的那行记录的id1改为5。然后在查询二进制日志文件,看是否记录了我的操作。

结果和明显,二进制文件记录了我修改数据库的操作,并且还记录了我是修改那个数据库里面的数据,至于我查询语句,它并没有记录。

3.二进制日志的删除

对应比较方繁忙的系统来说,由于每天生成大量的日志,这些日子如果长时间不清楚(或转移),将会对磁盘空间带来很大的浪费。因此,定期删除日志是DBA维护MYSQL数据库的一个重要的内容。

1.通过reset master 命令

执行reset master命令,该命令将删除所有的binlog日志。新的日志文件的编号从000001开始。

2.通过purege master logs to命令

通过执行purge master logs to'base_name.xxxxxx',删除‘xxxxxx'编号之前的所有日志。下面我将删除mybinlog.000003之前的所有日志。

如下图:

3.通过purge master logs beffor '时间' 命令

执行purge master logs beffor '时间' 表示删除'时间'之前的所有日志。比如删除2016-04-01 00:00:00之前的所有日志,命令如下:

purge master logs beffor '2016-04-01 00:00:00';

4.通过在配置文件中设置参数expire_logs_days

通过设置参数expire_logs_days=#,来指定日志过期的天数,过了指定的天数,日志将会被自动删除,这个是我比较喜欢的方式。比如设置expire_logs_day=3,代表3天后会被自动删除。

4.二进制日志重要参数说明

max_binlog_size:指定单个二进制日志文件的最大值,如果超过该值,则产生新的二进制日志文件,后缀名+1,并记录到.index文件中。

binlog_cache_size:缓存区大小

sync_binlog:表示没写缓存多少次就同步到磁盘,如果将N设置为1,表示采用同步写到磁盘的方式写进二进制文件。MySQL中系统默认的设置是sync_binlog=0,也就是不做任何强制性的磁盘刷新指令,这时候的性能是最好的,但是风险也是最大的。因为一旦系统Crash,在binlog_cache中的所有binlog信息都会被丢失。而当设置为“1”的时候,是最安全但是性能损耗最大的设置。因为当设置为1的时候,即使系统Crash,也最多丢失binlog_cache中未完成的一个事务,对实际数据没有任何实质性影响。

binlog-do-db:需要记录哪些数据库的日子,默认值为空,表示将所有库日志同步到二进制日志中。

binlog-ignore-db:需要忽略哪些数据库的日子

log-slave-update:搭建主从数据库时候需要配置

binglog_format:可选值有statement(记录逻辑sql语句)、row(记录表的行更动情况)、mixed

5.利用二进制日志进行数据恢复

在前面讨论过如果数据出现异常,想将其恢复到在某个时间点的数据,仅仅靠二进制往往是不够的,我们还需要的是在这个时间点之前备份的数据。

为了便于观察效果,现在我已经将我的数据库备份了,此时数据表t1中数据如下:

从现在开始,我需要对数据进行一些操作,比如更新或者是插入操作,操作后,t1数据如下图

此时,如果很不幸运的事情发生了,有***闯入进来了,将我的t1表数据全部删除了,那么我怎样得到的***删除之前的数据呢?

第一步:我需要将我的数据还原到我备份的数据,还原后结果如下:

第二步:我需要利用我二进制日志文件还原从数据备份那刻到被******前的那刻的所有数据操作

执行:mysqlbinlog D:\wamp\bin\mysql\mysql5.6.17\data

\mybinlog.000004

分析二进制日志我们发现在'at 637'行,我们的数据遭到了***的***,所有我们只需要还原at 637行之前的所有操作,忽略之后的所有操作即可。

于是我们可以执行以下命令来恢复我们的数据:

mysqlbinlog D:\wamp\bin\mysql\mysql5.6.17\data\mybinlog.000004 --stop-pos=637|mysql -uroot -p**dequan

然后我们再来查看一下我们t1表的数据

总于大功告成了,但是这也提示我们,为了恢复数据的方便性,不仅仅需要开启二进制日志,也要定时保存数据。

关于二进制日志的补充:

1.我们还可以通过使用show binary logs命令查看当前还有哪些二进制日志。

2.我们可以通过show binlog events日志记录的事件

show binlog events查看的是所有日志记录的事件。如果想查询某个二进制日志记录事件,可以在后面加in+'日志名',如下图:

查询日志

1.功能描述

查询日志记录了客户端得所有语句。可以通过log=[file_name]来指定其位置,和其他日志一样,如果没有指定file_name值,日志将会写到datadir所在目录,默认的文件名师host_name.log,此日志对系统性能的影响较大,一般不会开启,在此,不细说。

慢查询日志

1.功能描述

慢查询日志是记录所有执行时间超过参数long_query_time(单位:秒),的SQL语句日志。为了获得表锁,而等待的时间,不算执行时间。我们可以通过log-slow-queries=[file_name]选项来启动慢查询日志功能。和前面的日志一样,如果没有指定file_name,那么日志目录在datedir目录下,且默认的名字为host_name-slow.log。

2.慢查询日志读取

查询慢查询开启状态

在配置文件中添加如下代码,开启慢查询

#开启慢查询

slow_query_log=ON
slow_query_log_file=D:/wamp/logs/myslowquery.log
long_query_time=1.5

(有的地方说是通过log-slow-queries=[file_name]来指定慢查询日志,但是我试过了,这样启动mysql会报错,可能是我在win系统下操作,又或可能我本地是使用WampServer集成环境安装的mysql、又或可能是使用的版本不一样)

查看慢查询时间设置

如果修改慢查询时间,可以使用set long_query_time=1.5;

为了便于查看效果,我们将慢查询时间限制改为0.15,然后我们写一个时间超过0.15的sql,最后查看日志,是否记录了该sql语句。

设置慢查询时间,以及执行相应的sql语句

在上面我共执行了3条SQL语句,现在我们再来看一下,慢查询日志如下

其只是记录了查询其中查询时间比较长的那条sql语句。