mysql的全量(查询)日志general-log的开启和分析方法

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
日志服务 SLS,月写入数据量 50GB 1个月
简介:

熟悉mysql的朋友应该都知道,error日志只记录数据库层的报错,binlog只记录增/删/改的记录,但是没记录谁执行,只记录执行用户名,slowlog虽然详细,但是只记录超过设定值的慢查询sql信息.

    只有general-log才是记录所有的操作日志,不过他会耗费数据库5%-10%的性能,所以一般没什么特别需要,大多数情况是不开的,例如一些sql审计和不知名的排错等,那就是打开来使用了.


开启的方法

    开启方法很简单,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#先查看当前状态
mysql> show variables like  'general%' ;
+------------------+--------------------------------+
| Variable_name    | Value                          |
+------------------+--------------------------------+
| general_log      | OFF                            |
| general_log_file |  /data/mysql/data/localhost .log |
+------------------+--------------------------------+
2 rows  in  set  (0.00 sec)
#可以在my.cnf里添加,1开启(0关闭),当然了,这样要重启才能生效,有点多余了
general-log = 1
log =  /log/mysql_query .log路径
#也可以设置变量那样更改,1开启(0关闭),即时生效,不用重启,首选当然是这样的了
set  global general_log=1
#这个日志对于操作频繁的库,产生的数据量会很快增长,出于对硬盘的保护,可以设置其他存放路径
set  global general_log_file= /tmp/general_log .log

    然后就开启完了,看看是否有这个文件存在并产生了日志,我们看到localhost.log已经生成了,因为我是默认的,所以名字就是这样的.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#ll
总用量 3215528
-rw-rw----. 1 mysql mysql         56 9月   5 11:32 auto.cnf
drwx------  2 mysql mysql       4096 9月  17 14:09 gw
-rw-rw----  1 mysql mysql      25666 9月   8 17:07 ib_buffer_pool
-rw-rw----. 1 mysql mysql 1073741824 9月  19 10:21 ibdata1
-rw-rw----. 1 mysql mysql 1073741824 9月  19 10:21 ib_logfile0
-rw-rw----. 1 mysql mysql 1073741824 9月   5 11:27 ib_logfile1
-rw-rw----  1 mysql mysql          5 9月   8 17:11 localhost.localdomain.pid
-rw-rw----  1 mysql mysql    6699602 9月  19 09:50 localhost.log
-rw-rw----  1 mysql mysql          5 9月  14 09:16 localhost.pid
drwx------. 2 mysql mysql       4096 9月   5 11:27 mysql
-rw-rw----  1 mysql mysql      34539 9月   7 14:57 mysql-bin.000006
-rw-rw----  1 mysql mysql   13746613 9月   8 17:07 mysql-bin.000007
-rw-rw----  1 mysql mysql     498989 9月  14 09:16 mysql-bin.000008
-rw-rw----  1 mysql mysql   48302055 9月  19 10:20 mysql-bin.000009
-rw-rw----  1 mysql mysql        136 9月  14 09:16 mysql-bin.index
-rw-rw----. 1 mysql mysql      57569 9月  14 09:16 mysql.err
drwx------. 2 mysql mysql       4096 9月   5 11:27 performance_schema
drwx------  2 mysql mysql       4096 9月  17 14:35  test

    开启完了,就看怎么分析了.


分析日志

    其实也比较直观,只是容易混淆,下面来看例子.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
/usr/local/mysql/bin/mysqld , Version: 5.6.32-78.0-log (Percona Server (GPL), Release 78.0, Revision 8a8e016). started with:
Tcp port: 3306  Unix socket:  /tmp/mysql .sock
Time                 Id Command    Argument
160919  9:28:19 30722 Connect   root@192.168.1.252 on  test
                 30722 Query     SET SESSION sql_mode =
                                         REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
                                         @@sql_mode,
                                         "STRICT_ALL_TABLES," "" ),
                                         ",STRICT_ALL_TABLES" "" ),
                                         "STRICT_ALL_TABLES" "" ),
                                         "STRICT_TRANS_TABLES," "" ),
                                         ",STRICT_TRANS_TABLES" "" ),
                                         "STRICT_TRANS_TABLES" "" )
                 30722 Query     SET NAMES utf8
                 30722 Query     SELECT *
FROM ` type `
WHERE `pid` = 30
                 30722 Quit
160919  9:28:38 29975 Query     SHOW GLOBAL STATUS
160919  9:28:39 30728 Connect   root@192.168.1.95 on  test
                 30728 Query     SET SESSION sql_mode =
                                         REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
                                         @@sql_mode,
                                         "STRICT_ALL_TABLES," "" ),
                                         ",STRICT_ALL_TABLES" "" ),
                                         "STRICT_ALL_TABLES" "" ),
                                         "STRICT_TRANS_TABLES," "" ),
                                         ",STRICT_TRANS_TABLES" "" ),
                                         "STRICT_TRANS_TABLES" "" )
                 30728 Query     SET NAMES utf8
                 30728 Query     SELECT `a`.*, `b`.`clientname`, `b`.`deptname`, `b`.`receiveprovince`, `b`.`carriers`, `b`.`receivecity`
FROM `repri` as `a`
LEFT JOIN `illmain` as `b` ON `a`.`illid` = `b`.`illID`
WHERE `a`.` id ` =  '21'
                 30728 Query     SELECT `typename`
FROM ` type `
WHERE ` id ` =  '8'
                 30728 Query     SELECT `typename`
FROM ` type `
WHERE ` id ` =  '9'
                 30728 Query     SELECT *
FROM `handlepri`
WHERE ` id ` =  '21'
                 30728 Query     SELECT *
