运维与开发的开车现场之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 ...
随机推荐
- ansible剧本之playbook操作
ansible 剧本 yaml介绍: 是一个编程语言 文件后缀名 yaml yml 数据对应格式: 字典: key: value 列表: [] - ansible-playbook命令格式 执行顺序: ...
- Mysql 性能优化及问题
MySQL max_allowed_packet设置及问题 查看 max_allowed_packet show VARIABLES like '%max_allowed_packet%'; 以下内容 ...
- linux 安装swoole
1.首先我们要安装swoole扩展的话,需要把它的包下载下来,下载地址是: https://github.com/swoole/swoole-src 2.下载下来之后进行解压: unzip swool ...
- python:枚举类型
1.什么是枚举类型? 枚举类型可以看做是一系列常量的集合,通常用于表示某些有限且固定的集合,例如月份(一年有12个月).星期(一星期有七天).季节(一年四个季节)等. 2.枚举的定义 定义枚举首先要导 ...
- 长寿花:dp
当然可以打组合数+CRT什么的,但是其实不必那么麻烦. 先讲那个思路,再转化过来吧. 首先可以发现的一个问题:所有颜色之间是没有区别的,所以我们其实并不在意到底是哪几种,我们只需要知道有几种就可以了. ...
- csps63总结
这次考试还算可以(吧),暴力都没打满,但是还差很多. T1 强烈推荐我的打法,很好理解并且很好打(虽然稍长) 维护指针指向的值及其是第几个数,然后分类讨论. (诡异构造的序列==随机数据)?? #in ...
- Android Drawable 简析
Drawable 是开发中经常用到的一个概念,我们经常用它去设置 View 的背景,背景可以一个颜色值,也可以是一张资源图片,还可以是一个自定义的 Drawable等等.这篇文章就简单说下 Drawa ...
- Ubuntu16.04安装Nginx+PHP5.6+MySQL5.6
安装Nginx 1.首先添加nginx_signing.key(必须,否则出错) $ wget http://nginx.org/keys/nginx_signing.key $ sudo apt-k ...
- Go 基础学习笔记(6)| 变量、函数使用
Go 变量定义与使用: 1.var 声明 (1)var identifier type 如:var x int =10 (2) var id ...
- 基于typedef的用法详解【转】
也许新手用这个关键字不多,但它却是一个很有用的关键字,可以使代码模块化程度更好(即与其它代码的关联较少),在C++中还是实现Traits技术的基础,也是模板编程的基本语法之一. 若说变量定义是为变量命 ...