MySQL日志

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL日志相关的知识,希望对你有一定的参考价值。

mysql日志是记录MySQL数据库的日常操作和错误信息的文件。MySQL中,日志可以分为二进制日志、错误日志、通用查询日志和慢查询日志。分析这些日志文件,可以了解MySQL数据库的运行情况、日常操作、错误信息和哪些地方需要进行优化。

- 日志定义、作用和优缺点
- 二进制日志
- 错误日志
- 通用查询日志
- 慢查询日志
- 日志管理
17.1 日志简介
日志是MySQL数据库的重要组成部分。日志文件中记录着MySQL数据库运行期间发生的变化。当数据库遭到意外的损害时,可以通过日志文件来查询出错原因,并且可以通过日志文件进行数据恢复。
MySQL日志可以分为四种,分别是二进制日志、错误日志、通用查询日志和慢查询日志。
17.2 二进制日志
二进制日志也叫作变量日志(update log),主要用于记录数据库的变化情况。通过二进制日志可以查询MySQL数据库中进行了哪些改变。
 
17.2.1 启动和设置二进制日志
默认情况下,二进制日志功能是关闭的。通过my.cnf或者my.ini文件的log-bin选项可以开户二进制日志。将log-bin选项加入到my.cnf或者my.ini文件到[mysqld]组中,形式如下:
 
# my.cnf(Linux操作系统下) 或者my.ini(Windows操作系统下)
[mysqld]
log-bin[=DIR\[filename]]
log-bin=c:/log/mylog
17.2.2 查看二进制日志
使用二进制格式可以存储更多的信息,并且可以使写入二进制日志的效率更高。但是,不能直接打开并查看二进制日志。如果需要查看二进制日志,必须使用mysqlbinlog命令。
mysqlbinlog filename.number
mysqlbinlog mylog.000001
 
17.2.3 删除二进制日志
二进制日志会记录大量的信息。如果很长时间不清理二进制日志,将会浪费很多的磁盘空间。删除二进制日志的方法很多,本小节将为读者详细介绍如何删除二进制日志。
 
1. 删除所有二进制日志: reset master;
2. 根据编号来删除二进制日志: purge master logs to ‘filename.number‘
purge master logs to ‘mylog.00001‘;
3. 根据创建时间来删除二进制日志
PURGE MASTER LOGS TO ‘yyyy-mm-dd hh:mm:ss‘;
purge master logs to ‘2009-12-20 15:00:00‘;
17.2.4 使用二进制日志还原数据库
二进制日志记录了用记对数据库中数据的改变。如INSERT语句、UPDATE语句、CREATE语句等都会记录到二进制日志中。一旦数据库遭到破坏,可以使用二进制日志还原数据库。
 
如果数据库遭到意外损坏,首先应该使用最近的备份文件来还原数据库。备份之后,数据库可能进行了一些更新。这可以使用二进制日志来还原。因为二进制日志存储了更新数据库的语句,如UPDATE语句、INSERT语句等。二进制日志还原数据库的命令如下:
mysqlbinlog filename.number | mysql -u root -p
drop table employee;
17.2.5 暂时停止二进制日志功能
在配置文件中设置了log-bin选项以后,MySQL服务器将会一直开启二进制日志功能。删除该选项后就可以停止二进制日志功能。如果需要再次启动这个功能,又需要重新添加log-bin选项。MySQL中提供了暂时停止二进制日志功能的语句。
 
如果用户不希望自己执行的某些SQL语句记录在二进制日志中,那么需要在执行这些SQL语句之前暂停二进制日志功能。用户可以使用SET语句来暂停二进制日志功能,SET语句的代码如下:
SET SQL_LOG_BIN=0;
17.3 错误日志
错误日志是MySQL数据库中最常用的一种日志。错误日志主要用来记录MySQL服务的开户、关闭和错误信息。
 
17.3.1 启动和设置错误日志
在MySQL数据库中,错误日志功能是默认开启的。而且,错误日志无法被禁止。默认情况下,错误日志存储在MySQL数据库的数据文件夹下。错误日志文件通常的名称为hostname.err。其中,hostname表示MySQL服务器的主机名。错误日志的存储位置可以通过log-error选项来设置。将log-error选项加入到my.ini或者my.cnf文件的[mysqld]组中,形式如下:
 
# my.cnf (Linux操作系统下)或者my.ini(Windows操作系统下)
[mysqld]
log-error=DIR/[filename]
17.3.2 查看错误日志
错误日志中记录着开启和关闭MySQL服务的时间,以及服务运行过程中出现哪些异常等信息。如果MySQL服务出现异常,可以到错误日志中查找原因。
错误日志是以文本文件形式存储的,可以直接使用普通文件工具就可以查看。Windows操作系统可以使用文本文件查看器查看。Linux操作系统下,可以使用vi工具或者使用gedit工具来查看。
17.3.3 删除错误日志
数据库管理员可以删除很长时间之间的错误日志,以保证MySQL服务器上的硬盘空间。MySQL数据库中,可以使用mysqladmin命令来开启新的错误日志。mysqladmin命令的语法如下:
mysqladmin -u root -p flush-logs
执行该命令后,数据库系统会自动创建一个新的错误日志。旧的错误日志仍然保留着,只是已经更名为filename.err-old。
17.4 通用查询日志
通用查询日志用来记录用户的所有操作,包括启动和关闭MySQL服务、更新语句、查询语句等。
17.4.1 启动和设置通用查询日志
默认情况下,通用查询日志功能是关闭的。通过my.cnf或者my.ini文件的log选项可以开启通用查询日志。将log选项加入到my.cnf或者my.ini文件的[mysqld]组中,形式如下:
# my.cnf(Linux操作系统下)或者my.ini(Windows操作系统下)
[mysqld]
log[=DIR\[filename]]
 
