浅谈MySQL5.7 sys schema

  在安装mysql 5.7.9后,进入data目录下我们会明显发现与5.6的不同,没有了test schema,并且,新增了一个sys schema

[root@liukaiy data]# pwd

/usr/local/mysql/data

[root@liukaiy data]# ls

auto.cnf        ib_logfile0  mysql               performance_schema

ib_buffer_pool  ib_logfile1  mysqld_safe.pid     sys

ibdata1         ibtmp1       mysql_upgrade_info

test schema我们就没必要研究了,没意义。现在来谈一下sys schema

  mysql5.7.7开始提供 SYS Schema,从SYS database中,可以获取mem page、io 、latch/mutex/lock等各种性能数据,方便做peformance turning 和 troubleshooting。比如可以方便获取2个sql发生 lock block,用户占用的资源等信息。

  感受就是,越来越像oracle了。

=============

登录mysql,查看数据库中的schema

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| performance_schema |

| sys                |

+--------------------+

4 rows in set (0.00 sec)

mysql> use sys;

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

Database changed

    使用show tables可以看到sys schema中的object。sys schema中包含很多描述数据库性能的视图,大部分视图是成对的,其中一个成员没有x$前缀,而另一个是有x$前缀的,两者的内容完全相同,区别是没有x$前缀的视图提供更人性化输出。

查看会话的状态

processlist和session视图

    sys schema的processlist和session视图提供了比show processlist和INFORMATION_SCHEMA PROCESSLIST 更全面的信息;

    session视图去掉了后台线程的信息,只保留了用户会话

mysql> select * from session limit 1\G

*************************** 1. row ***************************

                thd_id: 41

               conn_id: 15

                  user: root@localhost

                    db: sys

               command: Sleep

                 state: NULL

                  time: 5833

     current_statement: NULL

     statement_latency: NULL

              progress: NULL

          lock_latency: 671.00 us

         rows_examined: 0

             rows_sent: 0

         rows_affected: 0

            tmp_tables: 1

       tmp_disk_tables: 1

             full_scan: YES

        last_statement: select * from sys.schema_table_lock_waits

last_statement_latency: 1.21 ms

        current_memory: 0 bytes

             last_wait: NULL

     last_wait_latency: NULL

                source: NULL

           trx_latency: NULL

             trx_state: NULL

        trx_autocommit: NULL

                   pid: 22981

          program_name: mysql

1 row in set (0.11 sec)

查看哪些用户占用了大量的资源

mysql> show tables like 'user%';

+-----------------------------------+

| Tables_in_sys (user%)             |

+-----------------------------------+

| user_summary                      |

| user_summary_by_file_io           |

| user_summary_by_file_io_type      |

| user_summary_by_stages            |

| user_summary_by_statement_latency |

| user_summary_by_statement_type    |

+-----------------------------------+

6 rows in set (0.00 sec)

mysql> select * from user_summary\G

*************************** 1. row ***************************

                  user: root

            statements: 3331        //用户执行的SQL语句总数量

     statement_latency: 2.86 s        //该用户执行SQL总的等待时间,即累计的SQL执行时间

 statement_avg_latency: 857.30 us    //单次SQL的平均执行时间

           table_scans: 67    //全表扫描次数

              file_ios: 23626    //io次数

       file_io_latency: 1.72 s    //io消耗的总时间

   current_connections: 1    //该用户的当前连接会话数

     total_connections: 9    //该用户连接会话总数

          unique_hosts: 1    //用户发起的连接中唯一主机的数量,即从几个主机发起过数据库连接

        current_memory: 0 bytes    //当前被分配的内存

total_memory_allocated: 0 bytes    //总共被分配的内存

*************************** 2. row ***************************

                  user: background

            statements: 0

     statement_latency: 0 ps

 statement_avg_latency: 0 ps

           table_scans: 0

              file_ios: 2127

       file_io_latency: 161.74 ms

   current_connections: 26

     total_connections: 30

          unique_hosts: 0

        current_memory: 0 bytes

total_memory_allocated: 0 bytes

