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