前言
mysql自带的系统数据库是数据库管理的核心组成部分,主要包含mysql、information_schema、performance_schema、sys,它们不用于存储业务数据,而是用于存储系统元数据、权限信息和性能监控数据。这些系统数据库是mysql正常运行和高效管理的关键。
一、mysql
mysql是 mysql 的核心系统数据库,它是 mysql 服务器运行的"大脑"。这个数据库存储了所有与用户权限、系统配置和元数据相关的信息,是 mysql 正常运行的关键。
1. 核心特性
- 用户权限管理:存储所有用户账户信息、权限分配及角色定义,是数据库安全控制的核心。
- 系统配置存储:保存数据库的全局配置参数,如服务器变量、存储引擎设置等。
- 元数据维护:记录数据库对象(如表、视图、存储过程等)的创建信息及关联关系。
2. 核心表
| 表分类 | 表名 | 用途 | 说明 |
|---|---|---|---|
| 用户权限管理 | user | 存储全局用户账户及权限信息 | 包含用户名、主机名、加密密码、全局权限(如select_priv、insert_priv)等字段,是数据库安全控制的核心 |
| 数据库级权限 | db | 管理数据库级别的访问权限 | 指定用户对特定数据库的操作权限(如create、drop),权限粒度细化到数据库级别 |
| 表级权限 | tables_priv | 控制表级别的操作权限 | 记录用户对具体表的权限(如update、delete),支持更细粒度的权限管理 |
| 列级权限 | columns_priv | 实现列级别的访问控制 | 定义用户对表中特定列的权限(如仅允许修改某列数据),实现精细化权限管理 |
| 程序对象权限 | procs_priv | 管理存储过程/函数权限 | 存储用户对存储过程和函数的执行权限,控制程序对象的访问 |
| 代理权限 | proxies_priv | 管理代理用户权限 | 允许一个用户以另一个用户身份执行操作,支持权限代理机制 |
| 服务器配置 | servers | 存储服务器配置信息 | 记录mysql服务器实例的配置参数,如服务器地址、端口等 |
| 事件调度器 | event | 管理事件调度器信息 | 包含事件名称、执行时间表达式、状态(enabled/disabled)等,用于定时任务管理 |
| 时区信息 | time_zone | 存储时区配置 | 包含时区名称、时区偏移量、是否启用等信息,支持多时区应用 |
| 时区转换 | time_zone_leap_second | 记录闰秒信息 | 存储闰秒发生时间及调整值,确保时间计算的准确性 |
| 时区名称映射 | time_zone_name | 时区名称与id映射 | 关联时区名称与内部标识符,方便时区查询 |
| 时区偏移 | time_zone_transition | 时区转换历史 | 记录时区偏移量的历史变化,支持时间相关计算 |
| 插件管理 | plugin | 存储已安装插件信息 | 包含插件名称、状态(active/inactive)、版本、描述等,支持插件扩展 |
| 服务器变量 | global_variables | 存储全局服务器变量 | 包含变量名(如max_connections)、当前值、默认值等,影响服务器行为 |
| 会话变量 | session_variables | 存储会话级变量 | 与全局变量类似,但仅影响当前会话,支持个性化配置 |
| 帮助信息 | help_topic | 存储帮助主题信息 | 包含帮助主题id、名称、描述等,支持内置帮助系统 |
| 帮助内容 | help_relation | 关联帮助主题与内容 | 映射帮助主题与详细内容的关联关系,构建帮助系统框架 |
| 帮助类别 | help_category | 管理帮助分类 | 定义帮助信息的分类体系,方便用户按类别查询帮助 |
| 慢查询日志 | slow_log | 记录慢查询信息 | 存储执行时间超过阈值的sql语句,用于性能分析(需启用慢查询日志功能) |
3. 权限管理说明
3.1. 权限层次结构
mysql 的权限是分层管理的,从高到低依次为:
- 全局权限(
user表):影响整个服务器。 - 数据库级别权限(
db表):影响特定数据库。 - 表级别权限(
tables_priv表):影响特定表。 - 列级别权限(
columns_priv表):影响特定列。
3.2. 权限类型
| 权限类型 | 说明 | 作用范围 |
|---|---|---|
select | 查询数据 | 全局、数据库、表、列 |
insert | 插入数据 | 全局、数据库、表、列 |
update | 更新数据 | 全局、数据库、表、列 |
delete | 删除数据 | 全局、数据库、表、列 |
create | 创建数据库/表 | 全局、数据库 |
drop | 删除数据库/表 | 全局、数据库 |
grant option | 授予权限 | 全局、数据库 |
create temporary tables | 创建临时表 | 全局、数据库 |
lock tables | 锁定表 | 全局、数据库 |
create view | 创建视图 | 全局、数据库 |
show view | 查看视图 | 全局、数据库 |
execute | 执行存储过程 | 全局、数据库、表 |
4. 常用操作
4.1. 查看所有用户
select user, host from mysql.user;
4.2. 授予权限
-- 授予用户对test数据库的select权限 grant select on test.* to 'user'@'localhost'; -- 授予用户对所有数据库的select权限 grant select on *.* to 'user'@'localhost'; -- 授予用户对特定表的权限 grant select, insert on test.users to 'user'@'localhost'; -- 授予用户对特定列的权限 grant select (name, email) on test.users to 'user'@'localhost';
4.3. 查看特定用户的权限
-- 查看用户权限 show grants for 'user'@'localhost'; -- 查看用户权限的详细信息 select * from mysql.user where user = 'user' and host = 'localhost';
4.4. 修改权限
-- 修改用户密码
alter user 'user'@'localhost' identified by 'new_password';
-- 重置密码
set password for 'user'@'localhost' = password('new_password');
-- 刷新权限
flush privileges;
4.5. 删除用户权限
-- 删除用户权限 revoke select on test.* from 'user'@'localhost'; -- 删除用户 drop user 'user'@'localhost';
5. 常见问题
5.1. 无法登录
- 检查
user表中的用户和密码 - 确认
host字段是否匹配连接ip - 使用
flush privileges刷新权限
5.2. 权限不生效
- 确认是否执行了
flush privileges - 检查权限是否在正确的表中(如
db表 vsuser表)
5.3. 密码重置
-- 停止mysql服务
sudo systemctl stop mysql
-- 以跳过权限检查的方式启动
sudo mysqld_safe --skip-grant-tables &
-- 登录mysql
mysql -u root
-- 重置密码
use mysql;
update user set authentication_string = password('new_password') where user = 'root';
-- 重启mysql服务
sudo systemctl restart mysql
二、information_schema
information_schema是 mysql 的核心系统数据库,它提供了一个虚拟数据库,其中包含所有数据库的元数据信息。这个数据库不存储实际业务数据,而是提供关于数据库结构、表、列、索引、视图等的描述性信息。
1. 核心特性
- 标准系统数据库:所有 mysql 版本都支持。
- 只读视图:不能直接修改数据,只能查询。
- 动态生成的虚拟数据库:数据不存储在磁盘上,而是内部动态生成。
- 元数据查询中心:数据库管理员和开发人员的"数据库百科全书"。
- 标准 sql 兼容:使用标准 sql 查询获取元数据。
2. 核心视图
| 视图分类 | 视图名称 | 用途 | 说明 |
|---|---|---|---|
| 数据库元数据 | schemata | 查看数据库列表及属性 | 包含所有数据库名称、默认字符集、排序规则等信息 |
| 表元数据 | tables | 查看表及视图基本信息 | 包含表所属数据库、表名、存储引擎、创建时间、更新时间等 |
| 列元数据 | columns | 查看表列详细信息 | 包含列所属表、列名、数据类型、是否允许null、默认值、字符最大长度等 |
| 索引元数据 | statistics | 查看表索引信息 | 包含索引所属表、索引名、列名、索引顺序、索引类型(如btree)等 |
| 权限管理 | user_privileges | 查看用户全局权限 | 包含用户账号、权限类型(如select)、是否可授权等 |
| 存储过程/函数 | routines | 查看存储过程和函数 | 包含名称、类型(procedure/function)、所属数据库、创建时间等 |
| 触发器 | triggers | 查看触发器信息 | 包含触发器所属表、事件类型(insert/update/delete)、触发时机(before/after)等 |
| 事件调度器 | events | 查看事件调度器信息 | 包含事件名称、所属数据库、执行时间表达式、状态(enabled/disabled)等 |
| 字符集与排序 | character_sets | 查看支持的字符集 | 包含字符集名称、默认排序规则、描述等 |
| 排序规则 | collations | 查看排序规则信息 | 包含排序规则名称、字符集、是否区分大小写、是否区分重音等 |
| 表约束 | key_column_usage | 查看表约束关系 | 包含约束类型(primary key/foreign key)、关联表、关联列等 |
| 分区表 | partitions | 查看分区表信息 | 包含表名、分区名、分区方法(range/hash)、分区表达式等 |
| 插件管理 | plugins | 查看已安装插件 | 包含插件名称、状态(active/inactive)、版本、描述等 |
| 服务器参数 | global_variables | 查看全局服务器变量 | 包含变量名(如max_connections)、当前值、默认值等 |
| 会话参数 | session_variables | 查看会话级变量 | 与global_variables类似,但针对当前会话 |
| 引擎信息 | engines | 查看存储引擎支持情况 | 包含引擎名称(如innodb)、支持状态(default/yes/no)、描述等 |
| 表空间 | tablespaces | 查看表空间信息 | 包含表空间名称、引擎、文件路径、空间大小等 |
| 锁信息 | table_constraints | 查看表约束类型 | 包含表名、约束类型(primary key/unique/foreign key)等 |
| 外键关系 | referential_constraints | 查看外键关联关系 | 包含父表、子表、关联列、更新/删除规则等 |
| 视图定义 | views | 查看视图定义详情 | 包含视图所属数据库、视图名、定义sql语句、是否可更新等 |
3. 常用操作
3.1. 查询所有数据库
select schema_name as `database` from information_schema.schemata;
3.2. 查询特定数据库的所有表
select table_name as `table` from information_schema.tables where table_schema = 'your_database_name';
3.3. 查询表结构
select
column_name as `column`,
data_type as `type`,
is_nullable as `nullable`,
column_key as `key`,
column_default as `default`,
extra as `extra`
from information_schema.columns
where table_schema = 'your_database_name'
and table_name = 'your_table_name';
3.4. 查询索引信息
select
index_name as `index`,
column_name as `column`,
seq_in_index as `seq`,
non_unique as `nonunique`
from information_schema.statistics
where table_schema = 'your_database_name'
and table_name = 'your_table_name';
3.5. 查询外键关系
select
constraint_name as `constraint`,
referenced_table_name as `referenced table`,
referenced_column_name as `referenced column`
from information_schema.key_column_usage
where table_schema = 'your_database_name'
and table_name = 'your_table_name'
and referenced_table_name is not null;
3.6. 查询视图定义
select
table_name as `view`,
view_definition as `definition`
from information_schema.views
where table_schema = 'your_database_name';
3.7. 数据库结构比较
-- 比较两个数据库的表结构差异
select
table_name,
column_name,
data_type as source_type,
(select data_type
from information_schema.columns
where table_schema = 'target_db'
and table_name = source.table_name
and column_name = source.column_name) as target_type
from information_schema.columns source
where table_schema = 'source_db'
and (select data_type
from information_schema.columns
where table_schema = 'target_db'
and table_name = source.table_name
and column_name = source.column_name) is null
or (select data_type
from information_schema.columns
where table_schema = 'target_db'
and table_name = source.table_name
and column_name = source.column_name) <> source.data_type;
三、performance_schema
performance_schema是 mysql 5.5 版本引入的核心性能监控工具,用于收集 mysql 服务器运行时的底层事件信息。它也是一个虚拟数据库,数据存储在内存中,重启后会丢失。它和慢查询日志不同,它提供的是实时、细粒度的性能数据,而不是事后分析的慢查询记录。
1. 核心特性
- 低开销设计:采用轻量级检测点机制,默认配置下对性能影响小于5%,但启用大量监控项时可能增加开销。
- 内存存储:所有数据保存在内存中,重启后数据丢失,不占用磁盘空间。
- 事件驱动:以“事件”为单位记录资源消耗(如时间、次数),涵盖线程、语句、锁、i/o等关键指标。
- 细粒度监控:比慢查询日志提供更详细的性能数据。
- 实时性:可以实时监控数据库运行状态。
- 可配置性:按需选择监控哪些事件。
- 标准化sql:数据存储在标准 mysql 表中,便于使用 sql 分析。
2. 核心运行机制
事件分类与采集
performance_schema通过“检测点”捕获服务器内部事件,事件类型包括:- 语句事件:sql语句的执行(如解析、排序、执行)。
- 等待事件:资源等待(如锁、i/o、线程同步)。
- 阶段事件:sql执行各阶段(如解析、优化、执行)。
- 事务事件:事务的启动、提交、回滚。
- 内存事件:内存分配与释放。
存储引擎与表结构
performance_schema使用专用存储引擎,表结构按功能分类:- 当前事件表(如
events_statements_current):记录当前活跃事件。 - 历史事件表(如
events_statements_history):记录最近完成的事件(线程级)。 - 长历史事件表(如
events_statements_history_long):记录全局历史事件。 - 摘要表(如
events_statements_summary_by_digest):按语句摘要聚合统计数据。 - 配置表(如
setup_instruments、setup_consumers):动态控制监控项与数据存储。
- 当前事件表(如
数据采集与存储
- 事件数据通过检测点实时采集,存储在内存表中,支持
select查询。 - 配置表(如
setup_instruments)可启用/禁用特定事件采集,减少开销。
- 事件数据通过检测点实时采集,存储在内存表中,支持
3. 核心表
| 表分类 | 表名 | 用途 | 说明 |
|---|---|---|---|
| 语句事件记录 | events_statements_current | 记录当前执行的sql详细信息 | 如执行时间、扫描行数、锁等待等 |
| 语句事件记录 | events_statements_history | 记录最近完成的sql历史 | 按线程分组,存储最近10条执行记录 |
| 语句事件记录 | events_statements_history_long | 全局sql历史记录 | 存储所有线程的sql执行情况,最多10000条 |
| 语句事件记录 | events_statements_summary_by_digest | sql摘要聚合统计 | 按sql指纹分组,统计执行次数、总耗时、平均耗时等 |
| 等待事件记录 | events_waits_current | 当前资源等待事件 | 如锁等待、i/o等待、线程同步等 |
| 等待事件记录 | events_waits_history | 最近完成的等待事件 | 按线程分组,存储最近10条等待记录 |
| 等待事件记录 | events_waits_history_long | 全局等待事件历史 | 存储所有线程的等待事件,最多10000条 |
| 等待事件记录 | events_waits_summary_by_event_name | 按事件名称聚合统计 | 如锁等待次数、总耗时、平均耗时等 |
| 阶段事件记录 | events_stages_current | 当前sql执行阶段 | 如解析、优化、执行等阶段 |
| 阶段事件记录 | events_stages_history | 历史阶段事件 | 按线程分组,存储最近10条阶段记录 |
| 阶段事件记录 | events_stages_history_long | 全局阶段事件历史 | 存储所有线程的阶段事件,最多10000条 |
| 阶段事件记录 | events_stages_summary_by_event_name | 按阶段名称聚合统计 | 如解析阶段耗时、执行阶段耗时等 |
| 事务事件记录 | events_transactions_current | 当前执行的事务信息 | 如事务id、状态、开始时间等 |
| 事务事件记录 | events_transactions_history | 最近完成的事务历史 | 按线程分组,存储最近10条事务记录 |
| 事务事件记录 | events_transactions_history_long | 全局事务历史 | 存储所有线程的事务记录,最多10000条 |
| 事务事件记录 | events_transactions_summary_by_transaction | 事务级别统计 | 如提交次数、回滚次数、事务耗时等 |
| 内存事件记录 | memory_summary_by_account_by_event_name | 按账户和事件统计内存 | 如分配次数、释放次数、内存使用量等 |
| 内存事件记录 | memory_summary_by_host_by_event_name | 按主机和事件统计内存 | 如内存分配、释放、使用量等 |
| 内存事件记录 | memory_summary_by_thread_by_event_name | 按线程和事件统计内存 | 如线程内存使用情况、内存泄漏检测等 |
| 内存事件记录 | memory_summary_global_by_event_name | 全局内存使用统计 | 如总分配量、总释放量、当前使用量等 |
| 文件i/o事件 | file_summary_by_event_name | 按事件统计文件i/o | 如读写次数、耗时、数据量等 |
| 文件i/o事件 | file_summary_by_instance | 按文件实例统计i/o | 如文件读写次数、耗时、数据量等 |
| 文件i/o事件 | table_io_waits_summary_by_table | 按表统计i/o等待 | 如表读写等待次数、耗时等 |
| 配置表 | setup_instruments | 配置事件采集项 | 启用/禁用特定事件监控,如锁、i/o、sql执行等 |
| 配置表 | setup_consumers | 配置数据存储目标 | 控制是否记录历史、摘要或全局数据 |
| 配置表 | setup_timers | 配置计时器类型 | 如cpu时间、线程时间、墙钟时间等 |
| 配置表 | setup_actors | 配置用户/主机监控 | 设置用户和主机的监控权限 |
| 其他表 | threads | 服务器线程信息 | 如线程id、类型、状态、cpu使用率等 |
| 其他表 | users | 用户信息 | 如用户名、主机、权限等 |
| 其他表 | variables_by_thread | 线程变量使用 | 如线程级变量值、默认值、是否修改等 |
| 其他表 | mutex_instances | 互斥同步对象实例 | 记录系统中使用互斥量对象的所有记录,name为wait/synch/mutex/* |
| 其他表 | rwlock_instances | 读写锁同步对象实例 | 记录系统中使用读写锁对象的所有记录,name为wait/synch/rwlock/* |
| 其他表 | socket_instances | 活跃会话对象实例 | 记录thread_id, socket_id, ip和port,用于关联应用与数据库 |
4. 常用操作
4.1. 检查是否已启用
show variables like 'performance_schema'; -- 默认值为 on(mysql 5.7+)
4.2. 开启特定监控项
-- 开启所有事件的监控(谨慎使用,可能影响性能) update performance_schema.setup_consumers set enabled = 'yes'; -- 按需开启特定监控(推荐) update performance_schema.setup_consumers set enabled = 'yes' where name like 'events_statements%'; -- 开启sql语句监控
4.3. 配置监控粒度
-- 监控所有用户的sql语句 update performance_schema.setup_actors set enabled = 'yes', history = 'yes' where user = '%';
4.4. 查看最耗时的sql语句
select
digest_text as 'sql语句',
count_star as '执行次数',
sum_timer_wait / 1e9 as '总耗时(秒)',
avg_timer_wait / 1e9 as '平均耗时(秒)'
from performance_schema.events_statements_summary_by_digest
order by sum_timer_wait desc
limit 10;
4.5. 查看最近执行的sql详情
select
event_id,
sql_text as 'sql语句',
timer_wait / 1e9 as '耗时(秒)',
lock_time / 1e9 as '锁等待时间(秒)',
rows_examined as '扫描行数',
rows_sent as '返回行数'
from performance_schema.events_statements_history
order by timer_wait desc
limit 10;
4.6. 分析i/o瓶颈
select
event_name as '事件类型',
count_star as '次数',
sum_timer_wait / 1e9 as '总等待时间(秒)',
avg_timer_wait / 1e9 as '平均等待时间(秒)'
from performance_schema.file_summary_by_event_name
where event_name like '%read%'
order by sum_timer_wait desc;
4.7. 监控长期运行事务
select
thread_id,
event_id,
sql_text,
timer_start,
timer_wait / 1e9 as '已运行时间(秒)'
from performance_schema.events_transactions_current
where state = 'active'
order by timer_wait desc;
四、sys
sys是mysql 5.7.7+ 引入的一个辅助库,旨在简化数据库管理员(dba)和开发者的性能监控与诊断工作。它基于performance_schema和information_schema,通过视图、存储过程和函数的形式,提供更直观、易用的数据库性能和元数据信息。
sys 是 mysql 的"性能分析助手",它将复杂的性能数据转换为易于理解的视图,让数据库管理员和开发人员能够快速识别和解决性能问题。
1. 核心特性
简化性能监控
- sys库封装了performance_schema的复杂表结构,提供预聚合的视图,直接展示关键性能指标(如查询执行时间、锁等待、io延迟等)。
- 例如,通过
host_summary视图可快速查看各主机的连接数、内存使用、io延迟等概览信息。
快速诊断问题
- 提供针对慢查询、热点表、锁等待等常见问题的专用视图,帮助定位性能瓶颈。
- 例如,
statements_with_runtimes_in_95th_percentile视图可识别执行时间最长的查询。
统一元数据查询
- 集成information_schema的信息,提供关于数据库对象(如表、索引、存储过程)的详细元数据视图。
2. 主要内容
2.1. 视图(views)
sys库包含大量视图,按功能可分为以下几类:
性能视图
statement_analysis:查询执行统计(次数、总延迟、平均延迟等)。innodb_lock_waits:显示锁等待链,帮助解决死锁问题。io_by_thread_by_latency:按线程统计io延迟,识别高负载线程。
元数据视图
schema_table_statistics:统计表的增删改查操作量及io耗时。schema_unused_indexes:识别未使用的冗余索引,优化表结构。
系统状态视图
host_summary:主机级性能概览(连接数、内存使用、io等)。memory_by_thread_by_current_bytes:按线程统计内存使用情况。
视图命名规则:大部分视图成对出现,带x$前缀的视图显示原始数据(如皮秒单位),不带前缀的视图显示经过单位换算的数据(如毫秒、秒)。 比如:host_summary_by_file_io(换算后)与x$host_summary_by_file_io(原始数据)。
2.2. 存储过程(procedures)
用于动态配置performance_schema的监控项,例如:
ps_setup_enable_instrument('wait'):启用等待事件监控。ps_setup_disable_consumer('history_long'):禁用历史长事件收集。ps_setup_reset_to_default(true):重置performance_schema为默认配置。
2.3. 函数(functions)
提供格式化输出功能,例如:
format_bytes(bytes):将字节数转换为易读的单位(如kb、mb)。format_time(microseconds):将微秒转换为时间字符串(如00:00:01.234)。
3. 常用操作
3.1. 排查慢查询
-- 查看执行时间最长的10个查询 select * from sys.statement_analysis order by total_latency desc limit 10;
3.2. 识别热点表
-- 查看操作最频繁的表 select * from sys.schema_table_statistics order by rows_fetched + rows_inserted + rows_updated + rows_deleted desc limit 10;
3.3. 分析锁等待
-- 查看当前锁等待链 select * from sys.innodb_lock_waits;
3.4. 监控io性能
-- 按主机统计文件io延迟 select * from sys.host_summary_by_file_io order by io_latency desc;
3.5. 查看使用临时表的查询
select
digest_text as 'sql语句',
count_star as '执行次数',
sum_created_tmp_disk_tables as '磁盘临时表次数',
sum_created_tmp_tables as '临时表总数'
from sys.statements_with_temp_tables
order by sum_created_tmp_tables desc
limit 10;
3.6. 查看当前活动链接
select
id,
user,
host,
db,
command,
time,
state,
info
from sys.processlist
order by time desc;
3.7. 查看内存使用情况
select
event_name as '内存事件',
count_star as '次数',
sum_number_of_bytes_used / 1024 / 1024 as '总内存(mb)'
from sys.memory_global_by_current_bytes
order by sum_number_of_bytes_used desc
limit 10;
3.8. 查看索引使用情况
select
table_schema as '数据库',
table_name as '表名',
index_name as '索引名',
seq_in_index as '索引顺序',
column_name as '列名',
cardinality as '基数',
non_unique as '是否唯一'
from sys.schema_index_statistics
order by table_schema, table_name, index_name;
总结
到此这篇关于mysql数据库自带系统数据库功能超详细介绍的文章就介绍到这了,更多相关mysql自带系统数据库功能内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论