2011-06-17 16 views
0

mySQL SELECT INTO OUTFILEとLOAD DATA INFILE関数を使用して、Webアプリケーションの簡単なインポート/エクスポート機能を作成しようとしています。mysql LOAD INFILE/OUTFILE

outfile/infilesのパスをデフォルトのmysqlパス(通常はmysql.ini定義のtmpディレクトリにあると思います)にするのが最も簡単です。

既存の輸出とは衝突を確実にしないために、私は私がOUTFILEに追加する接頭辞としてタイムスタンプのMD5を生成します。

$this->prefix = md5(time()); 

SELECT * INTO OUTFILE ' . $this->prefix . '-' . $table . '.csv' 
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' 
FROM " . $table . " WHERE 1 

これまでのところは良い、私のログファイルで作成したCSVファイルを表示します

スクリプトがしかしLOAD DATA INFILEを行おうと/var/lib/mysql/master/、ファイルが見つかりません:

2011-06-17 14:31:35 - INFO --> Created outfile: eae77f210684ba0616c773677f707513-table.csv 
2011-06-17 14:31:35 - ERROR --> mySQL Error: 2 - File 'eae77f210684ba0616c773677f707513-table.csv' not found (Errcode: 2) 

が可能番目ですLOAD INFILESELECT INTO OUTFILEで異なるデフォルトの場所が使用されていますか?

私は先に進んで、LOAD INFILEコマンドでmysql tmp dirを指定しました。何らかの理由でファイルが見つからないのですが、明らかにそこにありますが、私は同じ "user 「それを読んでいると、それへの書き込み:

$ sudo find/-name '8e357dcba6557a31f9a36230c4233d1b-table.csv' 
/var/lib/mysql/master/8e357dcba6557a31f9a36230c4233d1b-table.csv 

2011-06-17 15:04:25 - INFO --> Created outfile: 8e357dcba6557a31f9a36230c4233d1b-table.csv 
2011-06-17 15:04:25 - ERROR --> mySQL Error: 13 - File '/var/lib/mysql/master/8e357dcba6557a31f9a36230c4233d1b-table.csv' not found (Errcode: 13) 

EDIT:ADDING INFILE文を

$this->prefix = md5(time()); 
$this->mysql_dir = "/var/lib/mysql/master/"; 
LOAD DATA LOCAL INFILE ' . $this->mysql_dir . $this->prefix . '-' . $table . '.csv 
INTO TABLE $table 
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' 

おかげ

+0

「LOAD INFILE」を実行しようとしていると、両方のエラー(コード)リストに「INFO - > Created outfile: '(** outfile **の後に** Created **)と表示されるのはなぜですか?また、OUTFILEの作成に使用しているSQLを表示しているので、なぜLOADコマンドも表示されていませんか? –

+0

これらのログエントリは自分のログノートです。これは "公式の" mysqlログファイルではありません。実際のOUTFILE文が成功コードを返したときに書き込まれます。私はload infileステートメントを投稿します。 – julio

+1

あなたの編集後、問題はかなり明確に思われます。あなたはファイル名の一部として '$ this-> prefix = md5(time());'を使って 'OUTFILE'を作成しています。 'LOAD INFILE'はファイル名の一部として' $ this-> prefix = md5(time()); 'も使用しています。時間がまったく変わった場合、MD5の値は一致しないので、 'OUTFILE'と' INFILE'のどちらの名前も一致しません。 –

答えて

1

あなたがLOAD DATA LOCAL INFILEを試したことがありますか?

+0

はい - どちらもLOCALとなしです。 – julio

+0

これは実際には問題でした.LOCALを削除し、ファイルシステムのパスを指定することはやりました。 LOCAL infileは、mySQLがデータを探していたパスを変更しました。 – julio

0

私はジュリオ、ロジックに問題があり、SELECT INTO OUTFILEまたはLOAD DATA INFILEではないと思います。

$ this->接頭辞をOUTFILE/INFILEステートメントに追加する両方の例では、毎回md5()を再生成しています。したがって、OUTFILEで使用する接頭辞はINFILEの接頭辞と一致せず、したがってエラーになります。

考えられる解決策: - は、LOAD DATA INFILE を行うときに、後でから読み取ることができるテーブル内の接頭辞を保存 - あなたが定期的に時刻にレポートを生成する場合、(代わりにMD5のすべての時間を、と言う)、タのデータを使用接頭辞としての時間、例えば20110618_1000-table.csv。