2 rows in set (0.02 sec)

    通过上述查询,可以简单看到每个用户占用的连接、内存、io等资源

如果想要进一步查询某项指标的话,可以查看对应的视图,如

mysql> select * from user_summary_by_statement_latency\G

*************************** 1. row ***************************

         user: root

        total: 3411

total_latency: 2.87 s

  max_latency: 648.56 ms

 lock_latency: 515.50 ms

    rows_sent: 1477

rows_examined: 23042

rows_affected: 408

   full_scans: 68

*************************** 2. row ***************************

         user: background

        total: 0

total_latency: 0 ps

  max_latency: 0 ps

 lock_latency: 0 ps

    rows_sent: 0

rows_examined: 0

rows_affected: 0

   full_scans: 0

2 rows in set (0.01 sec)

    这个视图概述了每个用户执行SQL的大体统计信息,本人简单分析如下:

user    用户名

total    该用户总共执行的SQl语句的数量

total_latency    执行SQL总共的等待时间

max_latency    单次执行的最长等待时间

lock_latency    锁等待累计时间

rows_sent    该用户执行SQL累积返回的行数

rows_examined    未执行用户SQL存储引擎读取的总行数

rows_affected    被用户SQL语句影响的总行数

full_scans    该用户执行的SQL中造成全表扫描的总次数

如果想了解各个用户占用的IO带宽,可查询如下视图

mysql> select * from user_summary_by_file_io\G

*************************** 1. row ***************************

      user: root

       ios: 23655

io_latency: 1.72 s

*************************** 2. row ***************************

      user: background

       ios: 2144

io_latency: 162.43 ms

2 rows in set (0.01 sec)

  这个视图相对比较简单,列举的是每个用户下的io事件次数,以及io等待的累计时间

除此之外,我们还可以根据waits_by_user_by_latency视图查看每个用户的等待事件

mysql> desc waits_by_user_by_latency;

+---------------+---------------------+------+-----+---------+-------+

| Field         | Type                | Null | Key | Default | Extra |

+---------------+---------------------+------+-----+---------+-------+

| user          | varchar(32)         | YES  |     | NULL    |       |

| event         | varchar(128)        | NO   |     | NULL    |       |

| total         | bigint(20) unsigned | NO   |     | NULL    |       |

| total_latency | text                | YES  |     | NULL    |       |

| avg_latency   | text                | YES  |     | NULL    |       |

| max_latency   | text                | YES  |     | NULL    |       |

+---------------+---------------------+------+-----+---------+-------+

6 rows in set (0.00 sec)

通过sys schema查询innodb的锁信息

    

innodb_lock_waits

    mysql 5.7.7开始,sys schema中提供了innodb_lock_waits视图,通过这个视图,我们可以更直观清晰地查看当前事务间的阻塞关系。在此列举几个受关注的列,如下:

waiting_trx_id    等待事务的ID

waiting_trx_age    等待的时间

waiting_query    等待锁资源的SQL

waiting_lock_mode    请求锁的模式 

blocking_trx_id    阻塞事务的ID

blocking_trx_age    阻塞事务被执行的时间

blocking_query    阻塞事务正在执行的SQL

blocking_lock_mode    阻塞的锁模式

locked_table    被加锁的表

locked_index    被加锁的索引

接下来简单模拟两个事务间的阻塞

1)甲会话中执行

mysql> set autocommit=off;

Query OK, 0 rows affected (0.00 sec)

mysql> select * from t1;

+----+------+

| id | name |

+----+------+

|  1 | liu  |

|  2 | kai  |

+----+------+

2 rows in set (0.00 sec)

mysql> select * from t1 where id=2 for update;

+----+------+

| id | name |

+----+------+

|  2 | kai  |

+----+------+

1 row in set (0.00 sec)

2)乙会话执行如下SQL

mysql> set autocommit=off;

Query OK, 0 rows affected (0.00 sec)

mysql> delete from liu.t1 where id=2;

3)丙会话中查询事务间阻塞

mysql> select waiting_trx_id,waiting_trx_age,waiting_query,waiting_lock_mode,blocking_trx_id,blocking_trx_age,blocking_query,blocking_lock_mode,locked_table,locked_index from sys.innodb_lock_waits\G

