定位数据库慢查询SQL有多种方式,根据具体使用的数据库种类和经济实力来定:
一、使用APM产品APM全程为Application Performance Management,软硬件解决方案都有,如果经济实力不错,直接买大厂商的APM产品最为省时省力,而且还附带报警和分析功能 。
APM不仅是管理数据库性能的,还可以对应用服务器进行检测,对JAVA、.NET、php、Ruby、Python、NodeJS等语言开发的应用程序性能进行监测 。
目前市面上很多,有像深信服等提供的集成在硬件中的一体机式的,还有一些纯软件的APM产品,例如像OneAPM那样即可以本地部署的,还可以本地安装弹针然后云端SaaS部署的 。这里就不一一列举了,大家可以根据自己预算找相应的厂家咨询 。
二、使用专门的数据库监测产品市面上还有一类小众的专门针对数据库的产品 。大部分都是多年DBA在自己多年的数据库运维经验基础上针对某种数据库定制的监测系统,除了针对数据库各个性能指标进行监测报警外,还提供智能分析和性能优化等服务 。
例如作为微软中国SQL Server金牌合作伙伴的北京格瑞趋势公司所推出的SQL专家云等产品,是专门针对微软SQL Server数据库某一段时间的采样数据分析、诊断,主要的应用场景包括:对数据库进行体检,自动形成体检报告;分析当前系统存在的问题及隐患;分析采样时段的性能问题及根源;分析数据库的参数配置及索引;自动优化并生产可执行的脚本 。
三、使用开源运维监控系统例如Zabbix、NagIOS、Grafana、Open-falcon等,这些开源系统同APM产品类似,但主要是提供给服务器运维人员使用的,内置了一部分数据库监控的功能,有的插件很多,功能和界面都还是不错的 。
但是开源产品的安装和使用需要有较高水平的运维人员来使用,需要自己来摸索适合的方式,针对性也不够强 。而且由于缺少支持,遇到问题解决起来比较麻烦 。
四、使用数据库系统自身的日志功能许多数据库的日志系统都带有慢查询记录功能,对于流量不大的系统,又不想投入大量金钱,可以先直接使用数据库日志来记录慢查询,然后定期汇总分析,持续优化应用程序系统 。一般用在开发期,或系统刚上线的试运行期 。
例如MySQL的慢查询日志,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中 。long_query_time的默认值为10,意思是运行10S以上的语句 。默认情况下,Mysql数据库并不启动慢查询日志,需要我们手动来设置这个参数,当然,如果不是调优需要的话,一般不建议启动该参数,因为开启慢查询日志会或多或少带来一定的性能影响 。
MySQL 慢查询的相关参数解释:Postgrsql也有类似的慢查询日志记录方式,PostgreSQL 日志支持的输出格式有 stderr(默认)、csvlog 、syslog 。一般的错误跟踪,只需在配置文件“postgresql.conf”简单设置几个参数,当然还有错误级别等要设置 。
slow_query_log :是否开启慢查询日志,1表示开启,0表示关闭 。
log-slow-queries :旧版(5.6以下版本)MySQL数据库慢查询日志存储路径 。可以不设置该参数,系统则会默认给一个缺省的文件host_name-slow.log
slow-query-log-file:新版(5.6及以上版本)MySQL数据库慢查询日志存储路径 。可以不设置该参数,系统则会默认给一个缺省的文件host_name-slow.log
long_query_time :慢查询阈值,当查询时间多于设定的阈值时,记录日志 。
log_queries_not_using_indexes:未使用索引的查询也被记录到慢查询日志中(可选项) 。
log_output:日志存储方式 。log_output='FILE'表示将日志存入文件,默认值是'FILE' 。log_output='TABLE'表示将日志存入数据库,这样日志信息就会被写入到mysql.slow_log表中 。MySQL数据库支持同时两种日志存储方式,配置的时候以逗号隔开即可,如:log_output='FILE,TABLE' 。日志记录到系统的专用日志表中,要比记录到文件耗费更多的系统资源,因此对于需要启用慢查询日志,又需要能够获得更高的系统性能,那么建议优先记录到文件 。
Postgresql 慢查询配置相关参数:
【如何对数据库中慢SQL进行快速定位?】logging_collector = on
log_destination = 'stderr'
log_directory = 'log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
查询控制台查看当前慢查询设置:
show log_min_duration_statement;
===>5s
推荐阅读
- 运维系统数据库升级到MGR小结
- 职场潜规则:如何杀死一个IT技术大牛?
- vim 技巧 及缩进
- PHP“垂死”十年
- 阿里云服务器是如何实现每台服务器都是公网IP的呢?
- Mysql亿级数据该如何优化?4大金刚 13太保
- 面试你应该知道的 MySQL 锁
- 黑子爆发对地球产生的影响可能是 恒星爆炸过程
- 被蛇咬怎么判断有毒无毒 如何判断毒蛇和无毒蛇
- 尤加利木,如何抚养尤加利