MySQL-выберите * в OUTFILE LOCAL?
MySQL является удивительным! В настоящее время я участвую в крупной миграции серверов, и ранее наша небольшая база данных размещалась на том же сервере, что и клиент.
так мы делали это:SELECT * INTO OUTFILE .... LOAD DATA INFILE ....
теперь мы перенесли базу на другой сервер и SELECT * INTO OUTFILE ....
больше не работает, понятно-причины безопасности я считаю.
Но, интересно LOAD DATA INFILE ....
можно изменить на LOAD DATA LOCAL INFILE ....
и бац, все работает.
Я не жалуюсь и не выражаю отвращения к Для MySQL. Альтернатива этому добавила 2 строки дополнительного кода и форму системного вызова a .SQL-скрипт. Все, что я хотел знать, почему LOAD DATA LOCAL INFILE
работает и почему нет такой вещи, как SELECT INTO OUTFILE LOCAL
?
Я сделал домашнее задание, не смог найти прямого ответа на мои вопросы выше. Я также не смог найти запрос функции @ MySQL. Если кто-то может это прояснить, это было бы потрясающе!
способен ли MariaDB справиться с этой проблемой?
6 ответов
из руководства: предназначен в первую очередь для быстрого сброса таблицы в текстовый файл на серверной машине. Если вы хотите создать результирующий файл на каком-либо клиентском хосте, отличном от хоста сервера, вы не можете использовать 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 с опцией-s (--silent), переданной.
вероятно, неплохо также передать параметр-r (--raw), чтобы специальные символы не экранировались. Вы можете использовать это для передачи запросов, как вы хотите.
mysql-u имя пользователя - H имя хоста-p-s-r-e " выберите concat ('this','','works')"
EDIT: кроме того, если вы хотите удалить имя столбца из своего вывода, просто добавьте другой-s (mysql-ss -р и т. д.)
путь, который вы даете 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 на сервер.
Re: выберите * в OUTFILE
проверьте, имеет ли MySQL разрешения на запись файла в каталог OUTFILE на сервере.
использование 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
так как я довольно регулярно ищу эту точную проблему (в надежде, что я пропустил что-то раньше...), Я, наконец, решил взять время и написать малый gist для экспорта запросов MySQL в виде CSV-файлов, вроде https://stackoverflow.com/a/28168869 но на основе PHP и с парой дополнительных опций. Это было важно для моего варианта использования, потому что мне нужно иметь возможность точно настроить параметры CSV (разделитель, обработка нулевых значений) и файлы нужно быть действительно действительным CSV, так что простой CONCAT
недостаточно, поскольку он не генерирует допустимые CSV-файлы, если значения содержат разрывы строк или разделитель CSV.
внимание: требуется PHP для установки на сервере!
(Можно проверить через php -v
)
"установки" mysql2csv
via
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.