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、二进制日志格式

二进制日志有三种格式:

  1. Stetament格式

    基于语句的,记录操作的SQL语句。

    优点:

    • 日志文件较小
    • 便于阅读与理解
    • 包含原始SQL,方便统计和审计

    缺点:

    • 可能导致主从不一致,存在安全隐患
    • 不能复制部分系统函数
    • 不支持不确定的SQL语句

    mysql5.7以前Statement是默认的格式

  2. Row格式

    记录操作的每一行数据。

    优点:

    • 相对于Statement有更加安全的复制格式
    • 系统的特殊函数也可以复制
    • 更少的锁
    • 数据一致性高

    缺点:

    • 日志文件比较大
    • 无法看见用户执行的SQL

    mysql5.7之后,默认的格式为Row格式

  3. MIXED格式

    一种混合格式,混合使用Row和Statement格式,对DDL记录会使用Statement,对于table里的行操作会记录Row格式。如果是Innodb表,事务级别为Read committed 或者 read uncommitted日志级别只能使用Row格式。

posted @ 2020-08-09 22:10  Charramma  阅读(166)  评论(0编辑  收藏  举报