Подтвердить что ты не робот

MySQL - SELECT * INTO OUTFILE LOCAL?

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

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

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

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

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

4b9b3361

Ответ 1

Из руководства: инструкция 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

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

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

mysql -u username -h hostname -p -s -r -e "выберите concat ('this', '', 'works')"

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

Ответ 3

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

Ответ 4

Re: SELECT * INTO OUTFILE

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

Ответ 5

Использование 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

Ответ 6

Поскольку я нахожу себя довольно регулярно, ища эту точную проблему (в надежде, что я что-то пропустил раньше...), я, наконец, решил потратить время и написать небольшой текст для экспорта запросов MySQL в виде файлов CSV, вроде fooobar.com/info/143305/... но на основе PHP и с несколькими дополнительными параметрами. Это было важно для моего случая использования, потому что мне нужно иметь возможность настраивать параметры CSV (разделитель, обработка значений NULL) И файлы должны быть фактически действительными CSV, так что простой CONCAT не является достаточным, так как он не " t генерирует достоверные 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.