*************************** 1. row ***************************

    waiting_trx_id: 1439

   waiting_trx_age: 00:07:53

     waiting_query: delete from liu.t1 where id=2

 waiting_lock_mode: X

   blocking_trx_id: 1438

  blocking_trx_age: 00:08:11

    blocking_query: NULL

blocking_lock_mode: X

      locked_table: `liu`.`t1`

      locked_index: PRIMARY

1 row in set (0.00 sec)

  我们发现,之前需要在information_schema中连接多个视图的查询,现在只需要查询这一个视图就能清晰地获取我们需要的信息了(以前只能通过information_schema中的,InnoDB_trx、INNODB_LOCKS、INNODB_LOCK_WAITS查询)

schema_table_lock_waits 

  5.7.9中新增的视图,通过这个视图可以查询阻塞会话的metadata lock信息

mysql> desc schema_table_lock_waits;

+------------------------------+---------------------+------+-----+---------+-------+

| Field                        | Type                | Null | Key | Default | Extra |

+------------------------------+---------------------+------+-----+---------+-------+

| object_schema                | varchar(64)         | YES  |     | NULL    |       |

| object_name                  | varchar(64)         | YES  |     | NULL    |       |

| waiting_thread_id            | bigint(20) unsigned | NO   |     | NULL    |       |

| waiting_pid                  | bigint(20) unsigned | YES  |     | NULL    |       |

| waiting_account              | text                | YES  |     | NULL    |       |

| waiting_lock_type            | varchar(32)         | NO   |     | NULL    |       |

| waiting_lock_duration        | varchar(32)         | NO   |     | NULL    |       |

| waiting_query                | longtext            | YES  |     | NULL    |       |

| waiting_query_secs           | bigint(20)          | YES  |     | NULL    |       |

| waiting_query_rows_affected  | bigint(20) unsigned | YES  |     | NULL    |       |

| waiting_query_rows_examined  | bigint(20) unsigned | YES  |     | NULL    |       |

| blocking_thread_id           | bigint(20) unsigned | NO   |     | NULL    |       |

| blocking_pid                 | bigint(20) unsigned | YES  |     | NULL    |       |

| blocking_account             | text                | YES  |     | NULL    |       |

| blocking_lock_type           | varchar(32)         | NO   |     | NULL    |       |

| blocking_lock_duration       | varchar(32)         | NO   |     | NULL    |       |

| sql_kill_blocking_query      | varchar(31)         | YES  |     | NULL    |       |

| sql_kill_blocking_connection | varchar(25)         | YES  |     | NULL    |       |

+------------------------------+---------------------+------+-----+---------+-------+

18 rows in set (0.00 sec)

每行记录描述的意义一览便知,本文不一一赘述

        MySQL5.7 新特性诸多,单单是sys schema这一个特性又岂是三言两语能说明白的,本文只是略微列举一二,希望能引起各位看客朋友们探索的欲望。

时间: 2024-12-17 00:18:35

浅谈MySQL5.7 sys schema的相关文章

浅谈关于JavaScript API设计的一些建议和准则

  这篇文章主要介绍了浅谈关于JavaScript API设计的一些建议和准则,文中列举了许多知名的JS API进行辅助说明,极力推荐!需要的朋友可以参考下 设计是一个很普遍的概念,一般是可以理解为为即将做的某件事先形成一个计划或框架. (牛津英语词典)中,设计是一种将艺术,体系,硬件或者更多的东西编织到一块的主线.软件设计,特别是作为软件设计的次类的API设计,也是一样的.但是API设计常常很少关注软件发展,因为为其他程序员写代码的重要性要次于应用UI设计和最终用户体验. 但是API设计,作为

浅谈PHP开发团队的管理之道

