mysql状态查询

mysql状态查询

Mysql 可以通过指令去了解数据库的情况。记一下常用的查看状态的指令。

mysql状态

 通过 SHOW STATUS 可以提供服务器状态信息,也可以使用 mysqladmin extende d-status 命令获得。 SHOW STATUS 可以根据需要显示 session 级别的统计结果和 global级别的统计结果。

show status;
Aborted_clients 由于客户没有正确关闭连接已经死掉,已经放弃的连接数量。
Aborted_connects 尝试已经失败的MySQL服务器的连接的次数。 
Connections 试图连接MySQL服务器的次数。
Created_tmp_tables 当执行语句时,已经被创造了的隐含临时表的数量。 
Delayed_insert_threads 正在使用的延迟插入处理器线程的数量。 
Delayed_writes 用INSERT DELAYED写入的行数。
Delayed_errors 用INSERT DELAYED写入的发生某些错误(可能重复键值)的行数。 
Flush_commands 执行FLUSH命令的次数。 
Handler_delete 请求从一张表中删除行的次数。 
Handler_read_first 请求读入表中第一行的次数。 
Handler_read_key 请求数字基于键读行。 
Handler_read_next 请求读入基于一个键的一行的次数。 
Handler_read_rnd 请求读入基于一个固定位置的一行的次数。 
Handler_update 请求更新表中一行的次数。
Handler_write 请求向表中插入一行的次数。 
Key_blocks_used 用于关键字缓存的块的数量。
Key_read_requests 请求从缓存读入一个键值的次数。
Key_reads 从磁盘物理读入一个键值的次数。
Key_write_requests 请求将一个关键字块写入缓存次数。 
Key_writes 将一个键值块物理写入磁盘的次数。 
Max_used_connections 同时使用的连接的最大数目。 
Not_flushed_key_blocks 在键缓存中已经改变但是还没被清空到磁盘上的键块。 
Not_flushed_delayed_rows 在INSERT DELAY队列中等待写入的行的数量。 
Open_tables 打开表的数量。 
Open_files 打开文件的数量。 
Open_streams 打开流的数量(主要用于日志记载) 
Opened_tables 已经打开的表的数量。 
Questions 发往服务器的查询的数量。
Slow_queries 要花超过long_query_time时间的查询数量。 
Threads_connected 当前打开的连接的数量。 
Threads_running 不在睡眠的线程数量。 
Uptime 服务器工作了多少秒。
  1. 如果opened_tables太大,应该把my.cnf中的table_cache变大

  2. 如果Key_reads太大,则应该把my.cnf中key_buffer_size变大.可以用Key_reads/Key_read_requests计算出cache失败率

  3. 如果Handler_read_rnd太大,则你写的SQL语句里很多查询都是要扫描整个表,而没有发挥索引的键的作用

  4. 如果Threads_created太大,就要增加my.cnf中thread_cache_size的值.可以用Threads_created/Connections计算cache命中率 

  5. 如果Created_tmp_disk_tables太大,就要增加my.cnf中tmp_table_size的值,用基于内存的临时表代替基于磁盘的

SHOW PROCESSLIST

查看当前正在进行的进程,对于有锁表等情况的排查很有用处 。默认显示100条,SHOW FULL PROCESSLIST; 显示所有。

SHOW PROCESSLIST;
id列:一个标识,你要kill 一个语句的时候很有用。 
user列: 显示当前用户,如果不是root,这个命令就只显示你权限范围内的sql语句。 
host列:显示这个语句是从哪个ip 的哪个端口上发出的。可用来追踪出问题语句的用户。 
db列:显示这个进程目前连接的是哪个数据库。
command列:显示当前连接的执行的命令,一般就是休眠(sleep),查询(query),连接(connect)。 
time列:此这个状态持续的时间,单位是秒。 
state列:显示使用当前连接的sql语句的状态,很重要的列,后续会有所有的状态的描述,请注意,state只是语句执行中的某一个状态,一个sql语句,已查询为例,可能需要经过copying to tmp table,Sorting result,Sending data等状态才可以完成。 
info列:显示这个sql语句,因为长度有限,所以长的sql语句就显示不全,但是一个判断问题语句的重要依据。

State 列详解:(当前sql跑在什么状态下)

