MySQL慢查询日志,看完你就会了

如何开启慢查询日志

1、查询查看慢查询日志是日志否开启

执行命令:show variables like slow%。

得到以下结果:

可以看到slow_query_log属性是看完OFF,处于关闭状态,查询那么我们需要先开启慢查询。日志

slow_query_log_file表示慢查询日志文件的看完存放路径,我们可以自定义文件路径:

set global slow_query_log_file = 路径。查询

2、日志开启慢查询日志

执行命令:set global slow_query_log = on。看完

然后再查询一下,查询发现slow_query_log处于开启状态:

开启了之后,日志是看完不是所有的查询都会记录在文件里呢?

当然不是,慢查询日志,查询顾名思义是日志只记录查询比较慢的语句,那问题又来了,看完怎么才算查询比较慢的语句呢?

实际上,这里会有一个标准值,而且这个标准值是可以由我们自己设定的。

3、慢查询的临界值设定

首先查看一下默认的临界值。云服务器

执行命令:show variables like %long%。

其中有一个long_query_time属性,它的值为10.000000。它表示的意思是,只记录查询时间在10s以上的语句。

显然10s我们是不可接受的,所以我们需要自己设定一下这个值。因为我自己的测试表中只有10w条数据,查询很快,所以这里我们设置的小一点。如果有条件的话,最好设置一个百万级的表进行测试。

我们把慢查询的临界值设置为0.02:set long_query_time=0.02。

可以看到现在临界值是0.02秒了。

现在来模拟查询时间小于0.01和大于0.01的两个查询,看是否都记录在了慢查询日志中。

然后看一下日志文件中的数据:

可以看到只有第二条查询的日志。企商汇

需要注意的是,我们上面的操作是在交互界面进行的,如果数据库进行重启,这些设置都会失效。如果要永久生效,需要修改配置文件:

复制vi /etc/my.cnf[mysqld]slow_query_log = 1long_query_time = 0.1slow_query_log_file =/usr/local/mysql/mysql_slow.log1.2.3.4.5.

在配置文件中加上这三行就可以了。主要要重启mysql才能生效!

慢查询语句解析

我们通过慢查询日志,可以定位到是哪一条语句查询比较慢,找到这条语句之后,如何去分析它慢的原因呢?最简单的方法,可以通过explain解析。

执行命令:explain (sql语句)。

我们把上面执行的两条语句放一起对比解析一下:

需要重点关注possible_keys、key、rows这几个属性值。

possible_keys表示该语句可能会用到的索引。

key表示该语句实际用到的索引。

rows表示该语句扫描的行数。

通过这些属性,我们可以大致的分析一下,高防服务器第一条语句没有走索引,它扫描了9万多行数据,所以查询速度比较慢,而第二条语句走了主键索引,仅仅扫描了一条语句,所以它的执行速度比较快。这样我们就可以快速定位到问题,然后针对性的去解决。

开启性能详情

如果通过上面的语句解析没有定位到问题,我该加的索引也加了,但是还是比较慢,那就可以通过性能详情来进一步的探究一下原因。

性能详情可以追踪查询语句的整个生命周期的状态,有了这些状态值,就可以从更深层次找出具体是哪个环节慢了,从而能针对性的进行改善。

1、查看性能详情是否开启

执行命令:show variables like %profiling%。

可以看到profiling属性值为OFF,表示关闭,那么我们先开启它。

执行命令:set profiling = on 。

这样就开启了。开启之后,我们就可以执行查询语句,mysql会自动的保存性能记录。

2、查看性能记录

我们执行一条sql语句:

然后查看性能记录:

执行命令:show profiles。

可以看到开启后的所有查询语句的记录。我们想查看一下第二条执行语句的整个执行周期的状态详情:

执行命令:show profile for query 2。

可以看到整个执行过程每个状态的耗时情况。然后定位到具体是哪个状态最耗时,然后针对性的排查原因。

官方也给出了每个状态的解释,具体可查看:

https://dev.mysql.com/doc/refman/5.7/en/general-thread-states.html。

