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

回答1件
あなたの回答
tips
プレビュー