45

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はこの問題を処理できますか?

4

7 に答える 7

60

マニュアルから: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
于 2010-06-03T23:34:44.997 に答える
7

-s(--silent)オプションを渡して、mysqlコンソールで目的を達成できます。

特殊文字がエスケープされないように、-r(--raw)オプションも渡すことをお勧めします。これを使用して、必要に応じてクエリをパイプ処理できます。

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

編集:また、出力から列名を削除する場合は、別の-s(mysql -ss -rなど)を追加するだけです。

于 2013-03-21T13:57:46.357 に答える
5

指定するパスLOAD DATA INFILEは、接続元のマシンではなく、サーバーが実行されているマシン上のファイルシステム用です。LOAD DATA LOCAL INFILEはクライアントのマシン用ですが、サーバーが正しい設定で起動されている必要があります。そうでない場合は許可されません。あなたはここでそれについてすべて読むことができます:http://dev.mysql.com/doc/refman/5.0/en/load-data-local.html

なぜローカルバージョンがないのかはSELECT INTO OUTFILEわかりませんが、接続を介して行うのはおそらく難しいでしょう。ツールを使用して同じ機能を取得できますが、mysqldumpSQLをサーバーに送信することはできません。

于 2010-05-19T17:19:53.060 に答える
3

Waverly360が示唆するように-eオプションを指定してmysqlCLIを使用することは良い方法ですが、メモリが不足し、大きな結果で強制終了される可能性があります。(その背後にある理由を見つけてください)。その場合、すべてのレコードが必要な場合、私の解決策は次のとおりです。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
于 2015-01-27T10:59:30.460 に答える
3

私はかなり定期的にこの正確な問題を探しているので(以前に何かを見逃したことを期待して...)、ついに時間をかけて、MySQLクエリをCSVファイルとしてエクスポートするための小さな要点を書くことにしまし。 /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.
于 2018-05-16T10:01:05.797 に答える
1

Re:SELECT * INTO OUTFILE

MySQLにサーバーのOUTFILEディレクトリにファイルを書き込む権限があるかどうかを確認します。

于 2010-05-19T17:15:57.910 に答える
1

パスを/var/lib/mysql-files/filename.csv(MySQL 8)に設定してみてください。SHOW VARIABLES LIKE "secure_file_priv";mysqlクライアントのコマンドラインに入力して、自分のファイルディレクトリを特定します。

ここについての回答を参照してください:(...)- 2015年にvhuユーザーが回答したMySQLの--secure-file-priv

于 2020-07-24T09:25:41.610 に答える