带你认识MySQL sys schema

本文深入解析MySQL5.7版本中新增的sys库,介绍其如何简化performance_schema的复杂度,提供丰富的数据库监控与分析功能。涵盖sys库结构、视图功能,如资源消耗、I/O请求、内存分配、SQL执行效率等查询示例。

前言:

MySQL 5.7中引入了一个新的sys schema,sys是一个MySQL自带的系统库,在安装MySQL 5.7以后的版本,使用mysqld进行初始化时,会自动创建sys库。

sys库里面的表、视图、函数、存储过程可以使我们更方便、快捷的了解到MySQL的一些信息,比如哪些语句使用了临时表、哪个SQL没有使用索引、哪个schema中有冗余索引、查找使用全表扫描的SQL、查找用户占用的IO等,sys库里这些视图中的数据,大多是从performance_schema里面获得的。目标是把performance_schema的复杂度降低,让我们更快的了解DB的运行情况。

1.sys库总览

本篇文章是基于MySQL 5.7.23版本实验的。打开sys库(希望你跟着我一起做哦),我们会发现sys schema里包含1个表,100个视图,存储过程及函数共48个,如下图所示:

image.png
image.png
image.png

其实我们经常用到的是sys schema下的视图,下面将主要介绍各个视图的作用,我们发现sys schema里的视图主要分为两类,一类是正常以字母开头的,共52个,一类是以 x$ 开头的,共48个。字母开头的视图显示的是格式化数据,更易读,而 x$ 开头的视图适合工具采集数据,显示的是原始未处理过的数据。

下面我们将按类别来分析以字母开头的52个视图:

  • host_summary:这个是服务器层面的,以IP分组,比如里面的视图host_summary_by_file_io;
  • user_summary:这个是用户层级的,以用户分组,比如里面的视图user_summary_by_file_io;
  • innodb:这个是InnoDB层面的,比如视图innodb_buffer_stats_by_schema;
  • io:这个是I/O层的统计,比如视图io_global_by_file_by_bytes;
  • memory:关于内存的使用情况,比如视图memory_by_host_by_current_bytes;
  • schema:关于schema级别的统计信息,比如schema_table_lock_waits;
  • session:关于会话级别的,这类视图少一些,只有session和session_ssl_status;
  • statement:关于语句级别的,比如statements_with_errors_or_warnings;
  • wait:关于等待的,比如视图waits_by_host_by_latency。
2.常用查询介绍

1,查看每个客户端IP过来的连接消耗了多少资源。
mysql> select * from host_summary;

2,查看某个数据文件上发生了多少IO请求。
mysql> select * from io_global_by_file_by_bytes;

3,查看每个用户消耗了多少资源。
mysql> select * from user_summary;

4,查看总共分配了多少内存。
mysql> select * from memory_global_total;

5,数据库连接来自哪里,以及这些连接对数据库的请求情况是怎样的?
查看当前连接情况。
mysql> select host, current_connections, statements from host_summary;

6,查看当前正在执行的SQL和执行show full processlist的效果相当。
mysql> select conn_id, user, current_statement, last_statement from session;

7,数据库中哪些SQL被频繁执行?
执行下面命令查询TOP 10最热SQL。
mysql> select db,exec_count,query from statement_analysis order by exec_count desc limit 10;

8,哪个文件产生了最多的IO,读多,还是写的多?
mysql> select * from io_global_by_file_by_bytes limit 10;

9,哪个表上的IO请求最多?
mysql> select * from io_global_by_file_by_bytes where file like ‘%ibd’ order by total desc limit 10;

10,哪个表被访问的最多?先访问statement_analysis,根据热门SQL排序找到相应的数据表。
mysql> select * from statement_analysis order by avg_latency desc limit 10;

11,哪些SQL执行了全表扫描或执行了排序操作?
mysql> select * from statements_with_sorting;
mysql> select * from statements_with_full_table_scans;

12,哪些SQL语句使用了临时表,又有哪些用到了磁盘临时表?
查看statement_analysis中哪个SQL的tmp_tables 、tmp_disk_tables值大于0即可。
mysql> select db, query, tmp_tables, tmp_disk_tables from statement_analysis where tmp_tables>0 or tmp_disk_tables >0 order by (tmp_tables tmp_disk_tables) desc limit 20;