FROM `low_re`
WHERE `low` =  '21'
AND ` type ` =0
ORDER BY ` id ` desc
                 30728 Query     SELECT *
FROM `guide`
WHERE `ll_type` =  '9'
                 30728 Query     SELECT *
FROM `illmain`
WHERE `illid` =  '0992016'
OR `orderid` =  '0992016'
                 30728 Quit

    我们来按列来解析

第一列:时间列,前面一个是日期,后面一个是小时和分钟,有一些不显示的原因是因为这些sql语句几乎是同时执行的,所以就不另外记录时间了.

第二列:ID列,就是show processlist出来的第一列的线程ID,对于长连接和一些比较耗时的sql语句,你可以精确找出究竟是那一条那一个线程在运行.

第三列:操作类型,Connect就是连接数据库,Query就是查询数据库(增删查改都显示为查询),可以特定过虑一些操作.

第四列:详细信息,例如上面例子Connect的详细信息就是root@192.168.1.95 on test,意思就是root@192.168.1.95连上test库,如此类推,下面的意思就是30728这个线程号连上数据库之后,做了什么查询的操作.

    还有其他一些grant/drop/create/alter等的操作,general_log都回全部记录下来,不过这里就不细细演示了,各位可以尝试一下.

    最后,也正如我开始说的,有了这些信息,做sql语句审计就变得可能了,找到责任人也是没有压力的,而对于一些疑难杂症的sql分析也是很简单了.




     本文转自arthur376 51CTO博客,原文链接:http://blog.51cto.com/arthur376/1853924,如需转载请自行联系原作者





相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
7天前
|
SQL 存储 关系型数据库
MySQL/SqlServer跨服务器增删改查(CRUD)的一种方法
通过上述方法,MySQL和SQL Server均能够实现跨服务器的增删改查操作。MySQL通过联邦存储引擎提供了直接的跨服务器表访问,而SQL Server通过链接服务器和分布式查询实现了灵活的跨服务器数据操作。这些技术为分布式数据库管理提供了强大的支持,能够满足复杂的数据操作需求。
48 12
|
5天前
|
存储 运维 监控
Linux--深入理与解linux文件系统与日志文件分析
深入理解 Linux 文件系统和日志文件分析,对于系统管理员和运维工程师来说至关重要。文件系统管理涉及到文件的组织、存储和检索,而日志文件则记录了系统和应用的运行状态,是排查故障和维护系统的重要依据。通过掌握文件系统和日志文件的管理和分析技能,可以有效提升系统的稳定性和安全性。
21 7
|
10天前
|
存储 缓存 关系型数据库
MySQL的count()方法慢
MySQL的 `COUNT()`方法在处理大数据量时可能会变慢,主要原因包括数据量大、缺乏合适的索引、InnoDB引擎的设计以及复杂的查询条件。通过创建合适的索引、使用覆盖索引、缓存机制、分区表和预计算等优化方案,可以显著提高 `COUNT()`方法的执行效率,确保数据库查询性能的提升。
113 12
|
12天前
|
存储 Oracle 关系型数据库
索引在手,查询无忧:MySQL索引简介
MySQL 是一款广泛使用的关系型数据库管理系统,在2024年5月的DB-Engines排名中得分1084,仅次于Oracle。本文介绍MySQL索引的工作原理和类型,包括B+Tree、Hash、Full-text索引,以及主键、唯一、普通索引等,帮助开发者优化查询性能。索引类似于图书馆的分类系统,能快速定位数据行,极大提高检索效率。
45 8
|
15天前
|
SQL 关系型数据库 MySQL
MySQL 窗口函数详解:分析性查询的强大工具
MySQL 窗口函数从 8.0 版本开始支持,提供了一种灵活的方式处理 SQL 查询中的数据。无需分组即可对行集进行分析,常用于计算排名、累计和、移动平均值等。基本语法包括 `function_name([arguments]) OVER ([PARTITION BY columns] [ORDER BY columns] [frame_clause])`,常见函数有 `ROW_NUMBER()`, `RANK()`, `DENSE_RANK()`, `SUM()`, `AVG()` 等。窗口框架定义了计算聚合值时应包含的行。适用于复杂数据操作和分析报告。
57 11
|
8天前
|
监控 安全 Linux
启用Linux防火墙日志记录和分析功能
为iptables启用日志记录对于监控进出流量至关重要
|
18天前
|
存储 关系型数据库 MySQL
mysql怎么查询longblob类型数据的大小
通过本文的介绍,希望您能深入理解如何查询MySQL中 `LONG BLOB`类型数据的大小,并结合优化技术提升查询性能,以满足实际业务需求。
71 6
|
2月前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
396 30
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
20天前
|
监控 安全 Apache
什么是Apache日志?为什么Apache日志分析很重要?
Apache是全球广泛使用的Web服务器软件,支持超过30%的活跃网站。它通过接收和处理HTTP请求,与后端服务器通信,返回响应并记录日志,确保网页请求的快速准确处理。Apache日志分为访问日志和错误日志,对提升用户体验、保障安全及优化性能至关重要。EventLog Analyzer等工具可有效管理和分析这些日志,增强Web服务的安全性和可靠性。
|
3月前
|
XML JSON Java
Logback 与 log4j2 性能对比:谁才是日志框架的性能王者?
【10月更文挑战第5天】在Java开发中,日志框架是不可或缺的工具,它们帮助我们记录系统运行时的信息、警告和错误,对于开发人员来说至关重要。在众多日志框架中,Logback和log4j2以其卓越的性能和丰富的功能脱颖而出,成为开发者们的首选。本文将深入探讨Logback与log4j2在性能方面的对比,通过详细的分析和实例,帮助大家理解两者之间的性能差异,以便在实际项目中做出更明智的选择。
350 3