【问题标题】:UDF result errorUDF 结果错误
【发布时间】:2013-08-14 11:00:46
【问题描述】:

我尝试安装“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 中的以下修改来解决它:

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”来创建文件,但没有结果

那么,我应该怎么做才能正确运行这些功能? 问候

【问题讨论】:

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


    【解决方案1】:

    谢谢罗兰。

    所以,我的问题的答案是“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 目录。所以我不能从任何目录创建文件或运行脚本。

    所以解决办法是给apparmor添加权限,让mysql访问新的数据目录。

    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”
    

    我希望这对某人有所帮助。

    遵守

    【讨论】:

    • 非常感谢..您的回答很有帮助:)
    【解决方案2】:

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

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

    HTH。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多