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,即不同步,这时性能最好,但风险最大。一旦系统奔溃,缓存中的日志都会丢失
我回来啦,目前还在从事数据库工程师方面工作,这些是日常数据库巡检总结希望能够帮助到大家,有错误和不足的地方也欢迎大家指出。