Как использовать load_file с Azure База данных для MySQL - PullRequest
0 голосов
/ 12 января 2020

Я пытаюсь загрузить данные изображения в столбец строки в базе данных Azure для MySQL. Это оператор SQL, который я пытаюсь выполнить через MySQL Workbench ...

insert into pm1.c1 (id,source,image) values ('1','a',load_file('/usr/csuser/clouddrive/a.jpg'));

Это дает хороший результат, но столбец изображения пуст. Задача состоит в том, чтобы предоставить доступ к файлу с экземпляра сервера. Я нашел сообщение в блоге, которое, казалось, поставило меня на правильный путь ...

https://techcommunity.microsoft.com/t5/azure-database-for-mysql/backup-azure-database-for-mysql-to-a-blob-storage/ba-p/803830

Это включает в себя запуск облачной оболочки, которая создает хранилище больших двоичных объектов. Я загрузил изображение a.jpg на файлообменник. Конечно, недоступен с сервера MySQL, следовательно, это нулевой результат.

Так что, очевидно, мне нужен какой-то синтаксис UN C для ссылки на файл в вызове load_file. Не могу понять, что это может быть. Azure Строки подключения хранилища требуют, чтобы вы смонтировали том на сервере, но, насколько я могу судить, нет способа подключиться к хосту, на котором запущен экземпляр MySQL.

Ответы [ 2 ]

0 голосов
/ 02 февраля 2020

Ответ на этот вопрос заключается в том, что load_file принципиально несовместим с Azure База данных для MySQL. В документации ничего не говорится об этой несовместимости.

Причина, по которой я знаю, что она несовместима, заключается в том, что она специально указана как несовместимая в документации по Google Cloud SQL для MySQL: https://cloud.google.com/sql/docs/mysql/features

Я видел это снова и снова ... если у одного облачного сервера что-то есть, то другие будут карабкаться, чтобы его получить. И наоборот, если что-то не поддерживается в одном облаке, вы можете быть уверены, что это не поддерживается в других облаках.

load_file () видимо считается дырой в безопасности. Таким образом, способ использования load_file () заключается в том, что вам нужно иметь локальную базу данных, в которой запускается load_file, а затем экспортировать данные в плоский файл и затем импортировать их в Azure База данных для MySQL.

0 голосов
/ 13 января 2020

Из MySQL документа load_file () :

Считывает файл и возвращает содержимое файла в виде строки. Чтобы использовать эту функцию:

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

Если файл не существует или не может быть прочитан из-за одного из предыдущих условия не выполнены, функция возвращает NULL.

Другие подробности:

MySQL Функция LOAD_FILE - это несколько условий, которые должны быть выполнены для успешного выполнения.

  • Необходимо указать полный путь к файлу. Таким образом, если ваш файл находится в домашнем каталоге пользователя, принимая имя пользователя w3r, вы должны указать '/home/w3r/somefile.txt'
  • Пользователь, выполняющий команду, должен иметь привилегию FILE. Вы можете предоставить привилегию FILE пользователю с помощью следующего "GRANT FILE для dbname. * TO user@localhost".
  • Файл должен быть доступен для чтения всем. Если вы пытаетесь загрузить файл, которого нет в иерархии домашнего каталога пользователей, убедитесь, что у вас есть разрешение на чтение этого файла.
  • MySQL Сервер имеет переменную max_allowed_packet. Файл, о котором идет речь, не должен превышать значение, указанное в этой переменной. Вы можете проверить значение max_allowed_packet с 'показывать переменные наподобие'% max_allowed_packet% ';'; у вас должна быть привилегия MySQL root для выполнения этой команды. Вы изменяете значение max_allowed_packet в вашем MySQL файле конфигурации. Откройте файл my.ini или my.cnf, найдите строку max_allowed_packet = some_value и измените значение на желаемое, например, если вы хотите установить значение valle, равное 50 МБ, напишите 50 МБ.
  • MySQL имеет переменную secure_file_priv. Если значение этой переменной установлено в непустое имя каталога, загружаемый файл должен находиться в этом каталоге. Вы можете найти переменную secure_file_priv и ее значение и изменить ее в файле конфигурации MySQL.

Ссылка: MySQL Функция LOAD_FILE () и How Функция LOAD_FILE () работает в MySQL

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...