用Oracle的眼光来学习MySQL 5.7的sys(下)(r11笔记第25天)

昨天写了篇分析sys的文章,用Oracle的眼光来学习MySQL 5.7的sys(上)(r11笔记第24天)收到了一些朋友的反馈,还不错,今天继续努力,再整理一篇。

sys还是很有借鉴意义

    今天还和同事偶然聊起sys schema的事情,我觉得有几个地方要值得借鉴。

1)原本需要结合information_schema,performance_schema查询的方式,现在有了视图的方式,显示更加直观

2)sys schema的有些功能在早期版本可能无从查起,或者很难查询,现在这些因为新版本的功能提炼都做出来了

3)如果想好好掌握这些视图的内涵,可以随时查看表的关联关系,对于理解MySQL的运行原理和问题的分析大有帮助,当然这个地方只能点到为止。

  
按照这种情况,没准以后会直接用sys替代information_schema,performance_schema,没准以后还会出更丰富的功能,类似Oracle中的免费的statspack,还有闭源的AWR,实时的性能数据抓取,自动性能分析和诊断,自动优化任务等,当然纯属猜想,Oracle里也都是这么走过来的。

    对于这些视图,我按照名字和类别简单归类

sys下的视图分类

   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这三个方面,提升空间还很大。

 

其实里面innodb,schema,statement这三部分是格外需要关注的。

sys下的innodb视图

比如innodb部分的视图innodb_lock_waits

我们做个小测试来说明一下。我们开启两个会话。

会话1: start transaction;  update test set id=100;

会话2: update test set id=102;

这个时候如果在没有sys的情况下,我们需要查看information_schema.innodb_locks和innodb_trx,有的时候还会查看show engine innodb status来得到一些信息佐证。

查看Innodb_locks

> select *from information_schema.innodb_locks\G
*************************** 1. row ***************************
    lock_id: 961672:356:3:2
lock_trx_id: 961672
  lock_mode: X
  lock_type: RECORD
 lock_table: `test`.`test`
 lock_index: GEN_CLUST_INDEX
 lock_space: 356
  lock_page: 3
   lock_rec: 2
  lock_data: 0x00000011D9EB
*************************** 2. row ***************************
    lock_id: 961671:356:3:2
lock_trx_id: 961671
  lock_mode: X
  lock_type: RECORD
 lock_table: `test`.`test`
 lock_index: GEN_CLUST_INDEX
 lock_space: 356
  lock_page: 3
   lock_rec: 2
  lock_data: 0x00000011D9EB
2 rows in set (0.00 sec)

查看innodb_trx
> select *from information_schema.innodb_trx\G
*************************** 1. row ***************************
                    trx_id: 961671
                 trx_state: RUNNING
               trx_started: 2016-12-26 22:25:52
     trx_requested_lock_id: NULL
          trx_wait_started: NULL
                trx_weight: 3
       trx_mysql_thread_id: 1149233
                 trx_query: NULL
       trx_operation_state: NULL
         trx_tables_in_use: 0
         trx_tables_locked: 1
          trx_lock_structs: 2
     trx_lock_memory_bytes: 1136
           trx_rows_locked: 1
         trx_rows_modified: 1
   trx_concurrency_tickets: 0
       trx_isolation_level: READ COMMITTED
         trx_unique_checks: 1
    trx_foreign_key_checks: 1
trx_last_foreign_key_error: NULL
 trx_adaptive_hash_latched: 0
 trx_adaptive_hash_timeout: 0
          trx_is_read_only: 0
trx_autocommit_non_locking: 0
1 row in set (0.00 sec)面对这些情况,该怎么处理,比如要杀掉会话,可能还会有些模棱两可。

我们来看看使用innodb_lock_waits的结果。这个过程语句都给你提供好了,只有1行信息,就是告诉你产生了阻塞,现在可以使用kill的方式终止会话,kill语句都给你提供好了。

> select * from innodb_lock_waits\G
*************************** 1. row ***************************
                wait_started: 2016-12-26 22:28:24
                    wait_age: 00:01:38
               wait_age_secs: 98
                locked_table: `test`.`test`
                locked_index: GEN_CLUST_INDEX
                 locked_type: RECORD
              waiting_trx_id: 961672
         waiting_trx_started: 2016-12-26 22:28:24
             waiting_trx_age: 00:01:38
     waiting_trx_rows_locked: 2
   waiting_trx_rows_modified: 0
                 waiting_pid: 1149284
               waiting_query: update test set id=102
             waiting_lock_id: 961672:356:3:2
           waiting_lock_mode: X
             blocking_trx_id: 961671
                blocking_pid: 1149233
              blocking_query: NULL
            blocking_lock_id: 961671:356:3:2
          blocking_lock_mode: X
        blocking_trx_started: 2016-12-26 22:25:52
            blocking_trx_age: 00:04:10
    blocking_trx_rows_locked: 1
  blocking_trx_rows_modified: 1
     sql_kill_blocking_query: KILL QUERY 1149233
