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:\ProgramData\MySQL\MySQL Server 5.7\my.ini中有下面几个参数设置是关于二进制日志的:
举例:直接打开C:\ProgramData\MySQL\MySQL Server 5.7\my.in的文件,取消Log-bin前面的注释,并添加expire_logs_days和max_binlog_size两个字段
修改了以后,不会立即生效的,需要重启MySql服务器(note,不是指的exit命令退出的客户端,而是进程中的MySql服务)。究竟生效没有,可以通过show variables变量来查看具体的值是否修改成功了。
关闭和重新启动MySql服务之后,新的二进制文件将出现在C:\ProgramData\MySQL\MySQL Server 5.7\Data目录下,并自动生成.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)
C:\Users\Hermioner>cd C:\ProgramData\MySQL\MySQL Server 5.7\Data C:\ProgramData\MySQL\MySQL Server 5.7\Data>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 从入门到精通》