25、mysqlreport(my.cnf)调优工具

时间:2023-03-08 16:51:49
25、mysqlreport(my.cnf)调优工具

25.1、mysqlreport介绍:

mysqlreport以很友好的方式显示 MySQL状态变。事实上,它几乎报告了所有的状态。不像 SHOW STATUS 只是在显示

了100多个状态值,mysqlreport 则以人性化的方式阐释和格式化了这些状态值,大大增加了其可读性。

25.2、安装mysqlreport:

MySQLReport 是用perl语言编写,所以想要运行它首先需要安装perl环境;

它还要与MySQL数据库连接,所以还需要安装数据库接口DBI和数据库驱动DBD-MySQL 。

[root@backup ~]# yum install -y perl

[root@backup ~]#yum -y install perl-DBI #安装数据库接口DBI;

[root@backup ~]#yum -y install perl-DBD-MySQL #安装数据库驱动DBD-MySQL;

[root@backup ~]#yum -y install mysqlreport #安装mysqlreport;

[root@backup ~]#rpm -qa mysqlreport perl-DBD-MySQL perl-DBI perl

mysqlreport-3.5-4.el6.noarch

perl-DBI-1.609-4.el6.x86_64

perl-DBD-MySQL-4.013-3.el6.x86_64

perl-5.10.1-144.el6.x86_64

25.3、mysqlreport常用命令说明:

[root@backup ~]#mysqlreport --help

--user #连接MySQL的用户名;

--password #连接MySQL用户的密码;

--host #连接MySQL远程服务器的ip地址;

--port #连接MySQL的端口号;

--socket #连接MySQL的socket;

--no-mycnf #不读取〜/ .my.cnf;

--infile FILE #从文件中读取而不是从MySQL(show status)读取状态值;

--outfile FILE #在屏幕上输出报告后将报告写入FILE;

--email ADDRESS #在屏幕上输出完成后将结果发送到指定的电子邮件地址(在Windows上不起作用);

--flush-status #显示完报告后执行flush-status命令,如果没有权限,则 DBD::mysql 会显示返回值;

--help #打印帮助;

--debug #打印调试信息;

有关更多信息,请访问http://hackmysql.com/mysqlreport。

25.4、输出结果说明:

[root@backup tmp]#mysqlreport --user root --password 123456 --socket /data/3306/mysql.sock

Use of uninitialized value $is in multiplication (*) at /usr/bin/mysqlreport line 829.

Use of uninitialized value in formline at /usr/bin/mysqlreport line 1227.

Use of uninitialized value in formline at /usr/bin/mysqlreport line 1235.

# 数据库版本 # 数据库启动的时间(这里是40分钟)

MySQL 5.5.32 uptime 0 0:40:3 Wed Feb 4 06:52:23 2015

# MyISAM 索引信息,本质来讲,索引最好是都在内存中

__ Key _________________________________________________________________

#在my.cnf文件中的key_buffer_size定义索引缓存的大小, 缺省是8M, 可考虑设置为512M

Buffer used 0 of 8.00M %Used: 0.00

# 当Usage到达80或90%,就表示负荷过大,要考虑加大缓存的大小

Current 1.46M %Usage: 18.24

# 写命中。写索引的效率(即写入内存与写入硬盘的比例)

Write hit 0.00%

# 读命中。这个非常重要,表示索引信息读内存的命中率,越高越好

Read hit 0.00%

__ Questions ___________________________________________________________

# MySQL自启动以来一共处理了多少个请求,这里是8540个请求,平均每秒是3.6个

Total 8.54k 3.6/s

Com_ 10.60k 4.4/s %Total: 124.20

-Unknown 10.20k 4.2/s 119.51

# 数据操作语句

DMS 8.11k 3.4/s 94.94

COM_QUIT 32 0.0/s 0.37

# 慢查询日志,查询超过10s是慢查询日志,一般设置为1s

Slow 10 s 0 0/s 0.00 %DMS: 0.00 Log:

# 数据操作语句的详细信息,可以得知读写比等信息

DMS 8.11k 3.4/s 94.94

# 查询4980次,每秒2.1次

SELECT 4.98k 2.1/s 58.35 61.46

# 更新1710次,每秒0.7次

UPDATE 1.71k 0.7/s 20.05 21.12

# 插入1310次,每秒0.5次

INSERT 1.31k 0.5/s 15.37 16.19

# 删除100次

DELETE 100 0.0/s 1.17 1.23

REPLACE 0 0/s 0.00 0.00

# 数据库其它操作,不宜占比太高

Com_ 10.60k 4.4/s 124.20

