質問するログイン新規登録
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

1回答

449閲覧

[MySQL] SELECT~INTO OUTFILEでパーミッション777の/tmpを出力先に指定しても、CSVファイルが書き出されない

milton_rb4life

総合スコア30

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

0クリップ

投稿2024/08/06 15:48

編集2024/08/07 15:06

0

0

2024/08/07 21:55 コメントにてご指摘いただいた、環境構成と操作

コメントでのご指摘をいただきありがとうございます。
どのような環境で、どのような操作を行ったかを説明いたします。

● 環境
VirtualBox7.0に対して、RockyLinux(Minimal ISO Edition)単一でインストールしました。
mysqlは、dnfコマンドで「mysql」「mysql-server」でインストールしました。

● 接続と操作について

Windows(ホストOS)から、RLogin(ターミナルソフト)で、リモートSSHを使って操作しております。

mysqlへのログインは、
・SSHリモートでつないだ状態ですべて操作。
・ゲストOSでは、非rootユーザーとしてログインしました。
mysql -u root -p -D HogeDBというコマンドでMySQLに入り込んでおりました。


実現したいこと

ごらんいただきありがとうございます。
MySQLで、SELECT~INTO OUTFILE の形式でCSVを出力しようとしておりました。

ネットで調べると沢山出てくる「my.cnfでsecure_file_priv=""に設定」を行った状態で、MySQLを再起動後、CSV出力を実施しましたが、「Query OK, 1 row affected (0.00 sec)」しか出力されず
CSVファイルが出力されないという現象が見られました。

パーミッションがいけないのか、my.cnfの設定が足りないのか、見当がつかない状態なので質問させていただきます。

発生している問題・分からないこと

(1)my.cnfでsecure_file_priv=""に設定して、MySQLを再起動してまず試したこと。
/home/hogehoge/hoge.csvに出力先を設定した場合は(OS errno 13 - Permission denied)が出力されました。

すなわち

SQL

1SELECT * FROM *** INTO OUTFILE '/home/hogehoge/hoge.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';

(OSのパーミッションでは/homeは755かつ、グループ:所有者がrootなので当然ではありますが。)

(2) CSV出力先をパーミッションが777である/tmpに変えた場合

SQL

1SELECT * FROM *** INTO OUTFILE '/tmp/hoge.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';

エラーは発生せず、Query OK, 1 row affected (0.00 sec)が出力されました。

ところが、「/tmp」の内容を確認したところ、ファイルそのものは出力されませんでした。
同じSQLを2回たたきましたが、こんどは「already exists」のエラーが出ました。

ERROR 1086 (HY000): File '/tmp/hoge.csv' already exists

エラーメッセージ

error

1/* 上記(1)では*/ 2ERROR 1 (HY000): Can't create/write to file '/home/hogehoge/hoge.csv' (OS errno 13 - Permission denied) 3 4 5/*上記(2)では、エラー発生せず、OKが出力されました。*/ 6 7`Query OK, 1 row affected (0.00 sec)`

該当のソースコード

SQL

1/*(1) 具体的なSQL */ 2SELECT * FROM *** INTO OUTFILE '/home/hogehoge/hoge.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n'; 3 4/*(2) 具体的なSQL */ 5SELECT * FROM *** INTO OUTFILE '/tmp/hoge.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n'; 6

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

/etc/my.cnfにある内容で、secure_file_priv=""に設定しました。

my.cnf

1 2[mysqld] 3# secure_file_priv="/var/lib/myswl-files" //←コメントアウト 4secure_file_priv="" 5

MySQL再起動後、secure_file_privの設定状態を確認したところ、内容が空になっていることを確認しました。

mysql> select @@global.secure_file_priv; +---------------------------+ | @@global.secure_file_priv | +---------------------------+ | | +---------------------------+ 1 row in set (0.00 sec)

補足

[環境]
Oracle VirtualBox 7.0
ゲスト OS:Rocky Linux 9.4
MySQL 8.0.36


実行したファクト

