1. 程式人生 > >MySQL 實現調用外部程序和系統命令

MySQL 實現調用外部程序和系統命令

基本 variables clu sch linu popu logserver git arm

MySQL 實現調用外部程序和系統命令


Refer:

http://www.cnblogs.com/yunsicai/p/4080864.html


1) Download lib_mysqludf_sys

$ git clone https://github.com/mysqludf/lib_mysqludf_sys.git

2) 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-dev

5) Compile on the mysql linux server:

$ sudo make install

That will generate and copy lib_mysqludf_sys.so into $(LIBDIR)


**********************************************************************************************

或者省去上面的步驟,直接下載:

ftp://pub:[email protected]

/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 xxx

mysql> source ./lib_mysqludf_sys.sql

7) 測試

mysql> select sys_eval(‘id‘);
+----------------+
| sys_eval(‘id‘) |
+----------------+
| |
+----------------+
1 row in set (0.00 sec)
發現不起作用。這是因為apparmor控制引起的。AppArmor 是一個相似於selinux 的東西。基本的作用是設置某個可運行程序的訪問控制權限。能夠限制程序 讀/寫某個文件夾/文件。打開/讀/寫網絡port等。(參考: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.log

echo "${_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 實現調用外部程序和系統命令