2010-05-19 2 views
31

MySQL замечательный! В настоящее время я участвую в крупной миграции сервера, и ранее наша небольшая база данных использовалась на том же сервере, что и клиент.
Итак, мы использовали это: SELECT * INTO OUTFILE .... LOAD DATA INFILE ....MySQL - ВЫБОР * ВХОД НА МЕСТЕ?

Теперь мы переместили базу данных на другой сервер, а SELECT * INTO OUTFILE .... перестали работать, понятны - соображения безопасности, на которые я верю. Но, интересно LOAD DATA INFILE .... можно изменить на LOAD DATA LOCAL INFILE .... и bam, он работает.

Я не жалуюсь и не выражаю отвращение к MySQL. Альтернативой тому, что добавлено 2 строки дополнительного кода и системный вызов, образуют скрипт .sql. Все, что я хотел знать, - это почему LOAD DATA LOCAL INFILE работает и почему нет такой вещи, как SELECT INTO OUTFILE LOCAL?

Я сделал домашнее задание, не смог найти прямой ответ на мои вопросы выше. Я тоже не смог найти запрос функции @ MySQL. Если кто-то может это понять, это было бы потрясающе!

Is MariaDB способен справиться с этой проблемой?

+0

Существует альтернатива, которая включает в себя использование команды тройник, который позволяет регистрировать ввод и вывод MySQL к отдельный файл на стороне клиента, однако он регистрирует весь сеанс mysql, а не выводит содержимое запроса запроса, и нет параметров форматирования, таких как вывод в стиль CSV. – CMCDragonkai

ответ

43

Из инструкции: The SELECT ... INTO OUTFILE заявление предназначено, прежде всего, для того, чтобы вы быстро сбросили таблицу в текстовый файл на серверной машине. Если вы хотите создать результирующий файл на каком-то клиентском хосте, отличном от хоста сервера, вы не можете использовать SELECT ... INTO OUTFILE. В этом случае, вы должны использовать такие команды, как mysql -e "SELECT ..." > file_name для создания файла на клиентском хосте «

http://dev.mysql.com/doc/refman/5.0/en/select.html

Пример:.

mysql -h my.db.com -u usrname--password=pass db_name -e 'SELECT foo FROM bar' > /tmp/myfile.txt 
2

Re: SELECT * INTO OUTFILE

Проверьте, MySQL имеет разрешения на запись в файл в каталоге OUTFILE на сервере.

+0

OUTFILE - это запись на сервер клиента, который отличается от сервера, на котором размещается база данных. – ThinkCode

+3

Документы MySQL (http://dev.mysql.com/doc/refman/5.0/en/select.html) определяют местоположение OUTFILE. В нем указано: «Файл создан на хосте сервера, поэтому вы должны иметь привилегию FILE для использования этого синтаксиса. File_name не может быть существующим файлом, который, среди прочего, предотвращает использование таких файлов, как/etc/passwd и таблицы базы данных . Итак, я бы хотел проверить, имеет ли MySQL разрешения на запись файла в каталог OUTFILE на сервере. Я не знаю, почему нет версии «LOCAL OUTFILE». Если вам нужно экспортировать локально один вариант, многие люди используют phpMyAdmin. – Snowcrash

+0

Вы только что спасли мне нечеткое сообщение. – octopusgrabbus

5

Путь, который вы указываете LOAD DATA INFILE, относится к файловой системе на компьютере, на котором работает сервер, а не машине, с которой вы подключаетесь. LOAD DATA LOCAL INFILE предназначен для компьютера клиента, но для этого требуется, чтобы сервер был запущен с правильными настройками, иначе это запрещено. Вы можете прочитать все об этом здесь: http://dev.mysql.com/doc/refman/5.0/en/load-data-local.html

Что касается SELECT INTO OUTFILE Я не уверен, почему нет локальной версии, к тому же, возможно, это сложно сделать по соединению. Вы можете получить такую ​​же функциональность с помощью инструмента mysqldump, но не путем отправки SQL на сервер.

+1

LOAD DATA работает нормально, но, если возможно, на сервере, на котором размещается БД, удаляется файл, невозможно отправить файл клиенту, который находится на другом сервере. – ThinkCode

+1

Параметры mysqldump и mysql -e swtich не соответствуют ожидаемому результату. mysqldump сбрасывает всю таблицу db/table, и мы не можем сбрасывать только несколько столбцов на основе условия. mysql -e swtich выгружает файл в формат .txt, и выход канала не может быть достигнут. – ThinkCode

5

Вы можете добиться того, что вы хотите с Консоль mysql с параметром -s (--silent) передана.

Возможно, это хорошая идея также перейти в параметр -r (-raw), чтобы специальные символы не сбрасывались. это для запросов на запросы, как вы хотите нг.

MySQL -u имя пользователя -h имя хоста -p -s -r -e «выберите CONCAT ('это',»», 'работает')»

EDIT: Кроме того, если вы хотите, чтобы удалить столбец имя из вашего вывода, просто добавьте еще один -s (mysql -ss -r и т. д.)

2

Использование mysql CLI с опцией -e, поскольку Waverly360 предлагает хороший, но это может исчезнуть из памяти и быть убитым на больших Результаты.(Хавент находит причину этого). Если это так, и вам нужны все записи, мое решение: туздЫшпр + mysqldump2csv:

wget https://raw.githubusercontent.com/jamesmishra/mysqldump-to-csv/master/mysqldump_to_csv.py 
mysqldump -u username -p --host=hostname database table | python mysqldump_to_csv.py > table.csv 
Смежные вопросы