MySql学习15----MySql日志

MySql日志记录了MySql数据库日常操作和错误信息。MySql有不同类型的日志文件(各自存储了不同类型的日志),从日志当中可以查询到MySql数据库的运行情况、用户操作、错误信息等,可以为MySql管理和优化提供必要的信息。

一. 日志简介

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

  • 错误日志:记录MySql服务的启动、运行或停止MySql服务时出现的问题;
  • 查询日志:记录建立的客户端连接和执行的语句;
  • 二进制日志:记录所有更改数据的语句,可以用于数据复制;
  • 慢查询日志:记录所有执行时间超过long_query_time的所有查询或不使用索引的查询

默认情况下,所有日志创建于MySql数据目录中。通过刷新日志,可以强制MySql关闭和重新打开日志文件。当执行一个Flush logs语句或执行MySqladmin flush-logs或MySqladmin refresh时,将刷新日志。

二. 二进制日志

使用二进制日志的主要目的是最大可能地恢复数据库,因为二进制日志包含备份后进行的所有更新。

二进制日志主要记录MySql数据库的变化。二进制日志以一种有效的格式,并且是事务安全的方式包含更新日志中可用的所有信息。二进制日志包含了所有更新了数据或者已经潜在更新了数据(例如,没有匹配任何行的一个DELETE)的语句。语句以“事件”的形式保存,描述数据更改。

2.1 启动和设置二进制日志

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

C:ProgramDataMySQLMySQL Server 5.7my.ini中有下面几个参数设置是关于二进制日志的:

举例:直接打开C:ProgramDataMySQLMySQL Server 5.7my.in的文件,取消Log-bin前面的注释,并添加expire_logs_days和max_binlog_size两个字段

修改了以后,不会立即生效的,需要重启MySql服务器(note,不是指的exit命令退出的客户端,而是进程中的MySql服务)。究竟生效没有,可以通过show variables变量来查看具体的值是否修改成功了。

关闭和重新启动MySql服务之后,新的二进制文件将出现在C:ProgramDataMySQLMySQL Server 5.7Data目录下,并自动生成.0000001和.index两个文件,文件名称默认为主机名称。当然,可以自定义日志路径,就需需要log-bin目录中指定二进制日志存放路径:

log-bin="D:/mylogs"
这样,就会在mlogs路径下生成对应的二进制文件 名称为mylogs.0000001和mylogs.index

note: 数据库文件最好不要和日志文件存放在同一个磁盘上,这样,当数据库文件所在的磁盘出现故障时,可以使用日志文件恢复数据。

2.2 查看二进制日志

MySql二进制日志存储了所有的变更信息,MySql二进制日志时经常用到的。当MySql创建二进制日志文件时,首先创建一个以“filename”为名称,以“.index”为后缀的文件;再创建一个以“filename”为名称,以“.000001”为后缀的文件。当MySql服务重新启动一次,以“.000001”为后缀的文件会增加一个,并且后缀名加1递增;如果日志长度超过了max_binlog_size的上限也会创建一个新的日志文件。

举例:使用show binary logs查看二进制文件个数及文件名

mysql> show binary logs;
+---------------------+-----------+
| Log_name            | File_size |
+---------------------+-----------+
| WL12345-bin.000001 |       154 |
+---------------------+-----------+
1 row in set (0.00 sec)

可以看到,当前只有一个二进制文件。日志文件的个数与MySql服务启动的次数相同。

举例:假设Mytest中有四个表,删除三个表,查看对应的日志内容。使用mysqlbinlog查看二进制日志的内容

 1 mysql> use mytest;
 2 Database changed
 3 mysql> show tables;
 4 +------------------+
 5 | Tables_in_mytest |
 6 +------------------+
 7 | stu              |
 8 | stu2             |
 9 | stu3             |
10 | user             |
11 +------------------+
12 4 rows in set (0.00 sec)
13 
14 mysql> drop table stu2,stu3,user;
15 Query OK, 0 rows affected (0.09 sec)
View Code
C:UsersHermioner>cd C:ProgramDataMySQLMySQL Server 5.7Data

C:ProgramDataMySQLMySQL Server 5.7Data>mysqlbinlog WL12345-bin.000001

具体的结果中,将会出现DROP语句,记录了刚刚的删除操作

DROP TABLE `stu2`,`stu3`,`user` /* generated by server */
/*!*/;
# at 354
#190215 16:38:25 server id 1 end_log_pos 377 CRC32 0xaff15f2d Stop

Note: 即使现在更新了数据,日志名字个数都不改变,只有重启了MySql服务器,才会增加日志个数。假设现在重启了,查看日志个数和名字:

mysql> show binary logs;
+---------------------+-----------+
| Log_name            | File_size |
+---------------------+-----------+
| WL12345-bin.000001 |       377 |
| WL12345-bin.000002 |       154 |
+---------------------+-----------+
2 rows in set (0.00 sec)

2.3 删除二进制日志

MySql的二进制文件可以配置自动删除,比如之前配置的过期删除时间,同时MySql也提供了安全的手动删除二进制日志文件的方法:RESET MASTER删除所有的二进制日志文件;PURGE MASTER LOGS只删除部分二进制日志文件。

(1)使用RESET MASTER语句删除所有二进制日志文件

           语法:

RESET MASTER;

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

(2)使用PURGE MASTER LOGS语句删除指定日志文件

          语法:

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

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

举例:删除创建时间比binlog.000003早的所有日志文件

举例:删除早于2016年1月30日的所有日志

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

要想从二进制日志恢复数据,需要知道当前二进制日志文件的路径和文件名。一般可以从配置文件my.ini中找到路径。

语法:

位置和结束位置。

note: 上面的position代表日志文件中的具体start或者stop的行数位置

2.5 暂时停止二进制日志功能

三. 错误日志

3.1 启动和设置错误日志

3.2 查看错误日志

3.3 删除错误日志

四. 通用查询日志

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

4.1 启动和设置通用查询日志

默认时没开启的,还是通过修改my.ini:

4.2 查看通用查询日志

5.3 删除通用查询日志

五. 慢查询日志

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

5.1 启动和设置慢查询日志

5.2 查看慢查询日志

5.3 删除慢查询日志

参考文献:

《MySql5.7 从入门到精通》

原文地址:https://www.cnblogs.com/Hermioner/p/10384818.html