一、 MySQL数据库体系结构

1.MySQL数据库体系结构介绍

1 数据库定义

  • 数据库(数据库文件)是指物理操作系统文件或者其他文件形式类型的集合。
  • 可以是frm、myd、myi、ibd结尾的文件。

2 数据库实例

  • 数据库后台进程/线程以及一个共享内存区组成,共享内存可以被运行的后台进程/线程所共享
  • 数据库实例才是真正用来操作数据库文件

注意:

MySQL中,数据库实例和数据库是一一对应的。没有Oracle的一对多(RAC)的机制。

2. MySQL体系结构

1 单进程多线程结构

  • 不会影响MySQL的性能,看程序如何写。(多进程程序,进程间通信开销大于多线程)

2 存储引擎的概念

  • 可以理解成文件系统,例如FAT32, NTFS, EXT4。
  • 一个表是一个分区,引擎就是分区的文件系统 存储引擎的对象就是
  • show tables; 可以看到每个表对应的是上面引擎(Engine)
  • 除了特殊情况,我们现在就只考虑INNODB

3 体系结构图

  • 体系分层结构说明

    • 第一层:主要功能是连接处理、授权认证、安全等。
    • 第二层:包含了MySQL服务端的核心功能,包含查询缓存、查询解析、分析、优化等功能。
    • 第三层:主要是存储引擎,存储引擎主要负责数据的存储和提取。
  • 各模块组成

    • 1 Connectors

      • 指的是不同语言中与SQL的交互
    • 2 Management Serveices & Utilities:

      • 系统管理和控制工具
    • 3 Connection Pool: 连接池

      • 管理缓冲用户连接,线程处理等需要缓存的需求。

      负责监听对 MySQL Server 的各种请求,接收连接请求,转发所有连接请求到线程管理模块。
      每一个连接上 MySQL Server 的客户端请求都会被分配(或创建)一个连接线程为其单独服务。
      而连接线程的主要工作就是负责 MySQL Server 与客户端的通信,接受客户端的命令请求,传递 Server 端的结果信息等。线程管理模块则负责管理维护这些连接线程。包括线程的创建,线程的 cache 等。

    • 4 SQL Interface: SQL接口。

      • 接受用户的SQL命令,并且返回用户需要查询的结果。比如select from就是调用SQL Interface
    • 5 Parser: 解析器。

      • SQL命令传递到解析器的时候会被解析器验证和解析。解析器是由Lex和YACC实现的,是一个很长的脚本。

      • 主要功能:

        • a . 将SQL语句进行语义和语法的分析,分解成数据结构,然后按照不同的操作类型进行分类,然后做出针对性的转发到后续步骤,以后SQL语句的传递和处理就是基于这个结构的。
        • b. 如果在分解构成中遇到错误,那么就说明这个sql语句是不合理的
    • 6 Optimizer: 查询优化器。

      • SQL语句在查询之前会使用查询优化器对查询进行优化。就是优化客户端请求的 query(sql语句) ,根据客户端请求的 query 语句,和数据库中的一些统计信息,在一系列算法的基础上进行分析,得出一个最优的策略,告诉后面的程序如何取得这个 query 语句的结果
      • 他使用的是“选取-投影-联接”策略进行查询。
        • 用一个例子就可以理解: select uid,name from user where gender = 1;
        • 这个select 查询先根据where 语句进行选取,而不是先将表全部查询出来以后再进行gender过滤
        • 这个select查询先根据uid和name进行属性投影,而不是将属性全部取出以后再进行过滤
        • 将这两个查询条件联接起来生成最终查询结果
    • 7 Cache和Buffer: 查询缓存。

      他的主要功能是将客户端提交 给MySQL 的 Select 类 query 请求的返回结果集 cache 到内存中,与该 query 的一个 hash 值做一个对应。该 Query 所取数据的基表发生任何数据的变化之后, MySQL 会自动使该 query 的Cache 失效。
      在读写比例非常高的应用系统中, Query Cache 对性能的提高是非常显著的。当然它对内存的消耗也是非常大的。
      如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key缓存,权限缓存等

    • 8 存储引擎接口

      • 存储引擎接口模块可以说是 MySQL 数据库中最有特色的一点了。目前各种数据库产品中,基本上只有 MySQL 可以实现其底层数据存储引擎的插件式管理。这个模块实际上只是 一个抽象类,但正是因为它成功地将各种数据处理高度抽象化,才成就了今天 MySQL 可插拔存储引擎的特色。

      MySQL区别于其他数据库的最重要的特点就是其插件式的表存储引擎。MySQL插件式的存储引擎架构提供了一系列标准的管理和服务支持,这些标准与存储引擎本身无关,可能是每个数据库系统本身都必需的,如SQL分析器和优化器等,而存储引擎是底层物理结构的实现,每个存储引擎开发者都可以按照自己的意愿来进行开发。

      注意:存储引擎是基于表的,而不是数据库。

  • sql在各个模块的执行过程

