暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

列举Mysql数据库状态指标及数值判断依据

浙金科技无限 2021-08-11
853

Mysql数据库是一款使用广泛的开源数据库,作为一款开源的免费产品,其并不像oracle那样功能强大,且不自带可视化监控与报警组件,更关键的是其“动态性能视图”远不如oracle丰富,对初学者来说,mysql在其运行过程中相比oracle更加黑盒,更加不可观测。因此我们来研究mysql提供的一些可供参考的数据库状态维度。


01 读写指标
select/insert/update/delete执行统计:
    SHOW GLOBAL STATUS WHERE variable_name in ('com_select','com_insert', 'com_update', 'com_ delete');

    --QPS (每秒查询处理量)MyISAM 引擎
      SHOW GLOBAL STATUS WHERE variable_name in (' Questions ',' Uptime ');
      --数据库查询处理数Questions
      --库运行时间Uptime
        QPS=Questions/Uptime

        --TPS
          SHOW GLOBAL STATUS WHERE variable_name in (' Com_commit ',' Com_rollback ');Com_commit';Com_rollback = SHOW GLOBAL STATUS LIKE 'Com_rollback';Uptime = SHOW GLOBAL STATUS LIKE 'Uptime';TPS=(Com_commit + Com_rollback)/Uptime

          --读写比,参考优化类型
            R/W=(Com_select + Qcache_hits) (Com_insert + Com_update + Com_delete + Com_replace)

            此代表数据库执行的SELECT和DML操作统计,是从数据库启动以来的总数。用户可以输入不带global参数版本的针对当前会话做统计但对本文讨论的数据库整体监控意义不大。监控意义有以下几点:
            1)我们可以在数据库发生性能问题时每隔数秒采样来判断目前数据库基本负载情况。
            2)可以在数据库运行一段时间后的统计来判断其上运行程序的SELECT与DML操作的负载比例,这对读写分离的设计和数据库集群的设计有至关重要的参考价值。
            3)可以记录每天的采样次数来生成基准值,从而在发生异常时能够得以体现。对报警和故障诊断具有重要意义。

            02 数据库连接相关
              show status WHERE variable_name in ('connections','threads_cached','threads_connected','max_used_connections', 'threads_created','threads_running');

              ●查看试图连接到MySQL(不管是否连接成功)的连接数:connections
              ●查看线程缓存内的线程的数量:threads_cached
              ●查看当前打开的连接的数量:threads_connected
              ●查看曾经打开过最大连接数:max_used_connections
              ●查看创建用来处理连接的线程数:threads_created
              ●查看激活的(非睡眠状态)线程数:threads_running

              数据库连接是一项重要的监控指标,数据库连接耗尽可以导致程序连接数据库失败,数据库连接频繁的建立和释放也将耗费大量的资源,直接降低数据库性能。短会话如不能复用数据库连接将使得性能无意义地耗费在建立释放连接的等待当中,造成应用性能瓶颈。

              ▷ threads_created/connections (理想值 < 10%)否则增大thread_cache_size。
              ▷ max_used_connections理想值max_connections参数的85%。

              03 锁相关
                show status WHERE variable_name in ('table_locks_immediate','table_locks_waited');

                ● 立刻获得锁的统计:
                table_locks_immediate
                ● 等待锁的统计:
                table_locks_waited
                ● 行锁等待:
                innodb
                  SHOW GLOBAL STATUS LIKE 'Innodb_row_lock_%';

                  table_locks_waited/ table_locks_immediate
                  此比例代表未能立刻获得锁的比例,小于1/5000是健康的情况,如果比例很高代表会话间锁阻塞严重,应当优化程序逻辑,改善锁的粒度等。在锁的粒度方面最好采用InnoDB引擎,因为InnoDB可以采用行锁而MyISAM只采用表锁,且对于高并发写入的应用InnoDB效果会好些.

                  04 缓存命中率相关
                  --myIsam缓存索引命中率
                    show variables like 'key_buffer_size';
                    show global status like 'key_read%';
                    key_cache_miss_rate = Key_reads Key_read_requests * 100%

                    --myIsam block命中率
                      show global status like 'key_blocks_u%';
                      Key_blocks_used (Key_blocks_unused + Key_blocks_used) * 100% (理想值 ≈ 80%)

                      --open_table_cache、table_open_cache应该大于open_tables,小于tables(或opened_tables)
                        show global status like 'open%tables%';show variables like 'table_open_cache';Open_tables  Opened_tables  理想值 (>= 85%)Open_tables / table_open_cache  理想值 (<= 95%)

                        --myIsam查询结果缓存缓存,褒贬不一暂时搁置
                          show global status like 'qcache%';

                          05 缓存空间情况
                          --在磁盘上创建临时表的比例
                            show variables like 'tmp_table_size';
                            show variables where Variable_name in ('tmp_table_size', 'max_heap_table_size');
                            show global status like 'created_tmp%';
                            Created_tmp_disk_tables Created_tmp_tables * 100% (理想值 < 25%)

                            --排序buffer
                              show variables like '%sort_buffer_size%'
                              show global status like 'sort%';

                              --打开文件数
                                show global status like 'open_files';
                                show variables like 'open_files_limit';
                                Open_files open_files_limit 理想值<= 75%

                                --buffer pool命中率,95~99%
                                  SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_reads';SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_read_requests';IFRH=(1 - Innodb_buffer_pool_reads/Innodb_buffer_pool_read_requests) * 100

                                  缓存空间命中率的正常是数据库健康运行的基础,由于硬盘io速度同cpu吞吐量间的巨大差距使得数据库程序不得不发展出各式各样的缓存机制,理解和监控这些缓存使用的基本情况指标是监控和故障判断的需要依据。

                                  06 慢查比例
                                    show status WHERE variable_name in ('slow_launch_threads','slow_queries');

                                    --查看创建时间超过slow_launch_time秒的线程数。
                                      show status like 'slow_launch_threads';

                                      --查看查询时间超过long_query_time秒的查询的个数。
                                        show status like 'slow_queries';

                                          SHOW GLOBAL STATUS WHERE variable_name in ('Slow_queries','Questions',' Uptime ');
                                          慢查频率:
                                          SQPM=Slow_queries Uptime
                                          慢查占查询比例:
                                          S/Q=Slow_queries/Questions

                                          慢查询是普遍使用的反映性能问题的指标,通过慢查频率和比例的计算可以比通过绝对值的估算挖掘更多信息。

                                          07 全表操作统计
                                            show variables where vairables_value in ('Select_full_join', 'Uptime')

                                            --full join发生频率
                                            --全表join操作:Select_full_join';
                                            --库启动时长:Uptime

                                            Full join发生频率:
                                            FJPS=Select_full_join / Uptime

                                              show global status like 'handler_read%';
                                              --全索引扫描正序:Handler_read_first
                                              --全索引扫描倒序:Handler_read_last
                                              --索引扫描:Handler_read_key  
                                              --索引扫描倒序:Handler_read_next
                                              --索引扫描正序:Handler_read_prev               
                                              --未使用索引:Handler_read_rnd    
                                              --未使用索引:Handler_read_rnd_next  
                                              全表扫描率=Handler_read_rnd_next / Com_select >4000 索引没建好

                                              以上列举部分关键指标,在充分掌握其含义的前提下尝试运用自动化脚本对这些指标进行监控。介于当前市面上的数据库监控产品普遍未能达到深入的监控mysql的运行状态,因此我们可以自己尝试以此为基础去做一些事情。

                                              点击蓝字

                                              关注我们

                                              文章转载自浙金科技无限,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                              评论