2017年12月17日日曜日

MySQLでCSVファイルがうまくいかなかった場合

MySQLでCSVファイルがうまくいかなかった場合

(ubuntudeで、mysqlバージョンは、5.7)


mysqlからファイル出力(CSVファイルなど)を出力しようとしたら
エラーになった場合は

以下のフォルダ名を追加して、そこに出力しましょう!

'/var/lib/mysql-files/test.txt'

そのフォルダのパーミションを変更して、だれでも読み書きできるようにしました。
(実行権限はいらないね)




エラーメッセージ
mysql> select 1 into outfile 'test.txt';
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement

正解
mysql> select "testdata"  into outfile '/var/lib/mysql-files/test.txt';
Query OK, 1 row affected (0.00 sec)

パーミションの変更
ll /var/lib/

drwxr-xr-x  2 root          root          4096 12月 17 07:35 mlocate/
drwxr-xr-x  2 root          root          4096  7月  8 17:55 msttcorefonts/
drwx------ 10 mysql         mysql         4096 12月 17 08:57 mysql/
drwxrwxrwx  2 mysql         mysql         4096 12月 17 08:37 mysql-files/
drwx------  2 mysql         mysql         4096  5月 14  2017 mysql-keyring/
drwxr-xr-x  2 root          root          4096  4月 27  2017 mysql-upgrade/
drwxr-xr-x  2 root          root          4096  5月 13  2017 nssdb/
drwxr-xr-x  2 root          root          4096  3月  7  2012 ntpdate/



別のやり方

secure_file_privの値を""にすると、どこでも読めるらしい。




sudo vi /etc/mysql/mysql.conf.d/mysqld.cnfを編集します。
ファイルの最後に以下を追加する。(もしあれば変更)

secure-file-priv=""

以下をmysql内で確認するとできた。
しかし、/tmp以外のフォルダではNG

❍ select "testdata"  into outfile '/tmp/test.txt';
✗ select "testdata"  into outfile '/home/koba/test/test.txt';

そこで、
secure-file-priv="/home/koba/test/"

でどうだ〜

mysql> select "testdata"  into outfile '/tmp/test2.txt';
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement

mysql> select "testdata"  into outfile '/home/koba/test/test2.txt';
ERROR 1 (HY000): Can't create/write to file '/home/koba/test/test2.txt' (Errcode: 13 - Permission denied)

全然だめ、パーミションは変更したのに!

色々やっていたが、ある時うまくいった。(原因?)

apparmorの設定をおこなっていた()
・再起動した
・chown で所有者、グループを変更していた

sudo gedit /etc/apparmor.d/usr.sbin.mysqld
sudo /etc/init.d/apparmor reload
sudo /etc/init.d/apparmor restart


まあー、現在時点では、わかったのは。。。
(mysqlからCSVファイルなどを出力したい)

/etc/mysql/mysql.conf.d/mysqld.cnfを編集
 「secure-file-priv=""」を追加した

②フォルダを自分のユーザーの適当なフォルダを作成
 パーミションは、所有者、グループが(読み、書き、実行)でその他が実行権
 (何も考えないでフォルダ作成しただけ)

③そのフォルダを、chownでグループだけを変更
 (グループをmysqlにしないと、mysqldがうまく書けない)











❍ubuntudeで、mysqlバージョンは、5.7
mysql> select version();
+-------------------------+
| version()               |
+-------------------------+
| 5.7.18-0ubuntu0.16.04.1 |
+-------------------------+



❍確認するらしい
mysql> select @@global.secure_file_priv;
+---------------------------+
| @@global.secure_file_priv |
+---------------------------+
| /var/lib/mysql-files/     |
+---------------------------+
1 row in set (0.00 sec)



❍フォルダ
 /var/lib/mysql-files


❍再起動
sudo /etc/init.d/mysql restart