MySQL日志(十四)
MySQL日志
- MySQL日志记录了MySQL数据库日常操作和错误信息。
日志简介
-
MySQL日志主要分为4类,使用这些日志文件,可以查看MySQL内部发生的事情。这4类日志分别是:
- 错误日志:记录MySQL服务的启动、运行或停止MySQL服务时出现的问题。
- 查询日志:记录建立的客户端连接和执行的语句。
- 二进制日志:记录所有更改数据的语句,可以用于数据复制。
- 慢查询日志:记录所有执行时间超过long_query_time的所有查询或不使用索引的查询。
-
通过刷新日志,可以强制关闭和重新打开日志文件(或者在某个情况下切换到一个新的日志)。当执行一个
FLUSH LOGS
语句或执行mysqladmin flush-logs
或mysqladmin refresh
时,将刷新日志。
二进制日志
- 二进制日志包含所有更新了数据或者已经存在更新了数据(例如,没有匹配任何行的一个DELETE)的语句。使用二进制日志的主要目的是最大可能地恢复数据库,因为二进制日志包含备份后进行的所有更新。
启动和设置二进制日志
-
默认情况下,二进制日志是关闭的,可以通过修改MySQL的配置文件来启动和设置二进制日志。
-
my.ini中[MySQLd]组下面有几个设置是关于二进制日志的:
log-bin [=path/[filename] ] expire_logs_days = 10 max_binlog_size = 100M
log-bin定义开启二进制日志;日志文件后缀为000001,000002...,每启动一次MySQL服务会自动生成一个新的日志文件,后缀名加1递增;filename.index文件内容为所有日志的清单,可以使用记事本打开。
expire_logs_days定义了MySQL清除过期日志的时间,即二进制日志自动删除的天数。默认值为0,表示“没有自动删除”。当MySQL启动或刷新二进制日志时可能删除该文件。
max_binlog_size定义了单个文件的大小限制,如果二进制日志写入的内容大小超出给定值,日志就会发生滚动(关闭当前文件,重新打开一个新的日志文件)。不能将该变量设置大于1GB或小于4096B。默认值是1GB。
-
通过使用SHOW VARIABLES语句可以查询日志设置,执行的语句及结果如下:
SHOW VARIABLES LIKE 'log_%';
-
提示:数据库文件最好不要与日志文件放在同一个磁盘上,这样,当数据库文件所在的磁盘发生故障时,可以使用日志文件恢复数据。
查看二进制日志
-
show binary logs语句可以查看当前的二进制日志文件个数及其文件名。
-
MySQL二进制日志并不能直接查看,如果要查看日志内容,可以通过mysqlbinlog命令查看,在命令行下执行的语句格式如下:
mysqlbinlog 路径 --不需要加引号,正反斜杆都可以
-
在MySQL中查看二进制日志,执行语句格式如下:
SHOW BINLOG EVENTS IN 'log_name';
-
使用
SHOW MASTER STATUS;
可以查看当前的二进制日志POS位置。
删除二进制日志
- MySQL的二进制日志文件可以配置自动删除,同时MySQL也提供了安全的手动删除二进制的方法;RESET MASTER删除所有的二进制日志文件;PURGE MASTER LOGS只删除部分二进制日志文件。
-
使用RESET MASTER语句删除所有二进制日志文件
RESET MASTER
语法格式如下:RESET MASTER;
执行完该语句后,所有二进制日志将被删除,MySQL会重新创建二进制日志,新的日志文件扩展名将重新从000001开始编号。
-
使用PURGE MASTER LOGS语句删除指定日志文件
PURGE MASTER LOGS
语法如下:PURGE {MASTER | BINARY} LOGS TO 'log_name' PURGE {MASTER | BINARY} LOGS BEFORE 'date'
第1种方法指定文件名,执行该命令将删除文件名编号比指定文件名编号小的所有日志文件。
第2种方法指定日期,执行该命令将删除指定日期以前的所有日志文件。
使用二进制日志恢复数据库
-
使用mysqlbinlog工具从指定的时间点开始直到现在,或另一个指定的时间点的日志中恢复数据。
-
mysqlbinlog
恢复数据的语法如下:mysqlbinlog [option] filename | mysql -u username -p
option是一些可选的选项,filename是日志文件名。
option参数是 --start-date、--stop-date、--start-position、--stop-position。--start-date和--stop-date可以指定恢复数据库的起始时间点和结束时间点。--start-position、--stop-position可以指定恢复数据的开始位置和结束位置。
暂时停止二进制日志功能
-
修改配置文件,可以停止二进制日志,但是需要重启MySQL数据库。MySQL提供了暂时停止二进制日志的功能。通过SET SQL_LOG_BIN语句可以暂停或者启动二进制日志。
-
SET SQL_LOG_BIN的语法如下:
SET sql_log_bin = {0|1} --0暂停,1启动
错误日志
- 错误日志文件包含了当mysqld启动和停止时,以及服务器在运行过程中发生任何严重错误时的相关信息。
启动和设置错误日志
-
在默认情况下,错误日志会记录到数据库的数据目录下。如果没有在配置文件中指定文件名,则文件名默认为hostname.err。
-
如果执行了
FLUSH LOGS
,错误日志文件会重新加载。 -
错误日志的启动和停止以及指定日志文件名都可以通过修改my.ini(或者my.cnf)来配置。错误日志的配置项是log-err。如果需要指定文件名,则配置项如下:
[mysqld] log-error = [path / [file_name]]
修改配置项后,需要重启MySQL服务以生效。
查看错误日志
-
MySQL错误日志是以文本文件形式存储的,可以使用文本编辑器直接查看MySQL错误日志。
-
如果不知道日志文件的存储路径,可以使用SHOW VARIABLES语句查询错误日志的存储路径。
-
SHOW VARIABLES
语句如下:SHOW VARIABLES LIKE 'log_error';
删除错误日志
-
MySQL的错误日志是以文本文件的形式存储在文件系统中的,可以直接删除。
-
flush logs
只是重新打开日志文件,并不做日志备份和创建的操作。如果日志文件不存在,MySQL启动或者执行flush logs
时会创建新的日志文件。 -
在运行状态下删除错误日志文件后,MySQL并不会自动创建日志文件。
flush logs
在重新加载日志的时候,如果文件不存在,则会自动创建。如果需要重建日志文件,则需要在服务器端执行以下命令:mysqladmin -u username -p flush-logs
或者在客户端电路MySQL数据库,执行
flush logs
语句:flush logs;
通用查询日志
- 通用查询日志记录MySQL的所有用户操作,包括启动和关闭服务、执行查询和更新语句等。
启动和设置通用查询日志
-
MySQL服务器默认情况下并没有开启通用查询日志。如果需要通用查询日志,可以通过修改my.ini(或my.cnf)配置文件来开启。在my.ini(或my.cnf)的 [mysqld] 组下加入log选项,形式如下:
[mysqld] general-log=1 general_log_file="path/filename.log"
如果不指定目录和文件名,通用查询日志将默认存储在MySQL数据目录中的hostname.log文件中。
查看通用查询日志
-
通用查询日志中记录了用户的所有操作。通用查询日志是以文本文件的形式存储在文件系统中,可以使用文本编辑器直接打开通用日志进行查看。
-
通过SHOW VARIABLES语句可以查看通用查询日志开启状态及日志所在路径,语句如下:
SHOW VARIABLES LIKE '%general%';
删除通用查询日志
- 可以用直接删除日志文件的方式删除通用查询日志。要重新建立新的日志文件,可使用语句
mysqladmin flush-logs
或者flush logs;
。
慢查询日志
- 慢查询日志是记录查询时长超过指定时间的日志。通过慢查询日志,可以找出执行时间较长、执行效率较低的语句,然后进行优化。
启动和设置慢查询日志
-
MySQL中慢查询日志默认是关闭的,可以通过配置文件my.ini或者my.cnf中的slow-query-log选项启动慢查询日志。另外,还需要配置long_query_time选项指定记录阈值。
在my.ini或者my.cnf开启慢查询日志的配置如下:
[mysqld] slow-query-log = 1 slow_query_log_file = "path/filename.log" long-query-time = n --单位为秒,默认值为10秒
删除慢查询日志
- 和通用日志一样,慢查询日志也可以直接删除。删除后在不重启服务器的情况下,需要执行
mysqladmin flush-logs
或者flush logs;
语句重建日志文件。
注意事项
- 日志既会影响MySQL的性能,又会占用大量磁盘空间。因此,如果不必要,应尽可能少地开启日志。在开发环境中优化查询效率低的语句,可以开启慢查询日志;如果需要记录用户的所有查询操作,可以开启通用查询日志;如果需要记录数据的变更,可以开启二进制日志;错误日志是默认开启的。
- 二进制日志还可以用来进行数据恢复,还可以用来数据复制。在数据库定期备份的情况下,如果出现数据丢失,可以先用备份恢复大部分数据,然后使用二进制日志恢复最近备份后变更的数据。在双机热备情况下,可以使用MySQL的二进制日志记录数据的变更,然后将变更部分复制到备份服务器上。