Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySQL运维的一款利器sys schema

MySQL运维的一款利器sys schema

作者头像
jeanron100
发布于 2018-03-22 07:14:42
发布于 2018-03-22 07:14:42
1.1K00
代码可运行
举报
运行总次数:0
代码可运行

MySQL运维中有很多的工具,就好比你进了一个杂货铺,各种运维中的小技巧几乎都有一些小工具, 走一圈发现真是琳琅满目,可见MySQL充分享受了开源社区的红利。

而比较特别的一点是MySQL社区中,官方提供的工具在以前不会成为市面上的拳头产品,有些甚至维护一段之后就没有深入维护了。所以走一圈发现,MySQL很多实用成熟的工具都来自于社区,而官方推出的一些工具不是因为企业版的限制就是功能的不成熟而被有限使用。

当然不一而论,在早些年我可以说这些话,但是在5.7开始,你会明显发现官方的投入已经很大了,官方推出的社区版迭代很快,已经早早超越了两个流行的分支Percona和MariaDB,尤其是MGR的推出,算是让MySQL在这方面有了不少的亮点和话语权。

我们继续回到工具,还是工具,工具是DBA的一把瑞士军刀,其实对我们来说,我们也不希望有一大把的小工具,如果有太多的工具,太多的瑞士军刀,我们的行李箱就会很沉重,哪些都需要,哪些都要单独安装,所以我们有时候希望做减法。如果官方有而且做得不错,那毫无疑问是我们首选的方案了。

所以在此我要推荐MySQL 的sys schema。这是在5.7推出的一个特性。算是对以前的performance_schema和information_schema的一个抽象层。

有的同学可能会问,这都是MySQL 5.7的特性了,我们的很多环境使用的依旧是5.5,5.6,这个特性对我们来说有什么意义,如果只是这样想,只能说明你只是意识到了这个问题而已,但是对于解决问题没有实质性建议。

我们来简单说下sys schema里面的一些小细节。

之前发表在DBAplus社群的一篇文章可供参考:在Oracle专家眼中,MySQL sys Schema是怎样一种存在?

我对sys下的视图做了一些分类,通过视图的命名可以看出来。

  • host_summary,这个是服务器层面的,比如里面的视图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,关于等待的,这个还是处于起步阶段,等待模型有待完善,目前只有基于io/file, lock/table, io/table这三个方面,提升空间还很大。

所以这确实是一个宝贝,让我们对原本难以入手的性能问题有了一些很清晰的定位方式。

比如我很看好的一个功能是自增列的溢出问题检测,如果能够提前发现,那么对于运维工作会从被动变为主动。

在MySQL 5.7中我会这样来用:

select *from schema_auto_increment_columns;

如果自增列值快要溢出(我们可以设置一个阈值,比如90%之类的),我们可以通过视图的方式来很容易定位到。

如果要查看这个视图的具体实现就会发现逻辑远比我们想象的复杂,视图的定义如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select `information_schema`.`COLUMNS`.`TABLE_SCHEMA` AS `table_schema`,`information_schema`.`COLUMNS`.`TABLE_NAME` AS `table_name`,`information_schema`.`COLUMNS`.`COLUMN_NAME` AS `column_name`,`information_schema`.`COLUMNS`.`DATA_TYPE` AS `data_type`,`information_schema`.`COLUMNS`.`COLUMN_TYPE` AS `column_type`,(locate('unsigned',`information_schema`.`COLUMNS`.`COLUMN_TYPE`) = 0) AS `is_signed`,(locate('unsigned',`information_schema`.`COLUMNS`.`COLUMN_TYPE`) > 0) AS `is_unsigned`,((case `information_schema`.`COLUMNS`.`DATA_TYPE` when 'tinyint' then 255 when 'smallint' then 65535 when 'mediumint' then 16777215 when 'int' then 4294967295 when 'bigint' then 18446744073709551615 end) >> if((locate('unsigned',`information_schema`.`COLUMNS`.`COLUMN_TYPE`) > 0),0,1)) AS `max_value`,`information_schema`.`TABLES`.`AUTO_INCREMENT` AS `auto_increment`,(`information_schema`.`TABLES`.`AUTO_INCREMENT` / ((case `information_schema`.`COLUMNS`.`DATA_TYPE` when 'tinyint' then 255 when 'smallint' then 65535 when 'mediumint' then 16777215 when 'int' then 4294967295 when 'bigint' then 18446744073709551615 end) >> if((locate('unsigned',`information_schema`.`COLUMNS`.`COLUMN_TYPE`) > 0),0,1))) AS `auto_increment_ratio`
 from (`INFORMATION_SCHEMA`.`COLUMNS` 
 join `INFORMATION_SCHEMA`.`TABLES` 
 on(((`information_schema`.`COLUMNS`.`TABLE_SCHEMA` = `information_schema`.`TABLES`.`TABLE_SCHEMA`) 
 and (`information_schema`.`COLUMNS`.`TABLE_NAME` = `information_schema`.`TABLES`.`TABLE_NAME`)))) 
 where ((`information_schema`.`COLUMNS`.`TABLE_SCHEMA` not in ('mysql','sys','INFORMATION_SCHEMA','performance_schema')) and (`information_schema`.`TABLES`.`TABLE_TYPE` = 'BASE TABLE') and (`information_schema`.`COLUMNS`.`EXTRA` = 'auto_increment')) 
 order by (`information_schema`.`TABLES`.`AUTO_INCREMENT` / ((case `information_schema`.`COLUMNS`.`DATA_TYPE` when 'tinyint' then 255 when 'smallint' then 65535 when 'mediumint' then 16777215 when 'int' then 4294967295 when 'bigint' then 18446744073709551615 end) >> if((locate('unsigned',`information_schema`.`COLUMNS`.`COLUMN_TYPE`) > 0),0,1))) desc,((case `information_schema`.`COLUMNS`.`DATA_TYPE` when 'tinyint' then 255 when 'smallint' then 65535 when 'mediumint' then 16777215 when 'int' then 4294967295 when 'bigint' then 18446744073709551615 end) >> if((locate('unsigned',`information_schema`.`COLUMNS`.`COLUMN_TYPE`) > 0),0,1))

