MySQL - SELECT * INTO OUTFILE LOCAL? - PullRequest
38 голосов
/ 19 мая 2010

MySQL потрясающий! В настоящее время я участвую в миграции основного сервера, а ранее наша небольшая база данных размещалась на том же сервере, что и клиент.
Итак, мы привыкли делать это: SELECT * INTO OUTFILE .... LOAD DATA INFILE ....

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

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

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

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

Ответы [ 6 ]

52 голосов
/ 04 июня 2010

Из руководства: оператор 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
7 голосов
/ 21 марта 2013

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

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

mysql -u username -h hostname -p -s -r -e "select concat ('this', '', 'works')"

РЕДАКТИРОВАТЬ: Кроме того, если вы хотите удалить имя столбца из вашего вывода, просто добавьте еще один -s (mysql -ss -r и т. Д.)

5 голосов
/ 19 мая 2010

Путь, который вы указываете 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 на сервер.

3 голосов
/ 27 января 2015

Использование mysql CLI с параметром -e, как предполагает Waverly360, является хорошим вариантом, но это может привести к нехватке памяти и гибели при больших результатах. (Не найти причину этого). Если это так, и вам нужны все записи, мое решение: mysqldump + 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
1 голос
/ 19 мая 2010

Re: ВЫБРАТЬ * В OUTFILE

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

0 голосов
/ 16 мая 2018

Поскольку я довольно регулярно ищу именно эту проблему (в надежде, что я что-то упустил раньше ...), я, наконец, решил не торопиться и написать небольшую суть для экспорта запросов MySQL в виде файлов CSV , вроде как https://stackoverflow.com/a/28168869, но на основе PHP и с несколькими дополнительными опциями. Это было важно для моего варианта использования, потому что мне нужно иметь возможность точно настроить параметры CSV (разделитель, обработка значения NULL) И файлы должны быть действительно действительными CSV, так что простого CONCAT недостаточно, так как не генерирует действительные файлы CSV, если значения содержат разрывы строк или разделитель CSV.

Внимание! Требуется установить PHP на сервер! (Можно проверить через php -v)

«Установить» mysql2csv через

wget https://gist.githubusercontent.com/paslandau/37bf787eab1b84fc7ae679d1823cf401/raw/29a48bb0a43f6750858e1ddec054d3552f3cbc45/mysql2csv -O mysql2csv -q && (sha256sum mysql2csv | cmp <(echo "b109535b29733bd596ecc8608e008732e617e97906f119c66dd7cf6ab2865a65  mysql2csv") || (echo "ERROR comparing hash, Found:" ;sha256sum mysql2csv) ) && chmod +x mysql2csv

(загрузить содержимое гистограммы, проверить контрольную сумму и сделать ее исполняемой)

Пример использования

./mysql2csv --file="/tmp/result.csv" --query='SELECT 1 as foo, 2 as bar;' --user="username" --password="password"

создает файл /tmp/result.csv с содержимым

foo,bar
1,2

справка для справки

./mysql2csv --help
Helper command to export data for an arbitrary mysql query into a CSV file.
Especially helpful if the use of "SELECT ... INTO OUTFILE" is not an option, e.g.
because the mysql server is running on a remote host.

Usage example:
./mysql2csv --file="/tmp/result.csv" --query='SELECT 1 as foo, 2 as bar;' --user="username" --password="password"

cat /tmp/result.csv

Options:
        -q,--query=name [required]
                The query string to extract data from mysql.
        -h,--host=name
                (Default: 127.0.0.1) The hostname of the mysql server.
        -D,--database=name
                The default database.
        -P,--port=name
                (Default: 3306) The port of the mysql server.
        -u,--user=name
                The username to connect to the mysql server.
        -p,--password=name
                The password to connect to the mysql server.
        -F,--file=name
                (Default: php://stdout) The filename to export the query result to ('php://stdout' prints to console).
        -L,--delimiter=name
                (Default: ,) The CSV delimiter.
        -C,--enclosure=name
                (Default: ") The CSV enclosure (that is used to enclose values that contain special characters).
        -E,--escape=name
                (Default: \) The CSV escape character.
        -N,--null=name
                (Default: \N) The value that is used to replace NULL values in the CSV file.
        -H,--header=name
                (Default: 1) If '0', the resulting CSV file does not contain headers.
        --help
                Prints the help for this command.
...