17.4.2 查看通用查询日志
用户的所有操作都会记录到通用查询日志中。如果希望了解某个用户最近的操作,可以查看通用查询日志。通用查询日志是以文本文件的形式存储的。Windows操作系统可以使用文本文件查看器查看。Linux操作系统下,可以使用vi工具或者使用gedit工具来查看。
17.4.3 删除通用查询日志
通用查询日志会记录用户的所有操作。如果数据库的使用非常频繁,那么通用查询日志将会占用非常大的磁盘空间。数据库管理员可以删除很长时间之间的通用查询日志,以保证MySQL服务器上的磁盘空间。
 
MySQL数据库中,也可以使用mysqladmin命令来开启新的通用查询日志。新的通用查询日志会直接覆盖旧的查询日志,不需要再手动删除了。mysqladmin命令的语法如下:
mysqladmin -u rot -p flush-logs
17.5 慢查询日志
慢查询日志用来记录执行时间超过指定时间的查询语句。通过慢查询日志,可以查找出哪些查询语句的执行效率很低,以便进行优化。
 
17.5.1 启动和设置慢查询日志
默认情况下,慢查询日志功能是关闭的。通过my.cnf或者my.ini文件的log-show-queries选项可以开启慢查询日志。通过long_query_time选项来设置时间值,时间以秒为单位。如果查询时间超过了这个时间值,这个查询语句将被记录到慢查询日志。将log-show-queries选项和long_query_time选项加入到my.cnf或者my.ini文件的[mysqld]组中,形式如下:
# my.cnf(Linux操作系统下)或者my.ini(Windows操作系统下)
[mysqld]
log-show-queries[=DIR\[filename]
long_query_time=n
17.5.2 查看通用查询日志
执行时间超过指定时间的查询语句会被记录到查询日志中。如果用户希望查询哪些查询的执行效率低,可以从慢查询日志中获得想要的信息。慢查询日志也是以文本文件的形式存储的。可以使用普通的文本文件查看工具来查看。
select benchmark(200000000,1*2);
暂停服务之后再查看慢查询日志
17.5.3 删除通用查询日志
慢查询日志的删除方法与通用查询日志的删除方法是一样的。可以使用mysqladmin命令来删除。也可以使用手工方式来删除。
mysqladmin -u root -p flush-logs
执行该命令后,命令行会提示输入密码。输入正确密码后,将执行删除操作。新的慢查询日志会直接覆盖旧的查询日志,不需要再手动删除了。数据库管理员也可以手工删除慢查询日志。删除之后需要重新启动MySQL服务。重启之后就会生成新的慢查询日志。如果希望备份旧的慢查询日志文件,可以将旧的日志文件改名。然后重启MySQL服务。
17.6 本章实例
(1)启动二进制日志功能,并且将二进制日志存储到c:\目录下。二进制日志文件命令为binlog。
my.ini或my.cnf中设置
log-bin=C:\binlog
重启服务
 
(2)启动服务后,查看二进制日志。
mysqlbinglog c:\binlog.000001
 
(3)然后向test数据库下的score表中插入两条记录。
user test;
insert into score values(null,901, ‘计算机‘,98);
insert into score values(null,901, ‘语文‘,80);
(4)暂停二进制日志功能,然后再次删除score表中的所有记录。
set sql_log_bin=0;
select * from score;
(5)重新开启二进制日志功能。
set sql_log_bin=1;
(6)使用二进制日志来恢复score表。
mysqllogbin c:\binlog.0000001 | mysql -u root -p
(7)删除二进制日志。
reset master;
原来二进制日志恢复为新的日志
17.7 上机实践
(1)将错误日志的存储位置设置为C:\LOG目录下。
(2)开启通用查询日志,并设置该日志存储在C:\LOG目录下。
(3)开启慢查询日志,并设置该日志存储在C:\LOG目录下。设置时间值为5秒。
(4)查看错误日志、通用查询日志和慢查询日志。
(5)删除错误日志。
(6)删除通用查询日志和慢查询日志。
 
1:
log-error=C:/LOG/
 
2:
log=C:/LOG/
 
3:
log-slow-queries=C:/LOG/
long_query_time=5
 
4:
重新启动服务
C:/log目录下有错误日志、通用查询日志和慢查询日志。
 
5:6:
mysqladmin -u root -p flush-logs
17.8 常见问题及解答
1. 平时应该开启什么日志?
2. 如何使用二进制日志?

以上是关于MySQL日志的主要内容,如果未能解决你的问题,请参考以下文章

程序员能纯靠技术渡过中年危机吗?

程序员能纯靠技术渡过中年危机吗?

(摘)为什么有些程序员悄无声息渡过35岁中年危机?

知乎热议:程序员能纯靠技术渡过中年危机吗?

知乎热议:“程序员能纯靠技术渡过中年危机吗?”你怎么看?

程序员真的有35岁危机这样的年龄危机吗?那些程序员是如何悄无声息渡过中年危机的?