mysql日常巡检

1.查看mysql服务是否异常

复制代码
systemctl status mysql_3306

查看MySQL进程是否存在

复制代码
ps -ef | grep mysql

2.连接异常检查

(1)查看是否异常连接

复制代码
show processlist;  
#或
show full processlist;

(2)查看当前失败连接数

复制代码
show global status like 'aborted_connects';

(3)查看试图连接到MySQL(不管是否连接成功)的连接数

复制代码
show status like 'connections';

(4)查看有多少由于客户没有正确关闭连接而死掉的连接数

复制代码
show global status like 'aborted_clients';

(5)查看最大连接数上限

复制代码
show variables like '%max_connections%';
show global status like 'max_connections';

(6)查看最大连接数

复制代码
show global status like 'Max_used_connections';

比较理想的设置是:

Max_used_connections / max_connections * 100% ≈ 85%

最大连接数占上限连接数的85%左右,如果发现比例在10%以下,MySQL服务器连接数上限设置的过高了。

3.存储引擎状态检查

(1)查看默认存储引擎

复制代码
show engines;

(2)检查InnoDB存储引擎的状态:

复制代码
SHOW ENGINE INNODB STATUS;

4.mysql日志巡检

(1)查看异常日志路径

复制代码
SHOW VARIABLES LIKE 'log_error';
tail -200f /mysql/log/3306/host01-error.log 

(2)查看慢查询日志路径

复制代码
SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'slow_query_log_file';
tail -200f  /mysql/log/3306/host01-query.log 

(3)查询数据库的慢查询日志

复制代码
SELECT * FROM mysql.slow_log WHERE start_time >= NOW() - INTERVAL 1 DAY ORDER BY start_time DESC;

5.查看数据库基本信息

(1)查看数据库的版本

复制代码
SELECT VERSION() AS 'MySQL版本';

(2)查看数据库字符集

复制代码
SHOW VARIABLES LIKE 'character_set_database';

(3)查看数据库当前时间

复制代码
SELECT NOW() AS '数据库当前时间';

(4)查看MySQL本次启动后的运行时间(单位:秒)

复制代码
show status like 'uptime';

6.查看数据库数据量

(1)mysql查看所有数据库数据量

复制代码
select 
table_schema as 'Database_name',
sum(table_rows) as 'rows',
sum(truncate(data_length/1024/1024, 2)) as 'Size_data(MB)',
sum(truncate(index_length/1024/1024, 2)) as 'Size_index(MB)'
from information_schema.tables
group by table_schema
order by sum(data_length) desc, sum(index_length) desc;

(2)mysql查看各个数据库表容量

复制代码
select 
table_schema as 'Database_name',
table_name as 'table_name',
table_rows as 'rows',
truncate(data_length/1024/1024, 2) as 'Size_data(MB)',
truncate(index_length/1024/1024, 2) as 'Size_index(MB)'
from information_schema.tables
order by data_length desc, index_length desc;

(3)mysql查看指定数据库容量大小

复制代码
select 
table_schema as 'Database_name',
sum(table_rows) as 'rows',
sum(truncate(data_length/1024/1024, 2)) as 'Size_data(MB)',
sum(truncate(index_length/1024/1024, 2)) as 'Size_index(MB)'
from information_schema.tables
where table_schema = 'mysql';

(4)mysql查看指定数据库表容量

复制代码
select 
table_schema as 'Database_name',
table_name as 'table_name',
table_rows as 'rows',
truncate(data_length/1024/1024, 2) as 'Size_data(MB)',
truncate(index_length/1024/1024, 2) as 'Size_index(MB)'
from information_schema.tables
where table_schema='mysql'
order by data_length desc, index_length desc;

(5)自增id使用情况

复制代码
SELECT table_schema , table_name , ENGINE , Auto_increment 
FROM information_schema.TABLES 
WHERE TABLE_SCHEMA NOT IN ("INFORMATION_SCHEMA","PERFORMANCE_SCHEMA", "MYSQL","SYS");

(6)表行数

复制代码
SELECT TABLE_SCHEMA , TABLE_NAME , TABLE_ROWS
FROM  information_schema.tables 
WHERE TABLE_SCHEMA not in('information_schema','sys','mysql','performance_schema')
ORDER BY table_rows DESC LIMIT 100;

7.mysql数据库用户巡检

(1)mysql查看所有用户信息

复制代码
SELECT user, host FROM mysql.user;

(2)查看所有用户信息

复制代码
SELECT * FROM mysql.user\G

(3)查看指定用户信息

