在工作中,总会出现这样那样的问题,遇到数据库方面的问题完全可以全权交给专业的DBA去帮你处理,但是自己写的sql、自己的环境还是要自己来掌握,只有知道了自己处理的环境的每一个细节,才能更好的优化、更好的发现问题、处理问题。
这里列举使用关系型数据库MySql中遇到的很多疑问,带着问题去处理,逐个击破,才能不断的进步,直至通关。武林中最高境界是忘掉一切,但是只有将所有问题了如指掌了然于胸融会贯通,才能达到忘我的最高境界。
本文只作为对于一个媛媛在开发中遇到的数据库方面问题的一个总结,只关注我关注的问题,非专业DBA,如有不妥,请专业人士多多指教。
参考书目:《高可用MySql》2015一版
处理性能问题应该遵循的一个非常重要的基本原理:
除非有深思熟虑的计划,并且相当了解变更后的期望和后果,否则永远不要更改服务器、数据库或者存储引擎的参数。更重要的是,如果没有评估变更的影响,永远不要做出改动。完全有可能发生这样的情况:你可能在短期内提高了服务器的性能,但是长远来看却对性能产生负面影响。
命令:
查看服务器的信息及其运行状态:
SHOW VARIABLES
SHOW STATUS
涉及很多变量(仅状态变量就超过290个),这些变量通常按照字母顺序列出,并根据功能分组。不过,有时候变量并不完全整洁有序。使用Like语句过滤能够产生系统特定方面的相关信息。如显示与线程运行相关的所有状态变量:
SHOW STATUS LIKE ‘%thread%’
SHOW INDEX FROM TABLE
描述表中的索引,确定是否使用了正确的索引
SHOW PLUGINS
列出所有已知插件,显示插件名称和当前状态。(Mysql最新版中的存储引擎是以插件形式实现的)
SHOW [FULL] PROVESSLIST
显示系统上运行的所有线程(包括处理客户端连接的线程)数据
上述命令可以作为诊断响应差的(太多线程),僵尸进程(无响应或长时间运行),或者诊断连接问题。
◆在处理低性能或者无响应的线程时,使用KILL(KILL thread id)命令中止这些线程。
◆必须有全局SUPER权限才能查看运行在系统上的所有进程。
SHOW [GLOBAL|SESSION] STATUS
显示所有系统变量的值,读取服务器的所有统计信息。
与GLOBAL或SESSION关键字结合使用,可以选择性查看全局变量的统计信息或者会话变量的统计信息
SHOW TABLE [FROM db] STATUS
显示给定数据库的表的详情,包括存储引擎、排序规则(collation)、创建数据、索引数据和行统计数据。与SHOW INDEX命令结合使用,能够在诊断低性能查询时检查表信息
与存储引擎相关的命令:
SHOW ENGINE engine_name LOGS
显示指定存储引擎的日志信息,该信息显示依赖于存储引擎,而且在优化存储引擎时非常有用。有些存储引擎不提供这些信息。
SHOW ENGINE engine_name STATUS
显示指定存储引擎的状态信息,该信息依赖于存储引擎。
SHOWENGINES
显示mysql发行版所有已知的存储引擎及其状态(如存储引擎是否启用)
这个命令有助于决定在数据库上使用何种存储引擎,以及复制时是否在master和slave上存在相同的存储引擎
与mysql复制相关的命令:
SHOW BINLOG EVENTS[IN log_file] [FROMpos] [LIMIT offset row_count]
显示被记录到二进制日志中的事件。
指定要审查的日志文件(如果没有In从句则默认使用当前日志文件),将输出限定为某个特定位置之后的所有事件,或者某个偏移位置之后的行。
这个命令用于诊断复制问题,当某个事件导致复制中断或者错误,此命令非常有用。
如果不使用LIMIT,而且服务器已经运行了一段事件并记录了日志,那么将会输出很长的结果,如果需要查看大量事件,需要考虑使用mysqlbinlog实用工具代替这个命令
SHOWBINARY LOGS
显示服务器上的二进制日志列表,获取过去和当前binlog文件名的相关信息及每个文件的大小
用于诊断复制问题,通过这个命令为SHOW BINLOG EVENTS指定日志文件,从而减少在诊断问题时必须查看的数据量
SHOWMASTER LOGS同义词
SHOW RELAYLOG EVENTS [IN log_file][FROM pos] [LIMIT offset row_count]
mysql5.5可用,功能同SHOW BINARY LOGS,是对slave上的中继日志而言,在master上运行无效
如果不指定日志文件名,默认显示第一个中继日志中的事件
SHOW MASTER STATUS
显示master的当前配置,显示当前二进制日志文件、文件的当前位置和所有排他性或包容性的复制设置。
当连接或重新连接slave时使用这个命令
SHOW SLAVE HOSTS
显示通过—report-host选项连接到master的slave列表,根据这个列表可以确定哪些slave连接到slave上
SHOW SLAVE STATUS
显示复制中slave的系统状态信息,追踪slave性能和状态的主要命令,这个命令显示了大量有关slave健康状态维护的重要信息
使查询在缓存中失效的事件:
◆数据或索引的变更
◆同一个查询的微小区别会产生不同的结果集,从而导致缓存未命中
◆当查询从临时表(不被缓存)中获取数据时
◆能够使内存中的查询无效的事务事件(如:COMMIT)
检查缓存的命令:
SHOW VARIABLES LIKE ‘%query_cache%’
检查have_query_cache变量,确定安装在mysql中的查询缓存是否被配置和是否可用,这是一个全局性的系统变量,使只读的。
影响查询缓存的一个设置:
query_cache_size:设置为0,临时并立即关闭查询缓存,并将缓存中的所有查询删除;如只设置query_cache_type=OFF还不够,因为这并不会释放查询缓存的缓冲区,必须同时设置query_cache_size=0才能够完全关闭查询缓存
mysqladmin实用工具:
是从命令行启动运行的,命令类似SQL命令
用途:可以关闭服务器、刷新日志、ping服务器、在复制中启动和关闭slave,刷新权限表
MYSQL工作台:
MYSQL工作台应用是基于工作站的GUI管理工具,在Mysql网站上可供下载,由mysql社区版(GPL)或标准版提供
主要功能:
◆服务器管理
◆SQL开发
◆数据建模
◆数据库迁移向导
Mysql服务器管理器:
查看和更改系统变量、管理配置文件、检查服务器日志、监控状态变量、以图形方式查看某些重要的性能数据,提供一组完整的管理选项,管理和查看数据库配置
如何使用mysql服务器管理器?
定义一个mysql服务器实例,“新建服务器实例”,然后按照步骤引导完成创建,过程中尝试连接服务器,验证提供的参数,确保这是一个有效的实例。建成后,会以方框的形式显示在主窗口的“服务器管理器”的下方
功能:
管理:提供服务器状态,启动和停止服务器、查看系统和状态变量,查看服务器日志
可通过服务器负载以及内存使用率的图,包括连接使用率、网络流量、查询缓存命中率和关键效率的图形,通过这些图,可以快速了解服务器的状态,如果任何一个图中有异常高的值(或者异常低的值,这种情况不常见),则可以此为线索检查性能问题
查看服务器日志:日志类型包括慢查询、常规、错误日志和按页轮流查看每个日志,可通过配置开启或关闭各类型的日志
读取日志文件时,需要权限,如果连接的是远程服务器(而不是本地主机),必须使用带有适当证书的SSH实例连接
安全:能够迅速查看服务器上定义的所有用户的权限
数据导出/恢复:封装了mysqldump的基本的数据导出和导入功能
第三方工具:
MySAR:系统活动报告,开源,与Linux的sar命令类似,综合了SHOWSTATUS、SHOW VARIABLES、SHOW FULL PROCESSLIST命令的输出结果,并将结果存储在服务器上的mysar数据库中
mytop:监控线程统计信息和mysql的常规性能统计信息,开源。列出一些常规统计信息,如主机名称、服务器版本、运行的查询数量、查询的平均执行时间、线程的总数量和其他统计信息。这些工具定期运行SHOW PROCESSLIST和SHOW STATUS命令,并像Linux的top一样以列表形式显示统计信息
InnoTop:系统活动报告,类top。专门监控InnoDB和mysql服务器的性能,主要用于监控事务、死锁、外键、查询活动、复制活动、系统变量的主要统计信息和主机的其他详情
InnoTop的使用很广泛,被认为是一种常用的性能监控工具。它拥有许多用于动态监控系统的功能,如果你主要使用InnoDB作为默认(或标准)存储引擎,并需要一个以文本模式运行的良好的监控工具,就选择Innotop
MySAR,mytop,InnoTop都是基于文本(命令行)的工具
MONyog:可以为安全和性能的主要组件设置参数,还包含有助于服务器性能调优的工具,还可以设置事件以监控特定参数,并在系统达到指定临界点时发出警告。
主要功能:
◆监控服务器资源
◆识别运行不佳的SQL语句
◆监控服务器日志(如错误日志)
◆实时监控查询性能,并识别长时间运行的查询
◆预警重大事件
mysql基准(benchmarking)测试套件:
为系统性能设置了期望,确定系统在某种负载(服务器处于轻负载、中等负载、高负载)下是运行定义良好的测试实例,并衡量和记录系统的统计信息。基准测试(perl开发)工具位于sql-bench文件夹中,通常包含在源码发行版中。
如果在某段时间内用户反映服务器变慢,如何知道服务器性能差?
假设已经检查了所有常规信息——内存、磁盘等,而所有这些信息都在正常范围内,没有出现错误和异常,这时,你怎么知道系统是否运行变慢?
使用基准测试:重新运行基准测试实例,如果执行结果过大(或者过小,具体取决于衡量指标),说明系统的性能没有期望的好