接上一篇
整体需求是mysql数据库插入一条数据,触发触发器事件,调用shell脚本,向其他服务器转发插入的数据内容。
关于mysql触发器执行shell脚本的过程,网上有很多很详细,不再赘述。
但我遇到了一个很特别的问题,在网上找了很久,发现似乎没人和我一样遇到同样问题的!!!
在mysql里执行网络命令如curl或者调用shell脚本中执行网络命令curl或者ping,只要是需要通过tcp/ip对外访问的,一律执行失败。
如在mysql中执行select sys_exec("curl http://www.baidu.com");
报错:
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 2
Current database: *** NONE ***
ERROR 1054 (42S22): Unknown column 'curl' in 'field list'
这个原因搞了好半天才知道是以为sql语句里 输入类似 / 符合需要加转义符。正确方式是:
select sys_exec("curl http:\/\/www.baidu.com");
不过如果命令在shell脚本中执行不需要转义符。
转义符问题解决了,但是还是继续报错:ERROR 2013 (HY000): Lost connection to MySQL server during query
检查/var/log/mysqld.log 显示:
/usr/sbin/mysqld: ready for connections.
Version: '5.7.32' socket: '/var/lib/mysql/mysql.sock' port: 3306 MySQL Community Server (GPL)
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
^M 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0curl: (7) Failed to connect to 61.135.185.32: Permission denied
07:45:18 UTC - mysqld got signal 11 ;
于是我开始怀疑防火墙事,于是我把防火墙关闭
systemctl stop firewalld
依旧报错
于是我尝试着再把selinux关闭
vim /etc/selinux/config
SELINUX=disabled
重启,通了,哈哈。。。
继续把防火墙开启,还是通的,问题找到了,就是selinux作祟。
这里在做一下提醒,调用shell脚本,如果脚本中要有写入文件的命令需要,给要写入的文件分配mysql用户的写入权限,否则会报错。