如何将load_file与适用于 MySQL 的 Azure 数据库配合使用



我正在尝试将图像数据加载到 Azure 数据库 MySQL 上的行列中。 这是我尝试通过MySQL工作台运行的SQL语句...

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

这涉及运行创建 Blob 存储的云外壳。 我将 a.jpg 图像上传到文件共享。 当然不能从MySQL服务器访问,因此结果为空。

所以显然我需要某种类型的 UNC 语法来引用load_file调用中的文件。 不知道那可能是什么。 Azure 存储连接字符串希望你在服务器上装载卷,但据我所知,无法连接到运行 MySQL 实例的主机。

来自 MySQL 文档 load_file(( :

读取文件并以字符串形式返回文件内容。要使用此功能:

  1. 该文件必须位于服务器主机上,您必须指定 文件的完整路径名,并且您必须具有 FILE 权限。
  2. 该文件必须可由服务器读取,并且其大小必须小于max_allowed_packet字节。
  3. 如果secure_file_priv系统变量设置为非空 目录名称,要加载的文件必须位于 目录。(在MySQL 8.0.17之前,该文件必须可供所有人读取, 不仅可由服务器读取。

如果由于不满足上述条件之一而导致文件不存在或无法读取,则该函数返回 NULL。

其他更多细节:

MySQL LOAD_FILE功能是成功执行需要满足的几个条件。

  • 您尝试加载的文件必须存在于同一主机中 MySQL 服务器运行的位置。例如,如果您的 MySQL 服务器是 安装在 example.com 上,文件必须仅存在于 example.com 上。
  • 必须指定文件的完整路径名。所以,如果你的文件是 位于用户的主目录中,假设用户名为 W3R,则 必须指定"/home/w3r/somefile.txt">
  • 执行命令的用户必须具有 FILE 权限。你可以 向具有以下"在 dbname 上授予文件"的用户授予文件权限。 到user@localhost"。
  • 有问题的文件必须可供所有人读取。如果您尝试加载 用户主目录层次结构中不存在的文件, 确保您对文件具有读取权限。
  • MySQL Server有一个max_allowed_packet变量。有问题的文件必须 不超过该变量中指定的值。您可以检查价值 max_allowed_packet "显示变量,例如 "%max_allowed_packet%";";您必须具有 MySQL 根权限 执行此命令。更改 max_allowed_packet 的值 您的 MySQL 配置文件。打开您的 my.ini 或 my.cnf 文件,找到 行 max_allowed_packet=some_value 并将值更改为您的 想要一个,例如,如果您想将山谷设置为50MB, 写入 50MB。
  • MySQL有一个secure_file_priv变量。如果该变量的值为 设置为非空目录名,要加载的文件必须是 位于该目录中。您可能会找到secure_file_priv变量 及其值,并可能在MySQL配置文件中更改它。

参考:MySQL LOAD_FILE(( 函数和 LOAD_FILE(( 函数在 MySQL 中的工作原理

希望这有帮助。

这个问题的答案是,load_file从根本上与适用于MySQL的Azure Database 不兼容。 文档中没有关于这种不兼容性的内容。

我知道它不兼容的原因是它在Google Cloud SQL for MySQL的文档中被特别列为不兼容:https://cloud.google.com/sql/docs/mysql/features

我一次又一次地看到这个...如果一个云服务器有东西,那么其他云服务器会争先恐后地获取它。 相反,如果某个云不支持某些内容,那么您可以确定其他云不支持它。

load_file((显然被视为一个安全漏洞。 因此,使用 load_file(( 的方法是,需要有一个运行load_file的本地数据库,然后将数据导出到平面文件,然后将其导入 Azure 数据库 MySQL。

最新更新