簡體   English   中英

MySQL LOAD_FILE() 加載空值

[英]MySQL LOAD_FILE() loads null values

我正在嘗試將 xml 文件目錄作為 blob 加載到數據庫表中。 每行將包含一個相應的 blob 文件。 通過 python 腳本將文件加載到表中時,值插入為空。 在 mysql 命令行中運行等效命令時也是這種情況。

在某一時刻,我能夠在將某些文件夾權限更改為 mysql 后插入值,但是由於需要腳本特權,我不得不修改目錄 /var/lib/mysql/foo 的所有權,因此值被重新插入為 null,從而有效地破壞了我寫的腳本。 我不記得這樣做的必要目錄權限更改。

以下是對該主題的討論:

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

隨着

MySQL LOAD_FILE 返回 NULL

我將我的文件復制到MySQL 可以訪問的位置。
要知道我使用的位置:

select @@secure_file_priv;

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

沒有其他工作:既不關閉 apparmor,也不更改所有權和權限,也不只是授予file權限。 所以我回滾了大部分,但正確的目錄仍然有效。 就我而言。

我的消息來源是 Raymond Nijland,在這里: https ://dba.stackexchange.com/questions/190380/load-file-production-null

確保:

  • 父目錄有執行權限
  • 必須明確授予 FILE 特權。 (GRANT FILE on . TO user@localhost)
  • 您已刷新權限
  • 您已注銷並重新登錄

父目錄權限示例:

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 eventCal@localhost                                                                                   |
+-----------------------------------------------------------------------------------------------------------------+
| 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 eventCal@localhost;
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
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

我在這個問題上浪費了一些時間。 就我而言,問題與“my.ini”中定義的secure_file_priv變量有關。

來自 MySQL 文檔:

如果secure_file_priv 系統變量設置為非空目錄名,則要加載的文件必須位於該目錄中

所以,有兩種方法:

1) 刪除此選項 2) 使用默認文件夾上傳文件(“C:\\ProgramData\\MySQL\\MySQL Server 5.7\\Uploads”)。 我還必須在 Windows 中使用雙斜杠。

為了使加載文件工作,請確保為 MySQL 所有者和組授予所有權限。

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

我在這里嘗試了所有其他答案。 經過相當多的反復試驗后發現我的問題是secure-file-priv根本沒有設置任何東西。 當我將此值設置為 my.conf 中的目錄路徑並確保正確設置權限時,最終可以訪問文件

添加到我的.conf:

secure_file_priv="/test/"

我認為這個答案特定於在 mac 上運行的 mysql

我將圖像復制到/var/lib/mysql/images (在創建圖像文件夾之后)並且它起作用了!

這可能是由於 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/

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 must null 以便查詢硬編碼目錄以外的目錄

secure-file-priv="C:/ProgramData/MySQL/MySQL Server 5.7/Uploads"
secure-file-priv=""

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM