[英]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 可以訪問的位置。
要知道我使用的位置:
select @@secure_file_priv;
它給了我/var/lib/mysql-files/
。
沒有其他工作:既不關閉 apparmor,也不更改所有權和權限,也不只是授予file
權限。 所以我回滾了大部分,但正確的目錄仍然有效。 就我而言。
我的消息來源是 Raymond Nijland,在這里: https ://dba.stackexchange.com/questions/190380/load-file-production-null
確保:
父目錄權限示例:
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.