报错内容如下:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 5

内容概要

作为一名运维小哥,先后经历了没有DBA的技术团队,有DBA的技术团队,然后又回到了没有DBA的技术团队。当开发人员提交SQL执行需求,运维人员进行SQL执行后,出现SQL报错。根据简单的报错信息大概能定位到时SQL语法的不严谨或者语法性问题,但单从sql层面上来讲,作为一个没有DBA的技术团队,经常使用SQL的也就是开发人员,运维人员更多时候是一个sql执行的角色,所以作为运维的我,因为不是专业的DBA,不能明确的指出开发人员SQL的缺陷。

所以,当SQL执行出现问题,就变得有点意思了~

下面,请允许我还原下开车现场:

说明

企业所使用的服务器环境及服务等运维人员并没有全权掌控,确实存在不足。一部分是历史遗留原因;一部分是企业团队环境(企业在北京、上海、南京等多地设有子公司,致使有些东西难以做到全权统筹);同时作为运维小弟呢,光有一腔抱负,但却没有指点江山的职权,所以呢,有些事务确实难以推动。

我呢,也只能在其位,谋其职,做好分内之事,同时,有时也会厚着脸皮跟老大说一些自己对于某些运维事务的处理方式、处理思路及运维环境等见解。所以至于是不是白说,我自己也不是很清楚^_^

运维流程、运维事务处理方式的变更中的某些事务确实是牵一发而动全身,要改革,首先要自己能厚着脸皮说思想,其次要老大能心宽点头,接着要进行事务的推动(内容包括 运维与开发的对接信息内容、运维流程、事务处理手段等等),当中不仅需要坚定的劳苦付出,也存在着责任,存在着风险,即使说我来扛责任,但事实是我只是个微不足道的小角色,最终的担子会压在leader身上。不动没风险,只是机械劳作多点而已;而动了呢,动好了,在外行人眼里可能看不出来运维团队做的优化及其收益,提高了些许的工作效率,有些人也会觉得是理所应当。而动坏了,那就麻烦大了。所以当中的利弊,当中的难易,并非三言两语能说道明白。

所以呢,目前还是墨守成规的进行着运维操作~~

报错:

环境

a)运维团队及Leader在北京,我在上海负责相关上海的运维事务;

b)测试环境MySQL全权开发掌管及自用,生产环境运维管理。

角色

Me(运维,just me) Dev(开发) Cap(运维leader,我老大)

对白:

Me:Hi,你这SQL执行报错,语句有问题吧?

Dev:没有问题啊,我在测试环境执行都能成功的。

Me:但这确实是报错了啊,报错截图我给你了。

此刻空气凝固了10s左右 ~~~

Me:你这测试环境是怎么执行的?

Dev:用IDE工具。

Me:工具执行跟登陆数据库执行命令应该没区别吧,你这MySQL什么版本?

Dev:5.6

Me:生产环境是5.7,你确定不是版本差异导致的语法不兼容?

Dev:SQL没问题的,我本机的MySQL5.7执行都没问题。

Me:呃。。。那之前生产创建触发器出现这种情况咋处理的?

Dev:是Cap开启了数据库的某个全局权限,命令行执行SQL还是不行,但是我用IDE工具就成功了,所以之前是Cap开启全局权限,我这里执行。

Me:呃。。。那我问问。

Me:@Cap 老大,开发创建触发器的需求,需要开全局配置,之前我反映过开了那个可能会造成主从同步异常,所以上次你跟我说别随便开,那这次的需求咋处理?

Cap:先别开,你网上查查资料,处理下。

Me:好的,我琢磨下。。。

此刻我的内心读白:

开发说SQL没问题,但是生产环境执行确实报错了,报错提示说的是版本差异或者SQL语法的问题,我觉得Dev在胡乱开车,奈何的是我却没有证据(因为自身SQL水平有限)~~

好吧,硬着头皮找问题吧。

问题解决

笔者通过问题排错,资料查询,并将数据导入到测试环境的MySQL5.7版本,然后进行相关的触发器创建SQL执行测试并多次修改试验,最后成功捕获问题并解决。

以下是两种不同解决方案,前者是之前老大的修改全局配置权限的操作方式,后者是笔者的解决方式:

错误解决姿势

# 开启MySQL的某项权限

mysql > set global log_bin_trust_function_creators=1;

# 权限开启后并给对应库的操作权限账号,由开发通过IDE工具执行SQL,操作成功!

# log_bin_trust_function_creators 参数说明:

当二进制日志启用后,这个变量就会启用。它控制是否可以信任存储函数创建者,不会创建写入二进制日志引起不安全事件的存储函数。如果设置为0(默认值),用户不得创建或修改存储函数,除非它们具有除CREATE ROUTINE或ALTER ROUTINE特权之外的SUPER权限。 设置为0还强制使用DETERMINISTIC特性或READS SQL DATA或NO SQL特性声明函数的限制。 如果变量设置为1,MySQL不会对创建存储函数实施这些限制。此变量也适用于触发器的创建。

说明:

那么为什么MySQL有这样的限制呢? 因为二进制日志的一个重要功能是用于主从复制,而存储函数有可能导致主从的数据不一致。同时经过实操后也确实出现了主从同步数据异常情况,所以,切勿轻易修改 log_bin_trust_function_creators 参数的默认值!

正确解决姿势

# 修改MySQL命令执行默认分隔符

说明:

a)图中三部分红框内容为笔者添加;

