前言
数据库的日志是帮助数据库管理员,追踪分析数据库以前发生的各种事件的有力根据。mysql中提供了错误日志、binlog日志(二进制日志)、查处日志、慢查询日志。在此,我力求解决下面问题:各个日志的作用是什么?如何去控制这些日志呢?如何去使用这些日志提供的信息呢?
错误日志
1.错误日志作用
错误日志记录了mysql启动和停止时。以及server执行过程中发生不论什么严重性错误的相关信息。当数据库出现不论什么故障导致无法启动时候。
比方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),重新启动server。则能够查看到错误日志文件在datadir指定的文件夹下
2.查看错误日志
错误日志的格式:时间 [错误级别] 错误信息
假设你感觉通过mysql配置文件来定位错误日志所在位置比較麻烦。你全然能够通过再client通过命令来查看错误日志所在位置
使用命令式:show variables like 'log_error';
下面是mysql启动日志
二进制日志
1.作用
二进制日志(又叫binlog日志)记录了全部的DDL(数据定义语言)语句和DML(数据操作语言)语句。可是不包含数据查询语句。语句是以“事件”的形式保存的,它描写叙述数据更改的过程。该日志的两个主要功能是:数据的恢复与数据的复制。
数据的恢复:MySQL本身具备数据备份和恢复功能。
比方,我们每天午夜12:00进行数据的备份。
假设某天,下午13:00,数据库出现问题。导致数据库内容丢失。
我们能够通过二进制日志解决问题。解决思路是。能够先将前一天午夜12:00的数据备份文件恢复到数据库,然后再使用二进制日志回复从前一天午夜12:00到当天13:00对数据库的操作。
数据复制:MySQL支持主从server间的数据复制功能,并通过该功能实现数据库的冗余机制以保证数据库的可用性和提高数据库德性能。MySQL正是通过二进制日志实现数据的传递。
主server上的二进制日志内容会被发送到各个从server上。并在每一个从server上运行,从而保证了主从server之间数据的一致性。
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
运行结果例如以下:
![](https://img-blog.csdn.net/20160413145255908?)
如今我们来做一个測试。看看bin日志是否记录了我更新数据库的操作
比方我将数据表t2中id2=2的那行记录的id1改为5。然后在查询二进制日志文件,看是否记录了我的操作。
![](https://img-blog.csdn.net/20160413150034692?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
结果和明显,二进制文件记录了我改动数据库的操作,而且还记录了我是改动那个数据库里面的数据,至于我查询语句。它并没有记录。
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命令查看当前还有哪些二进制日志。
![](https://img-blog.csdn.net/20160413155422072?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
2.我们能够通过show binlog events日志记录的事件
show binlog events查看的是全部日志记录的事件。假设想查询某个二进制日志记录事件,能够在后面加in+'日志名'。例如以下图:
![](https://img-blog.csdn.net/20160413160347638?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
查询日志
1.功能描写叙述
查询日志记录了client得
全部语句。能够通过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语句,如今我们再来看一下,慢查询日志例如以下
![](https://img-blog.csdn.net/20160413174343787?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
其仅仅是记录了查询当中查询时间比較长的那条sql语句。