4 逻辑存储结构

  • MySQL逻辑存储结构

    • instance
    • database
    • schema
    • table
    • view
    • 一个DB对应一个schema
    • 一个DB对应一个文件夹
    • 一个表对应一组文件
                                                 |--> table1 --- | view1 |
MySQL Instance -----> Database ----> Schema ---> |--> table2 --- | view2 |
|--> table3 --- | View3 |
注意: MySQL中一个Database对应一个Schema

5 物理存储结构

  • MySQL配置文件

    • datadir

      • 存储数据二进制文件的路径
  • 表结构的组成
    • frm:表结构定义文件
    • MYI:索引文件
    • MYD:数据文件 可以用hexdump -c XXX.frm查看二进制文件(意义不大)
    • show create table tablename;
    • mysqlfrm (utilities工具包)
shell> mysqlfrm --diagnostic /data/mysql_data/aaa/.a.frm #可将frm文件转成create table的语句
  • 错误日志文件

    • log_err 建议配置成统一的名字,方便定位错误
  • 慢查询日志文件
    • 将运行超过某一个时间阈值的SQL语句记录到文件

      • MySQL < 5.1 :以秒为单位
      • MySQL >= 5.1 : 以毫秒为单位
      • MySQL >= 5.5 : 可以将慢查询日志记录到表
      • MySQL >= 5.6 : 以更细的粒度记录慢查询
      • MySQL >= 5.7 : 增加timestamps支持
    • slow_query_log_file
      • 建议配置成统一的名字,用于优化查询
  • 通用日志作用
    • 可以记录数据库所有相关操作
    • 参数:general_log
    • 默认文件名:机器名.log
    • 同样可以将日志保存到表
    • mysql.general_log
    • 开启性能下降明显

二、 MySQL主要文件

1.慢查询日志

1.1 慢查询日志相关参数:

  • slow_query_log

    • 是否开启慢查询日志
  • slow_query_log_file

    • 慢查询日志文件名, 在my.cnf我们已经定义为slow.log,默认是 机器名-slow.log
  • long_query_time

    • 制定慢查询阈值, 单位是秒,且当版本 >=5.5.X,支持毫秒。例如0.5即为500ms
    • 大于该值,不包括值本身。例如该值为2,则执行时间正好等于2的SQL语句不会记录
  • log_queries_not_using_indexes

    • 没有使用索引的SQL记录到慢查询日志

      • 如果一开始因为数据少,查表快,耗时的SQL语句没被记录,当数据量大时,该SQL可能会执行很长时间
      • 需要测试阶段就要发现问题,减小上线后出现问题的概率
  • log_throttle_queries_not_using_indexes

    • 限制每分钟内,在慢查询日志中,去记录没有使用索引的SQL语句的次数;版本需要>=5.6.X

      • 因为没有使用索引的SQL可能会短时间重复执行,为了避免日志快速增大,限制每分钟的记录次数
  • min_examined_row_limit

    • 扫描记录少于该值的SQL不记录到慢查询日志

      • 结合去记录没有使用索引的SQL语句的例子,有可能存在某一个表,数据量维持在百行左右,且没有建立索引。这种表即使不建立索引,查询也很快,扫描记录很小,如果确定有这种表,则可以通过此参数设置,将这个SQL不记录到慢查询日志。
  • log_slow_admin_statements

    • 记录超时的管理操作SQL到慢查询日志,比如ALTER/ANALYZE TABLE
  • log_output

    • 慢查询日志的格式,[FILE | TABLE | NONE],默认是FILE;版本>=5.5
    • 如果设置为TABLE,则记录的到mysql.slow_log
  • log_slow_slave_statements

    • 在从服务器上开启慢查询日志
  • log_timestamps

    • 写入时区信息。可根据需求记录UTC时间或者服务器本地系统时间

