• MySQL监控项


    一、server层监控

    1. Max_used_connections: 服务器启动后已经同时使用的连接的最大数量。获取方式:show global status
    2. Connections: 试图连接到(不管是否成功)MySQL服务器的连接数。获取方式:show global status
    3. com_select: 读操作的数量。获取方式:show global status
    4. com_insert: insert操作的数量。获取方式:show global status
    5. com_update: update操作的数量。获取方式:show global status
    6. com_delete: delete操作的数量。获取方式:show global status
    7. com_commit: commit操作的数量。获取方式:show global status
    8. com_rollback: rollback操作的数量。获取方式:show global status 通过上述变量计算一下QPS和TPS,计算方式见监控项2。
    9. Slow_queries:查询时间超过long_query_time秒的查询的个数。获取方式:show global status
    10. long_query_time:数据库查询日志超过多少秒便判定为慢查询,单位是秒。获取方式:show global variables
    11. slow_query_log:是否开启慢日志。获取方式show global variables
    12. Select_full_join:在表连接操作过程中出现全表扫描的次数。获取方式:show global status
    13. Created_tmp_tables:表示在执行语句的过程中创建内部临时表的个数。获取方式:show global status
    14. binlog_cache_disk_use:表示binlog的缓存使用临时文件的次数。如果经常>0,需要调大binlog_cache_size的缓存。注意binlog_cache_size的缓存不能调整太大,因为每个session会分配一个binlog_cache_size缓存空间。获取方式:show global status
    15. aborted_connects:数据库尝试连接失败次数。获取方式:show global status
    16. max_connect_errors:数据库最大连接错误次数。获取方式:show global variables
    17. aborted_connects/max_connect_errors*100%:数据库尝试连接失败次数/数据库最大连接次数。当值大于50%是需要执行flush host命令刷新主机缓存。建议值<50%。获取方式:show global status和show global variables
    18. aborted_clients:数据库放弃的连接个数。获取方式:show global status
    19. select * from information_schema.processlist WHERE TIME > 1 AND INFO like "select%";  ##抓取慢日志(每分钟将执行的结果放入到自己的库中,可以让用户自己选择慢日志的时长。如果用户不想开慢日志可以采取这样的方式)
    20. table open cache efficiency(表打开缓存效率)
    table open cache efficiency = Table_open_cache_hits/(Table_open_cache_misses+ Table_open_cache_hits)
    select * from performance_schema.global_status where variable_name in ('Table_open_cache_hits','Table_open_cache_misses');
    

      21.incoming netword traffic(Bytes/Second)(每秒从所有客户端接收的字节数)

    incoming netword traffic(Bytes/Second)= Bytes_received/Uptime;
    select * from performance_schema.global_status where variable_name in ('Bytes_received','Uptime');
    

      22.Outgoing Network Traffic(Kbytes/Second)(每秒发送给所有客户端的千字节数)

    Outgoing Network Traffic(Kbytes/Second)= Bytes_sent/Uptime/1024;
    select * from performance_schema.global_status where variable_name in ('Bytes_sent','Uptime');
    

      23.transaction_isolation:实例的隔离级别。

    show global variables like 'transaction_isolation';
    

      

    二、InnoDB引擎层监控

     

    2.1、锁相关的

    1、查看此时有多少个锁等待

    select count(*) from information_schema.INNODB_LOCKS;
    

    2、innodb_row_lock_waits:数据库运行以来一共发生了多少次行锁等待

    show global status where variable_name ='innodb_row_lock_waits';

    3、Innodb_row_lock_current_waits: InnoDB表上当前等待的行锁数。获取方式:show global status

    4、Innodb_row_lock_time: 获取innodb行锁需要等待的时间,单位:毫秒。获取方式:show global status

    5、Innodb_row_lock_time_max:获取InnoDB表行锁的最长时间,单位:毫秒。获取方式:show global status

    2.2、innodb buffer相关的

    1、Innodb_buffer_pool_wait_free: Innodb的IO线程从数据文件中读取了数据要写入buffer pool的时候,需要等待空闲页的次数。如果该值太大,需要增加innodb_buffer_pool_size。获取方式:show global status

    2、Innodb_log_waits: 因为日志缓冲(log buffer)不足导致等待的次数。该值如果太大,需要增大innodb_log_buffer_size的值。获取方式:show global status

    3、Innodb buffer pool usege rete(innodb buffer pool使用率):业务高峰建议值不超过95%。

    Innodb buffer pool usege rete=innodb_buffer_pool_pages_data/innodb_buffer_pool_pages_total x 100%  ##可以参考这个值以及结合其它状态来判断是否增加innodb_buffer_pool_size。
    
    select * from performance_schema.global_status where variable_name in ('innodb_buffer_pool_pages_data','innodb_buffer_pool_pages_total');

    4、Innodb Buffer pool hit rate(innodb buffer pool命中率)(建议值不低于98%。):

    获取方式一:

    show engine innodb status,然后查看BUFFER POOL AND MEMORY节中的Buffer pool hit rate。

    获取方式二:

    Innodb Buffer pool hit rate=Innodb_buffer_pool_read_requests/(Innodb_buffer_pool_read_requests+Innodb_buffer_pool_reads+Innodb_buffer_pool_read_ahead)
    
    select * from performance_schema.global_status where variable_name in ('Innodb_buffer_pool_read_requests','Innodb_buffer_pool_reads','Innodb_buffer_pool_read_ahead');
    

    5、innodb_dblwr_pages_written/innodb_dblwr_writes:数据库的写入压力。

    Innodb_dblwr_pages_written表示double write一共写了多少页,Innodb_dblwr_writes表示double write实际写入次数。如果innodb_dblwr_pages_written/innodb_dblwr_writes大于64说明写入压力很高。获取方式:show global status。相对于医院可以考虑降低一半,大于32报警。

    6、hash searches/s:每秒使用自适应哈希索引的次数。通过查看这个值来判断是否禁用自适应哈希索引。获取方式:show engine innodb status

    2.3、其它

    1、查看当前innodb表创建的innodb临时表(支持5.7和8.0)。

    select count(*) from information_schema.INNODB_TEMP_TABLE_INFO;
    

    2、查看自启动以来innodb表的插入、删除、更新、查询的行数(需要打开计数器set global innodb_monitor_enable = all;)

    SELECT COUNT FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME='dml_inserts';
    
    SELECT COUNT FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME='dml_deletes';
    
    SELECT COUNT FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME='dml_updates';
    
    SELECT COUNT FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME='dml_reads';
    

      

    三、安全方面

    3.1、是否有用户有grant,super,drop等危险的权限。

    select user,host from mysql.user where (Drop_priv='Y' OR Grant_priv='Y' OR Super_priv='Y' OR Alter_priv='Y' OR Shutdown_priv='Y' OR Lock_tables_priv='Y') and user not in ('mysql.session');
    

    3.2、锁定的用户

    8.0:

    SELECT USER,HOST FROM mysql.user where account_locked='Y' AND USER NOT IN ('mysql.session','mysql.sys','mysql.infoschema');
    

    5.7:

    SELECT USER,HOST FROM mysql.user where account_locked='Y' AND USER NOT IN ('mysql.session','mysql.sys');
    

    5.6以下包括5.6,没有锁定用户的功能。

    3.3、设置密码过期的用户

    select user,host from mysql.user where password_expired = 'Y';

    上面的语句是找到创建时创建就指定了过期的语句,例如下面的语句。

    CREATE USER 'jeffrey'@'%' IDENTIFIED by '123456a!' password expire;

    3.4、用户密码即将过期的天数

    1、确认系统是否设置了 default_password_lifetime 变量值。

    show global variables like 'default_password_lifetime';
    

    如果为0,表示没有启用系统的密码过期策略,则执行步骤2,就能拿到所有用户的过期天数。如果不为0,则步骤2和步骤3都要执行。 

    2、找出指定了密码过期的用户(这个优先级高于系统设置的变量)

    SELECT USER,HOST,password_lifetime,password_last_changed,DATEDIFF(ADDDATE(password_last_changed,password_lifetime),CURDATE()) AS dr FROM mysql.user WHERE password_lifetime IS NOT NULL;

    dr表示还有几天到期,如果为负数表示超过到期日期的天数。到期剩余天数=最后一次修改密码的时间+password_lifetime-CURDATE()

    3、取出使用全局的密码过期策略的用户的到期时间

    (由于5.7要开启show_compatibility_56参数,所以不能一步算出来,需要将default_password_lifetime的值收集到我们的库里,然后在进行加减。)

    SELECT USER,HOST,password_last_changed,CURDATE() FROM mysql.user WHERE password_lifetime IS NULL;

    password_last_changed表示最后一次修改密码的时间。到期剩余天数=最后一次修改密码的时间+default_password_lifetime-CURDATE()

    3.5、密码复杂度

    1、validate_password_policy:设置密码策略。需要安装validate_password,否则下面的参数都不可用

    INSTALL PLUGIN validate_password SONAME 'validate_password.so';

    进行的检测

    0 or LOW

    长度;

    1 or MEDIUM

    长度;数字、小写/大写和特殊字符

    2 or STRONG

    长度;数字、小写/大写和特殊字符;字典文件

     

    2、validate_password_number_count:当validate_password_policy为MEDIUM或STRONG,则要求密码最少具有多少个数字字符数。

    3、validate_password_special_char_count:当validate_password_policy为MEDIUM或STRONG,则要求密码中最少具有多少个特殊字符数。

    4、validate_password_mixed_case_count:当validate_password_policy为MEDIUM或STRONG,则要求密码中最少具有多少个小写字符和大写字符。

    5、validate_password_length:需要密码中最少具有多少个字符数。值的设置不能小于此表达式的值:

    validate_password_number_count + validate_password_special_char_count + ( 2 * validate_password_mixed_case_count )
    

    6、validate_password_dictionary_file:设置检查密码字典文件的路径和文件名。当validate_password_policy为STRONG,密码长度大于4的每个子串都将与字典文件中的单词进行比较。任何匹配都会导致密码被拒绝。比较不区分大小写。(指定的密码字典文件不需要设置属主为mysql。密码字典表中的单词需要满足大于4个字符串。)

    3.6、是否开启binlog

    show global variables like 'log_bin';
    

    四、任务维度

     

     

    五、主从复制

     

     

    六、SQL语句、索引、表

    6.1、启动到现在有哪些全表扫描:

    SELECT object_schema,object_name,count_read AS rows_full_scanned FROM performance_schema.table_io_waits_summary_by_index_usage WHERE index_name IS NULL AND count_read > 0 ORDER BY count_read DESC;
    

    6.2、从启动到现在没有使用到的索引:

    SELECT object_schema,object_name,index_name FROM performance_schema.table_io_waits_summary_by_index_usage WHERE index_name IS NOT NULL AND count_star = 0 AND object_schema not in ('mysql','performance_schema') AND index_name <> 'PRIMARY' ORDER BY object_schema, object_name;
    

    6.3、操作频繁的前10张表:

    SELECT object_schema AS table_schema,object_name AS table_name,count_star AS rows_io_total,count_read AS rows_read,count_write AS rows_write,count_fetch AS rows_fetchs,count_insert AS rows_inserts,count_update AS rows_updates,count_delete AS rows_deletes FROM performance_schema.table_io_waits_summary_by_table ORDER BY sum_timer_wait DESC limit 10;
    

    6.4、找出有冗余索引的表(5.7和8.0):

    select table_schema,table_name,redundant_index_name,redundant_index_columns,dominant_index_name,dominant_index_columns from sys.schema_redundant_indexes order by table_name;
    

    6.5、使用临时表的语句:

    6.6、查看innodb缓冲池中的热点表

     

  • 相关阅读:
    解除对80端口的占用
    php排序算法
    Jquery异步请求数据实例
    C# winform 递归选中TreeView子节点
    C# WinFrom 编写正则表达式验证类
    c# winfrom 委托实现窗体相互传值
    [转]我的第一个WCF
    计算字符串中子串出现的次数
    JQuery中的html(),text(),val()区别
    Crystal Report制作使用
  • 原文地址:https://www.cnblogs.com/li-guanhua/p/13427659.html
Copyright © 2020-2023  润新知