(1)/home/**** で自分のアカウントとしてログイン。直後mysqlに入る。

mysql -u root -p -D test

(2)ファイルの出力場所の限定「secure_file_priv」が空白になっていることを確認。

mysql> select @@global.secure_file_priv; +---------------------------+ | @@global.secure_file_priv | +---------------------------+ | | +---------------------------+ 1 row in set (0.01 sec)

(3)mysqlでCSVを出力

mysql> select * from hello into outfile '/tmp/hoge2.csv' fields terminated by ',' enclosed by '"' lines terminated by '\n'; Query OK, 1 row affected (0.02 sec)

(4)上記(3)のSQLを実行した直後、「ls -al /tmp」で「'/tmp/hoge2.csv'」が出力されていないことを確認。

[********@localhost tmp]$ ls -al /tmp total 4 drwxrwxrwt. 13 root root 4096 Aug 7 23:53 . dr-xr-xr-x. 19 root root 249 Jul 30 23:32 .. drwxrwxrwt. 2 root root 6 Jul 26 23:10 .ICE-unix drwxrwxrwt. 2 root root 6 Jul 26 23:10 .X11-unix drwxrwxrwt. 2 root root 6 Jul 26 23:10 .XIM-unix drwxrwxrwt. 2 root root 6 Jul 26 23:10 .font-unix drwxr-xr-x. 2 ******** ******** 6 Jul 30 22:10 hsperfdata_******** drwxr-xr-x. 2 root root 6 Jul 29 23:34 hsperfdata_root drwx------. 3 root root 17 Aug 7 20:26 systemd-private-6eb8c4666b9944359c54e43fbc3f0072-chronyd.service-iabmYe drwx------. 3 root root 17 Aug 7 20:26 systemd-private-6eb8c4666b9944359c54e43fbc3f0072-dbus-broker.service-oaodlP drwx------. 3 root root 17 Aug 7 20:27 systemd-private-6eb8c4666b9944359c54e43fbc3f0072-kdump.service-pKea5U drwx------. 3 root root 17 Aug 7 20:26 systemd-private-6eb8c4666b9944359c54e43fbc3f0072-mysqld.service-mAddu0 drwx------. 3 root root 17 Aug 7 20:26 systemd-private-6eb8c4666b9944359c54e43fbc3f0072-systemd-logind.service-Um0xQ5

(5)上記(3)と同じSQLを起動し、「already exists」がエラーが出ていることを確認。

mysql> select * from hello into outfile '/tmp/hoge2.csv' fields terminated by ',' enclosed by '"' lines terminated by '\n'; ERROR 1086 (HY000): File '/tmp/hoge2.csv' already exists

(6)上記(5)を実行した直後、「ls -al /tmp」で「'/tmp/hoge2.csv'」が出力されていないことを確認。

[********@localhost tmp]$ ls -al /tmp total 4 drwxrwxrwt. 13 root root 4096 Aug 8 00:00 . dr-xr-xr-x. 19 root root 249 Jul 30 23:32 .. drwxrwxrwt. 2 root root 6 Jul 26 23:10 .ICE-unix drwxrwxrwt. 2 root root 6 Jul 26 23:10 .X11-unix drwxrwxrwt. 2 root root 6 Jul 26 23:10 .XIM-unix drwxrwxrwt. 2 root root 6 Jul 26 23:10 .font-unix drwxr-xr-x. 2 ******** ******** 6 Jul 30 22:10 hsperfdata_******** drwxr-xr-x. 2 root root 6 Jul 29 23:34 hsperfdata_root drwx------. 3 root root 17 Aug 7 20:26 systemd-private-6eb8c4666b9944359c54e43fbc3f0072-chronyd.service-iabmYe drwx------. 3 root root 17 Aug 7 20:26 systemd-private-6eb8c4666b9944359c54e43fbc3f0072-dbus-broker.service-oaodlP drwx------. 3 root root 17 Aug 7 20:27 systemd-private-6eb8c4666b9944359c54e43fbc3f0072-kdump.service-pKea5U drwx------. 3 root root 17 Aug 7 20:26 systemd-private-6eb8c4666b9944359c54e43fbc3f0072-mysqld.service-mAddu0 drwx------. 3 root root 17 Aug 7 20:26 systemd-private-6eb8c4666b9944359c54e43fbc3f0072-systemd-logind.service-Um0xQ5

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2024/08/06 16:18

> ところが、「/tmp」の内容を確認したところ、ファイルそのものは出力されませんでした。 これは、ls /tmp/hoge.csv で、ls: cannot access '/tmp/hoge.csv': No such file or directory のようになるということですよね? それと、 > File '/tmp/hoge.csv' already exists の両方が正しいとすると、「それぞれ別のOSの/tmpである」ということになりますね。
milton_rb4life

2024/08/07 12:01

コメントいただきありがとうございます。 はい、ご指摘の通りのメッセージが出ております。 VirtualBoxにはRockyLinuxを単一でインストールしてるので別のOSには飛んで行ってしまってるとは考えにくいと推測しています。
Eggpan

2024/08/07 12:07

mysqlコマンドはRobkyLinux内からlocalhostに対して接続しているのでしょうか? 構成やコマンドなどのやった事が詳しく記載されているとより良い回答がつくと思います。
milton_rb4life

2024/08/07 12:57

ご指摘ありがとうございます。 詳細追加情報を、このページのTOPに追記いたしました。
otn

2024/08/07 13:39

> ところが、「/tmp」の内容を確認したところ、ファイルそのものは出力されませんでした。 は、 ・/tmp/hoge.csv というファイルが存在しない ・/tmp/hoge.csv というファイルは存在するが、中身が空など のどちらの意味でしょうか? 最初は、「/tmp/hoge.csv というファイルが存在しない」という意味だろうと思って、 > File '/tmp/hoge.csv' already exists と矛盾すると言うことを書いたのですが、もしかして存在するのですか? 記述は全て客観的なファクトの提示にしてもらえると、いちいち確認しなくて済みます。
milton_rb4life

2024/08/07 14:19

失礼しました。 「物理的にファイルそのものが存在しない」というのが事実です。 ファイルそのものが存在しないのに「already exists」という矛盾が発生しています。
otn

2024/08/07 14:50 編集

> 「物理的にファイルそのものが存在しない」というのが事実です。 そうじゃなくて、何を見てあなたがそういう感想を持ったかの、その見たもの自体のことを聞いています。 それがファクトです。コピペしましょう。 何故私がこの質問をしているのか理解されていますか? ・/tmp/hoge.csv が存在しないというのが間違い ・/tmp/hoge.csv が存在するというが間違い ・それぞれ別の/tmpの話で、hoge.csv が存在しない/tmpと、hoge.csvが存在する/tmpの両方がある の三択のどれかの訳ですが、 hoge.csvが存在するというのは、 ERROR 1086 (HY000): File '/tmp/hoge.csv' already exists というファクトが示されていますが、hoge.csv が存在しないというのはファクトが示されていません。 「それぞれ別の/tmp」というのもかなり怪しいのですが、今の所、調べ方を思いついてません。 ということで、まずは、簡単にファクトが出てきそうな、何を見て「物理的にファイルそのものが存在しない」と思ったのかを聞いています。 あとは、 ERROR 1086 (HY000): File '/tmp/hoge.csv' already exists のメッセージが出た時刻と、あなたが「物理的にファイルそのものが存在しない」という感想をいだいたファクトを目にした時刻との間に乖離があると、その間に消えたとかもあるかも知れません。
milton_rb4life

2024/08/07 15:06

コメントありがとうございます。質問を修正したのでご確認よろしくお願いいたします。
otn

2024/08/07 16:04

> systemd-private-6eb8c4666b9944359c54e43fbc3f0072-mysqld.service-mAddu0 私個人では使ってないので、すっかり忘れてましたが、privatetmpという機能があり、 systemctl で動かすサービス単位で/tmpを分けることが出来ますので、たぶんそれでしょう。 やっぱり「別の/tmp」か。 rootからしか見えませんが、上記のディレクトリーの中をみると、tmpがあって、 それがmysqldから見える/tmpなので、その中にhoge2.csv があると思います。 privatetmpの目的は、システムサービスの/tmpを一般ユーザーからアクセスできなくするためなので、 セキュリティーを考えると有効にした方が良いのですが、私は使ってません。
milton_rb4life

2024/08/07 16:37

コメントありがとうございます。問題が解決しました! ご指摘の「systemd-private-mysql(略)」の中に「/tmp」フォルダがあって その中を確認しましたところ、CSVファイルが見つかりました。 本当にありがとうございました。 ``` [root@localhost tmp]# cd /tmp/systemd-private-6eb8c4666b9944359c54e43fbc3f0072-mysqld.service-mAddu0 [root@localhost systemd-private-6eb8c4666b9944359c54e43fbc3f0072-mysqld.service-mAddu0]# ls -al total 4 drwx------. 3 root root 17 Aug 7 20:26 . drwxrwxrwt. 13 root root 4096 Aug 8 01:32 .. drwxrwxrwt. 2 root root 39 Aug 7 23:53 tmp [root@localhost ~]# cd /tmp/systemd-private-6eb8c4666b9944359c54e43fbc3f0072-mysqld.service-mAddu0/tmp [root@localhost tmp]# ll total 8 -rw-r-----. 1 mysql mysql 18 Aug 7 20:29 hoge.csv -rw-r-----. 1 mysql mysql 18 Aug 7 23:53 hoge2.csv ```
milton_rb4life

2024/08/07 16:37 編集

コメントありがとうございます。 ベストアンサーに選びたいので同じ内容を回答欄に投稿いただけますでしょうか?
guest

回答1

0

ベストアンサー

/home/hogehoge/hoge.csvのエラーの方はどうなったか分かりませんが、タイトルにある「/tmpを出力先に指定しても、CSVファイルが書き出されない」については、コメントのやりとりで「違う/tmpを見ていた」ということで解決したので書いておきます。
(最初は、仮想マシンかコンテナがらみでの別/tmpかと思っていましたが、どうも1つのOS内の話らしいので違いそう)

結局は、PrivateTmpの機能が有効であったため、MySQLからみると、/tmp/systemd-private-中略-mysqld.service-中略/tmp/tmpに見えると言うことで、そこにhoge.csvはあったようです。
名前空間を使って/tmpを分離して、関係ないプロセスからはアクセスできなくすることでセキュリティーを確保するという機能だと思います。

投稿2024/08/08 10:07

otn

総合スコア86367

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

milton_rb4life

2024/08/08 12:17

回答ありがとうございます。 試したところ問題が解決しました! ベストアンサーに選ばせていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問