Вопрос

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 справиться с этой проблемой?

Это было полезно?

Решение

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

Другие советы

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

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

MySQL -U имени пользователя -H -H HostName -P -S -R -E «Выбрать CONCAT (« Это »,«, «работает») »

Редактировать: Кроме того, если вы хотите удалить имя столбца с вашего вывода, просто добавьте другого -S (MySQL -SS -R и т. Д.)

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

Использование MySQL CLI с вариантами, так как 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

Re: выберите * в Outfile

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

Так как я нахожусь довольно регулярно ищем эту точную проблему (в надежде, что я что-то пропустил раньше ...), я наконец решил потратить время и писать Маленький гид для экспорта MySQL Queries в виде файлов CSV, вроде как https://stackoverflow.com/a/28168869. Но на основе PHP и с парой дополнительных вариантов. Это было важно для моего случая использования, потому что мне нужно иметь возможность точно настроить параметры CSV (разделитель, обработку нулевого значения) и файлы должны быть фактически действительными 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

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

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

./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.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top