MySQLのデータファイルにロードするためのアクセスが拒否されました


105

PHPでは常にMySQLクエリを使用していますが、試してみると

LOAD DATA INFILE

次のエラーが表示されます

#1045-ユーザー 'user' @ 'localhost'のアクセスが拒否されました(パスワードを使用:YES)

これが何を意味するのか誰か知っていますか?

回答:


197

私もこの問題に遭遇しました。LOCALSQLステートメントに追加する必要がありました。

たとえば、これは許可の問題を与えます:

LOAD DATA INFILE '{$file}' INTO TABLE {$table}

LOCALステートメントに追加すると、権限の問題は解消されます。そのようです:

LOAD DATA LOCAL INFILE '{$file}' INTO TABLE {$table}

12
これは別のことをします。ファイルをサーバーの一時ディレクトリにアップロードします。これは時々必要ですが、infileがすでにMySQLサーバー上にある場合は、冗長な作業を行っているだけです。
jeffcook2150

1
はい、これでうまくいきました。データベースサーバーのポートをssh経由で転送していて、リモートデータベースサーバーでLOCAL部分のないファイルを探していたと思います
マイク

2
@jeremysawesomeの場合、次のエラーが発生します。エラーコード:1148このMySQLバージョンでは、使用されたコマンドは許可されていません。mysqlファイルをlocal-infile = 1に変更するなど、この問題のいくつかの回答を試しましたが、失敗しました。
OrwellHindenberg、2015

mySQLを6.2.5に更新すると、この問題は解決しました
OrwellHindenberg 2015

4
--local-infileオプションでmysqlを呼び出す必要がある場合もあります。
shabbychef 2015

32

私はこの問題を抱えていました。探し回ったところ、満足のいく答えが見つかりませんでした。検索結果を以下にまとめます。

アクセス拒否エラーは、次のことを意味している可能性があります。

  • 'user' @ 'localhost'にはFILE特権(GRANT FILE on *.* to user@'localhost')がありません。または、
  • ロードしようとしているファイルがmysqlサーバーを実行しているマシンに存在しない(LOAD DATA INFILEを使用している場合)。または、
  • ロードしようとしているファイルがローカルマシンに存在しない(LOAD DATA LOCAL INFILEを使用している場合)。または、
  • ロードしようとしているファイルは誰でも読み取り可能ではありません(ファイルすべての親ディレクトリが誰でも読み取り可能である必要があります:chmod 755ディレクトリ、およびchmod 744 file.dat)

+1:これは私にとってはうまくいきました:ロードしようとしているファイルは誰もが読めるわけではありません(ファイルとすべての親ディレクトリが誰でも読めるようにする必要があります:chmod 755ディレクトリ、およびchmod 744 file.dat)。すべてのディレクトリのアクセス許可を変更していませんでした
gavdotnet 2013

1
ユーザーTatianaは、サーバー全体に対してのみ、データベースごとにFILE権限を付与することはできないと指摘しています。grantコマンドは、「上のGRANTファイルになりますユーザーに@ 『localhost』のBY 『password』を)を同定し;」
JAL

3
@JAL私はあなたが「ユーザーに*。*のGRANT FILEを」という意味だと思います-おそらくアスタリスク文字は取り除かれました
Eugene M

@Eugene Mがこれによりエラーが発生すると言ったので、DB GRANTとGLOBAL PRIVILEGESの誤った使用
会計士م

19

次のコマンドを使用してみてください:

load data local infile 'home/data.txt' into table customer;

これはうまくいくはずです。私の場合はうまくいきました。


3
ERROR 1148 (42000): The used command is not allowed with this MySQL version
スチュワート

@Stewart、上記のコマンドから「local」を削除してください。以降のmysqlバージョンは、グローバル変数「local_infile」変数が「ON」に設定されている場合(以下のように)、このフラグをサポートしていないようです。したがって、コマンドは次のようになります。mysql>ファイル「home / data.txt」のデータをテーブルcustomerにロードします。+ --------------- + ------- + | 変数名| 値| + --------------- + ------- + | local_infile | オン| + --------------- + ------- +
カムランハイダー

