记一次由mysql触发器引发的故障


上周六到公司上班,刚坐下没多久,公司业务传过消息说,用户borrow表信息无法更新。查看网站报错如下:

报错信息表示是由于mysql的函数和触发器引起的,问了下公司开发,他们表示函数功能已经测试上线好久了,没有问题,而触发器是这周刚上的。于是,赶紧进入生产的DB服务器进行查看:如上,总共有11条触发器。为了不影响业务,我决定先将触发器备份,然后将其删除。这里复习下mysqldump命令:这个是默认值,mysqldump默认会导出触发器。(如果不想备份触发器使用–skip-triggers即可)导出存储过程以及函数。不创建建库语句,只对数据进行导出。不导出数据,只导出表结构。不导出建表语句,只导出数据。可以看到触发器已经备份好了。因为当时情况紧急,首要任务是将业务恢复,所开发云主机域名以就把触发器全部删除了。
删除暂时没找到批量的方法,还好数据只有11条,一条一条删吧。至此,业务终于恢复了。1,MySQL触发器属于隐式调用,往往会在你不知道的情况下做出许多操作,从而增加系统的复杂程度。
2,复杂MySQL触发器会嵌套使用,这就有可能产生死锁,本例就是个印证,borrow表触发插入其他表,而插入其他表的操作又会触发borrow表更新,这就产生了死锁,导致borrow表无法被更新。触发器是一种与表操作有关的数据库对象,当触发器所在表上出现指定事件时,将调用该对象,即表的操作事件触发表上的触发器的执行。
触发器语法:trigger_name:触发器名称
trigger_time:触发器触发时机(BEFORE/AFTER)
trigger_event: 触发事件(INSERT,UPDATE,DELETE)
table_name: 建立触发器的表名称
trigger_statement: 触发器程序体,可以为单一的SQL语句,也可以是包含BEGIN,END在内的多条语句。
FOR EACH ROW: 行级触发参考文章:
https://www.cnblogs.com/duodushu/p/5446384.html

相关推荐: glibc方式安装mysql

下载安装包 mysql-5.6.38-linux-glibc2.12-x86_64.tar.gz创建mysql用户useradd -r mysql -s /sbin/nologin解压文件tar -zxvf mysql-5.6.38-linux-glibc2.…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 06/04 18:44
下一篇 06/04 18:44

相关推荐