iT邦幫忙

2

MariaDB在INTO OUTFILE發生 ERROR 1356 (HY000) 錯誤

  • 分享至 

  • xImage

不好意思打擾各位>< 我在使用MariaDB做Select Table 的 INTO OUTFILE '檔案名稱'; 時出現以下錯誤:

ERROR 1356 (HY000): View 'DB_name.Table_name' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them

只有加上INTO OUTFILE '檔案名稱'; 會出現這種錯誤,單純select的時候都很正常也都有列結果出來。
上網爬文很多都說要 grant all privileges on *.* to 帳號名稱@'%';flush privileges;
但是我做完還是一樣一點用都沒有,我已經快要發瘋了,請各位幫幫我拜託,真的非常感謝各位!

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

5
一級屠豬士
iT邦大師 1 級 ‧ 2022-03-28 15:43:19
最佳解答

因為 grant all privileges on *.* to 帳號名稱@'%';
這裡是 on db.obj 的意思,而 file 是單獨的權限,
所以要對該物件有權限以外,還要有 file 權限,才能 讀入 寫出.
https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html
以上是 MySQL / MariaDB 裡面的權限.
再來是 MySQL / MariaDB 對你指定的目錄,是否有權限,這是另外層級.
目錄權限設定正確以後,若是使用 Ubuntu 的話, 因為他有 Apparmor 會做攔截,
要在 /etc/apparmor.d/usr.sbin.mysqld 添加你指定目錄 /data/ rw,
然後 sudo /etc/init.d/apparmor restart

以上做一個大致上的介紹.

看更多先前的回應...收起先前的回應...
lulu_meat iT邦研究生 5 級 ‧ 2022-03-28 16:30:51 檢舉

謝謝您! 我剛剛在/etc/apparmor.d/usr.sbin.mysqld 內添加/tmp/ rw,sudo /etc/init.d/apparmor restart,結果發生下列錯誤:

Restarting apparmor (via systemctl): apparmor.serviceJob for apparmor.service failed because the control process exited with error code.
See "systemctl status apparmor.service" and "journalctl -xe" for details.
 failed!

上網查他說要移除apparmor.service:

sudo apt-get remove apparmor.service

但是我實在不敢輕舉妄動(怕弄壞被罵),想先請問您。

另外我發現我問題的select Table會出錯的部分是因為我要selct的是view不是table,所以單純select的話會出現

ERROR 1146 (42S02): Table 'DB_NAME.TABLE_NAME' doesn't exist

上面問題說單純select會成功是因為我下了大概一百多筆select,只有其中4筆的是view,所以才能成功,不然如果單獨select view的話會是錯的,請問這個跟我這次的錯誤有關係嗎? 謝謝!

可能要改用這樣的方式,因為這才是比較新的版本的方式.
sudo systemctl restart apparmor.service
我上面的例子是舊的方式.
若有疑慮,最好先不要動.安全第一.
若妳是用 /tmp , 也許有機會,不變動 apparmor 設定,就能夠寫出.
這個要看你的機器的設定情況.

另外從你的敘述裡,會不會你select 的 view 是不存在了?

用這個方式查看一下

select *
  from INFORMATIONSCHEMA.VIEWS;
lulu_meat iT邦研究生 5 級 ‧ 2022-03-28 16:56:05 檢舉

下您的語法出現這個問題:
https://ithelp.ithome.com.tw/upload/images/20220328/201332867W35CZjHRZ.png
但是我下SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'DB_NAME' AND TABLE_TYPE ='VIEW'; 卻又能看的到這些有問題的VIEW:
https://ithelp.ithome.com.tw/upload/images/20220328/20133286TpaBxRosi2.png

因為 MariaDB 版本關係 , information_schema 的內容是不同的版本.總之目前你那裡可以看到有那些view. 但是你要匯出時,出現問題. 有可能是,要into outfile 的,必須是 table,不能是 view.
也許要把 view 的定義,來去建立實體的table,才能outfile.

還有一個可能
因為create view 時有一個 [SQL SECURITY { DEFINER | INVOKER }]

你操作的與 view 的建立者,是不同帳號.

lulu_meat iT邦研究生 5 級 ‧ 2022-03-28 17:09:52 檢舉

我有用新建的帳號另外複製一個view,然後into outfile也是出現一開始的錯誤訊息。
因為這個資料庫不是我建的,當初做的人已經離職了,我現在也沒辦法問>< 請問我如果把view建成實體table會影響整個系統嗎? 謝謝您!

建立新的table, 不是砍資料,這樣大多數情況問題不大.
除非很神奇的情況,剛好你的table的名字是可以招喚出神秘的力量,
或是有些神奇的程式去偵測某特定table名稱出現,去做些奇怪的動作.

你可以查看到那幾個 view 的定義嗎?

因為改成 table 的方式,資料是從其他table複製,建立時那一次.
view是每次查詢都拉一次.
以你目前要做匯出,兩者差異不大,當然實體table會多佔些 disk space.

可以使用 SHOW CREATE VIEW
https://mariadb.com/kb/en/show-create-view/

lulu_meat iT邦研究生 5 級 ‧ 2022-03-28 17:29:27 檢舉

我剛剛隨便拿一個View看定義,發現我根本不知道rackuser的密碼是甚麼,沒辦法登入進去試QAQ

這個view 的 SQL SECURITY 是 DEFINER.
你看到後面有 as 接著的 select 'O'... 那串,
就是view 的主體定義了.

lulu_meat iT邦研究生 5 級 ‧ 2022-03-28 17:40:49 檢舉

請問我需要更改這個View的甚麼設定才能讓他做INTO OUTFILE呢?
還是只要是View就不能INTO OUTFILE呢?謝謝!

lulu_meat iT邦研究生 5 級 ‧ 2022-03-28 17:46:03 檢舉

我剛剛把view轉成table就可以做INTO OUTFILE了! 剛好這些view的數量都不大,所以不會占太多空間,謝謝您!

因為那個view的 SQL SECURITY 是 DEFINER,所以你的匯出有問題.
但是你應該可以select 裡面的 table ,有看到 Object , EntityLink.
因為目的是匯出,所以可以用

create table newtbl as
select ....

這樣的方式建立 table,再匯出.

1
海綿寶寶
iT邦大神 1 級 ‧ 2022-03-28 15:00:13

只 Google 到這個
不妨試看看
grant the view's definer the global FILE privileges

This thread is getting a little old, but it has by far the best presentation of the few (unsolved) posts on that subject, so here is what I found:

As you can guess, since the error shows up when you add the "into file" part, the lacking permission is that of accessing files (and yes, the error message is misleading).

Indeed, if you grant the view's definer the global FILE privileges, the error will disappear. (And that makes the error message misleading in a second way, in that it looks like the invoker permissions have no bearing there - though they should, IMHO.)

資料來源

lulu_meat iT邦研究生 5 級 ‧ 2022-03-28 17:49:16 檢舉

謝謝您的回復! 不好意思這麼晚才回覆您><
因為急著做測試就先研究樓下大哥的方法了,非常感謝您的幫忙!!

我要發表回答

立即登入回答