说明:本文节选自<浅谈PHP开发团队管理及程序员做人问题>.全文请点击这里访问. 看了标题,也许很多程序员会反感的说:"程序员的做人问题先不用谈,你想出来这个标题,那你做人是不是有问题吧!" 笔者本人并不反驳这样的说法,每个人都有自己的做人原则.法国人的那句俗话说的好:"我不苟同你的思想,但是我绝对捍卫你思想的自由". 是,这是站在个人的立场上可以那么说.但是如果站在一个团队的立场上呢?一切不尽然了! 无论马拉车的原理也好,还是木桶原理也好,西方人整出来

浅谈Oracle数据库外部身份认证研究

以下的文章主要是浅谈Oracle数据库的外部身份认证实际研究,我在一个信誉度很好的网站,找到了一个关于浅谈Oracle数据库外部身份认证的一些实用性很强的相关资料,拿出来供大家分享. 一.服务器上使用操作系统验证 1.配置SQLNET.ORA文件 参数NAMES.DIRECTORY_PATH= (TNSNAMES, ONAMES, HOSTNAME)表明解析客户端连接时所用的主机字符串的方式.TNSNAMES表示采用TNSNAMES.ORA文件来解析:ONAMES表示Oracle使用自己的名称服

[原创]浅谈如何使用gcc开发NT核心驱动程序

 [原创]浅谈如何使用gcc开发NT核心驱动程序       一谈到在 Win NT 下开发核心驱动程序,可能不少人首先都会想到微软"正统" 的VC来.诚然,用VC 配合 WINDDK 的确工作的不错,但或许我们可以让其变 得更简单更完善一些.     其实偶一般是用 Masm32v9 + EditPlus2 编写 NT内核驱动,仅此而已. 从环境搭建的便捷性和编写代码的灵活性来说无疑这是非常高的.但汇编 终归是汇编,虽然强大,但很多事都要自己动手来做,往往很简单的功能都 要用比较&q

浅谈Python Web的五大框架

说到Web Framework,Ruby的世界Rails一统江湖,而Python则是一个百花齐放的世界,各种micro-framework.framework不可胜数,不完全列表见: http://wiki.python.org/moin/WebFrameworks. 虽然另一大脚本语言PHP也有不少框架,但远没有Python这么夸张,也正是因为Python Web Framework(Python Web开发框架,以下简称Python框架)太多,所以在Python社区总有关于Python框架孰

浅谈Python 对象内存占用_python

一切皆是对象 在 Python 一切皆是对象,包括所有类型的常量与变量,整型,布尔型,甚至函数. 参见stackoverflow上的一个问题 Is everything an object in python like ruby 代码中即可以验证: # everythin in python is object def fuction(): return print isinstance(True, object) print isinstance(0, object) print isinst

在Oracle专家眼中,MySQL sys Schema是怎样一种存在?

作者介绍 杨建荣,DBAplus社群联合发起人.现就职于搜狐畅游,Oracle ACE-A.YEP成员,超7年数据库开发和运维经验,擅长电信数据业务.数据库迁移和性能调优.持Oracle 10G OCP,OCM,MySQL OCP认证,<Oracle DBA工作笔记>作者.   sys Schema的初衷   MySQL的数据字典经历了几个阶段的演进,MySQL4.1 提供了information_schema 数据字典,一些基础元数据可以通过SQL来查询得到. MySQL5.5 提供了per

浅谈关于JavaScript API设计的一些建议和准则_基础知识

 设计是一个很普遍的概念,一般是可以理解为为即将做的某件事先形成一个计划或框架. (牛津英语词典)中,设计是一种将艺术,体系,硬件或者更多的东西编织到一块的主线.软件设计,特别是作为软件设计的次类的API设计,也是一样的.但是API设计常常很少关注软件发展,因为为其他程序员写代码的重要性要次于应用UI设计和最终用户体验. 但是API设计,作为我们自己写的库中提供的公共接口,能够向调用我们代码的开发者表现出我们库的一些特点和功能,所以API设计和UI设计一样重要.事实上,两者都是为应用可以提供更好

浅谈spring容器中bean的初始化_java

当我们在spring容器中添加一个bean时,如果没有指明它的scope属性,则默认是singleton,也就是单例的. 例如先声明一个bean: public class People { private String name; private String sex; public String getName() { return name; } public void setName(String name) { this.name = name; } public String get