复制代码
SELECT * FROM mysql.user WHERE user in ('root','repuser')\G
Select_priv:            确定用户是否可以通过SELECT命令选择数据 
Insert_priv:            确定用户是否可以通过INSERT命令插入数据 
Update_priv:            确定用户是否可以通过UPDATE命令修改现有数据 
Delete_priv:            确定用户是否可以通过DELETE命令删除现有数据 
Create_priv:            确定用户是否可以创建新的数据库和表 
Drop_priv:                确定用户是否可以删除现有数据库和表 
Reload_priv:            确定用户是否可以执行刷新和重新加载MySQL所用各种内部缓存的特定命令,包括日志、权限、主机、查询和表 
Shutdown_priv:            确定用户是否可以关闭MySQL服务器,将此权限提供给root账户之外的任何用户时,都应当非常谨慎 
Process_priv:            确定用户是否可以通过SHOW 
File_priv:                确定用户是否可以执行SELECT INTO OUTFILE和LOAD DATA INFILE命令 
Grant_priv:            确定用户是否可以将已经授予给该用户自己的权限再授予其他用户,例如,如果用户可以插入、选择和删除foo数据库中的信息,并且授予了GRANT权限,则该用户就可以将其任何或全部权限授予系统中的任何其他用户 
References_priv:        目前只是某些未来功能的占位符,现在没有作用 
Index_priv:            确定用户是否可以创建和删除表索引 
Alter_priv:            确定用户是否可以重命名和修改表结构 
Show_db_priv:            确定用户是否可以查看服务器上所有数据库的名字,包括用户拥有足够访问权限的数据库,可以考虑对所有用户禁用这个权限,除非有特别不可抗拒的原因 
Super_priv:            确定用户是否可以执行某些强大的管理功能,例如通过KILL命令删除用户进程,使用SET GLOBAL修改全局MySQL变量,执行关于复制和日志的各种命令 
Create_tmp_table_priv:    确定用户是否可以创建临时表 
Lock_tables_priv:        确定用户是否可以使用LOCK 
Execute_priv:            确定用户是否可以执行存储过程,此权限只在MySQL 5.0及更高版本中有意义 
Repl_slave_priv:        确定用户是否可以读取用于维护复制数据库环境的二进制日志文件,此用户位于主系统中,有利于主机和客户机之间的通信 
Repl_client_priv:        确定用户是否可以确定复制从服务器和主服务器的位置 
Create_view_priv:        确定用户是否可以创建视图,此权限只在MySQL 5.0及更高版本中有意义 
Show_view_priv:        确定用户是否可以查看视图或了解视图如何执行,此权限只在MySQL 5.0及更高版本中有意义 Create_routine_priv:确定用户是否可以更改或放弃存储过程和函数,此权限是在MySQL 5.0中引入的 Alter_routine_priv:确定用户是否可以修改或删除存储函数及函数,此权限是在MySQL 5.0中引入的 Create_user_priv:确定用户是否可以执行CREATE 
Event_priv:            确定用户能否创建、修改和删除事件,这个权限是MySQL 5.1.6新增的 
Trigger_priv:            确定用户能否创建和删除触发器,这个权限是MySQL 5.1.6新增的
Create_tablespace_priv: 创建表的空间

8.mysql查看锁

(1)查看表锁

--查看需要等待的表锁数

复制代码
show global status like 'Table_locks_waited';

--查看立即释放表锁数

复制代码
show global status like 'Table_locks_immediate';

Table_locks_immediate / Table_locks_waited >5000 建议采用InnoDB引擎,对于高并发写入的应用InnoDB效果会好些。

Table_locks_immediate / Table_locks_waited = 235 MyISAM就足够

(2)行锁

复制代码
show status like 'InnoDB_row_lock%';
Innodb_row_lock_current_waits        #当前等待锁的行锁数量
Innodb_row_lock_time                #请求行锁总耗时
Innodb_row_lock_time_avg            #请求行锁平均耗时
Innodb_row_lock_time_max            #请求行锁最久耗时
Innodb_row_lock_waits                #行锁发生次数

(3)查询死锁表及查询死锁等待时间

复制代码
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
SELECT * FROM information_schema.INNODB_LOCK_waits;
MySQL 8.0 
select * from performance_schema.data_locks;
select * from performance_schema.data_lock_waits;

9.临时表/临时文件

复制代码
show global status like 'created_tmp%';
Created_tmp_disk_tables 创建在磁盘上的临时表的数量
Created_tmp_files       临时文件文件数
Created_tmp_tables      创建的临时表的数量
每次创建临时表,Created_tmp_tables增加,如果是在磁盘上创建临时表,Created_tmp_disk_tables也增加,Created_tmp_files表示MySQL服务创建的,
理想的配置为:
Created_tmp_disk_tables / Created_tmp_tables * 100% <= 25%

10.打开表/文件数

复制代码
show global status like 'Open_files';
show variables like 'open_files_limit';
比较合适的设置:Open_files / open_files_limit * 100% <= 75%