Checking table 正在检查数据表(这是自动的)。
Closing tables 正在将表中修改的数据刷新到磁盘中,同时正在关闭已经用完的表。这是一个很快的操作,如果不是这样的话,就应该确认磁盘空间是否已经满了或者磁盘是否正处于重负中。
Connect Out 复制从服务器正在连接主服务器。
Copying to tmp table on disk 由于临时结果集大于 tmp_table_size,正在将临时表从内存存储转为磁盘存储以此节省内存。
Creating tmp table 正在创建临时表以存放部分查询结果。
deleting from main table 服务器正在执行多表删除中的第一部分,刚删除第一个表。
deleting from reference tables 服务器正在执行多表删除中的第二部分,正在删除其他表的记录。
Flushing tables 正在执行 FLUSH TABLES,等待其他线程关闭数据表。
Killed 发送了一个kill请求给某线程,那么这个线程将会检查kill标志位,同时会放弃下一个kill请求。MySQL会在每次的主循环中检查kill标志位,不过有些情况下该线程可能会过一小段才能死掉。如果该线程程被其他线程锁住了,那么kill请求会在锁释放时马上生效。
Locked 被其他查询锁住了。
Sending data 正在处理 SELECT 查询的记录,同时正在把结果发送给客户端。
Sorting for group 正在为 GROUP BY 做排序。
Sorting for order 正在为 ORDER BY 做排序。
Opening tables 这个过程应该会很快,除非受到其他因素的干扰。例如,在执 ALTER TABLELOCK TABLE 语句行完以前,数据表无法被其他线程打开。 正尝试打开一个表。
Removing duplicates 正在执行一个 SELECT DISTINCT 方式的查询,但是MySQL无法在前一个阶段优化掉那些重复的记录。因此,MySQL需要再次去掉重复的记录,然后再把结果发送给客户端。
Reopen table 获得了对一个表的锁,但是必须在表结构修改之后才能获得这个锁。已经释放锁,关闭数据表,正尝试重新打开数据表。
Repair by sorting 修复指令正在排序以创建索引。
Repair with keycache 修复指令正在利用索引缓存一个一个地创建新索引。它会比 Repair by sorting 慢些。
Searching rows for update 正在讲符合条件的记录找出来以备更新。它必须在 UPDATE 要修改相关的记录之前就完成了。
Sleeping 正在等待客户端发送新请求.
System lock 正在等待取得一个外部的系统锁。如果当前没有运行多个 mysqld 服务器同时请求同一个表,那么可以通过增加 –skip-external-locking参数来禁止外部系统锁。
Upgrading lock INSERT DELAYED 正在尝试取得一个锁表以插入新记录。
Updating 正在搜索匹配的记录,并且修改它们。
User Lock 正在等待 GET_LOCK()。
Waiting for tables 该线程得到通知,数据表结构已经被修改了,需要重新打开数据表以取得新的结构。然后,为了能的重新打开数据表,必须等到所有其他线程关闭这个表。
show com
SHOW STATUS like "Com_%"; #全局级别:
show global status like "Com_%"; #全局级别:
  1.  Com_select 执行 select 操作的次数,一次查询只累加 1 ;

  2.  Com_insert 执行 insert 操作的次数,对于批量插入的 insert 操作,只累加一次 ;

  3. Com_update 执行 update 操作的次数;

  4. Com_delete 执行 delete 操作的次数;

通过以上几个参数,可以很容易的了解当前数据库的应用是以插入更新为主还 是以查询操作为主,以及各种类型的 SQL大致的执行比例是多少。对于更新操作的计 数,是对执行次数的计数,不论提交还是回滚都会累加。 对于事务型的应用,通过 Com_commit 和 Com_rollback 可以了解事务提交和回 滚的情况,对于回滚操作非常频繁的数据库,可能意味着应用编写存在问题。此外,以下几个参数便于我们了解数据库的基本情况:

  • Connections 试图连接 Mysql 服务器的次数

  • Uptime 服务器工作时间

  • Slow_queries 慢查询的次数

慢查询

通过设置慢查询时间以及对应的文件能够把慢查询记录,以便以后做分析。

show variables like '%slow%';

  • slow_launch_time 表明2s 为慢查询的界限

show global status like 'max_used_connections';  


以上表示慢查询为2s,一共618条慢查询。

开启慢查询

通过配置my.cnf。

安装完成后可能还没有配置文件,需要自己创建。

MySQL启动时会读取配置文件my.cnf,读取次序依次为 /etc/my.cnf/etc/mysql/my.cnf/usr/local/etc/my.cnf~/.my.cnf。安装完MySQL后可能上述位置上都没有my.cnf文件,要想指定配置文件,可以将MySQL安装目录下的示例配置文件拷贝到对应位置。

Linux下找到mysql的配置文件my.ini, 在mysqld下方加入慢查询的配置语句(注意:一定要在[mysqld]下的下方加入)




查看慢查询工具

查看慢查询 可以使用mysql自带的慢查询日志工具 mysqldumpslow

慢日志格式
 # Time: 2016-12-22T09:41:17.777439Z
# User@Host: homestead[homestead] @  [192.168.10.1]  Id:  1543
# Query_time: 2.001423  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 0
use homestead;
SET timestamp=1482399677;
select sleep(2);

主要功能是, 统计不同慢 sql 下面这些属性:

  • 出现次数(Count),

  • 执行最长时间(Time),

  • 累计总耗费时间(Time),

  • 等待锁的时间(Lock),

  • 发送给客户端的行总数(Rows),

  • 扫描的行总数(Rows),

  • 用户以及sql语句本身(抽象了一下格式, 比如 limit 1, 20 用 limit N,N 表示).

讲一下有用的参数:

-s 排序选项:

c 查询次数

r 返回记录行数 t 查询时间 -t num 只显示 top n 条查询 其他参数可以使用 -h 命令进行查看

参考: https://blog.csdn.net/zhangliangzi/article/details/51884863
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值