Consulta saída para um arquivo dá acesso negado erro
-
21-08-2019 - |
Pergunta
Eu estou tentando capturar a saída de uma consulta SQL em MySQL, para um arquivo de texto usando a seguinte consulta.
select count(predicate),subject from TableA group by subject into outfile '~/XYZ/output.txt';
Eu recebo o seguinte erro.
ERRO 1045 (28000): Acesso negado para o usuário 'username' @ '%' (senha usada: SIM)
Qualquer idéia de onde estou indo errado? É algum problema de permissão relacionadas?
Solução
OutFile é própria permissão é no mysql.
Se você tiver tudo o que está incluído.
Mas se você só tem uma coleção segura como SELECT, INSERT, UPDATE, DELETE, DROP, CREATE, mas não OUTFILE, "no arquivo de saída" não vai funcionar em consultas.
A razão para isso é que o acesso a arquivos de dentro MySQL, mesmo para fins de gravação, tem certos riscos de segurança, porque se você acessar um arquivo do mysql você pode acessar qualquer arquivo que o usuário mysql tem acesso, ultrapassando assim de usuário baseada em permissões de arquivo.
Para contornar este problema, você pode executar sua consulta diretamente para a saída de qualquer Shell / idioma que você está usando para executar o SQL com.
Aqui está um exemplo * nix
>$ echo "select count(predicate),subject from TableA group by subject" | mysql -u yourusername -p yourdatabasename > ~/XYZ/outputfile.txt
Mas fazer tudo em uma linha sem o "\" ou usar o "\" para escapar da quebra de linha.
O que está acontecendo aqui é que você está executando uma consulta no cliente mysql e é cuspir para fora o resultado, então você está dirigindo a saída para um arquivo. Assim, o arquivo nunca é chamado de dentro mysql, ele é chamado após corridas mysql.
Assim, o uso mysql para obter as informações e depois despejar os dados para o arquivo a partir de seu próprio shell de usuário e você vai ficar bem.
Ou encontrar uma maneira de obter-se a permissão mysql outfile, de qualquer forma.
Outras dicas
Se é o seu sistema (você é admin), e você sabe como para prendê-lo, isto é como você permitir que essas permissões.
USE mysql;
UPDATE user SET File_priv = 'Y' WHERE User = 'db_user';
FLUSH PRIVILEGES;