14

次のクエリを使用して、MySQL で SQL クエリの出力をテキスト ファイルにキャプチャしようとしています。

select count(predicate),subject from TableA group by subject into outfile '~/XYZ/output.txt';

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

エラー 1045 (28000): ユーザー 'ユーザー名'@'%' のアクセスが拒否されました (パスワードを使用: はい)

どこが間違っているのですか?許可関連の問題ですか?

4

2 に答える 2

30

Outfile は、mysql の独自の許可です。

ALL をお持ちの場合は含まれています。

ただし、SELECT、INSERT、UPDATE、DELETE、DROP、CREATE などの安全なコレクションしかなく、OUTFILE がない場合、「into outfile」はクエリで機能しません。

この理由は、MySQL 内からファイルにアクセスすることには、書き込み目的であっても、特定のセキュリティ リスクがあるためです。mysql からファイルにアクセスすると、mysql ユーザーがアクセスできる任意のファイルにアクセスできるため、ユーザーベースのファイル権限がバイパスされるためです。

これを回避するには、SQL の実行に使用しているシェル/言語の出力にクエリを直接実行できます。

これは* nixの例です

>$ echo "select count(predicate),subject from TableA group by subject"  | mysql -u yourusername -p yourdatabasename > ~/XYZ/outputfile.txt

ただし、「\」を使用せずにすべてを 1 行で行うか、「\」を使用して改行をエスケープしてください。

ここで何が起こっているかというと、mysql クライアントに対してクエリを実行し、結果を吐き出してから、出力をファイルに送信しているということです。したがって、ファイルは mysql 内から呼び出されることはなく、mysql の実行後に呼び出されます。

したがって、mysql を使用して情報を取得し、データを自分のユーザー シェルからファイルにダンプすれば問題ありません。

または、どちらの方法でも、outfile mysql 許可を取得する方法を見つけてください。

于 2009-03-21T03:26:26.447 に答える
4

それがあなたのシステム (あなたが管理者) であり、それを保護する方法を知っている場合、これがそれらのアクセス許可を有効にする方法です。

USE mysql;
UPDATE user SET File_priv = 'Y' WHERE User = 'db_user';
FLUSH PRIVILEGES;
于 2014-10-21T15:24:15.853 に答える