2013-02-07 9 views
5

Piszę bardzo prosty skrypt powłoki, aby zrzucić tabelę do pliku CSV. Oto część z nich:Zapytanie MySQL OUTFILE narzeka, że ​​"plik już istnieje", ale plik w ogóle nie istnieje

day=`/bin/date +'%Y-%m-%d'` 
file="/tmp/table-$day.csv" 
rm $file 
query="SELECT * FROM table INTO OUTFILE '$file' FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY '\\n'" 
echo "$query" | mysql <connection_parameters> 

umieścić w rm $file, aby upewnić się, że plik nie istnieje przed wykonaniem kwerendy użytkownika.

Jednak, kiedy wykonać skrypt, dostaję sprzeczne komunikaty:

rm: cannot remove `/tmp/table-2013-02-08.csv': No such file or directory 
ERROR 1086 (HY000) at line 1: File '/tmp/table-2013-02-08.csv' already exists 

I nie można znaleźć nigdzie plik_wy w maszynie.

Co jest nie tak ...?

Dziękuję.

+1

Czy/tmp istnieje? Czy masz do niego prawo zapisu? Zastanawiam się, czy MySQL próbuje pisać do/mysql/tmp/zamiast do miejsca, w którym wykonujesz skrypt powłoki. –

+0

dzięki Jacob./tmp istnieje i jest zapisywalny. Ręczne wykonywanie kwerendy działa poprawnie. –

+0

Zauważyłem, że ręczne wykonanie kwerendy powiedzie się po raz pierwszy, ale nie po raz drugi ... –

Odpowiedz

8

Znalazłem odpowiedź.

OUTFILE tworzy plik na serwerze MySQL, a nie na moim komputerze klienta MySQL.

+2

+1. Z perspektywy czasu jest to oczywiste, ponieważ zapytanie jest uruchamiane na serwerze ... ale go nie widziałem. Patrzyłem na pierwotne pytanie i myślałem, że w jakiś sposób masz problem z pozwoleniami lub coś takiego. Uśmiechnęłam się, żeby zobaczyć odpowiedź. –

0

Sprawdź, czy masz to w/etc/passwd

mysql: X: 27: 27: MariaDB Server:/var/lib/mysql:/sbin/nologin

zmienić powłokę na/bin/bash zamiast:

Powiązane problemy