Saya mencoba untuk membuang isi tabel ke file csv menggunakan pernyataan MySQL SELECT INTO OUTFILE. Jika aku melakukan:
SELECT column1, column2
INTO OUTFILE 'outfile.csv'
FIELDS TERMINATED BY ','
FROM table_name;
outfile.csv akan dibuat di server di direktori yang sama dengan tempat file database ini disimpan.
Namun, ketika saya mengubah kueri saya menjadi:
SELECT column1, column2
INTO OUTFILE '/data/outfile.csv'
FIELDS TERMINATED BY ','
FROM table_name;
Saya mendapat:
ERROR 1 (HY000): Can't create/write to file '/data/outfile.csv' (Errcode: 13)
Errcode 13 adalah kesalahan izin, tetapi saya mendapatkannya bahkan jika saya mengubah kepemilikan / data ke mysql: mysql dan memberinya 777 izin. MySQL berjalan sebagai pengguna "mysql".
Anehnya saya dapat membuat file di / tmp, hanya saja tidak di direktori lain yang pernah saya coba, bahkan dengan izin yang disetel sedemikian rupa sehingga pengguna mysql harus dapat menulis ke direktori tersebut.
Ini adalah MySQL 5.0.75 yang berjalan di Ubuntu.
mysql
sql
into-outfile
Ryan Olson
sumber
sumber
/tmp
.Jawaban:
Versi Ubuntu mana yang ini dan apakah Ubuntu Server Edition ini?
Edisi Server Ubuntu terbaru (seperti 10.04) dikirimkan dengan AppArmor dan profil MySQL mungkin dalam mode penerapan secara default. Anda dapat memeriksanya dengan menjalankan
sudo aa-status
seperti ini:Jika mysqld disertakan dalam mode penegakan, maka mode inilah yang mungkin menolak penulisan. Entri juga akan ditulis
/var/log/messages
ketika AppArmor memblokir penulisan / akses. Apa yang dapat Anda lakukan adalah mengedit/etc/apparmor.d/usr.sbin.mysqld
dan menambah/data/
dan/data/*
mendekati bagian bawah seperti:Dan kemudian buat AppArmor memuat ulang profil.
PERINGATAN: perubahan di atas akan memungkinkan MySQL untuk membaca dan menulis ke direktori / data. Kami harap Anda telah mempertimbangkan implikasi keamanan dari ini.
sumber
/your/abs/folder/ r, /your/abs/folder/** rwk, }
jangan lupa untuk menyertakan koma di akhir!Ubuntu menggunakan AppArmor dan itulah yang mencegah Anda mengakses / data /. Fedora menggunakan selinux dan itu akan mencegah ini pada mesin RHEL / Fedora / CentOS.
Untuk memodifikasi AppArmor agar memungkinkan MySQL mengakses / data / lakukan hal berikut:
sudo gedit /etc/apparmor.d/usr.sbin.mysqld
tambahkan baris ini di mana saja dalam daftar direktori:
/data/ rw,
lalu lakukan:
sudo /etc/init.d/apparmor restart
Opsi lain adalah menonaktifkan AppArmor untuk mysql sama sekali, ini TIDAK DIANJURKAN :
sudo mv /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/
Jangan lupa restart apparmor:
sudo /etc/init.d/apparmor restart
sumber
Saya tahu Anda mengatakan bahwa Anda sudah mencoba menyetel izin ke 777, tetapi karena saya memiliki bukti bahwa bagi saya itu adalah masalah izin, saya memposting apa yang sebenarnya saya jalankan dengan harapan dapat membantu. Inilah pengalaman saya:
sumber
MySQL semakin bodoh di sini. Ia mencoba membuat file di bawah / tmp / data / .... Jadi yang dapat Anda lakukan adalah sebagai berikut:
Kemudian coba kueri Anda. Ini berfungsi untuk saya setelah berjam-jam men-debug masalah.
sumber
Masalah ini telah mengganggu saya sejak lama. Saya perhatikan bahwa diskusi ini tidak menunjukkan solusi pada RHEL / Fecora. Saya menggunakan RHEL dan saya tidak menemukan file konfigurasi yang sesuai dengan AppArmer di Ubuntu, tetapi saya memecahkan masalah saya dengan membuat SETIAP direktori di direktori PATH dapat dibaca dan diakses oleh mysql. Misalnya, jika Anda membuat direktori / tmp, dua perintah berikut membuat SELECT INTO OUTFILE dapat menampilkan file .sql AND .sql
Jika Anda membuat direktori di direktori home / home / tom, Anda harus melakukan ini untuk / home dan / home / tom.
sumber
chown mysql:mysql
menyelesaikan masalah sayaKamu bisa melakukan ini :
sumber
Beberapa hal untuk dicoba:
secure_file_priv
set variabel sistem? Jika ya, semua file harus ditulis ke direktori itu.sumber
Saya memiliki masalah yang sama dan saya memperbaiki masalah ini dengan mengikuti langkah-langkah berikut:
sudo gedit /etc/apparmor.d/usr.sbin.mysqld
sekarang file akan dibuka di editor, tambahkan direktori Anda di sana
/ var / www / csv / * rw,
juga saya telah menambahkan di file saya, seperti yang diberikan gambar berikut:
sudo /etc/init.d/apparmor restart
Itu berhasil dilakukan dan menulis semua baris dengan kolom yang dipilih ke dalam file OUTPUT.csv ...
sumber
Dalam kasus saya, solusinya adalah membuat setiap direktori di jalur direktori dapat dibaca dan diakses oleh
mysql
(chmod a+rx
). Direktori masih ditentukan oleh jalur relatifnya di baris perintah.sumber
Saya baru saja mengalami masalah yang sama. Masalah saya adalah direktori yang saya coba tempatkan tidak memiliki izin menulis untuk proses mysqld. SQL awal dump akan menulis tetapi penulisan file csv / txt akan gagal. Sepertinya sql dump berjalan sebagai pengguna saat ini dan konversi ke csv / txt dijalankan sebagai pengguna yang menjalankan mysqld. Jadi direktori membutuhkan izin tulis untuk kedua pengguna.
sumber
Anda perlu memberikan jalur absolut, bukan jalur relatif.
Berikan jalur lengkap ke direktori / data yang Anda coba tulis.
sumber
touch /data/outfile.csv
su --shell=/bin/sh nameofaccount
Apakah Ubuntu menggunakan SELinux? Periksa untuk melihat apakah itu diaktifkan dan diterapkan. /var/log/audit/audit.log mungkin membantu (jika di situlah Ubuntu menempelkannya - itulah lokasi RHEL / Fedora).
sumber
Saya mengalami masalah yang sama pada CentOs 6.7 Dalam kasus saya, semua izin telah ditetapkan dan kesalahan masih terjadi. Masalahnya adalah SE Linux berada dalam mode "memaksa".
Saya mengalihkannya ke "permisif" menggunakan perintah
sudo setenforce 0
Kemudian semuanya berhasil bagi saya.
sumber