[解決済み] SELECT INTO OUTFILEでMySQL Errcode 13を回避するにはどうしたらいいですか?
質問
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 ディレクトリの読み取りと書き込みができるようになります。これによるセキュリティへの影響については、すでにご検討いただいていることと思います。
関連
-
[解決済み】SQL ZOO 各大陸とアルファベット順で1位の国名をリストアップする
-
[解決済み] mysqldです。dir を data に変更できません。サーバーが起動しません
-
[解決済み] このMySQLエラー Incorrect column specifier for column COLUMN NAMEを回避するにはどうしたらよいですか?
-
[解決済み] MySQLの複数行を1つのフィールドに連結することはできますか?
-
[解決済み] MySQLでコマンドラインを使用してユーザーアカウントのリストを取得するにはどうすればよいですか?
-
[解決済み] MySQLのクエリ結果をCSV形式で出力するにはどうすればよいですか?
-
[解決済み] MySQLデータベースのテーブルのサイズを取得する方法は?
-
[解決済み] MySQLで'insert if not exists'を行うにはどうしたらいいですか?
-
[解決済み] MYSQLでMAX(列の値)、PARTITIONで別の列で行を選択するにはどうすればよいですか?
-
[解決済み] SQL ServerでINNER JOINを使用して削除するにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 親の行を削除または更新できない: 外部キー制約に失敗 - MYSQL
-
[解決済み】MySQLのエラーコードです。MySQL WorkbenchでUPDATE中に1175のエラーが発生しました。
-
コマンドでmysqlに接続中、'mysql'が内部または外部コマンドとして認識されない エラーは解決されました。
-
[解決済み] エラー 1115 (42000)。不明な文字セットです。'utf8mb4'
-
[解決済み] MySQLを使用したパーセンタイル値の計算
-
[解決済み] "sqlstate[23000]: 整合性制約違反 "を有効な制約で
-
[解決済み] WHEREで集計関数は使用できません "というエラーを回避する方法
-
[解決済み] #1136 - 列数が 1 行目の値数と一致しません。
-
[解決済み] エラー 1049 (42000)。不明なデータベース
-
[解決済み] MySQLの グループ関数の無効な使用