如何在Linux系统安装lib_mysqludf_sys解决MySQL sys_exec不存在报错
*安全提示:lib_mysqludf_sys允许MySQL直接执行操作系统命令,存在极高的安全隐患,非特殊必要不建议使用。生产环境优先使用监听binlog、插入数据后发送消息到消息队列触发脚本等更安全的方案替代该逻辑。
lib_mysqludf_sys Linux 环境安装步骤
- 第一步:安装编译依赖
Debian/Ubuntu 发行版执行:apt update && apt install -y git gcc make libmysqlclient-dev
CentOS/RHEL 发行版执行:yum install -y git gcc make mysql-devel - 第二步:获取并进入源码目录
拉取lib_mysqludf_sys开源源码后进入对应文件夹。 - 第三步:查询MySQL插件存储路径
登录MySQL执行命令查询插件目录,后续编译好的库文件需要放到该路径下:show variables like 'plugin_dir';
常见路径为/usr/lib/mysql/plugin/或者/usr/lib64/mysql/plugin/,以实际查询结果为准。 - 第四步:编译生成动态库文件
64位系统执行编译命令:gcc -fPIC -Wall -I/usr/include/mysql -shared -o lib_mysqludf_sys.so lib_mysqludf_sys.c
32位系统执行编译命令:gcc -fPIC -Wall -I/usr/include/mysql -m32 -shared -o lib_mysqludf_sys.so lib_mysqludf_sys.c
如果MySQL头文件不在默认/usr/include/mysql路径,可以将命令中该路径替换为实际的头文件存储路径。 - 第五步:部署动态库到MySQL插件目录
将编译生成的lib_mysqludf_sys.so移动到之前查询到的插件目录下,示例:mv lib_mysqludf_sys.so /usr/lib/mysql/plugin/
给库文件添加可执行权限:chmod 755 /usr/lib/mysql/plugin/lib_mysqludf_sys.so - 第六步:MySQL中注册sys_exec函数
登录MySQL执行以下语句完成函数注册:CREATE FUNCTION sys_exec RETURNS INT SONAME 'lib_mysqludf_sys.so'; CREATE FUNCTION sys_eval RETURNS STRING SONAME 'lib_mysqludf_sys.so'; - 第七步:验证安装结果
执行测试命令验证函数是否可用:SELECT sys_exec('echo test > /tmp/mysql_udf_test.txt');
若命令执行无报错,且系统/tmp目录下生成了mysql_udf_test.txt文件,说明安装成功。
常见报错排查
- 编译时报找不到
mysql.h:确认已安装对应MySQL开发依赖包,若MySQL是自定义路径安装,修改编译命令中的头文件路径为实际路径即可。 - 注册函数时提示
cannot open shared library:检查库文件是否放在正确的插件目录下,以及MySQL运行用户是否有该文件的读取执行权限。 - 触发器调用脚本无效果:确认触发器中Python解释器和脚本都写了绝对路径,同时MySQL运行用户(通常为mysql)对脚本有执行权限,对脚本涉及的其他目录文件有对应读写权限。
内容的提问来源于stack exchange,提问作者Murtada Altarouti
相关产品推荐
相关产品推荐