@KamranHyderあなたは私に良い答えを持っているように聞こえます。完全な回答として追加してみませんか?
スチュワート

10

MySQLユーザーにFILE権限が付与されていることを確認します。

共有Webホスティングを使用している場合、ホスティングプロバイダーによってブロックされている可能性があります。


共有ウェブホスティングの場合:「LOAD DATA LOCAL INFILE」を使用すると役に立ちますか?
Peter

3

Lyonからの文字列は私に非常に良いヒントを与えてくれました:Windowsでは、バックスラッシュではなくスラッシュを使用する必要があります。このコードは私にとってはうまくいきます:

    File tempFile = File.createTempFile(tableName, ".csv");
    FileUtils.copyInputStreamToFile(data, tempFile);

    JdbcTemplate template = new JdbcTemplate(dataSource);
    String path = tempFile.getAbsolutePath().replace('\\', '/');
    int rows = template.update(MessageFormat
            .format("LOAD DATA LOCAL INFILE ''{0}'' INTO TABLE {1} FIELDS TERMINATED BY '',''",
                    path, tableName));
    logger.info("imported {} rows into {}", rows, tableName);

    tempFile.delete();

2

私は同じ問題に遭遇しました、そしてそれらのステップに従うことによってそれを解決しました:

  • load_infile変数をアクティブにする
  • カスタムmysqlユーザーへのグランドファイルアクセス許可
  • secure_file_priv変数を非アクティブ化します(私のファイルはWebサーバーによって/ tmpフォルダーにアップロードされましたが、これはもちろんmyslq / var / lib / mysql-fileの保護されたディレクトリではありません)

この3番目のポイントについては、以下を参照できます。 https //dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_secure_file_priv

BR、

広告


2

これは私にも起こり、Yamirが彼の投稿で説明したすべての手順を実行したにもかかわらず、それを機能させることができませんでした。

このファイルは、777権限で/tmp/test.csvにありました。MySQLユーザーにはファイル権限があり、MySQLバージョンではLOCALオプションが許可されていなかったため、行き詰まりました。

最後に私は実行することで問題を解決することができました:

sudo chown mysql:mysql /tmp/test.csv

2

あなたがコマンドラインを使用しているなら私は簡単なものを見つけました

としてログインmysql -u[username] -p[password] --local-infile

その後 SET GLOBAL local_infile = 1;

データベースを選択する use [db_name]

そして最後に LOAD DATA LOCAL INFILE 'C:\\Users\\shant\\Downloads\\data-1573708892247.csv' INTO TABLE visitors_final_test FIELDS TERMINATED BY ','LINES TERMINATED BY '\r \n' IGNORE 1 LINES;


--local-inlineを追加すると役に立ちました。ただし、私の場合、local_infileグローバル変数はすでにONに設定されています。ユーザーは、変数を変更する前に、この変数に書き込んだ値を最初に理解することをお勧めします。
Eugene Maysyuk

RDSユーザーの場合=> --local-infileの追加はRDSで役立ちましたが、RDSではSET GLOBAL local_infile = 1;機能していないようですが、それがなければそれでも--local-infileうまくいきませんでした
事実

0

MySQLテーブルのロードは高速で簡単です(Python / Djangoモデルマネージャスクリプトを使用していた)。

1)すべての列VARCHAR(n)NULLを含むテーブルを作成します。例:

mysql> CREATE TABLE cw_well2( api VARCHAR(10) NULL,api_county VARCHAR(3) NULL);


 2)csvからヘッダー(最初の行)を削除してからロードします(LOCALを忘れた場合は、「#1045-ユーザー 'user' @ 'localhost'のアクセスが拒否されました(パスワードを使用:YES)」):

mysql> LOAD DATA LOCAL INFILE "/home/magula6/cogswatch2/well2.csv" INTO TABLE cw_well2 FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'     -> ; Query OK, 119426 rows affected, 19962 warnings  (3.41 sec)


 3)列を変更します。

mysql> ALTER TABLE cw_well2 CHANGE spud_date spud_date DATE;

mysql> ALTER TABLE cw_well2 CHANGE latitude latitude FLOAT;

ほら!


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.