Бывает надо выполнить команду ОС при каком-то событии, например, отправить 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/Linux6 |
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;
Вот и все. Пользуемся на здоровье 🙂