MySQLはすばらしい!私は現在、主要なサーバーの移行に関わっています。以前は、小さなデータベースはクライアントと同じサーバーでホストされていました。
そのため、以前はSELECT * INTO OUTFILE .... LOAD DATA INFILE ....
を使用していました
ここで、データベースを別のサーバーに移動しましたが、SELECT * INTO OUTFILE ....
は機能しなくなり、理解できるようになりました。セキュリティ上の理由です。しかし、興味深いことにLOAD DATA INFILE ....
はLOAD DATA LOCAL INFILE ....
とbamに変更できます。
私は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コンソールで-s(--silent)オプションを渡して、目的を達成できます。
特殊文字がエスケープされないように、-r(--raw)オプションも渡すことをお勧めします。これを使用して、必要に応じてクエリをパイプ処理できます。
mysql -uユーザー名-hホスト名-p -s -r -e "select concat( 'this'、 ''、 'works')"
編集:また、出力から列名を削除する場合は、別の-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を送信することはできません。
Waverly360が示唆するように-eオプションを指定してmysql CLIを使用するのは良い方法ですが、それはメモリ不足になり、大きな結果で殺される可能性があります。 (Haventはその背後にある理由を見つけます)。その場合、すべてのレコードが必要な場合、私の解決策は次のとおりです。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:SELECT * INTO OUTFILE
MySQLに、サーバー上のOUTFILEディレクトリにファイルを書き込む権限があるかどうかを確認します。
この問題をかなり定期的に探しているので(以前に何かを見逃したことを期待して...)、最終的に時間をかけて MySQLクエリをCSVファイルとしてエクスポートする小さな要点 =、ちょっと https://stackoverflow.com/a/28168869 に似ていますが、PHPに基づいており、いくつかのオプションがあります。これは私のユースケースにとって重要でした、CSVパラメータ(区切り文字、NULL値処理)を微調整できる必要があり、ファイルは実際に有効な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.