mysqludf – mysql user defined functions

 

Dostęp do sytemu operacyjnego z poziomu bazy danych

https://github.com/mysqludf/lib_mysqludf_sys

Pobrać rozpakować zainstalować wymagane biblioteki:

# apt install gcc
# apt install make
# apt install default-libmysqlclient-dev

Przekopiowanie biblioteki do katalogu pluginów bazy danych

> SELECT VERSION();
   10.1.44-MariaDB-0+deb9u1

> SHOW VARIABLES LIKE 'plugin_dir';
  /usr/lib/x86_64-linux-gnu/mariadb18/plugin/

# cp lib_mysqludf_sys.so /usr/lib/x86_64-linux-gnu/mariadb18/plugin/

.

# cd lib_mysqludf_sys-master/
# chmod +x install.sh
# ./install.sh
Compiling the MySQL UDF
gcc -Wall -I/usr/include/mysql -I. -shared lib_mysqludf_sys.c -o /usr/lib/lib_mysqludf_sys.so
MySQL UDF compiled successfully
-e
Please provide your MySQL root password
Enter password:
MySQL UDF installed successfully

Możliwe do użycia w procedurach funkcje

sys_exec – wykonuje dowolne polecenie i zwraca exit code.
sys_eval – wykonuje dowolne polecenie i zwraca wyjście polecenia
sys_get – pobiera zmienną środowiskową
sys_set – tworzy zmienną środowiskową, lub aktualizuje jej wartość

Sposób sposób sprawdzenia – kod 0 – sukces

> SELECT lib_mysqludf_sys_info(); 
  lib_mysqludf_sys version 0.0.3

> SELECT sys_exec('ls -l /var/www/html');
 0

Dodawanie / usuwanie funkcji jeśli nie istnieją / nie używane

> CREATE FUNCTION lib_mysqludf_sys_info RETURNS INT SONAME ‘lib_mysqludf_sys.so’;
> CREATE FUNCTION sys_exec RETURNS INT SONAME ‘lib_mysqludf_sys.so’;
> CREATE FUNCTION sys_get  RETURNS INT SONAME ‘lib_mysqludf_sys.so’;
> CREATE FUNCTION sys_set  RETURNS INT SONAME ‘lib_mysqludf_sys.so’;
> CREATE FUNCTION sys_eval RETURNS INT SONAME ‘lib_mysqludf_sys.so’;

> DROP FUNCTION IF EXISTS lib_mysqludf_sys_info;
> DROP FUNCTION IF EXISTS sys_exec;
> DROP FUNCTION IF EXISTS sys_get;
> DROP FUNCTION IF EXISTS sys_set;
> DROP FUNCTION IF EXISTS sys_eval;

Zawartość skryptu /var/www/projekt/test.sh

#!/bin/sh
/usr/bin/mysql -u john -p'Hasło' -e 'SELECT CURRENT_USER();'

Sprawdzenie czy skrypt jest poprawny

# chown mysql.mysql test.sh
# chmod +x text.sh
# ./test.sh
+----------------+
| CURRENT_USER() |
+----------------+
| john@localhost |
+----------------+

Spr. czy funkcja mysql uruchomi skrypt?

> SELECT sys_exec('/var/www/projekt/test.sh');
  256

Kod inny niż 0 oznacza błąd. Sprawdzić logi:

# tail -f /var/log/mysql/error.log
  ERROR 1698 (28000): Access denied for user 'john'@'localhost'

Zalecenia

mysql - właściciel skryptu test.sh, uprawnienia w bazie do CALL, dostęp do tabeli
skrypt prawa +x dla właściciela, 
hasło - bez spacji w apostrofie: -p'hasło'
pełne ścieżki: /usr/bin/mysql, /var/www/projekt/test.sh, /var/www/projekt/data.csv

Procedura ładowania danych

DROP PROCEDURE IF EXISTS load_data_SP ;
DELIMITER $$
CREATE PROCEDURE load_data_SP ()
  BEGIN
    DECLARE ret_val int;
    SET ret_val=sys_exec('/../import_data.sh');
    IF ret_val=0 THEN 
      SELECT 'OK' as Result;
    ELSE
      SELECT ret_val AS Result;
    END IF;
 END $$
DELIMITER ;

Uprawnienia użytkownika podanego w skrypcie do tabeli i procedury:

>  GRANT ALL PRIVILEGES ON nazwa_bazy.nazwa_tabeli from_topdieta` TO 'john'@'localhost' 
> GRANT EXECUTE ON PROCEDURE nazwa_bazy.load_data_SP to 'john'@'localhost';

Przydatne linki:

https://stackoverflow.com/questions/55241615/mysql-sys-exec-cant-open-shared-library-lib-mysqludf-sys-so-errno-11-wrong

https://kedar.nitty-witty.com/blog/using-load-data-infile-with-stored-procedure-workaround-mysql

Dodaj komentarz