выполнение в mysql команд операционной системы

Бывает надо выполнить команду ОС при каком-то событии, например, отправить e-mail при изменении данных

Родного способа нет, но можно использовать функционал пользовательских функций UDF.

UDF репозитарий нам предлагает библиотеку lib_mysqludf_sys для работы с операционной системой, которая содержит в себе 4 функции: 

  • sys_eval(arg1) – выполняет произвольную команду и возвращает вывод внешней команды
  • sys_exec(arg1) – выполняет произвольную команду и возвращает код возврата
  • sys_get(arg1) – позволяет получить переменную окружения или NULL если таковой нет
  • sys_set(arg1, arg2) – позволяет задать переменную окружения (параметры: имя переменной, значение), возвращает 0 в случае успеха

Подробная документация находится  здесь (на английском языке).

Теперь перейдем к установке. Качаем lib_mysqludf_sys_0.0.3.tar.gz. Распаковываем. Для установки может потребоваться наличие в системе пакета mysql-devel

Копируем библиотеку (или предварительно компилируем) в папку с библиотеками. Путь может быть /usr/lib/mysql, /usr/lib/mysql/plugin/ или другим

 и подгружаем новые функции в mysql

1
CREATE FUNCTION lib_mysqludf_sys_info RETURNS string SONAME 'lib_mysqludf_sys.so';
2
CREATE FUNCTION sys_get RETURNS string SONAME 'lib_mysqludf_sys.so';
3
CREATE FUNCTION sys_set RETURNS int SONAME 'lib_mysqludf_sys.so';
4
CREATE FUNCTION sys_exec RETURNS int SONAME 'lib_mysqludf_sys.so';
5
CREATE FUNCTION sys_eval RETURNS string SONAME 'lib_mysqludf_sys.so';

Или используем скрипт  install.sh из архива с исходниками

Определить текущую версию библиотеки можно

1
mysql> select  lib_mysqludf_sys_info();
2
+--------------------------------+
3
| lib_mysqludf_sys_info()        |
4
+--------------------------------+
5
| lib_mysqludf_sys version 0.0.3 |
6
+--------------------------------+
7
1 row in set (0.00 sec)

 Проверяем работу

1
mysql> select sys_eval('whoami');
2
+--------------------+
3
| sys_eval('whoami') |
4
+--------------------+
5
| mysql
6
             |
7
+--------------------+
8
1 row in set (0.04 sec)

1
mysql> select sys_eval('uname -a');
2
+----------------------------------------------------------------------------------------------------+
3
| sys_eval('uname -a')                                                                               |
4
+----------------------------------------------------------------------------------------------------+
5
| Linux localhost.localdomain 2.6.18-194.11.1.el5 #1 SMP Tue Aug 10 19:09:06 EDT 2010 i686 i686 i386 GNU/Linux
6
 |
7
+----------------------------------------------------------------------------------------------------+
8
1 row in set (0.00 sec)
9

Ненужные UDF функции можно удалить

1
DROP FUNCTION IF EXISTS sys_get;
2
DROP FUNCTION IF EXISTS sys_set;
3
DROP FUNCTION IF EXISTS sys_exec;
4
DROP FUNCTION IF EXISTS sys_eval;

Вот и все. Пользуемся на здоровье 🙂

Добавить комментарий

Войти с помощью: 

Ваш e-mail не будет опубликован. Обязательные поля помечены *