sql_kill_blocking_connection: KILL 1149233
1 row in set (0.01 sec)  

当然默认事务还是有一个超时的设置,可以看到确实是update test set id=102阻塞了。已经因为超时取消。

> update test set id=102;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

不过innodb相关的视图确实不多,只有3个,都蛮实用的。

sys下的schema视图

我们继续看看schema层面的视图,这部分内容就很实用了。

schema_auto_increment_columns      
schema_index_statistics
schema_object_overview
schema_redundant_indexes
schema_table_lock_waits
schema_table_statistics
schema_table_statistics_with_buffer
schema_tables_with_full_table_scans
schema_unused_indexes

如果要查看一个列值溢出的情况,比如是否列的自增值会超出数据类型的限制,这个问题对很多MySQL DBA一直以来都是一个挑战,视图schema_auto_increment_columns就给你包装好了,直接用即可。以下输出略微做了调整。

table_name        | column_name |column_type |  max_value  | auto_increment
------------------+-------------+------------+---------------+-------------
ta_newyear2_back  | id          |int(11)     |  2147483647 |9945076       |
tb_activate_code  | id          |int(11)     |  2147483647 |1851387       |
sys_oper_log      | id          |int(11)     |  2147483647 |126867        |

如果一个表的索引没有使用到,以前pt工具也可以做一些分析,现在查个视图就搞定了。当然索引的部分,一方面和采样率也有关系,不是一个绝对的结果。查看schema_unused_indexes的结果如下:

+-----------------+--------------------------------+-----------------------
| object_schema   | object_name                    | index_name            
+-----------------+--------------------------------+-----------------------
| activity_log    | bfgifts_logininfo              | index_cn              
| activity_log    | bf_sendq_reglog                | in_bf_sendq_reglog    
| activity_log    | db_singlecharge_records        | idx_db_singlecharge_re
| activity_log    | FFO_RECHARGE_CONS              |

如果要查看那些表走了全表扫描,性能情况,可以查看schema_tables_with_full_table_scans,查询结果如下,如果数据量本身很大,这个结果就会被放大,值得关注。

+-----------------+--------------------+-------------------+-----------+
| object_schema   | object_name        | rows_full_scanned | latency   |
+-----------------+--------------------+-------------------+-----------+
| mobile_billing  | tb_activate_code   |      133704990876 | 20.74 h   |
| mobile_billing  | tb_appkey_config   |          56067246 | 5.32 m    |
| mobile_billing  | tb_goods           |          11323673 | 1.20 m    |
| mobile_billing  | tb_app             |          11104405 | 28.86 s   |

如果查看一些冗余的索引,可以参考 schema_redundant_indexes,删除的SQL语句都给你提供好了。

*************************** 9. row ***************************
              table_schema: zzb_test
                table_name: tes_activate_list
      redundant_index_name: INDEX_SMS_ID
   redundant_index_columns: SMS_ID
redundant_index_non_unique: 0
       dominant_index_name: PRIMARY
    dominant_index_columns: SMS_ID
 dominant_index_non_unique: 0
            subpart_exists: 0
            sql_drop_index: ALTER TABLE `zzb_test`.`sms_activate_list` DROP INDEX `INDEX_SMS_ID`

sys下的statement视图

接下来是statement层面的视图,大体有下面的一些

statement_analysis                           
statements_with_errors_or_warnings           
statements_with_full_table_scans             
statements_with_runtimes_in_95th_percentile  
statements_with_sorting                      
statements_with_temp_tables

这部分内容对于分析语句的性能还是尤其有用的。

比如查看语句的排序情况,资源使用情况,延时等都会提供出来。

> select *from statements_with_sorting;                    
+-------------------------------------------------------------------+----------------+------------+---------------
| query                                                             | db             | exec_count | total_latency
+-------------------------------------------------------------------+----------------+------------+---------------
| SELECT * FROM `tb_goods` WHERE ... TION` ASC , `GOODS_PRICE` ASC  | mobile_billing |      26334 | 29.84 s       
| SELECT `id` , `appname` , `app ... ? ORDER BY `create_date` DESC  | mobile_billing |      13664 | 9.04 s        
| SELECT `channel0_` . `id` AS ` ... annel0_` . `create_date` DESC  | mobile_billing |       6832 | 4.83 s   

 在这里SQL语句做了删减,不过大体能看出语句的信息,执行次数和 延时等都可以看到。

对于SQL语句中生成的临时表可以查看statements_with_temp_tables ,比如某一个语句生成的临时表情况,都做了统计。

db      | exec_count | total_latency | memory_tmp_tables | disk_tmp_tables
--------+------------+---------------+-------------------+-----------------
test    |         27 | 2.36 s        |              3442 |             263
backend |         18 | 1.06 s        |              1314 |            

时间: 2024-09-20 07:08:07

用Oracle的眼光来学习MySQL 5.7的sys(下)(r11笔记第25天)的相关文章