1.2 慢查询日志测试

  • 查看慢查询记录的相关参数

    • 终端A
root@gczheng 00:01:  [(none)]> select version();
+------------+
| version() |
+------------+
| 5.7.18-log |
+------------+
1 row in set (0.00 sec) root@gczheng 00:02: [(none)]> show variables like "slow%";
+---------------------+------------------------+
| Variable_name | Value |
+---------------------+------------------------+
| slow_launch_time | 2 |
| slow_query_log | ON | --slow_query_log已打开
| slow_query_log_file | /r2/mysqldata/slow.log | --slow日志位置
+---------------------+------------------------+
3 rows in set (0.01 sec) root@gczheng 00:03: [(none)]> show variables like "long_query%";
+-----------------+----------+
| Variable_name | Value |
+-----------------+----------+
| long_query_time | 1.000000 | -- my.cnf 中该值设置为2秒
+-----------------+----------+
1 row in set (0.01 sec) root@gczheng 00:03: [(none)]> show variables like "min_ex%";
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| min_examined_row_limit | 0 | -- my.cnf中未配置,默认值为0
+------------------------+-------+
1 row in set (0.00 sec)
  • 查看慢查询日志

    • 终端B
[root@rhel7 mysqldata]# tail -f /r2/mysqldata/slow.log
bin/mysqld, Version: 5.7.18-log (MySQL Community Server (GPL)). started with:
Tcp port: 3306 Unix socket: /r2/mysqldata/mysql.sock
Time Id Command Argument
  • 进行模拟耗时操作

    • 终端A
root@gczheng 00:11:  [(none)]> select sleep(8);
+----------+
| sleep(8) |
+----------+
| 0 |
+----------+
1 row in set (8.00 sec)
  • 最终产生慢查询日志

    • 终端B
[root@rhel7 mysqldata]# tail -f /r2/mysqldata/slow.log
bin/mysqld, Version: 5.7.18-log (MySQL Community Server (GPL)). started with:
/usr/local/mysql/bin/mysqld, Version: 5.7.18-log (MySQL Community Server (GPL)). started with:
Tcp port: 3306 Unix socket: /r2/mysqldata/mysql.sock
Time Id Command Argument
# Time: 2017-11-23T00:11:20.876205+08:00
# User@Host: root[root] @ localhost [] Id: 3
# Query_time: 8.000251 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 0
#这个就是min_examined_row_limit
#设置的意义。如my.cnf中设置该值为100
#则这条语句因为Rows_examined < 100,而不会被记录
SET timestamp=1511367080;
select sleep(8);

注意

如果在终端A中set global min_examined_row_limit = 100;, 然后执行select sleep(8),会发现该记录仍然被记录到慢查询日志中。原因是因为set global min_examined_row_limit设置的是全局变量,此次会话不生效。

但是我们上面set global slow_query_log = 1;却是在线生效的,这点有所不通

  • mysqldumpslow
[root@rhel7 mysqldata]# mysqldumpslow slow.log 