11.打开表的数量

复制代码
show global status like '%Open%_table%';
Open_tables                    打开表数量
Opened_tables                表示打开过的表数量
Open_table_definitions         代表当前缓存了多少.frm文件。
Opened_table_definitions    代表自从MySQL启动后,缓存了.frm文件的数量
理想值为:
Open_tables / Opened_tables * 100% >= 85%
Open_tables / table_cache * 100% <= 95%

show variables like 'table%';
table_definition_cache      控制总frm文件的数量
table_open_cache            所有线程打开的表的数量
table_open_cache_instances  打开的表缓存实例的数量

12.线程

(1)线程使用情况

复制代码
show global status like 'Thread%';
threads_cached                线程缓存内的线程的数量
threads_connected            当前打开的连接的数量
threads_connected            当前打开的连接的数量
threads_created                创建用来处理连接的线程数,如果Threads_created较大,你可能要增加thread_cache_size值。
threads_running                激活的(非睡眠状态)线程数

(2)查看创建时间超过slow_launch_time秒的线程数。

复制代码
show status like 'slow_launch_threads';

(3)查看查询时间超过long_query_time秒的查询的个数。

复制代码
show status like 'slow_queries';

13.查询缓存

复制代码
show global status like 'qcache%';  
Qcache_free_blocks            缓存中相邻内存块的个数。数目大说明可能有碎片。FLUSH QUERY CACHE会对缓存中的碎片进行整理,从而得到一个空闲块。
Qcache_free_memory            缓存中的空闲内存。
Qcache_hits                    每次查询在缓存中命中时就增大
Qcache_inserts                每次插入一个查询时就增大。命中次数除以插入次数就是不中比率。
Qcache_lowmem_prunes        缓存出现内存不足并且必须要进行清理以便为更多查询提供空间的次数。这个数字最好长时间来看;如果这个数字在不断增长,就表示可能碎片非常严重,或者内存很少。(上面的 free_blocks和free_memory可以告诉您属于哪种情况)
Qcache_not_cached            不适合进行缓存的查询的数量,通常是由于这些查询不是 SELECT 语句或者用了now()之类的函数。
Qcache_queries_in_cache        当前缓存的查询(和响应)的数量。
Qcache_total_blocks            缓存中块的数量。

查询服务器关于query_cache的配置

复制代码
show variables like 'query_cache%';  
query_cache_limit                超过此大小的查询将不缓存
query_cache_min_res_unit        缓存块的最小大小
query_cache_size                查询缓存大小
query_cache_type                缓存类型,决定缓存什么样的查询,示例中表示不缓存 select sql_no_cache 查询
query_cache_wlock_invalidate    当有其他客户端正在对MyISAM表进行写操作时,如果查询在query cache中,是否返回cache结果还是等写操作完成再读表获取结果。

query_cache_min_res_unit的配置默认是4KB,设置值大对大数据查询有好处,但如果查询都是小数据查询,容易造成内存碎片和浪费。

查询缓存碎片率 = Qcache_free_blocks / Qcache_total_blocks * 100% (如果查询缓存碎片率超过20%且查询都是小数据量,可以用FLUSH QUERY CACHE整理缓存碎片,或者减小query_cache_min_res_unit)
查询缓存利用率 = (query_cache_size -- Qcache_free_memory) / query_cache_size * 100% (查询缓存利用率在25%以下的话说明query_cache_size设置的过大,可适当减小;查询缓存利用率在80%以上而且Qcache_lowmem_prunes > 50的话说明query_cache_size可能有点小,要不就是碎片太多)
查询缓存命中率 = (Qcache_hits -- Qcache_inserts) / Qcache_hits * 100%

14.排序使用情况

复制代码
show global status like 'sort%'; 

15.表扫描情况

复制代码
show global status like 'handler_read%';
show  status like 'com_select';
表扫描率 = Handler_read_rnd_next / Com_select

如果表扫描率超过4000,说明进行了太多表扫描,很有可能索引没有建好,增加read_buffer_size值会有一些好处,但最好不要超过8MB。

16.查看独立表空间是否开启及表空间默认大小

复制代码
SHOW VARIABLES LIKE 'innodb_file_per_table';
SHOW VARIABLES LIKE 'innodb_data_file_path';

17.查看innodb文件路径

复制代码
SHOW VARIABLES LIKE 'innodb_data_home_dir';
SHOW VARIABLES LIKE 'innodb_data_file_path';

18.查看等待事件

复制代码
show global status like 'Innodb_buffer_pool_wait_free';
show global status like 'Innodb_log_waits';

19.查看binglog模式

(1)查看binlog相关参数配置

复制代码
SHOW VARIABLES LIKE '%log_bin%';

(2)查看binlog保留天数

复制代码
show VARIABLES LIKE 'expire_logs_days%';