b)第一框是修改数据库默认的分隔符,指定为 " // " ;

c)第二框是结束整条sql内容;

d)第三框是将分隔符改回到默认;

e)因sql语句中存在分号 ";" ,其用于整条sql内部的小断句,而MySQL默认的命令分隔符也是分号,故容易出现符号混淆,导致SQL执行异常。所以改变默认的命令行的分隔符用以区别分号,便能完美解决问题。

运维与开发的开车现场之MySQL5.7创建触发器报错解决过程的更多相关文章

  1. 1+X云计算平台运维与开发(中级)eNSP A~E卷 试题+答案

    1+X云计算平台运维与开发(中级)eNSP A~E卷 试题+答案 A卷 路由器管理(40分) 41 配置R1和R2路由器(路由器使用R2220),R1路由器配置端口g0/0/1地址为192.168.1 ...

  2. linux运维/自动化开发__目录

    服务器软件安装 nginx apache php mysql oracle tomcat memcached mongodb sqlserver 常用pc端工具安装使用 Xshell         ...

  3. MySQL运维及开发规范

    一.基础规范 (1) 使用INNODB存储引擎 (2) 表字符集使用UTF8 (3) 所有表都需要添加注释 (4) 单表数据量建议控制在5000W以内 (5) 不在数据库中存储图.文件等大数据 (6) ...

  4. eclipse开发Java web工程时,jsp第一行报错,如何解决?

    与myeclipse不同,eclipse开发java web项目时是要下载第三方软件(服务器)的,正是这个原因,很多初学者用eclipse学习java web的时候,总是会遇到一些小问题.其中常见的一 ...

  5. Eclipse + Pydev开发Python时import报错解决方法

    一.  原文链接:http://blog.csdn.net/lhanchao/article/details/51306626            用eclipse +PyDev开发python时, ...

  6. 微信公众号开发上传图文素材带有卡片小程序报错:errcode=45166,errmsg = invalid content hint

    微信公众号开发自从支持允许在群发图文中插入小程序,方便了小程序的运营及推广.最近在三方服务开发中,要支持图文素材插入小程序遇到了一个很是棘手的问题.官方给出的插入小程序的示例支持文字.图片.卡片.如下 ...

  7. redis运维与开发笔记

  8. 【运维】浪潮服务器一块硬盘显示红色Offline(或者Failed)解决办法

    [写在前面]           最近服务器不知道为什么总是出现故障,以前戴尔服务器硬盘出现故障,也就是说硬盘旁边的灯显示为红色的时候,一般情况下都是表示硬盘坏掉了,直接买一块新的硬盘,将坏掉的硬盘拿 ...

  9. 在android 中开发java.net.SocketException: socket failed: EACCES (Permission denied) 报错

    在android中下载文件,写好下载文件的代码后需要配置相应的权限 <uses-permission android:name="android.permission.INTERNET ...

随机推荐

  1. ansible剧本之playbook操作

    ansible 剧本 yaml介绍: 是一个编程语言 文件后缀名 yaml yml 数据对应格式: 字典: key: value 列表: [] - ansible-playbook命令格式 执行顺序: ...

  2. Mysql 性能优化及问题

    MySQL max_allowed_packet设置及问题 查看 max_allowed_packet show VARIABLES like '%max_allowed_packet%'; 以下内容 ...

  3. linux 安装swoole

    1.首先我们要安装swoole扩展的话,需要把它的包下载下来,下载地址是: https://github.com/swoole/swoole-src 2.下载下来之后进行解压: unzip swool ...

  4. python:枚举类型

    1.什么是枚举类型? 枚举类型可以看做是一系列常量的集合,通常用于表示某些有限且固定的集合,例如月份(一年有12个月).星期(一星期有七天).季节(一年四个季节)等. 2.枚举的定义 定义枚举首先要导 ...

  5. 长寿花:dp

    当然可以打组合数+CRT什么的,但是其实不必那么麻烦. 先讲那个思路,再转化过来吧. 首先可以发现的一个问题:所有颜色之间是没有区别的,所以我们其实并不在意到底是哪几种,我们只需要知道有几种就可以了. ...

  6. csps63总结

    这次考试还算可以(吧),暴力都没打满,但是还差很多. T1 强烈推荐我的打法,很好理解并且很好打(虽然稍长) 维护指针指向的值及其是第几个数,然后分类讨论. (诡异构造的序列==随机数据)?? #in ...

  7. Android Drawable 简析

    Drawable 是开发中经常用到的一个概念,我们经常用它去设置 View 的背景,背景可以一个颜色值,也可以是一张资源图片,还可以是一个自定义的 Drawable等等.这篇文章就简单说下 Drawa ...

  8. Ubuntu16.04安装Nginx+PHP5.6+MySQL5.6

    安装Nginx 1.首先添加nginx_signing.key(必须,否则出错) $ wget http://nginx.org/keys/nginx_signing.key $ sudo apt-k ...

  9. Go 基础学习笔记(6)| 变量、函数使用

    Go 变量定义与使用: 1.var 声明 (1)var identifier type                              如:var x  int =10 (2) var id ...

  10. 基于typedef的用法详解【转】

    也许新手用这个关键字不多,但它却是一个很有用的关键字,可以使代码模块化程度更好(即与其它代码的关联较少),在C++中还是实现Traits技术的基础,也是模板编程的基本语法之一. 若说变量定义是为变量命 ...