Outfileにselectを使用してmysql errcode13を回避するにはどうすればよいですか?
-
03-10-2019 - |
質問
MySQL選択を使用して、テーブルの内容を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は許可エラーですが、 /データの所有権をmysql:mysqlに変更し、777の権限を与える場合でも、それを取得します。 MySQLはユーザー「MySQL」として実行されています。
奇妙なことに、 /TMPのファイルを作成できます。これは、ユーザーMySQLがディレクトリに書き込みできるように設定されている場合でも、試した他のディレクトリではありません。
これは、Ubuntuで実行されているMySQL 5.0.75です。
解決
Ubuntuの特定のバージョンはこれであり、このUbuntu Server Editionはどれですか?
最近のUbuntu Serverエディション(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モードに含まれている場合、それはおそらく書き込みを否定するものです。エントリも書かれます /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ディレクトリに読み書きできます。これのセキュリティへの影響をすでに検討していることを願っています。
他のヒント
UbuntuはApparmorを使用しています。 FedoraはSELINUXを使用しているため、RHEL/FEDORA/CENTOSマシンでこれを防ぎます。
Apparmorを変更して、MySQLがアクセス /データ /フォローを実行できるようにします。
sudo gedit /etc/apparmor.d/usr.sbin.mysqld
ディレクトリのリストのどこにでもこの行を追加します:
/data/ rw,
次に、:
sudo /etc/init.d/apparmor restart
別のオプションは、mysqlのApparmorを完全に無効にすることです。これは お勧めしません:
sudo mv /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/
Apparmorを再起動することを忘れないでください:
sudo /etc/init.d/apparmor restart
私はあなたがすでに777に権限を設定しようとしたと言ったことを知っていますが、私にとってそれが許可の問題であるという証拠があるので、私がそれが役立つことを望んでいることを正確に掲載しているものを投稿しています。これが私の経験です:
tmp $ pwd
/Users/username/tmp
tmp $ mkdir bkptest
tmp $ mysqldump -u root -T bkptest bkptest
mysqldump: Got error: 1: Can't create/write to file '/Users/username/tmp/bkptest/people.txt' (Errcode: 13) when executing 'SELECT INTO OUTFILE'
tmp $ chmod a+rwx bkptest/
tmp $ mysqldump -u root -T bkptest bkptest
tmp $ ls bkptest/
people.sql people.txt
tmp $
MySQLはここで愚かになっています。 /tmp/data/....の下でファイルを作成しようとします。
mkdir /tmp/data
mount --bind /data /tmp/data
次に、クエリを試してください。これは、問題をデバッグした数時間後に私のために機能しました。
この問題は長い間私を悩ませてきました。この議論は、Rhel/Fecoraの解決策を指摘していないことに気付きました。私はRhelを使用しており、Ubuntuでappipermerに対応する構成ファイルは見つかりませんが、ディレクトリパス内のすべてのディレクトリを読み取り可能でMySQLがアクセスできるようにすることで問題を解決しました。たとえば、ディレクトリ /TMPを作成する場合、次の2つのコマンドにより、.sqlと.sqlファイルを出力できるOutfileに選択するようになります
chown mysql:mysql /tmp
chmod a+rx /tmp
ホームディレクトリ /ホーム /トムにディレクトリを作成する場合は、 /homeと /home /tomの両方でこれを行う必要があります。
あなたはこれを行うことができます :
mysql -u USERNAME --password=PASSWORD --database=DATABASE --execute='SELECT `FIELD`, `FIELD` FROM `TABLE` LIMIT 0, 10000 ' -X > file.xml
試してみるべきこと:
- それは
secure_file_priv
システム変数セット?もしそうなら、すべてのファイルをそのディレクトリに書き込む必要があります。 - ファイルが存在しないことを確認します-MySQLは、既存のファイルを上書きするのではなく、新しいファイルのみを作成します。
私は同じ問題を抱えており、次の手順でこの問題を修正しました。
- オペレーティングシステム:Ubuntu 12.04
- ランプが取り付けられています
- 出力ファイルを保存するディレクトリを次のようにしてください:/var/www/csv/
ターミナルで次のコマンドを実行し、GEDITエディターを使用してこのファイルを編集して、ディレクトリを出力ファイルに追加します。
sudo gedit /etc/apparmor.d/usr.sbin.mysqld
これでファイルが編集者に開かれます。ディレクトリをそこに追加してください
/var/www/csv/* rw、
同様に、私は自分のファイルに追加されたものを追加しました。
次のコマンドを実行してサービスを再起動します。
sudo /etc/init.d/apparmor再起動
たとえば、CSVファイルにデータを出力するために、phpmyAdminクエリビルダーに次のクエリを実行します
SELECT colName1, colName2,colName3
INTO OUTFILE '/var/www/csv/OUTFILE.csv'
FIELDS TERMINATED BY ','
FROM tableName;
選択した列がoutput.csvファイルに正常に完了し、すべての行を書き込みます...
私の場合、解決策は、ディレクトリパス内のすべてのディレクトリを読み取り可能でアクセスできるようにすることでした mysql
(chmod a+rx
)。ディレクトリは、コマンドラインの相対パスによってまだ指定されていました。
chmod a+rx /tmp
chmod a+rx /tmp/migration
etc.
私はちょうどこの同じ問題に出くわしました。私の問題は、MySQLDプロセスの書き込み許可がなかったというディレクトリでした。最初のSQLダンプは書き出しますが、CSV/TXTファイルの書き込みは失敗します。現在のユーザーとしてSQLダンプが実行され、CSV/TXTへの変換がMySQLDを実行しているユーザーとして実行されるように見えます。したがって、ディレクトリには両方のユーザーに許可を書き込む必要があります。
相対的なパスではなく、絶対的なパスを提供する必要があります。
書き込もうとしている /データディレクトリへのフルパスを提供します。
ubuntuはselinuxを使用していますか?有効になって実施しているかどうかを確認してください。 /var/log/audit/audit.logはhelpulかもしれません(それがubuntuがそれを貼り付けている場合、それがRhel/Fedoraの場所です)。
私の場合、CENTOS 6.7で同じ問題がありました。すべてのアクセス許可が設定されていても、エラーは発生しました。問題は、SE Linuxがモード「強制」にあることでした。
コマンドを使用して「許容」に切り替えました sudo setenforce 0
それからすべてが私のためにうまくいきました。