(3)查看binlog记录模式

复制代码
SHOW GLOBAL VARIABLES LIKE 'binlog_format';

(4)查看所有binlog文件

复制代码
SHOW MASTER LOGS;

(5)查看当前记录的binlog文件

复制代码
SHOW MASTER STATUS;

(6)查看binlog文件记录

复制代码
show binlog events in 'host01-binlog.000002';

(7)手动切换binlog

复制代码
FLUSH LOGS;

log_bin_trust_function_creators={on | off }    #默认为OFF,这个参数开启会限制存储过程、Function、触发器的创建
log_bin = {on | off | base_name}                 #指定是否启用记录二进制日志或者指定一个日志路径(路径不能加.否则.后的被忽略)
sql_log_bin ={ on | off }                         #指定是否启用记录二进制日志,只有在log_bin开启的时候才有效
expire_logs_days =                                 #指定自动删除二进制日志的时间,即日志过期时间
binlog_do_db =                                     #明确指定要记录日志的数据库
binlog_ignore_db =                                 #指定不记录二进制日志的数据库
log_bin_index =                                 #指定mysql-bin.index文件的路径
binlog_format = { mixed | row | statement }     #指定二进制日志基于什么模式记录
binlog_rows_query_log_events = { 1|0 }             # MySQL5.6.2添加了该变量,当binlog format为row时,默认不会记录row对应的SQL语句,设置为1或其他true布尔值时会记录,但需要使用mysqlbinlog -v查看,这些语句是被注释的,恢复时不会被执行。
max_binlog_size =                                 #指定二进制日志文件最大值,超出指定值将自动滚动。但由于事务不会跨文件,所以并不一定总是精确。
binlog_cache_size = 32768                         #基于事务类型的日志会先记录在缓冲区,当达到该缓冲大小时这些日志会写入磁盘
max_binlog_cache_size =                         #指定二进制日志缓存最大大小,硬限制。默认4G,够大了,建议不要改
binlog_cache_use                                #使用缓存写二进制日志的次数(这是一个实时变化的统计值)
binlog_cache_disk_use                            #使用临时文件写二进制日志的次数,当日志超过了binlog_cache_size的时候会使用临时文件写日志,如果该变量值不为0,则考虑增大binlog_cache_size的值
binlog_stmt_cache_size = 32768                     #一般等同于且决定binlog_cache_size大小,所以修改缓存大小时只需修改这个而不用修改binlog_cache_size
binlog_stmt_cache_use                            #使用缓存写二进制日志的次数
binlog_stmt_cache_disk_use                        #使用临时文件写二进制日志的次数,当日志超过了binlog_cache_size的时候会使用临时文件写日志,如果该变量值不为0,则考虑增大binlog_cache_size的值
sync_binlog = { 0 | n }                         #这个参数直接影响mysql的性能和完整性
sync_binlog=0                                    #不同步,日志何时刷到磁盘由FileSystem决定,这个性能最好。
sync_binlog=n                                    #每写n次二进制日志事件(不是事务),MySQL将执行一次磁盘同步指令fdatasync()将缓存日志刷新到磁盘日志文件中。Mysql中默认的设置是sync_binlog=0,即不同步,这时性能最好,但风险最大。一旦系统奔溃,缓存中的日志都会丢失

我回来啦,目前还在从事数据库工程师方面工作,这些是日常数据库巡检总结希望能够帮助到大家,有错误和不足的地方也欢迎大家指出。

相关推荐
搬砖天才、38 分钟前
日常记录-redis主从复制(master-slave)+ Sentinel 哨兵(高可用)
数据库·redis·sentinel
努力奋斗的小杨41 分钟前
学习MySQL的第十一天
数据库·笔记·sql·学习·mysql·navicat
TDengine (老段)1 小时前
TDengine 流计算引擎设计
大数据·数据库·物联网·flink·时序数据库·tdengine·涛思数据
双叶8361 小时前
(51单片机)LCD展示动画(延时函数)(LLCD1602教程)
c语言·数据库·c++·单片机·嵌入式硬件·51单片机
长安城没有风1 小时前
从入门到精通【MySQL】视图与用户权限管理
数据库·mysql
samson_www1 小时前
试水低代码平台Nocoly
数据库·低代码·low-code
GreatSQL2 小时前
使用 gt-checksum 分析迁移对象
数据库
用户6279947182622 小时前
南大通用GBase8s数据库的create distinct type语句详解
数据库
bing_1582 小时前
Nacos 客户端 SDK 的核心功能是什么?是如何与服务端通信的?
服务器·数据库·nacos 通信
AnsenZhu2 小时前
Redis Cluster 使用 CRC16 算法实现 Slot 槽位分片的核心细节
数据库·redis·缓存·crc16