Tidak dapat menampilkan data MySQL ke file

13

Saya mencoba untuk mengeluarkan data dari tabel MySQL ke file tetapi mendapatkan kesalahan izin:

$ pwd
/home/dotancohen
$ mkdir in
$ chmod 777 in/
$ mysql -ugs -p
mysql> USE someDatabase;
mysql> SELECT * FROM data INTO OUTFILE '/home/dotancohen/in/data.csv';
ERROR 1045 (28000): Access denied for user 'gs'@'localhost' (using password: YES)
mysql>

Jika direktori yang dimaksud chmodded ke 777, lalu mengapa pengguna MySQL tidak bisa menulis file? Cukup menarik, saya tidak bisa menulis ke / tmp / baik.

EDIT: Sepertinya pengguna DB memiliki izin MySQL yang tepat:

mysql> show grants;
+----------------------------------------------------------------------------------+
| Grants for gs@localhost                                                          |
+----------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'gs'@'localhost' IDENTIFIED BY PASSWORD 'somePassword'     | 
| GRANT ALL PRIVILEGES ON `gs\_%`.* TO 'gs'@'localhost'                            | 
+----------------------------------------------------------------------------------+
2 rows in set (0.01 sec)
dotancohen
sumber
2
Anda harus memberikan hak akses ke MySQL di seluruh pohon direktori. Pemberian hak intidak ada gunanya jika MySQL tidak dapat mengakses dotanchoen. Dengan kata lain, safety depost box di brankas bank dapat dibiarkan terbuka lebar, tetapi jika pintu brankas bank terkunci, Anda tidak akan masuk ke dalam kotak. gsPengguna Anda juga harus memiliki FILEhak istimewa mysql untuk benar-benar menjalankan kueri itu.
Masalahnya adalah Anda mungkin tidak memiliki perms pilih? Izin Mysql tidak dikendalikan oleh izin direktori. Anda perlu menggunakan mysql -u <username> -p untuk dijalankan sebagai pengguna mysql tertentu. Untuk memberikan akses pengguna ke db, lihat hibah MySql. dev.mysql.com/doc/refman/5.1/en/grant.html
Terima kasih, pengguna ini memang memiliki SELECTizin. Saya sering menelusuri basis data sebagai pengguna ini.
dotancohen
Terima kasih, Marc, itulah yang saya takutkan. Jadi saya tidak dapat memiliki folder "inbox" yang dapat ditulis oleh pengguna lain, tanpa membiarkan mereka membaca / menulis ke direktori home saya juga?
dotancohen
2
Pastikan bahwa pengguna memiliki FILEhak istimewa seperti yang dijelaskan oleh dokumen MySQL .
Mike Purcell

Jawaban:

12

Menurut Dokumentasi MySQL tentang SELECT ... INTO OUTFILE

File apa pun yang dibuat oleh INTO OUTFILE atau INTO DUMPFILE dapat ditulis oleh semua pengguna pada host server. Alasan untuk ini adalah bahwa server MySQL tidak dapat membuat file yang dimiliki oleh siapa pun selain dari pengguna yang akunnya sedang berjalan. (Anda tidak boleh menjalankan mysqld sebagai root untuk ini dan alasan lain.) Karena itu file tersebut harus dapat ditulis oleh dunia sehingga Anda dapat memanipulasi isinya.

Anda harus menampilkan SELECT INTO OUTFILEke / var / lib / mysql sebagai berikut

SELECT * FROM data INTO OUTFILE 'data.csv';

Tentu saja, Anda perlu memastikan Anda memiliki izin FILE di gs @ localhost.

Ada dua cara untuk mendapatkan izin ini

METODE # 1

GRANT FILE ON *.* TO 'gs'@'localhost';

METODE # 2

UPDATE mysql.user SET File_priv = 'Y' WHERE user='gs' AND host='localhost';
FLUSH PRIVILEGES;

UPDATE 2012-05-01 07:09 EDT

Untuk memberi Anda hak istimewa FILE, lakukan hal berikut:

  • LANGKAH 01) service mysql restart --skip-networking --skip-grant-tables
  • LANGKAH 02) mysql <hit enter>
  • LANGKAH 03) UPDATE mysql.user SET File_priv = 'Y' WHERE user='gs' AND host='localhost';
  • LANGKAH 04) exit
  • LANGKAH 05) service mysql restart
RolandoMySQLDBA
sumber
Terima kasih. Saya memperbarui pertanyaan dengan output dari SHOW GRANTS. Sepertinya pengguna DB harus memiliki izin yang tepat.
dotancohen
Pengguna DB tidak memiliki izin yang tepat. Hak istimewa FILE hanya diberikan kepada pengguna dengan GRANT ALL PRIVILEGES ON *.*, seperti RELOADdan SHUTDOWN. Ini karena itu adalah hak administratif global. Hak GRANT ALListimewa yang Anda miliki adalah hanya untuk gsbasis data.
RolandoMySQLDBA
1

Distribusi dan OS yang berbeda tidak semuanya menangani tujuan untuk OUTFILE.

Misalnya, ketika menjalankan daemon mysqld di Linux, yang menggunakan soket, OUTFILE terkadang ditulis ke /tmpdirektori. Bukan masalah besar, hanya saja menggunakan pendekatan OUTFILE memiliki kekurangan, yaitu berurusan dengan izin dan menemukan ke mana file itu pergi.

Karena tujuan dari pertanyaan ini tidak secara khusus "Cara menggunakan OUTFILE", tetapi Anda hanya ingin menangkap beberapa data MySQL ke dalam file, inilah alternatif yang tidak mengharuskan Anda untuk bermain-main dengan izin FILE, dll. .

$ (echo 'SELECT * FROM data' | mysql -ugs -p[password])> /home/dotancohen/in/data.csv

Output dari ini dibatasi-tab secara default. Untuk koma, cukup kirim melalui pipa sedatau sesuatu sebelum menuliskannya ke dalam file.

AaronDanielson
sumber
1

Saya menghabiskan waktu berjam-jam untuk mencoba memahami saran pada halaman ini dan banyak halaman lain dari StackOverflow.

Tidak peduli bagaimana saya mengubah izin di MySql, saya tidak bisa mendapatkan apa pun untuk bekerja.

Saya kembali ke izin yang saya mulai.

Pada akhirnya apa yang berhasil bagi saya lebih sederhana daripada saran orang lain:

echo "select id, emailAddress FROM contacts" | mysql --user=myusername --password mydatabasename > /home/my_output_file.tsv

Ryan
sumber
1
Metode Anda baik untuk digunakan saat berada di Bash CLI. Namun pertanyaan dalam OP bertanya tentang bagaimana cara output data ke file dari klien MySQL CLI.
dotancohen
0

Mengenai dua metode untuk menghasilkan data ke CSV (seharusnya memang TSV) yang disebutkan di atas, saya telah menemukan bahwa jika ada nilai kosong di entri yang Anda ekspor, ada risiko bahwa data dapat kacau karena kesalahan alokasi dari data ke kolom yang sesuai.

Dengan memperhatikan integritas data untuk pemulihan, saya menemukan situs web ini:

https://www.eversql.com/exporting-mysql-schema-structure-to-xml-using-mysql-clients/

Disebutkan bahwa --xmlopsi dalam mysqldumpmemungkinkan mengekspor data ke dalam format XML yang kemudian dapat diuraikan oleh skrip kustom ke format apa pun yang diperlukan, termasuk TSV.

Nguyen H Chan
sumber