Reading mysql slow query log from slow.log
Count: 2 Time=15.88s (31s) Lock=0.00s (0s) Rows=1.0 (2), root[root]@localhost
select sleep(N) Count: 1 Time=0.00s (0s) Lock=0.00s (0s) Rows=0.0 (0), 0users@0hosts
bin/mysqld, Version: N.N.N-log (MySQL Community Server (GPL)). started with: [root@rhel7 mysqldata]# mysqldumpslow --help
Usage: mysqldumpslow [ OPTS... ] [ LOGS... ] Parse and summarize the MySQL slow query log. Options are --verbose verbose
--debug debug
--help write this text to standard output
-v verbose
-d debug
-s ORDER what to sort by (al, at, ar, c, l, r, t), 'at' is default
al: average lock time
ar: average rows sent
at: average query time
c: count
l: lock time
r: rows sent
t: query time
-r reverse the sort order (largest last instead of first)
-t NUM just show the top n queries
-a don't abstract all numbers to N and strings to 'S'
-n NUM abstract numbers with at least n digits within names
-g PATTERN grep: only consider stmts that include this string
-h HOSTNAME hostname of db server for *-slow.log filename (can be wildcard),
default is '*', i.e. match all
-i NAME name of server instance (if using mysql.server startup script)
-l don't subtract lock time from total time

如果在线上操作,不需要mysqldumpslow去扫整个slow.log, 可以去 tail -n 10000 slow.log > last_10000_slow.log(10000这个数字根据实际情况进行调整),然后进行mysqldumpslow last_10000_slow.log

  • 慢查询日志存入表