stmt_execut 8.11k 3.4/s 94.93

stmt_close 1.05k 0.4/s 12.30

stmt_prepar 1.05k 0.4/s 12.30

__ SELECT and Sort _____________________________________________________

# 全表扫描,数值越低越好

Scan 9 0.0/s %SELECT: 0.18

# 范围查询

Range 10 0.0/s 0.20

# 联合查询全表扫描

Full join 0 0/s 0.00

Range check 0 0/s 0.00

Full rng join 0 0/s 0.00

Sort scan 0 0/s

Sort range 71 0.0/s

Sort mrg pass 0 0/s

# 查询缓存

__ Query Cache _________________________________________________________

# 缺省为32M

# 如果内存使用接近最大值,则有查询会从缓存中被移走,从而影响下面的Prune值

Memory usage 16.81k of 1.00M %Used: 1.64

# 内存碎片,值越大,碎片越多。一般不超过20%。与query_cache_min_res_unit相关

Block Fragmnt 100.00%

Hits 0 0/s

Inserts 1 0.0/s

# insert/prune是一个波动性的QC指标。一个稳定运行中的QC,insert进QC的查询数量应该大于prune掉

# 的查询数量。如果是1:1,就表示:

# 1. QC大小不够

# 2. mysql试图缓存一切,结果帮了倒忙~

# 但更多的时候是第二种情况。因为QC设置里开启的默认type1就是要求mysql尽可能的缓存一切东西。

# 另一个稍微好一些的方式是type2 demand ,只有在查询使用 `select sql_cache` 时才缓存查询结果

Insrt:Prune 1:1 0/s

# hit/insert用来反映QC的有效性。理想情况是:mysql插入一批稳定的查询到QC里,然后源源不断的命中这批

# 结果。所以,如果QC的有效性足够,这个比值应该是偏向hit的。如果不幸的偏向了insert,那说明QC其实没

# 起到太大的作用。比如说1:1,一次insert用了一次hit,然后就被替换了,这完全违背了使用QC的初衷。不

# 过还有更糟的,比如0.34:1,一次都没用上,就被prune掉了

Hit:Insert 0.00:1

# 表锁报表,MyISAM是表锁

__ Table Locks _________________________________________________________

# 锁等待,总数不要超过10%,否则对性能有很大的影响

Waited 0 0/s %Total: 0.00

# 总数

Immediate 8.28k 3.4/s

# 这里有两个值比较重要。一个是表缓存使用率,哪怕高到100%都行。不过要是真高到100%了,可能你的

# ’table_cache’设置已经不够了,赶紧加大吧。

# 第二个是当前打开表的比率,这个也能协助判断’table_cache’设置是否合理。一般这个值应该小于每秒

# 1次。不过一个负载比较高而又运行的还不错的mysql,可能能达到每秒打开7次表,依然保持100%的表缓存

__ Tables ______________________________________________________________

Open 163 of 2000 %Cache: 8.15

Opened 170 0.1/s

# 如果最大连接数曾经接近过100%,请加大’max_connection’设置。不过事实上,默认的100已经足够绝大多数

# 哪怕相当繁忙的mysql使用了,盲目加大这个设置其实不对。一个mysql链接持续1秒钟,100个就是足足100秒

# 。所以如果连接数太高,或者说一直在慢慢涨,问题很可能在别的地方,比如慢查询、糟糕的索引、甚至DNS

# 解析太慢。在修改这个数的事情,还是先去研究一下为什么100个还不够呢

__ Connections _________________________________________________________

# 最大151,并发最大数是30

Max used 30 of 151 %Max: 19.87

Total 34 0.0/s

__ Created Temp ________________________________________________________

# 在磁盘上创建临时文件

Disk table 0 0/s

# 在内存中创建临时文件,mysql一般也避免在磁盘上创建临时表,除非达到了’tmp_table_size’的阀值。这个

# 阀值会显示在内存(Table)那行的Size列后面,即16M

Table 19 0.0/s Size: 16.0M

File 5 0.0/s

# 这里面有一个需要注意的地方:线程命中率(%Hit)。每个mysql的连接都是一个单独的线程。

# MySQL启动时,只创建不多的几个线程和一个线程缓存,以节省不断创建和销毁线程的开销,哪

# 怕这个开销不怎么明显。当mysql的连接数超过了线程缓存数(由thread_cache_size定义)

# 时,MySQL开始出现线程抖动(‘threadthrash’)。为了接纳新的连接,mysql疯狂的创建新线程,

# 结果自然是线程命中率大幅下滑。

__ Threads _____________________________________________________________

Running 1 of 1

