2013-02-07 37 views
5

Tôi đang viết một kịch bản lệnh shell rất đơn giản để đổ một bảng vào tệp CSV. Đây là một phần của nó:Truy vấn MySQL OUTFILE phàn nàn rằng "tệp đã tồn tại" nhưng tệp không tồn tại ở tất cả

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> 

Tôi đặt trong rm $file để đảm bảo rằng tệp không tồn tại trước khi thực hiện truy vấn.

Tuy nhiên, khi tôi thực thi kịch bản, tôi nhận được thông điệp mâu thuẫn:

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 

tôi không thể tìm thấy bất cứ nơi nào OUTFILE trong máy.

Vì vậy, điều gì sai ...?

Cảm ơn bạn.

+1

Hiện/tmp có tồn tại không? Bạn có quyền ghi vào nó không? Tôi tự hỏi nếu MySQL đang cố gắng ghi vào/mysql/tmp/thay vì liên quan đến nơi bạn đang thực thi kịch bản lệnh shell. –

+0

cảm ơn Jacob./tmp tồn tại và có thể ghi. Thực hiện thủ công truy vấn chạy thành công. –

+0

Tôi nhận thấy rằng thực hiện thủ công truy vấn thành công lần đầu tiên, nhưng không phải lần thứ hai ... –

Trả lời

8

Tôi đã tìm thấy câu trả lời.

OUTFILE tạo tệp trên máy chủ MySQL, thay vì trên máy khách MySQL của tôi.

+2

+1. Nhìn lại, điều đó là hiển nhiên vì truy vấn chạy ở máy chủ ... nhưng tôi không thấy nó. Tôi đã nhìn vào câu hỏi ban đầu và suy nghĩ bạn bằng cách nào đó đã có một vấn đề cấp phép hoặc một cái gì đó. Nó làm tôi mỉm cười khi thấy câu trả lời. –

0

Kiểm tra xem bạn có điều này trong/etc/passwd

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

thay đổi vỏ để/bin/bash thay vì

Các vấn đề liên quan