MySQL日志
一、日志的作用及类型
MySQL日志的作用
- 排错
- 了解MySQL运行情况
MySQL日志的类型
- 错误日志
- 慢日志
- 查询日志
- 二进制日志
二、错误日志
记录用户登录和服务出错相关的信息,默认是开启的。
可以在配置文件中指定错误日志的存放位置,确保启动MySQL服务的用户对这个目录有写权限。
在配置文件中配置错误日志位置,使用log-error或log_error都可以
log-error=/var/log/mysql/mysql.log
如果没有指定错误日志,默认存放在MySQL的数据目录下,以主机名.err作为文件名。
查看错误日志的详细位置:
Charramma@(none) 11:51 mysql>show variables like 'log_error';
+---------------+--------------------------+
| Variable_name | Value |
+---------------+--------------------------+
| log_error | /var/log/mysql/mysql.log |
+---------------+--------------------------+
1 row in set (0.00 sec)
Charramma@(none) 11:54 mysql>
什么时候会写错误日志到日志文件中?
- 登录失败
- 启动过程出错
- 配置文件出错
三、慢日志
作用:记录了执行时间超过long_query_time参数值的sql语句,可以有效的帮助我们发现实际应用中sql的性能问题,找出执行效率低下的sql语句,为数据库性能提升提供了线索。
慢日志存放在数据目录下,名字是主机名+slow.log。
慢日志默认是关闭的。
Charramma@(none) 15:21 mysql>show variables like 'slow_query_log';
+----------------+-------+
| Variable_name | Value |
+----------------+-------+
| slow_query_log | OFF |
+----------------+-------+
1 row in set (0.00 sec)
Charramma@(none) 15:22 mysql>
查看long_query_time的值,默认为10秒
Charramma@(none) 16:10 mysql>show variables like 'long%';
+-----------------+-----------+
| Variable_name | Value |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set (0.01 sec)
Charramma@(none) 16:10 mysql>
通过修改配置文件打开慢日志。
vim /etc/my.cof
[mysqld]
# 打开慢日志
show_query_log = 1
# 设定超过1秒为慢日志
log_query_time = 1
# 指定慢日志的存放目录
show_query_log_file=/data/mysql/mysql_slow.log
四、查询日志
查询日志记录客户端操作的所有sql语句,包括select查询语句在内。默认关闭。
Charramma@(none) 21:53 mysql>show variables like 'general_log';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| general_log | OFF |
+---------------+-------+
1 row in set (0.00 sec)
Charramma@(none) 21:53 mysql>
在配置文件中开启查询日志。
[mysqld]
general_log
general_log_file=/data/mysql/mysql_ge.log
默认存放在数据目录下,名字是主机名+log。
由于查询日志纪录了所有数据库的操作,因此对于访问频繁的应用,该日志会对系统性能造成一定影响,通常建议关闭此日志。
缺点
-
消耗大量磁盘空间
-
消耗CPU、内存、磁盘资源
优点
- 审计:会记录所有的SQL操作
五、二进制日志(Binary Log)
1、什么是二进制日志
MySQL二进制日志是一个二进制文件,主要记录了数据库的改动,如建表、数据改动等,并且记录了语句发生的时间、执行市场、操作数据等其他额外信息。
作用:
- 数据恢复
- 主从复制
二进制日志默认不开启。
Charramma@(none) 19:35 mysql>show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | OFF |
+---------------+-------+
1 row in set (0.00 sec)
Charramma@(none) 19:36 mysql>
可以在配置文件中开启二进制日志。
[mysqld]
# 打开二进制日志
# 指定日志文件位置
log_bin=/mysql/bin_log/mysql_binlog
# 服务器的标识id
server_id = 1
现在可以查看二进制日志文件名了,如果没有开启二进制日志是查不到的。二进制日志文件存放在数据目录下,以主机名-bin.00000*为名
Charramma@(none) 19:36 mysql>show binary logs;
ERROR 1381 (HY000): You are not using binary logging
# ****** 开启二进制日志后 *****
Charramma@(none) 19:41 mysql>show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | ON |
+---------------+-------+
1 row in set (0.00 sec)
Charramma@(none) 19:41 mysql>
Charramma@(none) 19:41 mysql>show binary logs;
+----------------------+-----------+
| Log_name | File_size |
+----------------------+-----------+
| localhost-bin.000001 | 5755 |
+----------------------+-----------+
1 row in set (0.00 sec)
Charramma@(none) 19:41 mysql>
查看二进制日志大小限制
Charramma@(none) 20:02 mysql>show variables like 'max_binlog_size';
+-----------------+------------+
| Variable_name | Value |
+-----------------+------------+
| max_binlog_size | 1073741824 |
+-----------------+------------+
1 row in set (0.00 sec)
Charramma@(none) 20:13 mysql>
2、二进制日志操作
-
查看当前服务器所有的二进制文件
Charramma@(none) 19:51 mysql>show binary logs; +----------------------+-----------+ | Log_name | File_size | +----------------------+-----------+ | localhost-bin.000001 | 217592 | +----------------------+-----------+ 1 row in set (0.00 sec) Charramma@(none) 19:52 mysql>show master logs; +----------------------+-----------+ | Log_name | File_size | +----------------------+-----------+ | localhost-bin.000001 | 218475 | +----------------------+-----------+ 1 row in set (0.00 sec) Charramma@(none) 19:52 mysql>
-
查看当前二进制日志文件状态
最后(最新)一个binlog日志的编号名称,及其最后一个操作事件pos结束点(Position)值。
Charramma@(none) 19:52 mysql>show master status; +----------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +----------------------+----------+--------------+------------------+-------------------+ | localhost-bin.000001 | 241741 | | | | +----------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec) Charramma@(none) 19:53 mysql>
-
刷新日志,产生一个新编号的二进制日志文件
Charramma@(none) 19:53 mysql>flush logs; Query OK, 0 rows affected (0.00 sec) Charramma@(none) 20:01 mysql>show master logs; +----------------------+-----------+ | Log_name | File_size | +----------------------+-----------+ | localhost-bin.000001 | 411106 | | localhost-bin.000002 | 2214 | +----------------------+-----------+ 2 rows in set (0.00 sec) Charramma@(none) 20:01 mysql>
-
重置所有二进制日志文件
Charramma@(none) 20:01 mysql>reset master; Query OK, 0 rows affected (0.06 sec) Charramma@(none) 20:02 mysql>show master logs; +----------------------+-----------+ | Log_name | File_size | +----------------------+-----------+ | localhost-bin.000001 | 730 | +----------------------+-----------+ 1 row in set (0.00 sec) Charramma@(none) 20:02 mysql>
3、二进制日志的内容
查看二进制日志的内容
# 查看第一个binlog文件的内容
Charramma@(none) 20:21 mysql>show binlog events;
# 查看某个特定的binlog文件的内容
Charramma@(none) 20:21 mysql>show binlog events in 'localhost-bin.000001' limit 3;
+----------------------+-----+----------------+-----------+-------------+---------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+----------------------+-----+----------------+-----------+-------------+---------------------------------------+
| localhost-bin.000001 | 4 | Format_desc | 1 | 123 | Server ver: 5.7.29-log, Binlog ver: 4 |
| localhost-bin.000001 | 123 | Previous_gtids | 1 | 154 | |
| localhost-bin.000001 | 154 | Anonymous_Gtid | 1 | 219 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
+----------------------+-----+----------------+-----------+-------------+---------------------------------------+
3 rows in set (0.00 sec)
Charramma@(none) 20:21 mysql>
- pos pos起始点
- Event_type事件类型
- server id 1 数据库主机的服务号;
- end_log_pos pos结束点
- SET 执行的sql语句
3、二进制日志格式
二进制日志有三种格式:
-
Stetament格式
基于语句的,记录操作的SQL语句。
优点:
- 日志文件较小
- 便于阅读与理解
- 包含原始SQL,方便统计和审计
缺点:
- 可能导致主从不一致,存在安全隐患
- 不能复制部分系统函数
- 不支持不确定的SQL语句
mysql5.7以前Statement是默认的格式
-
Row格式
记录操作的每一行数据。
优点:
- 相对于Statement有更加安全的复制格式
- 系统的特殊函数也可以复制
- 更少的锁
- 数据一致性高
缺点:
- 日志文件比较大
- 无法看见用户执行的SQL
mysql5.7之后,默认的格式为Row格式
-
MIXED格式
一种混合格式,混合使用Row和Statement格式,对DDL记录会使用Statement,对于table里的行操作会记录Row格式。如果是Innodb表,事务级别为Read committed 或者 read uncommitted日志级别只能使用Row格式。