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://kedar.nitty-witty.com/blog/using-load-data-infile-with-stored-procedure-workaround-mysql