MySQL 实现调用外部程序和系统命令
来源:互联网 发布:java工程师培训招生 编辑:程序博客网 时间:2024/06/05 10:28
MySQL 实现调用外部程序和系统命令
Refer:
http://www.cnblogs.com/yunsicai/p/4080864.html
1) Download lib_mysqludf_sys
$ git clone https://github.com/mysqludf/lib_mysqludf_sys.git2) get mysql plugin dir as LIBDIR:
mysql > show variables like 'plugin_dir';
+--------------+--------------------------+
|variable_name | value |
+--------------+--------------------------+
| plugin_dir | /usr/lib64/mysql/plugin |
+--------------+--------------------------+
3) Modify Makefile as below: 编译64位的so
LIBDIR=/usr/lib64/mysql/plugin
install:
gcc -m64 -fPIC -Wall -I/usr/include/mysql -I. -shared lib_mysqludf_sys.c -o $(LIBDIR)/lib_mysqludf_sys.so
4) If need, install:
$ apt-get install libmysqlclient-dev5) Compile on the mysql linux server:
$ sudo make installThat will generate and copy lib_mysqludf_sys.so into $(LIBDIR)
**********************************************************************************************
或者省去上面的步骤,直接下载:
ftp://pub:pub@pepstack.com/tarball/lib_mysqludf_sys.tar.gz
里面包含了已经编译好的64位 lib_mysqludf_sys.so,只要复制到 plugin_dir 目录下即可。
**********************************************************************************************
6) Install the library 'lib_mysqludf_sys.so' from terminal using following command:
$ mysql -u root -p??? -h xxxmysql> source ./lib_mysqludf_sys.sql
7) 测试
mysql> select sys_eval('id');
+----------------+
| sys_eval('id') |
+----------------+
| |
+----------------+
1 row in set (0.00 sec)
发现不起作用。这是由于apparmor控制引起的。AppArmor 是一个类似于selinux 的东西,主要的作用是设置某个可执行程序的访问控制权限,可以限制程序 读/写某个目录/文件,打开/读/写网络端口等。(参考:http://www.oschina.net/p/apparmor)
执行下面的命令:
$ sudo ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/$ sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.mysqld再次测试:
mysql> mysql> select sys_eval('id');
+--------------------------------------------------+
| sys_eval('id') |
+--------------------------------------------------+
| uid=114(mysql) gid=125(mysql) groups=125(mysql) |
+--------------------------------------------------+
1 row in set (0.01 sec)
成功!
8)实战应用
创建目录:
$ sudo mkdir /usr/local/logserver/mysqludf$ sudo vi /usr/local/logserver/mysqludf/test.sh
test.sh内容如下:
#!/bin/sh## mysqludf-test.sh### 2017-02-11########################################################################_file=$(readlink -f $0)_cdir=$(dirname $_file)_name=$(basename $_file)echo "create date file:"date > ${_cdir}/test.logecho "${_cdir}/test.log"exit 21
设置权限:
$ sudo chown mysql:mysql -R /usr/local/logserver/mysqludf$ sudo chmod a+x /usr/local/logserver/mysqludf/test.sh
确保mysqludf及test.sh都是mysql:mysql
9)测试sys_eval:
mysql> select sys_eval('/usr/local/logserver/mysqludf/test.sh');+-----------------------------------------------------------+| sys_eval('/usr/local/logserver/mysqludf/test.sh') |+-----------------------------------------------------------+| create date file:/usr/local/logserver/mysqludf/test.log |+-----------------------------------------------------------+1 row in set (0.01 sec)可见sys_eval把所有的echo输出显示出来。
10)测试sys_exec:
mysql> select sys_exec('/usr/local/logserver/mysqludf/test.sh');+---------------------------------------------------+| sys_exec('/usr/local/logserver/mysqludf/test.sh') |+---------------------------------------------------+| 5376 |+---------------------------------------------------+1 row in set (0.00 sec)
sys_exec执行test.sh之后的返回值是5376 (=256*exit 21)。由于test.sh 最后一句的:exit 21。
所以,在mysql过程里尽量使用sys_exec以获取脚本(test.sh)执行的返回值。
把test.sh修改成你的脚本,就可以使用mysqludf强大的功能了!
- MySQL 实现调用外部程序和系统命令
- iOS调用外部程序和系统程序
- 从Ant调用系统命令或外部程序
- 用Ant调用系统命令或外部程序
- 用Ant调用系统命令或外部程序
- 从Ant调用系统命令或外部程序
- Java调用外部程序命令
- PHP 调用外部系统命令
- PHP 调用外部系统命令
- PHP 调用系统外部命令 system() exec() passthru() 和 popen()
- java实现外部程序调用
- Process 执行Linux命令/调用外部程序
- 调用外部程序的工具、按钮命令
- python可以调用外部系统命令
- 调用cmd.exe程序和外部程序
- 外部过滤器,程序和命令--基本命令
- 外部过滤器,程序和命令--复杂命令
- 外部过滤器,程序和命令--通讯命令
- java上机。。。抽象类。
- c# 鼠标操作摄像机脚本
- redis的默认配置
- 138. Copy List with Random Pointer
- linux磁盘列阵和文件系统
- MySQL 实现调用外部程序和系统命令
- <input>text
- linux sort 多字段排序
- 基于CAShapeLayer和贝塞尔曲线的圆形进度条动画【转载】
- ASI和AFN有什么区别
- Android动态加载jar
- Learn Python The Hard Way-习题48 lexicon.py之我的实现
- int、Integer,"=="和equals() 辨别?
- 阶段总结