运维与开发的开车现场之MySQL5.7创建触发器报错解决过程
报错内容如下:
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+X云计算平台运维与开发(中级)eNSP A~E卷 试题+答案
1+X云计算平台运维与开发(中级)eNSP A~E卷 试题+答案 A卷 路由器管理(40分) 41 配置R1和R2路由器(路由器使用R2220),R1路由器配置端口g0/0/1地址为192.168.1 ...
- linux运维/自动化开发__目录
服务器软件安装 nginx apache php mysql oracle tomcat memcached mongodb sqlserver 常用pc端工具安装使用 Xshell ...
- MySQL运维及开发规范
一.基础规范 (1) 使用INNODB存储引擎 (2) 表字符集使用UTF8 (3) 所有表都需要添加注释 (4) 单表数据量建议控制在5000W以内 (5) 不在数据库中存储图.文件等大数据 (6) ...
- eclipse开发Java web工程时,jsp第一行报错,如何解决?
与myeclipse不同,eclipse开发java web项目时是要下载第三方软件(服务器)的,正是这个原因,很多初学者用eclipse学习java web的时候,总是会遇到一些小问题.其中常见的一 ...
- Eclipse + Pydev开发Python时import报错解决方法
一. 原文链接:http://blog.csdn.net/lhanchao/article/details/51306626 用eclipse +PyDev开发python时, ...
- 微信公众号开发上传图文素材带有卡片小程序报错:errcode=45166,errmsg = invalid content hint
微信公众号开发自从支持允许在群发图文中插入小程序,方便了小程序的运营及推广.最近在三方服务开发中,要支持图文素材插入小程序遇到了一个很是棘手的问题.官方给出的插入小程序的示例支持文字.图片.卡片.如下 ...
- redis运维与开发笔记
- 【运维】浪潮服务器一块硬盘显示红色Offline(或者Failed)解决办法
[写在前面] 最近服务器不知道为什么总是出现故障,以前戴尔服务器硬盘出现故障,也就是说硬盘旁边的灯显示为红色的时候,一般情况下都是表示硬盘坏掉了,直接买一块新的硬盘,将坏掉的硬盘拿 ...
- 在android 中开发java.net.SocketException: socket failed: EACCES (Permission denied) 报错
在android中下载文件,写好下载文件的代码后需要配置相应的权限 <uses-permission android:name="android.permission.INTERNET ...
随机推荐
- Web for pentester_writeup之File Include篇
Web for pentester_writeup之File Include篇 File Include(文件包涵) Example 1 加一个单引号 从报错中我们可以获取如下信息: 当前文件执行的代 ...
- Vim 自定义补全利器 Snippet
Vim Snippet 设置 本人是 vim 用户,可以说能不用 IDE 就不用 IDE. Snippet 是一种支持用户自定义补全的需求,在 vim 中,可以使用 UltiSnips 和 Vim-S ...
- 【Java必修课】String.intern()原来还能这么用(原理与应用)
1 简介 String.intern()是JDK一早就提供的native方法,不由Java实现,而是底层JVM实现,这让我们对它的窥探提高了难度.特别是在Oracle收购了Sun公司后,源代码不开源了 ...
- LNMP下zabbix_server安装部署二
上一篇中搭建完成了zabbix的web端,但是虚拟机有点问题,所以转到笔记本上来写笔记本环境 server:192.168.112.9 agent:192.168.112.8 上一篇中完成了web ...
- nginx篇最初级用法之访问认证
1打开conf下的配置文件 在server 之下 location 之上加入 auth_basic "Input Password:"; 弹出的提示信息 auth_basic ...
- CSPS模拟 46
勿忘国耻. 由于重新评测我看到了不是很真实的一幕 紧接着是更不真实的一幕 就在虚假形象快要建立完成的时候 它由于来自东方的神秘力量倒塌了 被两个学校的大佬爆踩了(捂脸 T1 无脑背包? 考试时想1h想 ...
- PHP关于access_token失效问题
PHP关于access_token失效问题 有时候PHP设置了缓存 明明就是没有过期 但却提示失效这情况一般就是1 多个appid和secrete 生成的access_token互相覆盖了 所以 这种 ...
- SD-WAN 本地策略与中心策略配置(三)
目录 1. Localized Policy配置 2. Centralized Policy配置 3. Application Route and Traffice Policy 1. Localiz ...
- 实现支持多用户在线的FTP程序(C/S)
1. 需求 1. 用户加密认证 2. 允许多用户登录 3. 每个用户都有自己的家目录,且只能访问自己的家目录 4. 对用户进行磁盘分配,每一个用户的可用空间可以自己设置 5. 允许用户在ftp ser ...
- CentOS 6.4 configure error的解决方法
资料来源:http://blog.sina.com.cn/s/blog_62426dcf0100f2rz.html 虽然上面的文章是针对centOS 5写的,不过经测试也可用于centOS6.4. 自 ...