sql-31 Mysql5.7系统表
MySQL 5.7 系统数据库与数据表详解
MySQL 5.7 包含多个系统数据库,它们存储了MySQL服务器的元数据、权限信息、性能指标等关键数据。以下是详细的解析:
一、系统数据库概览
MySQL 5.7 默认包含以下系统数据库:
-- 查看所有数据库
SHOW DATABASES;
-- 输出示例:
+--------------------+
| Database |
+--------------------+
| information_schema | -- 信息模式(虚拟数据库)
| mysql | -- 核心系统数据库
| performance_schema | -- 性能监控数据库
| sys | -- 系统数据库(5.7.7+)
| test | -- 测试数据库(可删除)
+--------------------+
二、information_schema 详解
1. 概述
- 虚拟数据库,不占用物理存储空间
- 提供元数据访问,符合SQL标准
- 所有用户都可访问(只读)
2. 核心表结构
数据库和表信息
-- 查看所有表
USE information_schema;
SHOW TABLES LIKE '%TABLES%';
-- 重要表:
-- TABLES:所有表的信息
SELECT
TABLE_SCHEMA AS '数据库',
TABLE_NAME AS '表名',
TABLE_TYPE AS '类型',
ENGINE AS '存储引擎',
TABLE_ROWS AS '行数',
DATA_LENGTH AS '数据大小(B)',
INDEX_LENGTH AS '索引大小(B)',
CREATE_TIME AS '创建时间'
FROM TABLES
WHERE TABLE_SCHEMA = 'your_database'
ORDER BY DATA_LENGTH DESC;
-- COLUMNS:所有列的信息
SELECT
TABLE_SCHEMA,
TABLE_NAME,
COLUMN_NAME,
DATA_TYPE,
CHARACTER_MAXIMUM_LENGTH,
IS_NULLABLE,
COLUMN_DEFAULT,
COLUMN_COMMENT
FROM COLUMNS
WHERE TABLE_SCHEMA = 'your_database'
ORDER BY TABLE_NAME, ORDINAL_POSITION;
-- STATISTICS:索引统计信息
SELECT
TABLE_SCHEMA,
TABLE_NAME,
INDEX_NAME,
COLUMN_NAME,
SEQ_IN_INDEX,
INDEX_TYPE,
CARDINALITY
FROM STATISTICS
WHERE TABLE_SCHEMA = 'your_database';
权限和进程信息
-- 查看用户权限
SELECT
GRANTEE,
PRIVILEGE_TYPE,
IS_GRANTABLE
FROM USER_PRIVILEGES;
-- 查看进程列表(类似SHOW PROCESSLIST)
SELECT
ID,
USER,
HOST,
DB,
COMMAND,
TIME,
STATE,
INFO
FROM PROCESSLIST
WHERE COMMAND != 'Sleep'
ORDER BY TIME DESC;
-- 查看字符集和校对规则
SELECT
CHARACTER_SET_NAME,
DEFAULT_COLLATE_NAME,
DESCRIPTION,
MAXLEN
FROM CHARACTER_SETS;
-- 查看存储引擎信息
SELECT
ENGINE,
SUPPORT,
COMMENT,
TRANSACTIONS,
XA,
SAVEPOINTS
FROM ENGINES;
三、mysql 数据库详解
1. 概述
- 核心系统数据库,存储权限、用户、插件等信息
- 使用MyISAM和InnoDB混合存储
- 需要特殊权限才能修改
2. 用户和权限表
user表(核心权限表)
-- 查看表结构
DESC mysql.user;
-- 重要字段:
-- Host, User: 用户标识(主机+用户名)
-- authentication_string: 密码哈希(5.7使用caching_sha2_password或mysql_native_password)
-- Select_priv, Insert_priv等: 全局权限
-- max_questions, max_updates: 资源限制
-- plugin: 认证插件
-- 查看用户权限
SELECT
Host,
User,
authentication_string,
Select_priv,
Insert_priv,
Update_priv,
Delete_priv,
Create_priv,
Drop_priv
FROM mysql.user
ORDER BY User, Host;
-- 创建用户(示例)
CREATE USER 'testuser'@'localhost' IDENTIFIED BY 'password';
GRANT SELECT, INSERT ON mydb.* TO 'testuser'@'localhost';
FLUSH PRIVILEGES;
其他权限相关表
-- db表:数据库级权限
SELECT * FROM mysql.db WHERE User = 'testuser';
-- tables_priv表:表级权限
SELECT * FROM mysql.tables_priv;
-- columns_priv表:列级权限
SELECT * FROM mysql.columns_priv;
-- procs_priv表:存储过程权限
SELECT * FROM mysql.procs_priv;
3. 时区和字符集表
-- 时区信息
SHOW TABLES LIKE '%time%';
-- time_zone, time_zone_leap_second, time_zone_name, time_zone_transition
-- 查看时区设置
SELECT * FROM mysql.time_zone;
SELECT * FROM mysql.time_zone_name;
-- 加载时区数据(需要导入)
-- mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
-- 字符集相关
SELECT * FROM mysql.columns_priv;
4. 其他重要表
-- 事件调度器
SELECT * FROM mysql.event;
-- 存储过程和函数
SELECT * FROM mysql.proc;
-- 插件信息
SELECT * FROM mysql.plugin;
-- 服务器端帮助系统
SELECT * FROM mysql.help_topic;
SELECT * FROM mysql.help_category;
SELECT * FROM mysql.help_relation;
四、performance_schema 详解
1. 概述
- 性能监控数据库,提供服务器运行时性能数据
- 默认启用,但某些功能可能需要配置
- 使用内存表,重启后数据丢失
2. 配置和使用
-- 查看是否启用
SHOW VARIABLES LIKE 'performance_schema';
-- 或
USE performance_schema;
SHOW TABLES;
-- 启用/禁用特定监控
UPDATE performance_schema.setup_instruments
SET ENABLED = 'YES', TIMED = 'YES'
WHERE NAME LIKE '%statement/%';
UPDATE performance_schema.setup_consumers
SET ENABLED = 'YES'
WHERE NAME LIKE '%events_statements_%';
3. 关键表分类
配置表
-- 监控配置
SELECT * FROM performance_schema.setup_actors;
SELECT * FROM performance_schema.setup_consumers;
SELECT * FROM performance_schema.setup_instruments;
SELECT * FROM performance_schema.setup_objects;
SELECT * FROM performance_schema.setup_timers;
语句和事件监控
-- 最近执行的SQL语句
SELECT
EVENT_ID,
EVENT_NAME,
TIMER_WAIT/1000000000 AS '耗时(秒)',
LOCK_TIME/1000000000 AS '锁时间(秒)',
SQL_TEXT,
DIGEST,
DIGEST_TEXT,
ROWS_AFFECTED,
ROWS_SENT,
ROWS_EXAMINED,
CREATED_TMP_TABLES,
CREATED_TMP_DISK_TABLES
FROM performance_schema.events_statements_history_long
WHERE SQL_TEXT IS NOT NULL
ORDER BY TIMER_START DESC
LIMIT 10;
-- 按SQL模式聚合统计
SELECT
DIGEST_TEXT,
COUNT_STAR AS '执行次数',
SUM_TIMER_WAIT/1000000000 AS '总耗时(秒)',
AVG_TIMER_WAIT/1000000000 AS '平均耗时(秒)',
SUM_ROWS_AFFECTED AS '影响行数',
SUM_ROWS_SENT AS '返回行数',
SUM_ROWS_EXAMINED AS '扫描行数',
FIRST_SEEN AS '首次出现',
LAST_SEEN AS '最后出现'
FROM performance_schema.events_statements_summary_by_digest
WHERE DIGEST_TEXT IS NOT NULL
ORDER BY SUM_TIMER_WAIT DESC
LIMIT 10;
连接和线程信息
-- 查看当前连接线程
SELECT
THREAD_ID,
PROCESSLIST_ID AS '连接ID',
PROCESSLIST_USER AS '用户',
PROCESSLIST_HOST AS '主机',
PROCESSLIST_DB AS '数据库',
PROCESSLIST_COMMAND AS '命令',
PROCESSLIST_TIME AS '时间(秒)',
PROCESSLIST_STATE AS '状态',
PROCESSLIST_INFO AS '当前SQL'
FROM performance_schema.threads
WHERE PROCESSLIST_ID IS NOT NULL
ORDER BY PROCESSLIST_TIME DESC;
-- 线程历史
SELECT * FROM performance_schema.events_waits_history;
SELECT * FROM performance_schema.events_waits_history_long;
锁和事务监控
-- 当前锁信息
SELECT
OBJECT_SCHEMA,
OBJECT_NAME,
LOCK_TYPE,
LOCK_MODE,
LOCK_STATUS,
THREAD_ID,
PROCESSLIST_ID
FROM performance_schema.metadata_locks
WHERE OBJECT_SCHEMA IS NOT NULL;
-- 行锁等待
SELECT
WAITING_THREAD_ID,
WAITING_PROCESSLIST_ID,
WAITING_QUERY,
BLOCKING_THREAD_ID,
BLOCKING_PROCESSLIST_ID,
BLOCKING_QUERY
FROM performance_schema.threads
JOIN performance_schema.data_lock_waits
ON THREAD_ID = WAITING_THREAD_ID;
内存使用监控
-- 内存使用汇总
SELECT
EVENT_NAME,
COUNT_ALLOC,
COUNT_FREE,
SUM_NUMBER_OF_BYTES_ALLOC/1024/1024 AS '分配总量(MB)',
SUM_NUMBER_OF_BYTES_FREE/1024/1024 AS '释放总量(MB)',
CURRENT_COUNT_USED,
CURRENT_NUMBER_OF_BYTES_USED/1024/1024 AS '当前使用(MB)'
FROM performance_schema.memory_summary_global_by_event_name
ORDER BY CURRENT_NUMBER_OF_BYTES_USED DESC
LIMIT 15;
文件I/O监控
-- 文件I/O统计
SELECT
FILE_NAME,
COUNT_READ,
COUNT_WRITE,
SUM_NUMBER_OF_BYTES_READ/1024/1024 AS '读取总量(MB)',
SUM_NUMBER_OF_BYTES_WRITE/1024/1024 AS '写入总量(MB)'
FROM performance_schema.file_summary_by_instance
ORDER BY SUM_NUMBER_OF_BYTES_READ + SUM_NUMBER_OF_BYTES_WRITE DESC;
五、sys 数据库详解
1. 概述
- MySQL 5.7.7+ 引入,基于performance_schema的视图
- 提供更友好的性能诊断接口
- 所有数据来自performance_schema和information_schema
2. 常用视图
性能诊断视图
-- 查看最耗资源的SQL
SELECT * FROM sys.statement_analysis LIMIT 10;
-- 查看全表扫描的语句
SELECT * FROM sys.statements_with_full_table_scans;
-- 查看使用临时表的语句
SELECT * FROM sys.statements_with_temp_tables;
-- 查看排序相关的语句
SELECT * FROM sys.statements_with_sorting;
-- 查看错误和警告
SELECT * FROM sys.statements_with_errors_or_warnings;
模式相关视图
-- 按大小排序的表
SELECT
table_schema AS '数据库',
table_name AS '表名',
engine AS '存储引擎',
table_rows AS '行数',
data_length/1024/1024 AS '数据大小(MB)',
index_length/1024/1024 AS '索引大小(MB)',
(data_length+index_length)/1024/1024 AS '总大小(MB)'
FROM sys.schema_table_statistics
ORDER BY (data_length+index_length) DESC;
-- 未使用的索引
SELECT * FROM sys.schema_unused_indexes;
-- 冗余索引
SELECT * FROM sys.schema_redundant_indexes;
用户和连接视图
-- 用户连接统计
SELECT
user AS '用户',
current_connections AS '当前连接',
total_connections AS '总连接'
FROM sys.user_summary;
-- 查看当前会话
SELECT * FROM sys.session
WHERE command != 'Sleep'
ORDER BY time DESC;
-- 查看锁等待
SELECT * FROM sys.innodb_lock_waits;
-- 查看当前进程
SELECT * FROM sys.processlist;
InnoDB状态视图
-- InnoDB缓冲池统计
SELECT
page_type,
count/1024 AS '页数(K)',
data_size/1024/1024 AS '数据大小(MB)'
FROM sys.innodb_buffer_page
GROUP BY page_type
ORDER BY data_size DESC;
-- 缓冲池使用情况
SELECT * FROM sys.innodb_buffer_stats_by_schema;
SELECT * FROM sys.innodb_buffer_stats_by_table;
六、系统数据库维护
1. 备份系统数据库
# 备份mysql数据库(包含用户权限)
mysqldump -u root -p --databases mysql > mysql_backup.sql
# 备份所有系统数据库(除了information_schema)
mysqldump -u root -p --databases mysql performance_schema sys > system_dbs_backup.sql
# 备份用户权限(仅权限,无数据)
mysql -u root -p --skip-column-names -A -e"SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') FROM mysql.user WHERE user<>''" | mysql -u root -p --skip-column-names -A | sed 's/$/;/g' > all_grants.sql
2. 恢复系统数据库
-- 恢复mysql数据库
mysql -u root -p mysql < mysql_backup.sql
FLUSH PRIVILEGES; -- 必须执行!
-- 从权限文件恢复
mysql -u root -p < all_grants.sql
3. 常见维护操作
-- 清理performance_schema历史数据(重启后自动清理)
-- 可调整表大小限制
SET GLOBAL performance_schema_events_statements_history_size = 10000;
SET GLOBAL performance_schema_events_waits_history_size = 10000;
-- 修复mysql系统表
mysql_upgrade -u root -p
-- 检查表完整性
CHECK TABLE mysql.user;
REPAIR TABLE mysql.user;
-- 优化表
OPTIMIZE TABLE mysql.general_log; -- 如果启用的话
4. 安全加固建议
-- 删除测试数据库
DROP DATABASE test;
-- 删除匿名用户
DELETE FROM mysql.user WHERE User = '';
FLUSH PRIVILEGES;
-- 检查空密码用户
SELECT User, Host FROM mysql.user
WHERE authentication_string = '' OR authentication_string IS NULL;
-- 限制root远程登录
DELETE FROM mysql.user WHERE User = 'root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');
FLUSH PRIVILEGES;
七、故障排查示例
1. 连接数满排查
-- 查看最大连接数
SHOW VARIABLES LIKE 'max_connections';
-- 查看当前连接
SELECT * FROM information_schema.PROCESSLIST;
-- 或
SELECT * FROM sys.session;
-- 查看连接来源
SELECT
USER,
HOST,
COUNT(*) as connection_count
FROM information_schema.PROCESSLIST
GROUP BY USER, HOST
ORDER BY connection_count DESC;
2. 性能问题排查
-- 查看慢查询
SELECT * FROM sys.statement_analysis
ORDER BY avg_latency DESC
LIMIT 10;
-- 查看锁等待
SELECT * FROM sys.innodb_lock_waits;
-- 查看I/O瓶颈
SELECT * FROM sys.io_global_by_file_by_bytes
LIMIT 10;
-- 查看内存使用
SELECT * FROM sys.memory_global_by_current_bytes
LIMIT 10;
3. 权限问题排查
-- 查看用户权限
SHOW GRANTS FOR 'username'@'host';
-- 查看所有用户权限
SELECT
CONCAT('\'', user, '\'@\'', host, '\'') AS user_host,
authentication_string
FROM mysql.user
ORDER BY user, host;
-- 检查权限冲突
SELECT * FROM mysql.user WHERE user = 'username';
SELECT * FROM mysql.db WHERE user = 'username';
SELECT * FROM mysql.tables_priv WHERE user = 'username';
八、实用查询脚本
1. 系统状态概览
-- 系统概览脚本
SELECT
'数据库统计' AS '类别',
COUNT(*) AS '数量'
FROM information_schema.SCHEMATA
WHERE SCHEMA_NAME NOT IN ('information_schema', 'mysql', 'performance_schema', 'sys')
UNION ALL
SELECT
'表统计',
COUNT(*)
FROM information_schema.TABLES
WHERE TABLE_SCHEMA NOT IN ('information_schema', 'mysql', 'performance_schema', 'sys')
UNION ALL
SELECT
'总数据大小(GB)',
ROUND(SUM(DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024 / 1024, 2)
FROM information_schema.TABLES
WHERE TABLE_SCHEMA NOT IN ('information_schema', 'mysql', 'performance_schema', 'sys');
2. 监控关键指标
-- 关键性能指标监控
SELECT
VARIABLE_NAME AS '指标',
VARIABLE_VALUE AS '值',
'状态变量' AS '类型'
FROM performance_schema.global_status
WHERE VARIABLE_NAME IN (
'Threads_connected',
'Threads_running',
'Innodb_buffer_pool_pages_dirty',
'Innodb_buffer_pool_reads',
'Innodb_rows_read',
'Innodb_rows_inserted',
'Innodb_rows_updated',
'Innodb_rows_deleted'
)
UNION ALL
SELECT
VARIABLE_NAME,
VARIABLE_VALUE,
'系统变量'
FROM performance_schema.global_variables
WHERE VARIABLE_NAME IN (
'max_connections',
'innodb_buffer_pool_size',
'innodb_log_file_size',
'query_cache_size'
);
总结
MySQL 5.7 的系统数据库提供了强大的监控和管理能力:
- information_schema:元数据查询,标准化接口
- mysql:用户权限和系统配置核心
- performance_schema:深度性能监控
- sys:用户友好的性能诊断视图
最佳实践建议:
- 定期备份
mysql数据库(特别是user表) - 使用
performance_schema监控生产环境性能 - 利用
sys视图进行日常故障排查 - 谨慎操作系统表,避免直接修改
- 保持系统数据库的版本兼容性
这些系统数据库是MySQL管理和优化的核心工具,熟练掌握它们对数据库管理员至关重要。
珊瑚海

浙公网安备 33010602011771号