系统运维
上一篇:电脑开机显示CPU风扇速度错误的原因和解决方法(探讨CPU风扇速度错误的问题以及如何修复)
下一篇:在之前的文章中, 我们讨论过如何在Linux服务器安装各种各样的打印机(当然也包括网络扫描仪)。今天我们将来处理另一端:如何通过桌面客户端来访问网络打印机/扫描仪。网络环境 在这个安装教程中,我们的服务器(Debian Wheezy 7.2版本)的IP地址是192.168.0.10,我们的客户端(Ubuntu 12.04版本)的IP地址是192.168.0.105.注意这两台机器是在同一个网段(192.168.0.0/24).假如我们想允许打印机访问其它网段,我们需要在服务器上修改cupsd.conf文件的以下部分: Order allow,deny Allow localhost Allow from XXX.YYY.ZZZ.*(在上述例子中,我们授予打印机从本地或者任何系统能够访问打印机,这些系统的IPv4地址以XXX.YYY.ZZZ开始。为了验证哪些打印机可以在我们的服务器上适用,我们也可以在服务器上使用lpstat命令,或者浏览网页https://192.168.0.10:631/printers page.root@debian:~# lpstat -a EPSON_Stylus_CX3900 accepting requests since Mon 18 Aug 2014 10:49:33 AM WARSTPDF accepting requests since Mon 06 May 2013 04:46:11 PM WARSTSamsungML1640Series accepting requests since Wed 13 Aug 2014 10:13:47 PM WARST在Ubuntu桌面安装网络打印机 在我们的Ubuntu 12.04的客户端,我们将打开Printing菜单(Dash ->Printing).你会注意到在其它发行版中,这个名字也许会有一点差别(例如会叫做Printers 或者 Print & Fax):还没有打印机添加到我们的客户端:下面是在Ubuntu桌面客户端安装一台网络打印机的一些步骤。1) “Add”按钮将弹出 New Printer 菜单。我们将选择Network printer ->Find Network Printer并输入我们服务器的IP地址,接着点击Find:2) 在最下面我们将会看到可使用的打印机的名称。我们来选择这台三星打印机并按Forward:3) 我们将会被要求填写一些关于我们打印机的信息。当我们输入完成时,将点击 Apply按钮。4) 我们接下来将被询问是否打印一张测试页。让我们点击Print test page吧:这个打印任务将被创建为本地id 2:5)适用我们服务器上的CUPS网络借口,我们可以观察到打印任务已经提交成功了(打印机 ->SamsungML1640系列 ->显示完成任务):我们也可以通过在打印机服务器上运行以下命令显示同样信息: root@debian:~# cat /var/log/cups/page_log | grep -i samsung SamsungML1640Series root 27 [13/Aug/2014:22:15:34 -0300] 1 1 - localhost Test Page - -SamsungML1640Series gacanepa 28 [18/Aug/2014:11:28:50 -0300] 1 1 - 192.168.0.105 Test Page - -SamsungML1640Series gacanepa 29 [18/Aug/2014:11:45:57 -0300] 1 1 - 192.168.0.105 Test Page - -这个page_log日志显示每一页被打印过的信息,只包括哪些用户发送这些打印任务,打印日期&时间,以及客户端的IPv4地址。要安装Epson喷墨和PDF打印机,我们只需重复第1-5的步骤即可,并每一次选择左边的打印队列。例如,在下图中选择PDF打印机:然而,请注意到根据CUPS-PDF 文档中,根据默认:PDF文件将会被放置在打印作业的所有者命名的子目录内。在这个案例中,打印作业的所有者不能被识别(i.e.不会存在服务器中)输出的内容被放置在匿名操作的文件中。这些默认的文件夹可以通过改变在/etc/cups/cups-pdf目录中的Out值和AnonDirName变量来修改。这里,${HOME}被扩展到用户的家目录中:Out ${HOME}/PDFAnonDirName /var/spool/cups-pdf/ANONYMOUS网络打印实例 实例 #1 从Ubuntu12.04中打印,通常在本地用gacanepa(具有相同名字存在打印机服务器上)。打印到PDF打印机之后,让我们来检查打印机服务器上的/home/gacanepa/PDF目录下的内容:root@debian:~# ls -l /home/gacanepa/PDF total 368-rw------- 1 gacanepa gacanepa 279176 Aug 18 13:49 Test_Page.pdf-rw------- 1 gacanepa gacanepa 7994 Aug 18 13:50 Untitled1.pdf-rw------- 1 gacanepa gacanepa 74911 Aug 18 14:36 Welcome_to_Conference_-_Thomas_S__Monson.pdf这个PDF文件被创建时的,权限已经设置为600(-rw-------),这意味着只有打印任务的所有者(在这个例子中是gacanepa )可以访问它们。我们可以通过修改the /etc/cups/cups-pdf.conf文件UserUMask变量的值来改变这种行为。例如,0033的umask值将可以使PDF打印者以及其它所有者拥有创建文件的权限,但是只读权限也会赋予给其它所有者。 root@debian:~# grep -i UserUMask /etc/cups/cups-pdf.conf ### Key: UserUMaskUserUMask 0033对于那些不熟悉umask(有名用户文件创建模式掩码),它作为一组可以用于控制那些为新文件创建时修改默认权限。给予特定的umask值,在计算最终文件的许可权限时,在文件基本权限(0666)和umask的单项按位补码之间进行按位布尔 AND 运算。因此,假如设置一个umask值为0033,那么新文件默认的权限将不是(0033)AND 0666 = 644的值(文件拥有者具有读/写/执行的权限,其他人拥有只读权限)。实例 #2 在Ubuntu12.04执行打印,本地登录用户为jdoe(同样的帐号名称但是服务器上是不存在的)。 root@debian:~# ls -l /var/spool/cups-pdf/ANONYMOUS total 5428-rw-rw-rw- 1 nobody nogroup 5543070 Aug 18 15:57 Linux_-_Wikipedia__the_free_encyclopedia.pdf这个PDF被创建时赋予的权限是666(-rw-rw-rw-),这意味着每个人都可以访问它们。我们可以通过编辑在/etc/cups/cups-pdf.conf文件中的AnonUMask值来改变这种行为。在这一点上,你也许会疑惑:为什么同样安装一台网络打印机,大多数(当然不是全部)当前的Linux桌面发行版都会内置一个打印到文件的功能来允许用户动态创建PDF文件?使用一台网络PDF打印机有以下好处:一个网络打印机(任何类型的)允许你直接从命令行直接打印,无需首先打开文件。在其它操作系统上安装一个网络客户端,一个PDF网络打印机备件,于是系统管理员不必再单独需要安装PDF创建者实用程序(也避免了最终用户安装这些工具存在的风险)。网络PDF打印机允许通过配置权限直接打印一个网络共享,如我们所见的例子。在Ubuntu桌面安装一个网络扫描仪 这里是通过Ubuntu桌面客户端安装和访问一台网络扫描仪的一些步骤。假设网络扫描仪服务器已经启动并运行所述here.1)让我们第一步来检查在我们的Ubuntu客户端主机上是否存在一台可用的扫描仪。没有先前的安装,你将会看到信息提示没有识别到扫描仪. $ scanimage -L2) 现在我们需要启用saned进程,用来预装Ubuntu桌面。要启用它,我们需要编辑/etc/default/saned文件,并设置RUN变量为yes:$ sudo vim /etc/default/saned # Set to yes to start sanedRUN=yes3) 让我们编辑/etc/sane.d/net.conf文件,并在扫描仪安装后添加服务器IP地址:4) 重启saned进程:$ sudo service saned restart 5) 现在让我们来看看扫描仪是否可用: 现在我们可以打开Simple Scan(或者其它扫描工具)并开始扫描文件。我们可以旋转,修剪,和保存生成的图片:总结 拥有一或多台网络打印机或扫描仪在任何办公和家庭网络中都是非常方便适用的,并同时提供了许多好处。例举如下:多用户(从不同的平台/地方)都能够向打印机发送打印作业的队列。由于硬件共享达到了节约成本和维护的作用。我希望该文可以帮助你更充分地利用这些有点。