近期的学习计划(2017.3)(r11笔记第95天)

    发现我已经开始不按照时间管理软件的进度来跟踪工作了,工作学习都是如此,这样就会和计划脱钩,简单来说,很可能会有瞎忙活的情况,还是得来总结下近期的学习计划.计划就得落地,就得实打实的来做,我有信心完成.    接下来的时间,我会给自己留的尽量短一些,这样能够短期看到成效. MySQL方向 没错,短期内我的重心会放在MySQL上,里面有许多需要借鉴学习和深入学习的地方.   MySQL和Oracle的优化     可以参考 <高性能MySQL>,感觉里面提出的一些点还有待完善,我会逐步总结

MySQL中的半同步复制(r11笔记第65天)

关于MySQL的复制架构,大体有下面三种方式,异步,全同步复制,半同步复制. 三种复制方式     第一种是异步复制,是比较经典的主从复制,搭建主从默认的架构方式,就是属于异步的,相对来说性能要好一些.但是还是会有丢失数据的情况.     第二种是全复制,比如说MySQL Cluster这样的方式,是属于全复制的,实际上MySQL Cluster其实发展并不大顺利,更多时候是一个实验室产品,但是时间定格在2016年12月12日,MySQL  5.7.17 GA的重大特性group replica

浅谈MySQL中的事务隔离级别(r11笔记第86天)

   之前写了一篇浅谈事务(一),算是对事务的一个基本认识,今天来简单总结一下事务的隔离级别,虽然是老掉牙的知识点,重温一下还是值得的.    在MySQL中基本有这两种事务隔离级别的设置,默认的RR(Repeatable-Read)和实际中常见的RC(Read-Committed).两者区别是什么,怎么正确理解,用几个SQL语句就能说明白,就用简单的实验来说明白.    我们开始吧.        首先创建一个测试表test,插入一些数据. create table test( id int

学习mysql数据库主从同步复制原理

MySQL的Replication(英文为复制)是一个多MySQL数据库做主从同步的方案,特点是异步复制,广泛用在各种对MySQL有更高性能.更高可靠性要求的场合.与之对应的是另一个同步技术是MySQL Cluster,但因为MySQL Cluster配置比较复杂,所以使用者较少. MySQL的Replication是一个异步复制的过程(mysql5.1.7以上版本分为异步复制和半同步两种模式),它是从一个Mysql instance(instance英文为实例)(我们称之为Master)复制到

作为一个新手的Oracle(DBA)学习笔记

Oracle数据库笔记 Jack Chaing 作者QQ595696297 交流群 127591054 祝大家学习进步. 如果大家想看Word版本的可以去下载:Word排版比较清晰一些. http://download.csdn.net/detail/jack__chiang/9810532 此笔记是作者本人去年开始从一个DBA新人的学习笔记,积累至今,希望拿出来给那些对DBA有兴趣的童孩学习,大家一起努力嘛. 此笔记记录了作者工作学习中从零基础的学习的记录,和从中遇见的问题与问题的解决!很高兴

学习MySQL常用操作命令

学习MySQL常用操作命令 1.启动MySQL服务器 实际上上篇已讲到如何启动MySQL.两种方法: 一是用winmysqladmin,如果机器启动时已自动运行,则可直接进入下一步操作. 二是在DOS方式下运行 d:mysqlbinmysqld 2.进入mysql交互操作界面 在DOS方式下,运行: d:mysqlbinmysql 出现: mysql 的提示符,此时已进入mysql的交互操作方式. 如果出现 "ERROR 2003: Can′t connect to MySQL server o

关于oracle数据库的项目转换为mysql?

问题描述 关于oracle数据库的项目转换为mysql? 怎么把用oracle数据库开发的项目转换成mysql,求详细指点,有没有最简单的方法? 解决方案 参考:http://wenku.baidu.com/link?url=8nhsvM2RwI5R-xK0okxKS1zVDZYaHQFr1cnr5SmIR1Nn9gEwPFqLCcUvnTjwrde_NFqL7IgC9I6--yF26D8FiBbuN-pZEkDM1HV2PZFaOBmhttp://blog.csdn.net/xiaoliouc

oracle中的clob在mysql中的移植

问题描述 oracle中的clob在mysql中的移植 oracle中的clob一般会在mysql移植成什么数据类型,empty_clob()又会用什么代替呢?跪求 解决方案 数据库移植: 从Oracle移植到MySQL 注意databasePlatformOracle移植到mysql注意事项oracle移植到mysql注意事项 解决方案二: 数据库移植: 从Oracle移植到MySQL 注意databasePlatform Oracle移植到mysql注意事项 oracle移植到mysql注意

oracle start with 改成mysql

问题描述 oracle start with 改成mysql SELECT t.* FROM (SELECT DISTINCT (sm.menu_id), sm.up_menu_id, sm.menu_name, sm.menu_method, sm.leaf, sm.VALID_FLAG FROM sys_menu sm, sys_role_menu srm, sys_role sr, sys_user_role sur WHERE sm.menu_id = srm.menu_id AND s