MySQL verileri dosyaya gönderilemiyor


13

Bir dosyaya MySQL tablosundan veri çıkışı çalışıyorum ama izin hataları alıyorum:

$ 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>

Söz konusu dizin 777'ye chmodded ise, neden MySQL kullanıcısı dosyayı yazamıyor? İlginçtir ki / tmp / dosyasına da yazamıyorum.

EDIT: DB kullanıcı uygun MySQL izinlerine sahip gibi görünüyor:

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)

2
Tüm dizin ağacında MySQL'e erişim hakları vermelisiniz. inMySQL erişemezse hakların verilmesi anlamsızdır dotanchoen. Başka bir deyişle, banka kasasındaki emniyet depost kutusu tamamen açık bırakılabilir, ancak banka kasası kapısı kilitliyse kutuya girmezsiniz. Kişisel gsKullanıcı ayrıca MySQL olmalıdır FILEaslında bu sorguyu yürütmek için ayrıcalık.

Sorun, seçme izinleriniz olmayabilir mi? Mysql izinleri dizin izinleri tarafından denetlenmez. Belirli bir mysql kullanıcısı olarak çalıştırmak için mysql -u <kullanıcıadı> -p kullanmanız gerekir. Kullanıcıya bir db'ye erişim vermek için bir göz atın MySql hibe. dev.mysql.com/doc/refman/5.1/en/grant.html

Teşekkür ederim, bu kullanıcının SELECTizinleri var. Bu kullanıcı olarak veritabanına sık sık göz atıyorum.
dotancohen

Teşekkürler Marc, bundan korktum. Bu yüzden, diğer kullanıcıların yazabileceği bir "gelen kutusu" klasörüne de sahip olamıyorum, ana dizinime de okuma / yazma izni vermeden?
dotancohen

2
Kullanıcının MySQL belgeleriFILE tarafından açıklanan ayrıcalıklara sahip olduğundan emin olun .
Mike Purcell

Yanıtlar:


12

SELECT ... INTO OUTFILE hakkındaki MySQL Belgelerine göre

INTO OUTFILE veya INTO DUMPFILE tarafından oluşturulan tüm dosyalar, sunucu ana bilgisayarındaki tüm kullanıcılar tarafından yazılabilir. Bunun nedeni, MySQL sunucusunun, hesabı altında çalıştığı kullanıcı dışında kimsenin sahip olduğu bir dosya oluşturamamasıdır. (Bu ve diğer nedenlerle mysqld'i asla root olarak çalıştırmamalısınız.) Bu nedenle, içeriğini değiştirebilmeniz için dosya dünya çapında yazılabilir olmalıdır.

SELECT INTO OUTFILE/ Var / lib / mysql dizinine aşağıdaki gibi çıkış yapmalısınız

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

Tabii ki, gs @ localhost üzerinde DOSYA iznine sahip olduğunuzdan emin olmanız gerekir.

Bu izni vermenin iki yolu vardır

YÖNTEM 1

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

YÖNTEM # 2

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

GÜNCELLEME 2012-05-01 07:09 EDT

Kendinize DOSYA ayrıcalığı vermek için aşağıdakileri yapın:

  • ADIM 01) service mysql restart --skip-networking --skip-grant-tables
  • ADIM 02) mysql <hit enter>
  • ADIM 03) UPDATE mysql.user SET File_priv = 'Y' WHERE user='gs' AND host='localhost';
  • ADIM 04) exit
  • ADIM 05) service mysql restart

Teşekkürler. Soruyu çıktısıyla güncelledim SHOW GRANTS. DB kullanıcısının uygun izinlere sahip olması gerektiği anlaşılıyor.
dotancohen

DB kullanıcısı uygun izinlere sahip değil. DOSYA ayrıcalığı yalnızca ve GRANT ALL PRIVILEGES ON *.*gibi kullanıcılara verilir . Bu böyledir çünkü bunlar küresel idari ayrıcalıklardır. Sahip olduğunuz ayrıcalık yalnızca veritabanı içindir. RELOADSHUTDOWNGRANT ALLgs
RolandoMySQLDBA

1

Farklı dağıtımlar ve işletim sistemleri , OUTFILE'lar için hedefleri aynı şekilde işlemez.

Örneğin, bir soket kullanan Linux'ta bir mysqld arka plan programı çalıştırırken, OUTFILE bazen /tmpdizine yazılır . Büyük bir anlaşma değil, sadece OUTFILE yaklaşımının eksiklikleri vardır, yani izinlerle uğraşmak ve dosyanın nereye gittiğini bulmak.

Bu sorunun amacı "OUTFILE nasıl kullanılır?" Olmadığından, ancak sadece bazı MySQL verilerini bir dosyaya yakalamak istediğiniz için, FILE izinleri vb. .

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

Bunun çıktısı varsayılan olarak sekmeyle sınırlandırılmıştır. Virgül için, seddosyaya yazmadan önce veya bir şeyle bağlantı kurun.


1

Bu sayfadaki önerileri ve StackOverflow'un diğer birçok sayfasını anlamaya çalışırken saatler geçirdim.

MySql'deki izinleri nasıl değiştirirsem değiştireyim, çalışacak hiçbir şey alamadım.

Başladığım izinlere geri döndüm.

Sonuçta benim için işe yarayan, diğerlerinin önerilerinden daha basitti:

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


1
Yönteminiz Bash CLI'deyken kullanım için iyidir. Ancak OP'deki soru, MySQL istemci CLI'sinden bir dosyaya veri çıktısının nasıl alınacağını sorar.
dotancohen

0

Yukarıda belirtilen CSV'ye (gerçekten de TSV olması gerekir) veri çıkışı için iki yöntemle ilgili olarak, dışa aktardığınız girişlerde boş değerler varsa, verilerin yanlış konumlandırılması nedeniyle verilerin dağılması riski vardır. ilgili sütunlara veri.

Kurtarma için veri bütünlüğü konusunda endişe duyduğumda, bu web sitesini buldum:

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

O sözü --xmlseçeneği mysqldumpdaha sonra TSV dahil olmak üzere gerekli herhangi bir biçimde, özel bir komut dosyası tarafından çözümlenen olabilir XML formatında veri ihraç sağlar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.