1. ホーム
  2. マイスル

[解決済み] SELECT INTO OUTFILEでMySQL Errcode 13を回避するにはどうしたらいいですか?

2022-03-03 16:10:15

質問

MySQL SELECT INTO OUTFILE ステートメントを使用して、テーブルの内容を csv ファイルにダンプしようとしています。 もし私が

SELECT column1, column2
INTO OUTFILE 'outfile.csv'
FIELDS TERMINATED BY ','
FROM table_name;

outfile.csvは、サーバー上のこのデータベースのファイルが格納されているのと同じディレクトリに作成されます。

しかし、クエリを変更すると

SELECT column1, column2
INTO OUTFILE '/data/outfile.csv'
FIELDS TERMINATED BY ','
FROM table_name;

得ることができる。

ERROR 1 (HY000): Can't create/write to file '/data/outfile.csv' (Errcode: 13)

Errcode 13はパーミッションエラーですが、/dataの所有者をmysql:mysqlに変更し、パーミッションを777にしても出ますね。 MySQLはユーザー"mysql"として起動しています。

不思議なことに、/tmp にはファイルを作成できますが、他のどのディレクトリでも、ユーザー mysql がそのディレクトリに書き込めるはずのパーミッションを設定しても、作成することができません。

Ubuntu 上で動作する MySQL 5.0.75 です。

解決方法は?

UbuntuのバージョンとUbuntu Server Editionはどちらですか?

最近のUbuntu Server Edition(10.04など)にはAppArmorが搭載されており、MySQLのプロファイルがデフォルトで強制モードになっている可能性があります。これを確認するには、次のコマンドを実行します。 sudo aa-status のようにします。

# sudo aa-status
5 profiles are loaded.
5 profiles are in enforce mode.
   /usr/lib/connman/scripts/dhclient-script
   /sbin/dhclient3
   /usr/sbin/tcpdump
   /usr/lib/NetworkManager/nm-dhcp-client.action
   /usr/sbin/mysqld
0 profiles are in complain mode.
1 processes have profiles defined.
1 processes are in enforce mode :
   /usr/sbin/mysqld (1089)
0 processes are in complain mode.

mysqld が enforce モードに含まれている場合、おそらく書き込みを拒否しているのは mysqld でしょう。また、エントリーは /var/log/messages AppArmorが書き込み/アクセスをブロックしたとき。あなたができることは /etc/apparmor.d/usr.sbin.mysqld を追加し /data//data/* というように、下の方にある

...  
/usr/sbin/mysqld  {  
    ...  
    /var/log/mysql/ r,  
    /var/log/mysql/* rw,  
    /var/run/mysqld/mysqld.pid w,  
    /var/run/mysqld/mysqld.sock w,  
    **/data/ r,  
    /data/* rw,**  
}

そして、AppArmorにプロファイルを再読み込みさせます。

# sudo /etc/init.d/apparmor reload

警告: 上記の変更により、MySQL は /data ディレクトリの読み取りと書き込みができるようになります。これによるセキュリティへの影響については、すでにご検討いただいていることと思います。