• 1
  • 2
  • 3
  • 4
  • 5
mysql数据库问题 首 页  »  帮助中心  »  数据库  »  mysql数据库问题
MySQL排错指南之语法错误
发布日期:2016-4-23 23:4:51

  MySQL排错指南之语法错误

  一、语法错误

  语法错误虽然听起来十分简单,但是仍可能很难发现。我建议你像处理其他问题一样,要非常细心地查找可能出现的SQL语法错误。

  类似如下所示的这种错误,是很容易被发现,如图1所示:

  

图1

  在图2所示的这个示例中,很显然用户少转入了个“m”,错误消息也很清楚(输出结果根据页面设置进行宽度调整),如图2所示:

  

图2

  令人遗憾的是,并不是所有的语法错误都这么显而易见。以前我处理过一个问题,它的查询语句如下面所示:

  

图3

  这是一个由于版本迁移导致的问题;该语句在5.0版本中运行正常,但在5.1版本中出现错误。出现问题的原因在于,“accessible”在5.1版本中是一个保留字。给该语句加上引号(反引号还是双引号取决于你的SQL格式),即可重新正常运行,如下面所示:

  

图4

  在实际场景中的查询语句看起来可能十分繁琐,包括大段的JOIN与复杂的WHERE条件。因此,即使是简单的错误在其他大量语句的干扰下也很难被查找出来。我们当时第一步的任务就是简化复杂的查询,使它变成像刚才看到的那样只有一行SELECT的语句。这就是一个最简化测试的示例。当我们看到简化后只有一行的语句也有同样的bug时,我们就能很快意识到原有程序是因为保留字的问题而产生了错误。

  第一教训就是教你把检查查询的语法错误作为排错的第一步。

  但当你不知道查询是什么样的时候应该怎么办?比如,查询是由应用程序自动生成的,或在存储库中由第三方库动态生成的。

  考虑下面所示的PHP代码:

  

图5

  从上面所示的这段脚本中很难直接定位错误。然而,幸运的是,我们可以通过调整代码使输出函数打印查询语句。在PHP语言中,可以使用echo运算符。所以,如下面所示这样修改代码:

  

图6

  当程序输出将要提交的语句的时候,就有问题暴露出来了,如图7所示:

  

图7

  若你仍然没有发现错误,你可以在MySQL命令行客户端中尝试执行下面所示的这个查询:

  

图8

  问题在于每一行都少了一个右单引号。返回PHP代码,只需要下面所示的把:

  

图9

  改为:

  

图10

  即可。

  所以,一个重要的调试技巧是,始终尝试查看MySQL服务器最终接收到的查询。不要仅调试应用程序代码,要获取查询语句!

  令人遗憾的是,你不可能始终使用输出函数。例如,我之前提到的那个场景,SQL语句是在编译好的第三方库中生成的。你的应用程序可能只是使用了库提供的高级的抽象接口,比如CRUD(新建、读、更新、删除)接口。或在生产环境下,你不希望用户看到在使用特定参数对特定查询进行测试时的查询。在这种情况下,可以检查MySQL的通用查询日志。这里我们用一个新示例来说明其是如何工作的。

  下面是一段有问题的PHP代码,如图11所示:

  

图11

  这段代码更新了例1中定义的表。

  例1 一般问题情形的示例表

  

图12

  现在启用通用查询日志。该日志包含MySQL服务器接收到的每条独立查询。很多产品不会在日常运行中使用该日志,因为它在高负载的情况下增长十分迅速,并且写入日志会消耗MySQL服务器的资源,这些资源很可能用于更重要的用途。从MySQL5.1版本开始,你可以临时打开通用查询日志,方便随时记录你需要的查询。可以通过下面所示的命令来打开日志如图13所示:

  

图13

  也可以将日志记录在表中,这可以帮你方便地分类索引日志文件项,原因是你可以像查询其他表一样访问查询日志表:

  

图14

  现在可以运行应用程序。经过迭代地执行问题代码后,查询通用日志记录表,以查找有问题的查询,如图15所示:

  

 

  

 

  注意上述代码中2.row中的查询语句,如图16所示:

  

图16

  错误再次显而易见:在语句的结尾有个多余的逗号。这个问题是由下面这部分PHP代码产生的:

  

图17

  若字符串确实是以逗号结尾的,那么rtrim函数本应移除结尾的逗号。但是现在这行实际上是以空格结尾的,所以rtrim函数没有移除任何字符。

  既然我们已经发现了应用程序中产生错误的原因,我们就可以关闭通用查询日志.如图18所示:

  

图18

  在这节,我们学到了一些重要的东西:

  语法错误可能是导致一些现实问题的原因;

  你应该测试与MySQL服务器接收到的请求完全一致的查询;

  编程语言的输出函数和通用查询日志可以帮助你快速定位由应用程序发送到MySQL服务器的查询的问题。

  本文摘自《MySQL排错指南》

  

图19

  关于这本书的说明:

  •   《MySQL排错指南》由Oracle公司的技术支持工程师编写,详细阐述了MySQL故障诊断及处理中的知识,教会读者如何深入浅出地定位、分析并解决各种MySQL数据库的故障。
  •   《MySQL排错指南》共分为7章,其内容涵盖了解决MySQL问题的基本技巧、MySQL中的并发问题、服务配置的影响、MySQL硬件和运行环境相关的问题、复制备份中的故障排除、故障排除使用的技术和工具,以及一些MySQL故障排除的最佳实践。
  •   本书的附录中还包含了可以帮助读者解决MySQL疑难问题的一些有用资源。《MySQL排错指南》适合MySQL数据库开发及运维人员阅读。