前言
最近有一个需求需要在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!!!