2009-06-24 9 views
13

Nie mogę uzyskać następującego kodu do wygenerowania danych wyjściowych. Użytkownik MySQL ma poziom grantu "all",/tmp jest zapisywalny, zapytanie zwraca zestaw wyników.MySQL wybierz do pliku outfile/tmp no output

mysql> SELECT field FROM test_table WHERE condition='test' 
    -> INTO OUTFILE '/tmp/test.csv' 
    -> FIELDS TERMINATED BY ',' 
    -> ENCLOSED BY '"' 
    -> LINES TERMINATED BY '\n'; 
Query OK, 1 row affected (0.00 sec) 

mysql> 
[1]+ Stopped     mysql 
[[email protected] ~]# cat /tmp/test.csv 
cat: /tmp/test.csv: No such file or directory 

Czy powinienem widzieć różne wyniki z MySQL w przypadku awarii?

Czy mogę zweryfikować wynik wyższy niż "1 wiersz dotknięty"?

+0

Dlaczego polecenie select wpłynęłoby na cokolwiek? – futureelite7

+0

Przypuszczalnie odnosi się do funkcji outfile, a nie do select. – Andy

Odpowiedz

17

Pliki generowane przez klauzulę outfile są tworzone na hoście mysql. Upewnij się, że patrzysz na hosta mysql, ponieważ wygląda na to, że jesteś na hoście klienta, który najprawdopodobniej nie jest hostem serwera mysql.

Przeczytaj w sekcji o pliku wyjściowym dokumentację dotyczącą tego.

+0

Dzięki Dipin, masz rację, że to nie jest serwer DB. Wielkie dzięki – Andy

+0

Bez problemu. Cieszę się, że mogłem pomóc. Twoje zdrowie! – Dipin

+0

Dipin właśnie uratowałeś mnie, bijąc moją głowę przez całą noc. Dzięki! – jerrygarciuh

0

Wygląda na to, że możesz mieć problem z uprawnieniami do pliku. Upewnij się, że użytkownik: grupa, w której działa mysqld, ma odpowiednie uprawnienia do zapisu do /tmp/test.csv

Istnieje wiele różnych smaków demona serwera/pliku, które rozwiążą problem. Najprawdopodobniej w systemie UNIX można: chgrp mysqldGROUP/tmp

Ale to sprawia, że ​​wydaje się to takie proste - twój serwer jest skonfigurowany w określony sposób, więc dostosowujesz się do tego. Proces mysqld powinien naprawdę być w stanie odczytać/napisać tylko z kilku miejsc.

10

Natrafiłem na ten problem w Fedorze 17 i zostało spowodowane przez systemd. Myślę, że dobrze się dzielić.

mysql> select * into outfile '/tmp/z1' from t1; 
Query OK, 673 rows affected (0.01 sec) 
mysql> select * into outfile '/tmp/z2' from t1; 
Query OK, 673 rows affected (0.01 sec) 
mysql> select * into outfile '/tmp/z1' from t1; 
ERROR 1086 (HY000): File '/tmp/z1' already exists 
mysql> Bye 

# cat /tmp/z1 
cat: /tmp/z1: No such file or directory 
# ls -d systemd-* 
/tmp/systemd-private-AQEueG 
/tmp/systemd-private-AuCNDY 
/tmp/systemd-private-TOMNxZ 
/tmp/systemd-private-UacrpE 
/tmp/systemd-private-yal7lQ 
/tmp/systemd-private-ZlRJeN 
# ls /tmp/systemd-private-TOMNxZ 
z1 z2 

Sprawca był w /usr/lib/systemd/system/mysqld.service.

# Place temp files in a secure directory, not /tmp 
PrivateTmp=true 

Dzięki this blog znalazłem wskazówkę.

+0

Dzięki za udostępnienie – blissini