13,哪个表占用了最多的buffer pool?
mysql> select * from innodb_buffer_stats_by_table order by allocated desc limit 10;

14,每个库(database)占用多少buffer pool?
mysql> select * from innodb_buffer_stats_by_schema order by allocated desc limit 10;

15,每个连接分配多少内存?
利用session表和memory_by_thread_by_current_bytes分配表进行关联查询。
mysql> select b.user, current_count_used, current_allocated, current_avg_alloc, current_max_alloc, total_allocated,current_statement from memory_by_thread_by_current_bytes a, session b where a.thread_id = b.thd_id;

16,MySQL自增长字段的最大值和当前已经使用到的值?
mysql> select * from schema_auto_increment_columns;

17,MySQL有哪些冗余索引和无用索引?
mysql> select * from schema_redundant_indexes;
mysql> select * from schema_unused_indexes;

18,查看事务等待情况
mysql> select * from innodb_lock_waits;

总结:

本文主要介绍sys库相关内容,其实sys库有很多有用的查询,可以帮助你轻松了解数据库的运行情况,原本需要查找performance_schema中多个表才能获得的数据,现在查询一个视图即可满足。当然,sys库需要你详细去了解,总结出你需要的查询方法。

参考资料:

公众号.jpg

<think>我们正在讨论致远OA(A8 V5 企业版 V8.2SP1)中涉及的几个MySQL数据库模式:information_schema, performance_schema, sys。这些模式是MySQL的系统数据库,用于存储元数据、性能监控数据等。下面将分别解释它们的用途及其与致远OA的关系。 ### 1. **information_schema** - **用途**:提供对数据库元数据的访问,包括数据库、表、列、索引、权限等信息。它是一个只读的虚拟数据库,存储的是关于数据库对象的信息。 - **在致远OA中的应用**: - 管理员可以通过查询`information_schema`来获取致远OA数据库的结构信息,例如检查表是否存在(如之前遇到的`ctp_user`表问题)、查看表结构、索引等。 - 示例查询(检查表是否存在): ```sql SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'seeyon' AND TABLE_NAME = 'ctp_user'; ``` 如果返回结果为空,则说明表不存在(可能是被删除或版本差异)[^1]。 ### 2. **performance_schema** - **用途**:收集数据库服务器运行时的性能数据,包括事件(如SQL语句执行、锁等待、I/O操作等),用于监控MySQL服务器的性能。 - **在致远OA中的应用**: - 当致远OA系统出现性能问题时(如响应慢),DBA可以通过`performance_schema`分析SQL执行效率、锁竞争情况等。 - 示例:查看执行时间最长的SQL语句: ```sql SELECT SQL_TEXT, MAX_TIMER_WAIT FROM performance_schema.events_statements_summary_by_digest ORDER BY MAX_TIMER_WAIT DESC LIMIT 10; ``` ### 3. **sys** - **用途**:基于`performance_schema`和`information_schema`构,提供更易读的视图和存储过程,简化性能监控和诊断。 - **在致远OA中的应用**: - 提供直观的性能报告,例如查看内存使用情况、I/O负载等。 - 示例:查看内存使用情况: ```sql SELECT * FROM sys.memory_global_total; ``` ### 4. **mysql** - **用途**:存储MySQL自身的系统数据,如用户权限、时区、日志配置等。 - **在致远OA中的应用**: - 管理致远OA数据库用户权限(如`ctp_user`表的访问权限)。 - 示例:修改用户权限(恢复误删账户后可能需要): ```sql GRANT SELECT, UPDATE ON seeyon.* TO 'oa_user'@'localhost'; ``` ### 各模式间关系 - **依赖关系**: - `sys`模式依赖于`performance_schema`和`information_schema`,它是对两者的封装和简化。 - `performance_schema`提供底层性能数据,`information_schema`提供元数据。 - **协同工作**: - 当需要优化致远OA数据库时: 1. 用`information_schema`检查表结构(如索引缺失)。 2. 用`performance_schema`定位慢查询。 3. 用`sys`快速生成诊断报告。 ### 操作议 - **启用性能监控**(若未开启): ```ini # MySQL配置文件 my.cnf [mysqld] performance_schema=ON ``` - **定期清理历史数据**(避免`performance_schema`占用过多内存): ```sql TRUNCATE TABLE performance_schema.events_statements_history_long; ``` §§相关问题§§ 1. 如何利用`sys`模式诊断致远OA数据库性能问题? 2. 在`information_schema`中如何查询致远OA表的字段详细信息? 3. MySQL 8.0中`performance_schema`有哪些关键改进? 4. 如何配置`performance_schema`以最小化性能影响? [^1]: MySQL官方文档:information_schema表 [^2]: MySQL性能优化指南 [^3]: 致远OA数据库维护手册</think>### 致远OA A8 V5企业版V8.2SP1中数据库系统模式解析 在致远OA A8 V5企业版V8.2SP1中,`information_schema`、`performance_schema`、`sys` 是MySQL数据库的**系统级数据库(模式)**,与OA业务数据库(如`seeyon`)相互独立但协同工作。以下是它们的关系和用途: --- ### 1. **核心关系示意图** ```mermaid graph LR A[OA应用层] --> B((业务数据库 seeyon)) A --> C[information_schema] A --> D[performance_schema] A --> E[sys] D --> E[sys] C --> D ``` --- ### 2. **各模式用途详解** | 模式名称 | 用途 | 致远OA应用场景示例 | |----------------------|----------------------------------------------------------------------|----------------------------------------------------------------------------------| | **`information_schema`** | 存储**元数据**:<br>- 数据库/表/列结构<br>- 权限信息<br>- 约束信息 | 1. 验证表是否存在(如`ctp_user`)[^1]<br>2. 检查字段类型是否匹配<br>3. 修复表结构异常 | | **`performance_schema`** | 收集**性能数据**:<br>- SQL执行统计<br>- 锁等待事件<br>- 资源消耗监控 | 1. 分析慢查询优化性能<br>2. 诊断死锁问题<br>3. 监控连接池使用率 | | **`sys`** | **性能诊断工具集**:<br>- 基于`performance_schema`的易读视图<br>- 预设分析报告 | 1. 生成内存使用报告<br>2. 查看索引效率<br>3. 快速定位I/O瓶颈 | > 📌 **关键说明**: > - `sys` 本质是`performance_schema`的**高级封装**,通过视图简化性能分析(如`sys.session`视图替代`performance_schema.events_waits_current`) > - OA业务数据存储在独立数据库(通常为`seeyon`或`a8v5`),与这三个系统模式**物理隔离** --- ### 3. **协同工作机制** 1. **运维监控场景** ```sql /* 步骤1:通过sys快速定位问题 */ SELECT * FROM sys.memory_global_total; -- 查看总内存消耗[^3] /* 步骤2:用performance_schema深入分析 */ SELECT EVENT_NAME, COUNT_STAR FROM performance_schema.events_waits_summary_global_by_event_name ORDER BY COUNT_STAR DESC LIMIT 10; -- 统计高频等待事件 /* 步骤3:用information_schema验证表结构 */ SELECT COLUMN_TYPE FROM information_schema.COLUMNS WHERE TABLE_NAME='ctp_user'; -- 检查字段定义 ``` 2. **版本兼容性** - MySQL 5.7+ 默认启用`performance_schema` - MySQL 8.0+ 强化`sys`的**诊断能力**(如新增`sys.innodb_buffer_stats_by_table`)[^3] --- ### 4. **运维议** 1. **启用配置** 在`my.cnf`中确保: ```ini [mysqld] performance_schema=ON # 默认开启[^4] ``` 2. **安全权限** OA连接用户需授权(非`root`): ```sql GRANT SELECT ON sys.* TO 'oa_user'@'%'; GRANT SELECT ON performance_schema.* TO 'oa_user'@'%'; ``` 3. **性能开销** | 模式 | CPU开销 | 内存开销 | 议 | |---------------------|---------|----------|-------------| | `performance_schema` | 中 | 高 | 生产环境开启 | | `sys` | 低 | 低 | 随时使用 | > ⚠️ 注:`information_schema`为**只读虚拟表**,几乎无性能开销[^1] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值