web-dev-qa-db-ja.com

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

PHPでは常にMySQLクエリを使用しますが、LOAD DATA INFILEを試行すると、次のエラーが表示されます#1045 - Access denied for user 'user'@'localhost' (using password: YES)

94
Brian

私もこの問題に出くわしました。 SQLステートメントに「LOCAL」を追加する必要がありました。

たとえば、これは許可の問題を与えます:
LOAD DATA INFILE '{$file}' INTO TABLE {$table}

ステートメントに「LOCAL」を追加すると、権限の問題はなくなります。そのようです:
LOAD DATA LOCAL INFILE '{$file}' INTO TABLE {$table}

178
jeremysawesome

この問題がありました。私はあちこち検索しましたが、満足のいく答えは見つかりませんでした。検索結果を以下に要約します。

アクセス拒否エラーの意味は次のとおりです。

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

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

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

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

18
shreyas-agrawal

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

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

9
tanerkay

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();
3
Matthias Wuttke

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

ファイルは/tmp/test.csvにあり、777のアクセス許可があります。 MySQLユーザーにはファイル権限があり、LOCALオプションはMySQLバージョンで許可されていなかったため、立ち往生しました。

最後に、次を実行することで問題を解決できました。

Sudo chown mysql:mysql /tmp/test.csv
2
Giacomo

私は同じ問題に遭遇し、それらの手順を実行することで解決します:

  • load_infile変数をアクティブにします
  • カスタムmysqlユーザーへのグランドファイル許可
  • secure_file_priv変数を無効にします(myslq/var/lib/mysql-fileのセキュリティで保護されたディレクトリではない/ tmpフォルダーにファイルがアップロードされました)

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

BR、

広告

2
user7996813

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;

ほら!

0
magula