里面引用了performance_schema和information_schema的数据字典。

所以有一个很重要的问题,5.7的视图内容是否可以照搬到5.5来用呢。

显然不是一个完全肯定的答案,因为5.7中的information_schema中的表有72个,而5.5中只有37个,大部分的差异是在InnoDB的数据字典上。

但是巧的是对于视图schema_auto_increment_columns的实现来说,5.5的逻辑已经足够了。

所以尽管我们使用的5.5的版本,我们依旧可以享用这个5.7的特性带来的福利,当然不是简单的拿来主义,对于这列操作,我更希望是放在从库来执行,提前测试避免不必要的麻烦。所以很多问题都能够有定位的方法,对于解决问题就会如虎添翼。

所以顺着这个思路走下去,你会发现有很多工作待发掘。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-02-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 杨建荣的学习笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MySQL 数据类型深度全栈实战,天花板玩法层出不穷!
在 MySQL 数据库的世界里,数据类型是构建高效、可靠数据库的基石。选择合适的数据类型,不仅能节省存储空间,还能提升数据查询和处理的性能
羑悻的小杀马特.
2025/05/11
420
MySQL 数据类型深度全栈实战,天花板玩法层出不穷!
采集MySQL数据库表自增主键使用情况
下面这个脚本是采集数据库自增主键水位的(遇到过业务主键设置过小,导致出问题的,因此我们必须将自增id的水位线监控起来)
保持热爱奔赴山海
2019/09/17
2.5K0
prometheus 统计MySQL 自增主键的剩余可用百分比
最近生产环境一套数据库因为疯狂写日志数据,造成主键值溢出的情况出现,因此有必要将这个指标监控起来。
保持热爱奔赴山海
2019/09/17
1.5K0
prometheus 统计MySQL 自增主键的剩余可用百分比
mysql的information_schema下的COLUMNS表详解
`information_schema.COLUMNS` 表是 MySQL 中的一个元数据表,用于存储数据库中所有表的列信息。这个表对于查询和管理数据库结构非常有用,可以帮助您了解每个表中的列定义、数据类型、约束等细节。
jack.yang
2025/04/05
860
MySQL 8.0的SYS视图
MySQL 8.0的发展越来越趋同与Oracle,为了更好的监控MySQL的一些相关指标,出现了SYS视图,用于监控。
星哥玩云
2022/08/18
6160
强大到没朋友的mysql-shell及插件
mysql-shell 是官方出品的运维相关小工具, 目前已经具备很多功能。如果再配合大佬写的插件,简直强大到没朋友。
保持热爱奔赴山海
2020/08/09
1.5K1
故障分析 | MySQL 扩展 VARCHAR 长度遭遇问题的总结
经过排查分析得出,这是由于改表系统解析改表需求得出错误的改表方案导致,即这类改表可以满足快速改表操作(直接使用 ALTER TABLE),理论上任务下发后能马上改完,但是工单结果是执行触发 10 秒超时,最终工单失败。
爱可生开源社区
2024/01/31
3660
故障分析 | MySQL 扩展 VARCHAR 长度遭遇问题的总结
MySQL数值类型在binlog中需要注意的细节(r12笔记第69天)
MySQL里的数值类型分得很细,光整型数据就有多种数据类型。tinyint,smallint,mediumint,int(integer),还有范围最大的bigint,它们对应的数值范围也大大不同,大体来说就是下面的数值范围,从有符号数和无符号数来区别对待。 类型名称有符号数(signed)无符号数(Unsigned)tinyint-129~1270~255smallint-32768~327670~65535mediumint-8388608~83886070~16777215int(intege
jeanron100
2018/03/21
1.3K0
写给新手的Mysql入门指南(一)
关键字最好大写,这样便于阅读。可以用windows的cmd运行工具对数据库操作,前提是mysql的安装目录的子目录bin的路径添加导论系统变量PATH中,mysql -v可以查看数据库版本。登录:mysql -u用户名 -p密码,例如 mysql -uroot -p123456 。
Wizey
2018/08/30
5510
Mysql中索引和约束相关
自增 导出创建自增字段的语句 SELECT CONCAT( 'ALTER TABLE `', TABLE_NAME, '` ', 'MODIFY COLUMN `', COLUMN_NAME, '` ', IF(UPPER(DATA_TYPE) = 'INT', REPLACE( SUBSTRING_INDEX( UPPER(COLUMN_TYPE), ')', 1 ), 'INT', 'INTEGER' ), UPPER(COLUMN_TYPE) ), ') UNSIGNED NOT NULL AUTO_
码客说
2020/12/28
7670
MySQL 8.0新特性 — 事务性数据字典与原子DDL
事务性数据字典与原子DDL,是MySQL 8.0推出的两个非常重要的新特性,之所以将这两个新特性放在一起,是因为两者密切相关,事务性数据字典是前提,原子DDL是一个重要应用场景。
brightdeng@DBA
2020/08/17
1.8K0
MySQL 8.0新特性 — 事务性数据字典与原子DDL
Bypass information_schema
​ 数据库中的information_schema是用来作什么的:Information_schema 是我们安装了Mysql之后就会含有的一个数据库,这个库在mysql中就是个信息数据库,它保存着mysql服务器所维护的所有其他数据库的信息,包括了数据库名,表名,字段名等。
ly0n
2020/11/23
2K0
Bypass information_schema
MySQL常用命令总结
https://cloud.tencent.com/developer/article/1925495
DBA札记
2024/02/23
1340
MySQL常用命令总结
项目文档维护(二) 快速生成数据库设计(表格)
进度条满了之后并且提示 FInish Successfully 说明导出成功, 然后打开该Excel表格
时间静止不是简史
2024/05/26
4130
项目文档维护(二) 快速生成数据库设计(表格)
MySQL 5.6到MySQL 8的主从复制(通过5.7版本做桥接实现)
        MySQL 8与MySQL 5.6跨了两个大版本,直接从5.6(主)复制到8(从)是不行的,因此需要用一个MySQL 5.7版本作为桥接。5.6、5.7实例都要开启log_bin和log_slave_updates。5.6、5.7、8的安装步骤从略。
用户1148526
2024/05/26
2780
MySQL 5.6到MySQL 8的主从复制(通过5.7版本做桥接实现)
MySQL 8.0 information_schema.tables表和之前版本的差异
在做自动化运维开发过程中,需要从information_schema.tables获取MySQL表相关的元信息,发现MySQL8.0和5.7存在的差异还是比较大的;在MySQL8.0以前,通常会通过infomation_schema的表来获取一些元数据,例如从tables表中获取表的下一个auto_increment值,从indexes表获取索引的相关信息等。
SEian.G
2021/12/13
1.8K0
搞定PHP面试 - MySQL基础知识点整理 - 数据类型和数据表管理
若设置了 zerofill 属性,当 int(3) 存储 12 时,会在前面补0,补足3位。即 012 ;当 int(5) 存储 12 时,会在前面补三个0,补足5位。即 00012
猿哥
2019/07/10
1.5K0
搞定PHP面试 - MySQL基础知识点整理 - 数据类型和数据表管理
MySQL上线,检查数据库设计的“十条合规”
MySQL作为关系型数据库的典型代表,在国内环境里经历风雨磨砺,不断地精进,已经在开发和运维方面,成型了一套的规范。这些规范让了解和使用MySQL更加得心应手,并对后期的一些问题起到了很好的预防作用。
数据和云
2021/05/07
1.6K0
MySQL information_schema详解 COLUMNS
如果一个栏位在多个索引中,COLUMN_KEY只会显示其中优先级最高的一个,顺序为PRI, UNI, MUL
bsbforever
2020/08/18
4K0
MySQL整型数据类型详解
  1. 对整数类型, MySQL 还支持类型名称后面的小括号内指定的显示宽度,例如int(5) 表示宽度小于5位时填满宽度,如果不显示指定宽度默认是int(11),一般配合zerofill使用下面来描述下
星哥玩云
2022/08/17
8730
MySQL整型数据类型详解
相关推荐
MySQL 数据类型深度全栈实战,天花板玩法层出不穷!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验