Cached 8 of 9 %Hit: 11.76

Created 30 0.0/s

Slow 0 0/s

__ Aborted _____________________________________________________________

Clients 0 0/s

Connects 0 0/s

__ Bytes _______________________________________________________________

Sent 2.15M 894.0/s

Received 475.84k 198.0/s

# innodb_buffer_pool_size定义了InnoDB存储引擎的表数据和索引数据的最大内存缓冲区大小。

# 和 MyISAM 存储引擎不同, MyISAM 的 key_buffer_size只能缓存索引键,而innodb_buffer_pool_size

# 却可以缓存数据块和索引键。适当的增加这个参数的大小,可以有效的减少InnoDB类型的表的磁盘I/O

# 在一个以 InnoDB 为主的专用数据库服务器上,可以考虑把该参数设置为物理内存大小的 60%-80%

__ InnoDB Buffer Pool __________________________________________________

# 必须避免mysql运行到缓冲池溢出的地步。myisam溢出,只会导致性能下降(索引读写变慢)

# ,而innodb的溢出问题就多了,因为几乎所有东西都依赖缓冲池。所以最好还是配置好自增长缓冲池

# (‘auto-extending buffer pool’)

Usage 70.55M of 127.98M %Used: 55.12

# 读命中率

Read hit 97.08%

Pages

# 空闲页,是使用率(%Used)的对立方

Free 3.68k %Total: 44.88

# 数据页,列%Dirty,展示已经被修改过,但还没有被刷新到磁盘存储的数据页的比率

Data 4.48k 54.68 %Drty: 0.00

# 用于管理分配行锁和自适应哈希索引导致的开销使用的页

Misc 36 0.44

# 目前正在读写、或者因为其他原因无法被刷新的页

Latched 0.00

# 从内存读取的数量, 这个数值可以用来衡量innodb缓冲池的吞吐量,

# 因为几乎所有inondb需要的东西都是在缓冲池里,所以缓冲池的读性能是越快越好。

# 哪怕超过每秒200000次也不是不可能的

Reads 118.58k 49.3/s

# 从磁盘读的数量, 越小越好

From file 3.47k 1.4/s 2.92

# 随机读,innodb启动的随机读取数。只有对表的大部分内容进行随机扫描的时候才会出现

Ahead Rnd 0 0/s

# 顺序读,只有全表扫描才会出现

Ahead Sql 0/s

# 本行显示写的数量以及读写的比率。如果服务器主要操作是update和insert的话,这个值也会比较高。

Writes 11.59k 4.8/s

# 缓冲池的页刷新请求数

Flushes 1.48k 0.6/s

# 一般情况下,innodb缓冲池的写操作是后台运行的。不过,如果出现必须要读写一个页可偏偏没有可用的新

# 页时,(innodb)就只能先等待页的刷新了。这个变量就是这些等待的总数。只要缓冲池的大小设置得当,

# 等待数应该会很小

Wait Free 0 0/s

# innodb锁报表,MyISAM引擎是表锁,而innoDB是行锁。所以当你使用innodb时这几个变量的值非常重要。

__ InnoDB Lock _________________________________________________________

# 等待某行解锁的累积次数,最好为0

Waits 136 0.1/s

# 当前正在等待解锁的行个数,最好为0

Current 0

# 显示了毫秒(ms)级行锁等待数据。分别是总值、平均值和最大值。同样最好是0次。

Time acquiring

Total 266046 ms

Average 1956 ms

Max 6798 ms

# 这部分报告,一般广泛的用于衡量innodb引擎的吞吐量指标。

__ InnoDB Data, Pages, Rows ____________________________________________

Data

# 指的是整个innodb引擎完成所有的数据读取次数。注意:不是整个数据读取字节数或者类型,

# 而是innodb完成的数据读取次数

Reads 3.54k 1.5/s

# 写,和读一样也是次数的统计

Writes 977 0.4/s

# 刷新,同样的,innodb从内存写入磁盘的次数。这个值应该会比前两个小

fsync 170 0.1/s

# 等待,又被分成了三行(108-110),分别是读、写、刷新的等待次数

Pending

Reads 0

Writes 0

fsync 0

# 这部分包括三种自描述类型:创建、读取、写入,分别用来表示缓冲池中页的创建、读取

# 和写入的数量和速率(即每秒操作数)。

Pages

Created 27 0.0/s

Read 4.45k 1.9/s

Written 1.48k 0.6/s

Rows

Deleted 98 0.0/s

Inserted 1.31k 0.5/s

Read 475.31k 197.8/s

Updated 2.58k 1.1/s