mysql> show variables like "log_output%";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_output | FILE |
+---------------+-------+
1 row in set (0.00 sec)
mysql> set global log_output="table"; --设置为输出为表
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like "log_output";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_output | TABLE |
+---------------+-------+
1 row in set (0.00 sec) mysql> show variables like "slow_query_log";
+----------------+-------+
| Variable_name | Value |
+----------------+-------+
| slow_query_log | ON |
+----------------+-------+
1 row in set (0.00 sec) mysql> select sleep (11); --执行语句
+------------+
| sleep (11) |
+------------+
| 0 |
+------------+
1 row in set (11.00 sec) mysql> select * from mysql.slow_log;
+----------------------------+---------------------------+-----------------+-----------------+-----------+---------------+----+----------------+-----------+-----------+-------------------+-----------+
| start_time | user_host | query_time | lock_time | rows_sent | rows_examined | db | last_insert_id | insert_id | server_id | sql_text |thread_id |
+----------------------------+---------------------------+-----------------+-----------------+-----------+---------------+----+----------------+-----------+-----------+-------------------+-----------+
| 2017-11-23 16:58:23.873261 | root[root] @ localhost [] | 00:00:11.000196 | 00:00:00.000000 | 1 | 0 | | 0 | 0 | 168 | select sleep (11) | 314459 |
+----------------------------+---------------------------+-----------------+-----------------+-----------+---------------+----+----------------+-----------+-----------+-------------------+-----------+
1 row in set (0.00 sec) --显示表结构
mysql> show create table mysql.slow_log \G;
*************************** 1. row ***************************
Table: slow_log
Create Table: CREATE TABLE `slow_log` (
`start_time` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
`user_host` mediumtext NOT NULL,
`query_time` time(6) NOT NULL,
`lock_time` time(6) NOT NULL,
`rows_sent` int(11) NOT NULL,
`rows_examined` int(11) NOT NULL,
`db` varchar(512) NOT NULL,
`last_insert_id` int(11) NOT NULL,
`insert_id` int(11) NOT NULL,
`server_id` int(10) unsigned NOT NULL,
`sql_text` mediumblob NOT NULL,
`thread_id` bigint(21) unsigned NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log' --ENGINE=CSV 这里使用的是CSV的引擎,性能较差
1 row in set (0.00 sec)
ERROR:
No query specified -- 建议将slow_log表的存储引擎改成MyISAM
mysql> alter table mysql.slow_log engine = innodb;
ERROR 1580 (HY000): You cannot 'ALTER' a log table if logging is enabled --无法转化为innodb引擎 mysql> alter table mysql.slow_log engine = myisam;
ERROR 1580 (HY000): You cannot 'ALTER' a log table if logging is enabled '-- 提示我正在记录日志中,不能转换myisam引擎 mysql> set global slow_query_log = 0; -- 先停止记录日志
Query OK, 0 rows affected (0.01 sec) mysql> alter table mysql.slow_log engine = innodb;
ERROR 1579 (HY000): This storage engine cannot be used for log tables" --显示不支持innodb引擎 mysql> alter table mysql.slow_log engine = myisam; -- 转换表的myisam引擎
Query OK, 2 rows affected (5.05 sec)
Records: 2 Duplicates: 0 Warnings: 0 mysql> set global slow_query_log = 1; -- 再开启记录日志
Query OK, 0 rows affected (0.00 sec) mysql> show create table mysql.slow_log;
--表结构
ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Slow log' -- ENGINE转换成myisam引擎

使用TABLE的优势在于方便查询,但是记住当在备份的时候,不要备份慢查询日志的表,避免备份过大。

使用FILE也可以,需要定时清除该文件,避免单文件过大。


2. 通用日志(generic_log)与审计

1.1 通用日志作用

  • 当需要查找某条特定SQL语句,且该SQL语句执行较快,无法记录到slow_log中时,可以开启通用日志generic_log,进行全面记录, 可用于审计Audit

  • A终端设置开启关闭通用日志

mysql> set global general_log=on;  --开启通用日志
Query OK, 0 rows affected (0.00 sec) mysql> show create table mysql.general_log\G --显示通用日志表结构
*************************** 1. row ***************************
Table: general_log
Create Table: CREATE TABLE `general_log` (
`event_time` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
`user_host` mediumtext NOT NULL,
`thread_id` bigint(21) unsigned NOT NULL,
`server_id` int(10) unsigned NOT NULL,
`command_type` varchar(64) NOT NULL,
`argument` mediumblob NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='General log'
1 row in set (0.00 sec) mysql> show variables like '%general_log%';
+------------------+------------------------------------------------------+
| Variable_name | Value |
+------------------+------------------------------------------------------+
| general_log | ON |
| general_log_file | /r2/soft/dbtest/mysql-5.7.18/mysqldata/localhost.log | --日志位置
+------------------+------------------------------------------------------+
2 rows in set (0.00 sec) mysql> set global general_log=off; --关闭日志
  • B终端显示日志
[root@localhost-m(252) /r2/soft/dbtest/mysql-5.7.18/mysqldata]# tail -f localhost.log
SUM_TIMER_WRITE_LOW_PRIORITY,
SUM_TIMER_WRITE_NORMAL,
SUM_TIMER_WRITE_EXTERNAL
FROM performance_schema.table_lock_waits_summary_by_table
WHERE OBJECT_SCHEMA NOT IN ('mysql', 'performance_schema', 'information_schema')
2017-11-23T17:17:28.819250+08:00 315487 Quit
2017-11-23T17:17:29.304861+08:00 315489 Connect gcdb@192.168.48.168 on using TCP/IP
2017-11-23T17:17:29.305015+08:00 315489 Query select @@version_comment limit 1
2017-11-23T17:17:29.305307+08:00 315489 Query show global status where Variable_name in ("Com_select","Com_insert","Com_update","Com_delete","Innodb_buffer_pool_read_requests","Innodb_buffer_pool_reads","Innodb_rows_inserted","Innodb_rows_updated","Innodb_rows_deleted","Innodb_rows_read","Threads_running","Threads_connected","Threads_cached","Threads_created","Bytes_received","Bytes_sent","Innodb_buffer_pool_pages_data","Innodb_buffer_pool_pages_free","Innodb_buffer_pool_pages_dirty","Innodb_buffer_pool_pages_flushed","Innodb_data_reads","Innodb_data_writes","Innodb_data_read","Innodb_data_written","Innodb_os_log_fsyncs","Innodb_os_log_written")
  • 通用日志会记录所有操作,性能下降明显。所以如果需要审计,需要Audit Plugin

1.2 审计插件

- MariaDB Audit 插件
- MySQL社区版本目前没有提供Audit的功能,企业版本提供了该功能。MariaDB 提供了开源的Audit插件,且MySQL也能使用。
- [官方注册下载插件](https://mariadb.com/my_portal/download/audit_plugin)
- Mcaffer插件下载
- https://bintray.com/mcafee/mysql-audit-plugin/release#files 点击Files文件
- [audit-plugin-mysql-5.7-1.1.4-725-linux-x86_64.zip](https://bintray.com/mcafee/mysql-audit-plugin/download_file?file_path=audit-plugin-mysql-5.7-1.1.4-725-linux-x86_64.zip)

1.3 mcafee Audit Plugin安装

MySQL5.7.18 安装mcaffer audit-plugin-mysql-5.7-1.1.4-725 版本审计插件步骤如下:

--显示插件目录
root@gczheng 23:16: [(none)]> show global variables like 'plugin%';
+---------------+------------------------------+
| Variable_name | Value |
+---------------+------------------------------+
| plugin_dir | /usr/local/mysql/lib/plugin/ |
+---------------+------------------------------+
1 row in set (0.01 sec)
  • 安装审计插件
--解压plugin
[root@rhel7 software]# unzip audit-plugin-mysql-5.7-1.1.4-725-linux-x86_64.zip
Archive: audit-plugin-mysql-5.7-1.1.4-725-linux-x86_64.zip
creating: audit-plugin-mysql-5.7-1.1.4-725/
creating: audit-plugin-mysql-5.7-1.1.4-725/lib/
inflating: audit-plugin-mysql-5.7-1.1.4-725/lib/libaudit_plugin.so
inflating: audit-plugin-mysql-5.7-1.1.4-725/COPYING
inflating: audit-plugin-mysql-5.7-1.1.4-725/THIRDPARTY.txt
inflating: audit-plugin-mysql-5.7-1.1.4-725/README.txt
inflating: audit-plugin-mysql-5.7-1.1.4-725/plugin-name.txt
creating: audit-plugin-mysql-5.7-1.1.4-725/utils/
inflating: audit-plugin-mysql-5.7-1.1.4-725/utils/offset-extract.sh
--拷贝到插件目录
[root@rhel7 software]# cp audit-plugin-mysql-5.7-1.1.4-725/lib/libaudit_plugin.so /usr/local/mysql/lib/plugin/ [root@rhel7 software]# cd /usr/local/mysql/lib/plugin/
[root@rhel7 plugin]# ll libaudit_plugin.so
-rw-r--r-- 1 root root 1542249 Nov 23 23:16 libaudit_plugin.so --mycnf添加plugin-load=AUDIT=libaudit_plugin.so
[root@rhel7 plugin]# vim /etc/my.cnf
[mysqld]
......
plugin-load=AUDIT=libaudit_plugin.so --添加配置文件load模式,另外还有install模式:INSTALL PLUGIN AUDIT SONAME 'libaudit_plugin.so';
...... --重启MySQL
[root@rhel7 plugin]# service mysqld restart
Shutting down MySQL......... SUCCESS!
Starting MySQL........ SUCCESS!
  • 测试插件
--显示插件
root@gczheng 23:25: [(none)]> show plugins;
+----------------------------+----------+--------------------+--------------------+---------+
| Name | Status | Type | Library | License |
+----------------------------+----------+--------------------+--------------------+---------+
| binlog | ACTIVE | STORAGE ENGINE | NULL | GPL |
....... | ngram | ACTIVE | FTPARSER | NULL | GPL |
| AUDIT | ACTIVE | AUDIT | libaudit_plugin.so | GPL |
+----------------------------+----------+--------------------+--------------------+---------+
45 rows in set (0.00 sec) root@gczheng 23:25: [(none)]> show global status like 'AUDIT_version'; --显示审计日志版本
+---------------+-----------+
| Variable_name | Value |
+---------------+-----------+
| Audit_version | 1.1.4-725 |
+---------------+-----------+
1 row in set (0.00 sec) root@gczheng 00:00: [(none)]> show variables like "audit%"\G; -- 查看和audit相关的参数
*************************** 1. row ***************************
Variable_name: audit_before_after
Value: after
*************************** 2. row ***************************
Variable_name: audit_checksum
Value:
*************************** 3. row ***************************
Variable_name: audit_client_capabilities
Value: OFF
*************************** 4. row ***************************
Variable_name: audit_delay_cmds
Value:
*************************** 5. row ***************************
Variable_name: audit_delay_ms
Value: 0
*************************** 6. row ***************************
Variable_name: audit_force_record_logins
Value: OFF
*************************** 7. row ***************************
Variable_name: audit_header_msg
Value: ON
*************************** 8. row ***************************
Variable_name: audit_json_file
Value: OFF
*************************** 9. row ***************************
Variable_name: audit_json_file_bufsize
Value: 1
*************************** 10. row ***************************
Variable_name: audit_json_file_flush
Value: OFF
*************************** 11. row ***************************
Variable_name: audit_json_file_retry
Value: 60
*************************** 12. row ***************************
Variable_name: audit_json_file_sync
Value: 0
*************************** 13. row ***************************
Variable_name: audit_json_log_file
Value: mysql-audit.json
*************************** 14. row ***************************
Variable_name: audit_json_socket
Value: OFF
*************************** 15. row ***************************
Variable_name: audit_json_socket_name
Value: /var/run/db-audit/mysql.audit__r2_mysqldata_3306
*************************** 16. row ***************************
Variable_name: audit_json_socket_retry
Value: 10
*************************** 17. row ***************************
Variable_name: audit_json_socket_write_timeout
Value: 1000
*************************** 18. row ***************************
Variable_name: audit_offsets
Value:
*************************** 19. row ***************************
Variable_name: audit_offsets_by_version
Value: ON
*************************** 20. row ***************************
Variable_name: audit_password_masking_cmds
Value: CREATE_USER,GRANT,SET_OPTION,SLAVE_START,CREATE_SERVER,ALTER_SERVER,CHANGE_MASTER,UPDATE
*************************** 21. row ***************************
Variable_name: audit_password_masking_regex
Value: identified(?:/\*.*?\*/|\s)*?by(?:/\*.*?\*/|\s)*?(?:password)?(?:/\*.*?\*/|\s)*?['|"](?<psw>.*?)(?<!\\)['|"]|password(?:/\*.*?\*/|\s)*?\((?:/\*.*?\*/|\s)*?['|"](?<psw>.*?)(?<!\\)['|"](?:/\*.*?\*/|\s)*?\)|password(?:/\*.*?\*/|\s)*?(?:for(?:/\*.*?\*/|\s)*?\S+?)?(?:/\*.*?\*/|\s)*?=(?:/\*.*?\*/|\s)*?['|"](?<psw>.*?)(?<!\\)['|"]|password(?:/\*.*?\*/|\s)*?['|"](?<psw>.*?)(?<!\\)['|"]
*************************** 22. row ***************************
Variable_name: audit_record_cmds
Value:
*************************** 23. row ***************************
Variable_name: audit_record_objs
Value:
*************************** 24. row ***************************
Variable_name: audit_sess_connect_attrs
Value: ON
*************************** 25. row ***************************
Variable_name: audit_socket_creds
Value: ON
*************************** 26. row ***************************
Variable_name: audit_uninstall_plugin
Value: OFF
*************************** 27. row ***************************
Variable_name: audit_validate_checksum
Value: ON
*************************** 28. row ***************************
Variable_name: audit_validate_offsets_extended
Value: ON
*************************** 29. row ***************************
Variable_name: audit_whitelist_cmds
Value: BEGIN,COMMIT,PING
*************************** 30. row ***************************
Variable_name: audit_whitelist_users
Value:
30 rows in set (0.00 sec) root@gczheng 00:05: [(none)]> set global audit_json_log_file='/r2/mysqldata/audit.log'; --配置审计日志路径
Query OK, 0 rows affected (0.00 sec) root@gczheng 00:04: [(none)]> set global audit_json_file=ON; -- 打开审计功能
Query OK, 0 rows affected (0.00 sec) root@gczheng 00:11: [(none)]> show variables like "audit_json%";
+---------------------------------+--------------------------------------------------+
| Variable_name | Value |
+---------------------------------+--------------------------------------------------+
| audit_json_file | ON |
| audit_json_file_bufsize | 1 |
| audit_json_file_flush | OFF |
| audit_json_file_retry | 60 |
| audit_json_file_sync | 0 |
| audit_json_log_file | /r2/mysqldata/audit.log |
| audit_json_socket | OFF |
| audit_json_socket_name | /var/run/db-audit/mysql.audit__r2_mysqldata_3306 |
| audit_json_socket_retry | 10 |
| audit_json_socket_write_timeout | 1000 |
+---------------------------------+--------------------------------------------------+
  • 查看审计日志
[root@rhel7 ~]# tailf /r2/mysqldata/audit.log
{"msg-type":"activity","date":"1511453256465","thread-id":"26","query-id":"1562","user":"gcdb","priv_user":"gcdb","ip":"192.168.1.10","host":"192.168.1.10","connect_attrs":{"_os":"Win64","_client_name":"libmysql","_pid":"12056","_thread":"5756","_platform":"x86_64","program_name":"MySQLWorkbench","_client_version":"5.6.23"},"client_port":"14462","cmd":"show_keys","objects":[{"db":"information_schema","name":"/r2/mysqldata/#sql_10da1_0","obj_type":"TABLE"}],"query":"SHOW INDEX FROM `information_schema`.`TABLES`"}
  • 以上仅为基本功能操作,详细的细粒度控制请参考Mcafee文档

最新文章

  1. [开源]无sql之旅-Chloe.ORM之增删查改
  2. Android接入支付宝和银联
  3. Hibernate操作指南-搭建一个简单的示例(基于原生API和XML)
  4. yii2框架增删改查案例
  5. ES6 数组解构赋值
  6. NYOJ题目839合并
  7. Python-类的继承
  8. VS模板文件修改,自动生成注释
  9. 基于HTTP 协议认证介绍与实现
  10. (一)Windows下搭建PHP开发环境及相关注意事项
  11. response.setHeader各种使用方法
  12. CSS绘制无图片的气泡对话框
  13. linux下scrapy环境搭建
  14. 20.1章JSON语法
  15. mysql MHA高可用测试
  16. Vue.extend和Vue.component的联系与差异
  17. CF700E Cool Slogans SAM、线段树合并、树形DP
  18. mysql命令(三)
  19. 5月13 PDO数据访问抽象层
  20. Python代码运行应该注意哪些问题?

热门文章

  1. vue.js 源代码学习笔记 ----- instance index
  2. three.js入门系列之光源
  3. Android程序员学WEB前端(7)-CSS(2)-伪类字体文本背景边框-Sublime
  4. Java多线程编程实战指南(核心篇)读书笔记(二)
  5. RMI垃圾收集简介
  6. JMter请求参数中文显示乱码
  7. 余弦相似度及基于python的三种代码实现、与欧氏距离的区别
  8. 汇编语言---键盘KeyCode值列表
  9. jquery.i18n.properties.js hacking
  10. ubuntu下codeblock美化