Ubuntu18.04之mysqludf函数sys_exec/sys_eval函数执行不成功的解决方案

前言

最近有一个需求需要在mysql触发器中调用外部脚本文件,废了一些力气在Ubuntu上装好了mysqludf之后开始测试

然鹅,事情并没有想象的那么顺利

来看一下情景回放

1. 安装mysqludf

先从Github把项目荡下来:

https://github.com/mysqludf/lib_mysqludf_sys

解压文件,编译文件,这里特别说一下,网上说install.sh运行时会报错,第一次报错是因为没有安装库,

sudo apt install libmysqlclient-dev

第二次报错是因为没有权限,所以,

sudo ./install.sh

如此,就不需要在复制so文件到plugin目录下了

然后在我们荡下来的文件中有一个sql文件,登录mysql,执行sql文件中的内容来创建udf函数,

mysql>

DROP FUNCTION IF EXISTS lib_mysqludf_sys_info;
DROP FUNCTION IF EXISTS sys_get;
DROP FUNCTION IF EXISTS sys_set;
DROP FUNCTION IF EXISTS sys_exec;
DROP FUNCTION IF EXISTS sys_eval;

CREATE FUNCTION lib_mysqludf_sys_info RETURNS string SONAME 'lib_mysqludf_sys.so';
CREATE FUNCTION sys_get RETURNS string SONAME 'lib_mysqludf_sys.so';
CREATE FUNCTION sys_set RETURNS int SONAME 'lib_mysqludf_sys.so';
CREATE FUNCTION sys_exec RETURNS int SONAME 'lib_mysqludf_sys.so';
CREATE FUNCTION sys_eval RETURNS string SONAME 'lib_mysqludf_sys.so';

执行完之后我们来试一下,

mysql>

SELECT sys_eval('Hello mysql udf!');

+----------------------------------+
| sys_eval('echo hello mysql udf') |
+----------------------------------+
|                                  |
+----------------------------------+
1 row in set (0.00 sec)

???不对啊,剧本不是这样写的啊,不论试多少次都是一样的!

搞了我两天,终于!在Google上找到了答案

原文地址:https://github.com/mysqludf/lib_mysqludf_sys/issues/4

经过对比发现楼主和我遇到了同样的问题,下面有一位大佬给出了解答,

https://www.cyberciti.biz/faq/ubuntu-linux-howto-disable-apparmor-commands/

这里说需要关闭 apparmor_status 这个东西,别问我这是啥,我也不知道~

上命令,

sudo ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/
sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.mysqld

然后重启mysql,

sudo service mysql restart

再来试试,

mysql> SELECT sys_eval('echo hello mysql udf');
+----------------------------------+
| sys_eval('echo hello mysql udf') |
+----------------------------------+
| hello mysql udf
                 |
+----------------------------------+
1 row in set (0.00 sec)

and it works!!!

你可能感兴趣的:(Ubuntu)