引言
介绍
我们采用lib_mysqludf_sys这个库来实现
直接使用 https://github.com/mysqludf/lib_mysqludf_sys 上面的库会报错
mysql> create function sys_eval returns string soname 'lib_mysqludf_sys.so'; ERROR 1126 (HY000): Can't open shared library 'lib_mysqludf_sys.so' (errno: 11 /u01/gnway/mysql/lib/plugin/lib_mysqludf_sys.so: wrong ELF class: ELFCLASS32)
错误的意思是:我们使用了32位的动态库在64位系统上。
这年头谁还用32位啊??
只能重新编译一个64位版本的了!
手动编译
文件列表
lib_mysqludf_sys有这么几个文件
-rw-r--r-- 1 root root 168 Dec 27 16:38 Makefile -rwxr-xr-x 1 root root 1544 Feb 21 2013 install.sh -rw-r--r-- 1 root root 7715 Feb 21 2013 lib_mysqludf_sys.c -rw-r--r-- 1 root root 9934 Feb 21 2013 lib_mysqludf_sys.html -rwxr-xr-x 1 root root 12896 Feb 21 2013 lib_mysqludf_sys.so -rw-r--r-- 1 root root 1647 Feb 21 2013 lib_mysqludf_sys.sql
我们只用lib_mysqludf_sys.c这个文件即可
准备手动编译
检查环境
检查是否有gcc编译工具
gcc -v
如果没有的话,可以通过yum安装一下
yum -y install gcc
编译动态库
进入mysql
查询主目录
mysql> show variables like '%basedir%'; +---------------+-------------------------------+ | Variable_name | Value | +---------------+-------------------------------+ | basedir | /tongfu.net/env/mysql/ | +---------------+-------------------------------+ 1 row in set (0.00 sec)
查询插件目录
mysql> show variables like '%plugin_dir%'; +---------------+------------------------------------------+ | Variable_name | Value | +---------------+------------------------------------------+ | plugin_dir | /tongfu.net/env/mysql/lib/plugin/ | +---------------+------------------------------------------+ 1 row in set (0.00 sec)
执行编译命令
gcc -DMYSQL_DYNAMIC_PLUGIN -fPIC -Wall -I/tongfu.net/env/mysql/include -I. -shared lib_mysqludf_sys.c -o /tongfu.net/env/mysql/lib/plugin/lib_mysqludf_sys.so
安装UDF库
创建UDF方法
进入mysql,注册sys_eval方法
mysql> create function sys_eval returns string soname 'lib_mysqludf_sys.so'; Query OK, 0 rows affected (0.04 sec)
测试UDF方法
进入mysql,通过select语句测试sys_eval方法
mysql> select sys_eval('uname -a'); +----------------------------------------------------------------------------------------------------+ | sys_eval('uname -a') | +----------------------------------------------------------------------------------------------------+ | Linux mysvr 3.10.5-3.el6.x86_64 #1 SMP Tue Aug 20 14:10:49 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux | +----------------------------------------------------------------------------------------------------+ 1 row in set (0.03 sec)
其他方法
sys_get
用于获取系统变量
sys_set
用于设置系统变量
sys_exec
用于执行系统命令,并打印返回码
sys_eval
用于执行系统命令,并打印标准输出