2013-08-05 3 views
4

Я пытаюсь загрузить каталог xml-файлов в таблицу базы данных как blobs. Каждая строка будет содержать соответствующий файл blob. При загрузке файлов через скрипт python в таблицу значения вставляются как null. Это также происходит при выполнении эквивалентной команды в командной строке mysql.MySQL LOAD_FILE() загружает значения null

В какой-то момент мне удалось вставить значения после изменения некоторых разрешений на доступ к mysql, но из-за необходимых прав на скрипты мне пришлось изменить право собственности на каталог/var/lib/mysql/foo, поэтому значения повторно вставляются как null эффективно нарушая сценарий, который я написал. Я не могу вспомнить необходимое изменение разрешений на каталоги для этого.

Ниже приведены дискуссии по теме:

http://bugs.mysql.com/bug.php?id=38403

вместе с

MySQL LOAD_FILE returning NULL

ответ

5

Убедитесь, что:

  • есть разрешение на выполнение родительского каталога
  • В файле привилегия сусло explicily предписана. (. GRANT FILE на TO пользователя @ lokalny_host)
  • Вы очистили привилегии
  • Вы вышли и вошли обратно в

Примера разрешения на родительской директории:

 

mysql> \! ls -ld `dirname /home/jlam/code/projectName/doc/filesForTesting/images/imageTest01.jpg` 
drwxrwxr--. 2 jlam jlam 4096 May 12 14:22 /home/jlam/code/projectName/doc/filesForTesting/images 

mysql> select hex(LOAD_FILE('/home/jlam/code/projectName/doc/filesForTesting/images/image 

Test01.jpg')); 
+-------------------------------------------------------------------------------------------------------------+ 
| hex(LOAD_FILE('/home/jlam/code/projectName/doc/filesForTesting/images/imageTest01.jpg')) | 
+-------------------------------------------------------------------------------------------------------------+ 
| NULL                          | 
+-------------------------------------------------------------------------------------------------------------+ 
1 row in set (0.00 sec) 



mysql> \! chmod o+x /home/jlam/code/projectName/doc/filesForTesting/images 
mysql> \! ls -ld `dirname /home/jlam/code/projectName/doc/filesForTesting/images/imageTest01.jpg` 
drwxrwxr-x. 2 jlam jlam 4096 May 12 14:22 /home/jlam/code/projectName/doc/filesForTesting/images 
mysql> select hex(LOAD_FILE('/home/jlam/code/projectName/doc/filesForTesting/images/imageTest01.jpg')); 
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
| hex(LOAD_FILE('/home/jlam/code/projectName/doc/filesForTesting/images/imageTest01.jpg'))                                 
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
| FFD8FFE1001845786966000049492A00080000000000000000000000FFEC00114475636B7900010004000000500000FFE10407687474703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F003C3F787061636B657420626567696E3D22EFBBBF222069643D2257354D304D7043656869487 
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 

Пример пользовательских прав:

 

16:38:09 (getImages) ~/code/projectName/doc/filesForTesting/images$ mysql -u eventCal -p eventCal 
Enter password: 

mysql> show grants; 
+-----------------------------------------------------------------------------------------------------------------+ 
| Grants for [email protected]                     | 
+-----------------------------------------------------------------------------------------------------------------+ 
| GRANT USAGE ON *.* TO 'eventCal'@'localhost' IDENTIFIED BY PASSWORD '*xxxx' | 
| GRANT ALL PRIVILEGES ON `tmp`.* TO 'eventCal'@'localhost'              | 
| GRANT ALL PRIVILEGES ON `eventCalTesting`.* TO 'eventCal'@'localhost'           | 
| GRANT ALL PRIVILEGES ON `eventCal`.* TO 'eventCal'@'localhost'             | 
| GRANT ALL PRIVILEGES ON `eventCal_categoryMigration`.* TO 'eventCal'@'localhost'        | 
+-----------------------------------------------------------------------------------------------------------------+ 
5 rows in set (0.00 sec) 

mysql> select hex(LOAD_FILE('/home/jlam/code/projectName/doc/filesForTesting/images/imageTest01.jpg')); 
+-------------------------------------------------------------------------------------------------------------+ 
| hex(LOAD_FILE('/home/jlam/code/projectName/doc/filesForTesting/images/imageTest01.jpg')) | 
+-------------------------------------------------------------------------------------------------------------+ 
| NULL                          | 
+-------------------------------------------------------------------------------------------------------------+ 
1 row in set (0.00 sec) 

В другой корневой сессии:

 

mysql> grant file ON *.* to [email protected]; 
Query OK, 0 rows affected (0.00 sec) 

mysql> flush privileges; 
Query OK, 0 rows affected (0.00 sec) 

Назад в пользовательской сессии, я до сих пор не могу загрузить файл

 

mysql> select hex(LOAD_FILE('/home/jlam/code/projectName/doc/filesForTesting/images/imageTest01.jpg')); 
+-------------------------------------------------------------------------------------------------------------+ 
| hex(LOAD_FILE('/home/jlam/code/projectName/doc/filesForTesting/images/imageTest01.jpg')) | 
+-------------------------------------------------------------------------------------------------------------+ 
| NULL                          | 
+-------------------------------------------------------------------------------------------------------------+ 
1 row in set (0.00 sec) 

..... Но если я вхожу туда и обратно в:

 

mysql> exit 
Bye 

16:40:14 (getImages) ~/code/projectName/doc/filesForTesting/images$ mysql -u eventCal -p eventCal 
Enter password: 

mysql> select hex(LOAD_FILE('/home/jlam/code/projectName/doc/filesForTesting/images/imageTest01.jpg')); 
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
| hex(LOAD_FILE('/home/jlam/code/projectName/doc/filesForTesting/images/imageTest01.jpg'))                                 
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
| FFD8FFE1001845786966000049492A00080000000000000000000000FFEC00114475636B7900010004000000500000FFE10407687474703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F003C3F787061636B657420626567696E3D22EFBBBF222069643D2257354D304D7043656869487 
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 

+0

отличное объяснение, но не решило –

+0

. Ответ @Acubo ниже предлагает дополнительную подсказку. Мой ответ был написан еще в 2014 году, возможно, с тех пор изменилась конфигурация платформы по умолчанию. –

2

для того, чтобы загрузить файл для работы убедитесь, что все разрешения предоставляются для владельца MySQL и группы.

chown mysql:mysql /var/lib/mysql/foo/* 
chmod go+rw /var/lib/mysql/foo/* 
+0

Это был последний решающий шаг, который позволил мне загрузить файлы, которые мне нужны в базе данных. 'show VARIABLES' указал, что переменная secure_file_priv установлена ​​правильно, но я все равно не могу загрузить файлы. – user208145

0

Я скопировал изображение в /var/lib/mysql/images (после создания папки с изображениями), и это сработало!

1

Я потерял некоторое время с этой проблемой. В моем случае проблема связана с переменной secure_file_priv, определенной в «my.ini».

Из MySQL документации:

Если переменная secure_file_priv система настроена на имя каталога непустое , файл должен быть загружен должен находиться в том каталоге

Итак, есть двумя способами:

1) удалить эту опцию 2) использовать папку по умолчанию для загрузки файлов («C: \ ProgramData \ MySQL \ MySQL Server 5.7 \ Uploads») , Мне также пришлось использовать двойную косую черту в Windows.

Смежные вопросы