UDF结果错误

时间:2013-08-14 11:00:46

标签: mysql linux shell triggers user-defined-functions

我尝试安装“mysqludf_sys”。 但我得到了这个错误:

ERROR 1126 (HY000) at line 29: Can't open shared library 'lib_mysqludf_sys.so' (errno: 0 /usr/lib/mysql/plugin/lib_mysqludf_sys.so: cannot open shared object file: No such file or directory)
ERROR: unable to install the UDF

所以,我尝试用Makefile中的以下mofification来解决它:

LIBDIR=/usr/lib to LIBDIR=/usr/lib/mysql/plugin

还要确保gcc具有-fPIC选项,即:

gcc -fPIC -Wall -I/usr/include/mysql -I. -shared lib_mysqludf_sys.c -o $(LIBDIR)/lib_mysqludf_sys.so

但是当我测试sys_eval时,我得到:

mysql> SELECT sys_eval('id');
+----------------+
| sys_eval('id') |
+----------------+
|                |
+----------------+
1 row in set (0.02 sec)

我应该得到:

mysql> SELECT sys_eval('id');
+-------------------------------------------------+
| sys_eval('id')                                  |
+-------------------------------------------------+
| uid=105(mysql) gid=108(mysql) groups=108(mysql) |
+-------------------------------------------------+
1 row in set (0.01 sec)

我测试过“sys_exec”也创建了一个文件但没有结果

那么,我该怎么做才能正确运行这些功能呢? 此致

2 个答案:

答案 0 :(得分:3)

谢谢罗兰。

所以,我的问题的答案是“AppArmor”。

来自维基百科:

AppArmor允许系统管理员将每个程序与一个限制该程序功能的安全配置文件相关联。它通过提供强制访问控制(MAC)来补充传统的Unix自主访问控制(DAC)模型。

由于Ubuntu Hardy,MySQL 5.0服务器软件包还包含一个AppArmor配置文件(/etc/apparmor.d/usr.sbin.mysqld),它限制了MySQL服务器的功能,比如调用UDF来执行命令。

因此,为了让MySQL运行Linux命令,我应该更改AppArmor中MySql的安全级别。

[root@xxx ~]# aa-complain /usr/sbin/mysqld 

要了解AppArmor的状态:

 [root@xxx ~]# aa-status 

通过这种配置,我可以执行sys_eval和sys_exec。但那仍然局限于mysql目录。所以我无法从任何目录创建文件或运行脚本。

因此,解决方案是为mysql的apparmor添加权限以访问新的数据目录。

sudo vi /etc/apparmor.d/usr.sbin.mysqld

添加:

/newdir/ r,
/newdir/** rwk,

重启服务器:

sudo /etc/init.d/apparmor restart
sudo /etc/init.d/mysql restart

如果仍然无效,请检查nix权限,确保mysql是递归的新目录的所有者和组。

chown -R mysql:mysql “new datadir path”

我希望能帮助别人。

阿比德

答案 1 :(得分:1)

您正在调用的id应该是可执行文件。脚本通常本身不可执行,您应该修改该行以读取bash path/to/script.sh,以使其成为有效的可执行命令行。

此外,有很多关于sys_exec和朋友因为应用程序装甲设置而无法正常工作的报告。检查app armor是否已启用,如果已启用,请修改其配置以允许运行udfs。

HTH。