2012-06-13 4 views
3

Я нашел и нашел это сообщение (http://stackoverflow.com/questions/1814297/cant-load-file-data-in-the-mysql-directory), но он не работает для меня.Альтернатива функции LOAD_FILE()?

я ип Ubuntu 12,04 и MySQL версии 5.5.22-0ubuntu1

Я вошел в MySQL как корень и поэтому гранты должны быть все в порядке:

mysql> show grants; 
+---------------------------------------------------------------------+ 
| Grants for [email protected]           | 
+---------------------------------------------------------------------+ 
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION | 
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION  | 
+---------------------------------------------------------------------+ 

Я пытаюсь вставить некоторые данные из текстового файла в базу данных MySQL и функция LOAD_FILE, похоже, не работают должным образом

Я создал тестовый файл, разрешения 777 и скопировал его в корень из установки (я попробовал изменить владельца/группу на root: root и mysql: mysql и все еще ничего хорошего):

mysql> select load_file('/test.txt'); 
+------------------------+ 
| load_file('/test.txt') | 
+------------------------+ 
| NULL     | 
+------------------------+ 
1 row in set (0.00 sec) 

Но если я пытаюсь это:

mysql> select load_file('/etc/hosts'); 

Он отлично работает. Если я копирую тестовый файл в /etc, он все равно не работает.

Кто-нибудь видел это раньше или может указать мне другой способ загрузки в базу данных?

ответ

1

Чтобы использовать load_file следующие условия должны быть выполнены (от documentation):

  1. Файл должен находиться на хосте сервера
  2. Вы должны указать полный путь к файлу, и вы должны иметь привилегию FILE.
  3. Файл должен быть доступен для чтения всем и размером менее max_allowed_packet байт.
  4. Если системная переменная secure_file_priv установлена ​​на непустое имя каталога, загружаемый файл должен быть расположен в этом каталоге.

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

mysql -u foo -p dbname < filename.sql

+0

'secure_file_priv' пуст. Я запускаю локально и использую полный путь и читаем. Тестовый файл меньше размера thabn '/ etc/hosts', поэтому все вышеперечисленное должно быть в порядке. Это не SQL-инструкции, так что это тоже не сработает. Это, в основном, большой список чисел в текстовом файле, который отправляется, и аналогичные данные принимаются как часть тестового шага. – Firedragon

+0

Вы уверены, что здесь путь? 'select load_file ('/ test.txt');' Это не полный путь, если файл фактически не сидит на '/ test.txt' –

+0

Файл был скопирован там. Я пробовал на разных путях, например '/ home/me/test.txt', и он не работает. – Firedragon

0

Im не эксперт по MySQL, но ив заметил, что версия MySQL 5.5 имеет проблемы с ОС UBUNTU.

Даже после выполнения документации в mysql docs LOAD_FILE() не работает. Существует служба, называемая apparmour, предотвращающая выполнение функции LOAD_FILE(), я попытался остановить эту службу, но все еще сохранялся .....

Я знаю, что это не решает вашу проблему, но по крайней мере это поможет у найти, где проблема ......

0

Рассмотрим один-лайнер (примечание, я на Ubuntu):

printf "$(cat update_xml.sql)" "$(cat my.xml | sed s/"'"/"\\\'"/g)" | mysql -h myRemoteHost -u me -p*** 

В update_xml.sql есть:

UPDATE 
    myTable 
SET 
    myXmlColumn = '%s' 
WHERE 
    ... 
0

Добавьте это для дальнейшего использования. Наверное, это не поможет ОП.

Как уже отмечалось, AppArmor виноват. Необходимо указать белый список путей, необходимых для файла load_file, в предоставленный профиль, который можно найти здесь: /etc/apparmor.d/usr.sbin.mysqld. Документацию apparmor.d можно найти here. Это рекомендуется, так как AppArmor имеет свои причины быть там.

Альтернативы:

  • Это unrecommended метод. Отключите профиль usr.sbin.mysqld, чтобы не выставлять все службы. Просто привяжите профиль к /etc/apparmor.d/disable с помощью ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/usr.sbin.mysqld. Перезагрузите профили с помощью /etc/init.d/apparmor restart. Это, вероятно, имеет смысл для машины разработки.
  • Это очень неуправляемый метод, если вы не Фактически нужен AppArmor. Профили можно выгрузить с помощью /etc/init.d/apparmor teardown. Отключите сценарий инициализации с помощью update-rc.d -f apparmor remove.

Все перечисленные выше вещи требуют привилегий root, но я пропустил все повторяющиеся sudo перед всеми командами.

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