8

我正在尝试将 xml 文件的目录作为 blob 加载到数据库表中。每行将包含一个相应的 blob 文件。通过 python 脚本将文件加载到表中时,值将作为空值插入。在 mysql 命令行中运行等效命令时也是如此。

在将某些文件夹权限更改为 mysql 后,我一度能够插入值,但由于需要脚本权限,我不得不修改目录 /var/lib/mysql/foo 的所有权,因此值被重新插入为 null,从而有效地破坏了我写的脚本。我不记得为此需要更改目录权限。

以下是对该主题的讨论:

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

随着

MySQL LOAD_FILE 返回 NULL

4

8 回答 8

11

我将文件复制到MySQL 可以访问的位置。
要知道我使用的位置:

select @@secure_file_priv;

它给了我/var/lib/mysql-files/

没有其他方法起作用:既没有关闭 apparmor,也没有更改所有权和权限,也没有仅仅授予file特权。所以我回滚了大部分,但正确的目录仍然有效。就我而言。

我的来源是 Raymond Nijland,在这里:https ://dba.stackexchange.com/questions/190380/load-file-produce-null

于 2018-07-12T08:42:40.393 回答
8

确保:

  • 父目录有执行权限
  • 必须明确授予 FILE 特权。(GRANT FILE on . TO user@localhost)
  • 您已刷新权限
  • 您已注销并重新登录

父目录的权限示例:

mysql>\! ls -ld`目录名/home/jlam/code/projectName/doc/filesForTesting/images/imageTest01.jpg`
drwxrwxr--。2 jlam jlam 4096 5 月 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')) |
+-------------------------------------------------- -------------------------------------------------- ----------+
| 空 |
+-------------------------------------------------- -------------------------------------------------- ----------+
一组中的 1 行(0.00 秒)



mysql>\! chmod o+x /home/jlam/code/projectName/doc/filesForTesting/images
mysql>\! ls -ld`目录名/home/jlam/code/projectName/doc/filesForTesting/images/imageTest01.jpg`
drwxrwxr-x。2 jlam jlam 4096 5 月 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'))                                                                                                                                
+-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------
| FFD8FFE1001845786966000049492A00080000000000000000000000FFEC00114475636B7900010004000000500000FFE10407687474703A2F2F6E732E61646F62652E636F6D2F786​​1702F312E302F003C3F787​​061636B657420626567696E3D22EFBBBF222069643D2257354D304D7043656869487
+-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------

用户权限示例:

16:38:09 (getImages) ~/code/projectName/doc/filesForTesting/images$ mysql -u eventCal -p eventCal
输入密码:

mysql> 显示授权;
+-------------------------------------------------- -------------------------------------------------- --------------+
| eventCal@localhost 的赠款 |
+-------------------------------------------------- -------------------------------------------------- --------------+
| 将 *.* 上的使用授权给 'eventCal'@'localhost' 由密码 '*xxxx' 识别 |
| 授予 `tmp` 上的所有权限。* 到 'eventCal'@'localhost' |
| 授予 `eventCalTesting` 上的所有权限。* 到 'eventCal'@'localhost' |
| 授予 `eventCal` 上的所有权限。* 到 'eventCal'@'localhost' |
| 授予 `eventCal_categoryMigration` 上的所有权限。* 到 'eventCal'@'localhost' |
+-------------------------------------------------- -------------------------------------------------- --------------+
5 行一组(0.00 秒)

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')) |
+-------------------------------------------------- -------------------------------------------------- ----------+
| 空 |
+-------------------------------------------------- -------------------------------------------------- ----------+
一组中的 1 行(0.00 秒)

在其他根会话中:

mysql> 将文件 ON *.* 授予 eventCal@localhost;
查询正常,0 行受影响(0.00 秒)

mysql> 刷新权限;
查询正常,0 行受影响(0.00 秒)

回到用户会话,我仍然无法加载文件

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')) |
+-------------------------------------------------- -------------------------------------------------- ----------+
| 空 |
+-------------------------------------------------- -------------------------------------------------- ----------+
一组中的 1 行(0.00 秒)

.....但是如果我注销并重新登录:

mysql>退出
再见

16:40:14 (getImages) ~/code/projectName/doc/filesForTesting/images$ mysql -u eventCal -p eventCal
输入密码:

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'))                                                                                                                                
+-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------
| FFD8FFE1001845786966000049492A00080000000000000000000000FFEC00114475636B7900010004000000500000FFE10407687474703A2F2F6E732E61646F62652E636F6D2F786​​1702F312E302F003C3F787​​061636B657420626567696E3D22EFBBBF222069643D2257354D304D7043656869487
+-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------

于 2014-05-12T20:45:12.893 回答
4

我在这个问题上浪费了一些时间。就我而言,问题与“my.ini”中定义的secure_file_priv变量有关。

来自 MySQL 文档:

如果 secure_file_priv 系统变量设置为非空目录名,则要加载的文件必须位于该目录中

所以,有两种方法:

1)删除此选项 2)使用默认文件夹上传文件(“C:\ProgramData\MySQL\MySQL Server 5.7\Uploads”)。我还必须在 Windows 中使用双斜杠。

于 2017-06-06T10:22:53.573 回答
2

为了使加载文件工作,请确保授予 MySQL 所有者和组的所有权限。

chown mysql:mysql /var/lib/mysql/foo/*
chmod go+rw /var/lib/mysql/foo/*
于 2013-08-14T20:29:17.960 回答
1

我在这里尝试了所有其他答案。经过相当多的反复试验后发现我的问题是secure-file-priv根本没有设置任何东西。当我将此值设置为 my.conf 中的目录路径并确保权限设置正确时,最终可以访问文件

添加到 my.conf:

secure_file_priv="/test/"

我认为这个答案是特定于在 mac 上运行的 mysql

于 2020-02-05T05:00:45.470 回答
0

Acubo 用 Null Blob 插入解决了我的问题。在 MySql my.ini 文件中,secure-file-priv 设置为我不使用的特定文件夹,这就是为什么它忽略了我在 LOAD_FILE 中的路径。Acubo 说要确保将secure-file-priv设置设置为空。然后它将使用 LOAD_FILE 语句中的硬编码路径。

我的.ini

安全文件隐私 由 Frank Salinas 12/11/2019 修改,secure-file-priv 必须为空才能查询硬编码目录以外的目录

secure-file-priv="C:/ProgramData/MySQL/MySQL Server 5.7/Uploads"
secure-file-priv=""
于 2019-12-16T17:07:22.283 回答
0

我将图像复制到/var/lib/mysql/images(在创建图像文件夹之后)并且它有效!

于 2016-12-07T11:27:54.640 回答
0

这可能是由于 SO 安全限制。事实上,我可以通过在AppArmour中禁用 MySQL 配置文件来解决这个问题

我遵循的过程是检查是否有为 mysql 加载的配置文件

sudo aa-status

然后禁用它

sudo ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/
sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.mysqld

https://www.cyberciti.biz/faq/ubuntu-linux-howto-disable-apparmor-commands/

于 2018-05-15T12:54:51.703 回答