### **MySQL上线后根据status状态进行优化**
MySQL数据库上线后,可以等其稳定运行一段时间后再根据服务器的status状态进行适当优化,我们可以用如下命令列出MySQL服务器运行的各种状态值:
mysql > show global status;
我个人比较喜欢的用法是show status like '查询%';
**1.慢查询**
有时我们为了定位系统中效率比较低下的Query语法,需要打开慢查询日志,也就是Slow Que-ry log。打开慢查询日志的相关命令如下:
mysql>show variables like '%slow%';
+---------------------+-----------------------------------------+
| Variable\_name |Value |
+---------------------+-----------------------------------------+
| log\_slow\_queries | ON |
| slow\_launch\_time | 2 |
+---------------------+-----------------------------------------+
mysql>show global status like '%slow%';
+---------------------+-------+
| Variable\_name | Value|
+---------------------+-------+
| Slow\_launch\_threads | 0 |
| Slow\_queries | 2128 |
+---------------------+-------+
打开慢查询日志可能会对系统性能有一点点影响,如果你的MySQL是主从结构,可以考虑打开其中一台从服务器的慢查询日志,这样既可以监控慢查询,对系统性能影响也会很小。另外,可以用MySQL自带的命令mysqldumpslow进行查询。比如:下面的命令可以查出访问次数最多的20个SQL语句:
`mysqldumpslow-s c -t 20 host-slow.log`
**2.连接数**
我们如果经常遇见MySQL:ERROR 1040:Too manyconnections的情况,一种情况是访问量确实很高,MySQL服务器扛不住了,这个时候就要考虑增加从服务器分散读压力。另外一种情况是MySQL配置文件中max\_connections的值过小。来看一个例子。
mysql>show variables like 'max\_connections';
+-----------------+-------+
| Variable\_name | Value |
+-----------------+-------+
| max\_connections | 800 |
+-----------------+-------+
这台服务器最大连接数是256,然后查询一下该服务器响应的最大连接数;
mysql> show global status like 'Max\_used\_connections';
+----------------------+-------+
| Variable\_name | Value|
+----------------------+-------+
| Max\_used\_connections | 245 |
+----------------------+-------+
MySQL服务器过去的最大连接数是245,没有达到服务器连接数的上线800,不会出现1040错误。
**Max\_used\_connections/max\_connections \* 100% = 85%**
**最大连接数占上限连接数的****85%****左右****,****如果发现比例在****10%****以下,则说明****MySQL****服务器连接数的上限设置得过高了。**
*****
**3.key\_buffer\_size**
key\_buffer\_size是设置MyISAM表索引缓存空间的大小,此参数对MyISAM表性能影响最大。下面是一台MyISAM为主要存储引擎服务器的配置:
mysql> show variables like 'key\_buffer\_size';
+-----------------+-----------+
| Variable\_name | Value |
+-----------------+-----------+
| key\_buffer\_size | 536870912 |
+-----------------+-----------+
从上面可以看出,分配了512MB内存给key\_buffer\_size。再来看key\_buffer\_size的使用情况:
mysql> show global status like 'key\_read%';
+-------------------+--------------+
| Variable\_name | Value |
+-------------------+-------+
| Key\_read\_requests | 27813678766 |
| Key\_reads | 6798830 |
+-------------------+--------------+
一共有27813678766个索引读取请求,有6798830个请求在内存中没有找到,直接从硬盘读取索引。
key\_cache\_miss\_rate = key\_reads /key\_read\_requests \* 100%
**比如上面的数据,****key\_cache\_miss\_rate****为****0.0244%****,****4000%****个索引读取请求才有一个直接读硬盘,效果已经很好了,****key\_cache\_miss\_rate****在****0.1%****以下都很好,如果****key\_cache\_miss\_rate****在****0.01%****以下的话,则说明****key\_buffer\_size****分配得过多,可以适当减少。**
*****
**4.临时表**
当执行语句时,关于已经被创建了隐含临时表的数量,我们可以用如下命令查询其具体情况:
mysql> show global status like 'created\_tmp%';
+-------------------------+----------+
| Variable\_name |Value |
+-------------------------+----------+
| Created\_tmp\_disk\_tables | 21119 |
| Created\_tmp\_files |6 |
| Created\_tmp\_tables |17715532 |
+-------------------------+----------+
每次创建临时表时,Created\_tmp\_table都会增加,如果磁盘上创建临时表,Created\_tmp\_disk\_tables也会增加。Created\_tmp\_files表示MySQL服务创建的临时文件数,比较理想的配置是:
**Created\_tmp\_disk\_tables/ Created\_tmp\_files \* 100% <= 25%**
**比如上面的服务器****Created\_tmp\_disk\_tables/ Created\_tmp\_files \* 100% =1.20%****,就相当不错。我们在看一下****MySQL****服务器对临时表的配置:**
mysql>show variables where Variable\_name
in('tmp\_table\_size','max\_heap\_table\_size');
+---------------------+---------+
| Variable\_name |Value |
+---------------------+---------+
| max\_heap\_table\_size | 2097152 |
| tmp\_table\_size |2097152 |
+---------------------+---------+
**5.打开表的情况**
Open\_tables表示打开表的数量,Opened\_tables表示打开过的表数量,我们可以用如下命令查看其具体情况:
mysql> show global status like 'open%tables%';
+---------------+-------+
| Variable\_name | Value |
+---------------+-------+
| Open\_tables | 351 |
| Opened\_tables | 1455 |
如果Opened\_tables数量过大,说明配置中table\_open\_cache的值可能太小。我们查询下服务器table\_open\_cache;
mysql> show variables like 'table\_open\_cache';
+------------------+-------+
| Variable\_name | Value |
+------------------+-------+
| table\_open\_cache | 2048 |
+------------------+-------+
**比较合适的值为:**
**open\_tables/ opened\_tables\* 100% > = 85%**
**open\_tables/ table\_open\_cache\* 100% < = 95%**
*****
**6.进程使用情况**
如果我们在MySQL服务器的配置文件中设置了thread\_cache\_size,当客户端断开时,服务器处理此客户请求的线程将会缓存起来以响应一下客户而不是销毁(前提是缓存数未达上线)Thread\_created表示创建过的线程数,我们可以用如下命令查看:
mysql> show global status like 'thread%';
+-------------------+-------+
| Variable\_name | Value |
+-------------------+-------+
| Threads\_cached | 40 |
| Threads\_connected | 1 |
| Threads\_created | 330 |
| Threads\_running | 1 |
+-------------------+-------+
**如果发现****Threads\_created****的值过大的话,表明****MySQL****服务器一直在创建线程,这也是比较耗费资源的,可以适当增大配置文件中****thread\_cache\_size****的值**。查询服务器thread\_cache\_size配置如下:
mysql> show variables like 'thread\_cache\_size';
+-------------------+-------+
| Variable\_name | Value |
+-------------------+-------+
| thread\_cache\_size | 100 |
+-------------------+-------+
示例中的MySQL服务器还是挺健康的。
**7.查询缓存(querycache)**
它主要涉及两个参数,query\_cache\_size是设置MySQL的Query Cache大小,query\_cache\_type是设置使用查询缓存的类型,我们可以用如下命令查看其具体情况:
mysql> show global status like 'qcache%';
+-------------------------+-----------+
| Variable\_name |Value |
+-------------------------+-----------+
| Qcache\_free\_blocks |22756 |
| Qcache\_free\_memory |76764704 |
| Qcache\_hits | 213028692 |
| Qcache\_inserts |208894227 |
| Qcache\_lowmem\_prunes |4010916 |
| Qcache\_not\_cached |13385031 |
| Qcache\_queries\_in\_cache | 43560 |
| Qcache\_total\_blocks |111212 |
+-------------------------+-----------+
**MySQL****查询缓存变量的相关解释如下:**
Qcache\_free\_blocks:缓存中相邻内存快的个数。数目大说明可能有碎片。flush query cache会对缓存中的碎片进行整理,从而得到一个空间块。
Qcache\_free\_memory:缓存中的空闲空间。
Qcache\_hits:多少次命中。通过这个参数可以查看到Query Cache的基本效果。
Qcache\_inserts:插入次数,每插入一次查询时就增加1。命中次数除以插入次数就是命中比率。
Qcache\_lowmem\_prunes:多少条Query因为内存不足而被清楚出Query Cache。通过Qcache\_lowmem\_prunes和Query\_free\_memory相互结合,能够更清楚地了解到系统中Query Cache的内存大小是否真的足够,是否非常频繁地出现因为内存不足而有Query被换出的情况。
Qcache\_not\_cached:不适合进行缓存的查询数量,通常是由于这些查询不是select语句或用了now()之类的函数。
Qcache\_queries\_in\_cache:当前缓存的查询和响应数量。
Qcache\_total\_blocks:缓存中块的数量。
**我们在查询一下服务器上关于****query\_cache****的配置命令:**
mysql> show variables like 'query\_cache%';
+------------------------------+---------+
| Variable\_name | Value |
+------------------------------+---------+
| query\_cache\_limit | 1048576 |
| query\_cache\_min\_res\_unit | 2048 |
| query\_cache\_size | 2097152 |
| query\_cache\_type | ON |
| query\_cache\_wlock\_invalidate | OFF |
+------------------------------+---------+
**字段解释如下:**
query\_cache\_limit:超过此大小的查询将不缓存。
query\_cache\_min\_res\_unit:缓存块的最小值。
query\_cache\_size:查询缓存大小。
query\_cache\_type:缓存类型,决定缓存什么样的查询,示例中表示不缓存select sql\_no\_cache查询。
query\_cache\_wlock\_invalidat:表示当有其他客户端正在对MyISAM表进行写操作,读请求是要等WRITELOCK释放资源后再查询还是允许直接从Query Cache中读取结果,默认为OFF(可以直接从Query Cache中取得结果。)
query\_cache\_min\_res\_unit的配置是一柄双刃剑,默认是4KB,设置值大对大数据查询有好处,但如果你的查询都是小数据查询,就容易造成内存碎片和浪费。
**查询缓存碎片率****\=Qcache\_free\_blocks /Qcache\_total\_blocks \* 100%**
**如果查询碎片率超过****20%****,可以用****flushquery cache****整理缓存碎片,或者试试减少****query\_cache\_min\_res\_unit****,如果你查询都是小数据库的话。**
**查询缓存利用率****\=(Qcache\_free\_size – Qcache\_free\_memory)/query\_cache\_size \* 100%**
**查询缓存利用率在****25%****一下的话说明****query\_cache\_size****设置得过大,可适当减少****;****查询缓存利用率在****80%****以上而且****Qcache\_lowmem\_prunes> 50****的话则说明****query\_cache\_size****可能有点小,不然就是碎片太多。**
**查询命中率****\= (Qcache\_hits- Qcache\_insert)/Qcache)hits \* 100%**
**示例服务器中的查询缓存碎片率等于****20%****左右,查询缓存利用率在****50%****,查询命中率在****2%****,说明命中率很差,可能写操作比较频繁,而且可能有些碎片。**
*****
**8.排序使用情况**
它表示系统中对数据进行排序时所用的Buffer,我们可以用如下命令查看:
mysql> show global status like 'sort%';
+-------------------+----------+
| Variable\_name | Value |
+-------------------+----------+
| Sort\_merge\_passes | 10 |
| Sort\_range | 37431240 |
| Sort\_rows | 6738691532|
| Sort\_scan | 1823485 |
+-------------------+----------+
**Sort\_merge\_passes****包括如下步骤:****MySQL****首先会尝试在内存中做排序,使用的内存大小由系统变量****sort\_buffer\_size****来决定,如果它不够大则把所有的记录都读在内存中,而****MySQL****则会把每次在内存中排序的结果存到临时文件中,等****MySQL****找到所有记录之后,再把临时文件中的记录做一次排序。这次再排序就会增加****sort\_merge\_passes****。实际上,****MySQL****会用另外一个临时文件来存储再次排序的结果,所以我们通常会看到****sort\_merge\_passes****增加的数值是建临时文件数的两倍。因为用到了临时文件,所以速度可能会比较慢,增大****sort\_buffer\_size****会减少****sort\_merge\_passes****和创建临时文件的次数,但盲目地增大****sort\_buffer\_size****并不一定能提高速度。**
**9.文件打开数(open\_files)**
我们现在处理MySQL故障时,发现当Open\_files大于open\_files\_limit值时,MySQL数据库就会发生卡住的现象,导致Nginx服务器打不开相应页面。这个问题大家在工作中应注意,我们可以用如下命令查看其具体情况:
show global status like 'open\_files';
+---------------+-------+
| Variable\_name | Value |
+---------------+-------+
| Open\_files | 1481 |
+---------------+-------+
mysql> show global status like 'open\_files\_limit';
+------------------+-------+
| Variable\_name | Value |
+------------------+--------+
| Open\_files\_limit | 4509 |
+------------------+--------+
**比较合适的设置是:****Open\_files/ Open\_files\_limit \* 100% < = 75%**
*****
**10.InnoDB\_buffer\_pool\_cache合理设置**
InnoDB存储引擎的缓存机制和MyISAM的最大区别就在于,InnoDB不仅仅缓存索引,同时还会缓存实际的数据。此参数用来设置InnoDB最主要的Buffer的大小,也就是缓存用户表及索引数据的最主要缓存空间,对InnoDB整体性能影响也最大。
无论是MySQL官方手册还是网络上许多人分享的InnoDB优化建议,都是简单地建议将此值设置为整个系统物理内存的50%~80%。这种做法其实不妥,**我们应根据实际的运行场景来正确设置此项参数。**
- 笔记
- shell
- 如何才能学好Shell编程之“老鸟”经验谈
- scripts
- 迁移脚本
- centos_install.sh
- https.support.lwork.com.conf
- newbroker.default.lwork.com.conf
- bwnginx.conf
- twnginx.conf
- pre.default.lwork.com.conf
- zabbix_agentInstall
- getcc.sh
- shell脚本调试
- shell学习
- 第一章shell脚本入门
- shell脚本开发的基本规范及习惯
- 脚本规范示例
- 第三章变量的核心知识与实践
- 第四章变量知识进阶和实践
- 4.3 shell变量子串知识及实践
- 4.4 shell特殊扩展变量的知识与实践
- 第五章 变量的数值计算实践
- 第六章 shell脚本的条件测试
- 第七章 if条件的知识与实践
- 第8章 shell函数的基础实践
- 第13章 Shell数组的应用实践
- 经验
- for和while读行的区别
- 一个文件取2个参数
- 重定向正确及错误输出
- linux常用命令
- awk
- 详解
- 例子
- 内置变量
- 实例2
- 实例3
- find/grep
- iostat
- java启动脚本
- ln -s
- nmap
- passwd
- sed
- 详解
- 例子
- ssh-copy-id
- vim
- linux systemd详解
- 常用命令实列
- ss
- rz,sz小文件上传下载
- 文件的合并,排序和分割
- sort,uniq
- sort
- uniq
- cut
- paste
- tr
- curl
- cpu
- scp
- 批量添加注释
- nc
- yarn
- lsof
- tar
- cat
- openssl自签名证书
- pwgen
- logrotate
- 中间件
- mongo
- mongo配置文件详解
- mongo安装
- mongo常用命令
- mongo导入导出
- 导出数据的mongojs
- mongo shell
- mongo异常关闭
- mongo的缺点
- mysql
- 安装
- Gitd
- 主从同步
- 常用命令
- 日志清理
- 连接数,最大并发数,超时
- 错误
- 错误1872
- 错误1236
- 错误1-gitd主从报错
- 一些优化
- 服务器硬件优化
- 编译安装
- mysql配置文件优化
- 根据status优化
- 优化思路
- index
- 查询数据库大小
- ubuntu18.04mysql启动脚本
- pure-ftpd
- rabbitmq
- consul
- redis
- 安装
- 配置
- redis-sentinel
- 常用命令
- supervisor启动redis
- freeipa
- ftp
- 错误530根本原因和解决方法
- vsftp
- sftp
- JDK
- java参数
- zabbix
- 安装
- nginx
- 基础
- 1.基础web配置
- 2.nginx的日志格式
- 3.Nginx的请求限制
- 4.Nginx访问控制
- 进阶
- 1.静态资源web服务
- 2.Nginx作为代理服务
- 3.负载均衡
- 4.rewrite模块
- 5.Geoip
- location与proxy_pass
- proxy_set_header参数
- add_header
- 安装
- 4XX5XX重定向
- Nginx resolver explained
- 关于防止自己网页内容被别人iframe的问题
- nginx全局变量
- nginx错误代码
- 平滑升级nginx
- nginx相关资料网站
- nginx配置下载目录
- 反向代理并发数
- php
- 安装centos6,7
- xtrabackup
- apache
- 常用工具
- SSL证书在线工具SSL
- wordpress
- kafka
- nssm
- GoCD
- gocd简介
- gocd一些概念
- gocd客户端环境变量
- 建立一个piplines
- gocd添加nodejs
- supervisor
- mongo,mysql,hadoop比较
- screen
- python
- minio-私有存储桶
- kubernetes
- YAML格式简单说明
- k8s集群常用命令
- 概念
- k8s组件
- 对象
- workloads
- pods
- overview
- pod lifecycle
- init containers
- env向容器暴露pod信息
- controllers
- rs
- deployments
- daemonset
- StatefulSet
- service
- ingress
- volumes及configmap
- pv和pvc
- serviceaccount及认证
- dashboard及分级授权
- flannel&calico
- 调度器,预选策略及优先函数
- 资源指标API及自定义指标API
- helm
- k8s最佳实践
- 配置kubelet
- 简单命令定位问题
- k8s中日志收集-1
- k8s中日志收集-2
- lxcfs
- v1.24以后镜像问题
- 单控制节点集群v1.24以后适用
- 单控制节点集群v1.24前适用
- K8s.1.11.x阿里云安装HA版
- 国内k8s安装指定版本
- 发布及回滚
- 检查yaml文件格式
- pod分配到指定节点
- k8s跨集群访问
- 在docker中查看对应k8s容器日志
- cert-manager
- 问题定位技巧:容器内抓包
- 为容器设置启动时要执行的命令及其入参
- deploy.yaml文件实例
- kube/config
- 系统守护进程预留资源
- k8s集群证书pki过期处理
- pod跑java时内存的运用
- 从外部访问k8s中的pod
- HPA实战
- Docker
- Docker常用命令
- 基本概念
- 镜像
- 容器
- 仓库
- 安装 Docker
- Ubuntu
- Centos
- 镜像加速器
- 使用镜像
- 获取镜像
- 使用 Dockerfile 定制镜像
- Dockerfile 指令详解
- COPY 复制文件
- CMD 容器启动命令
- ENTRYPOINT 入口点
- ENV
- 其他命令
- 参考文档
- Alpine制作JDK8镜像
- Dockerfile示例
- 访问仓库
- nexus
- 最佳实践
- 镜像删除
- 清理docker磁盘空间
- docker容器日志管理
- 镜像基础上构建镜像
- git
- 公钥私钥免登
- 常用命令
- git pull
- git升级
- jenkins
- jenkins使用git
- 设置构建作业
- General
- Source Code Management
- Build Traggers
- Build Environment
- Build
- Post-build Actions
- 高级构建
- 参数化构建作业
- prometheus
- 监控原则
- 第一章 采集数据
- HPA
- meterics-server
- custom metrics
- kube-state-metrics
- node-exporter
- 第二章 prometheus
- prometheus概述
- prometheus基本架构
- prometheus安装
- prometheus的配置和服务发现
- scrape_configs
- kubernetes_sd_config
- relabel_config
- relabel_config例子
- 服务发现配置
- alertmanager_config
- alerting
- configuration
- route
- receivers
- inhibits_rules
- 第三章 展示与告警
- 第四章 PromQL
- rate,irate和delta的区别
- prometheus-operator
- maven
- maven命令
- maven仓库配置
- openstack
- 网络基础
- 计算机网络原理
- 一个URL请求的过程
- 2.记录
- 3.数据链路层
- 4.网络层
- 网络常用命令
- 命令
- iptables
- nc
- ipset
- mtr
- ss
- lsof
- ip
- 抓包
- tcpdump
- 网络排错与观察
- netstat
- traceroute
- dig与nslookup
- 计算机网络协议
- 负载均衡总结性说明
- NAT
- Tinc
- ubuntu
- ubuntu-var-log-下各个日志文件
- apt和dpkg
- systemctl详解
- 关闭系统更新,有些更新可能影响运行的程序
- ubuntu常用命令
- 基础工具journalctl命令
- za
- 恢复阿里云物理备份
- 域名证书申请和更换
- 正则表达式常用
- 服务器上排查问题得头5分钟
- windows
- winserver关闭事件跟踪程序
- windows常用命令
- win10企业LTSC版激活
- windows通过网卡只开80端口
- debug-tools
- win10-1903及以上版本Realtek高清晰音频管理器
- 彻底解决WPS Office Expansion tool弹出问题
- services延迟启动时间修改
- windows服务器定时重启
- windows sc命令
- 防火墙概述
- iptables
- 简单说明
- 例子
- 项目一
- DevOps简介
- 项目介绍
- 高并发内核优化
- gitlab
- gitlab社区和企业版本区别
- gitlab社区版安装
- gitlab指定版本安装
- gitlab安全设置
- gitlab的备份和恢复
- gitlab容器化安装
- jenkins
- jenkins安装
- ubuntu 16.04 install jenkins
- ubuntu 20.04 install jenkins
- jenkins使用git
- jenkins配置第一个项目
- jenkins发布及制作jar镜像
- jenkins安全策略
- gocd
- gocd安装
- k8s中gocd的server和agent模板
- gocd配置第一个项目
- 脚本
- gocd+ldap
- nexus
- 安装和配置
- freeipa
- 介绍
- 安装
- freeipa集成ocserv
- VPN
- 原理
- vpn部署ocserv
- k8s
- k8s高可用集群
- DNSmasq
- SNIproxy
- Tinc
- prometheus
- 简介
- helm安装prometheus
- 采集数据概览
- 采集数据node-exporter
- 采集数据kube-state-metrics
- 采集数据cadvisor和apiservers
- 指标汇总展示
- 监控
- nginx+lua+waf
- 项目二
- 简介
- nacos
- 简介
- nacos配置管理功能
- tengine
- java
- java参数说明及优化
- github快速访问
- amd和arm区别
- AWS
- 负载均衡ALB
