Não é possível gerar dados do MySQL para o arquivo

13

Estou tentando gerar os dados de uma tabela MySQL para um arquivo, mas obtendo erros de permissão:

$ pwd
/home/dotancohen
$ mkdir in
$ chmod 777 in/
$ mysql -ugs -p
mysql> USE someDatabase;
mysql> SELECT * FROM data INTO OUTFILE '/home/dotancohen/in/data.csv';
ERROR 1045 (28000): Access denied for user 'gs'@'localhost' (using password: YES)
mysql>

Se o diretório em questão for chmodded para 777, por que o usuário do MySQL não pode gravar o arquivo? Curiosamente, também não posso gravar em / tmp /.

EDIT: Parece que o usuário do banco de dados tem as permissões adequadas do MySQL:

mysql> show grants;
+----------------------------------------------------------------------------------+
| Grants for gs@localhost                                                          |
+----------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'gs'@'localhost' IDENTIFIED BY PASSWORD 'somePassword'     | 
| GRANT ALL PRIVILEGES ON `gs\_%`.* TO 'gs'@'localhost'                            | 
+----------------------------------------------------------------------------------+
2 rows in set (0.01 sec)
dotancohen
fonte
2
Você precisa conceder direitos de acesso ao MySQL em toda a árvore de diretórios. A concessão de direitos iné inútil se o MySQL não puder acessar dotanchoen. Em outras palavras, a caixa de depósito de segurança no cofre do banco pode ser deixada aberta, mas se a porta do cofre estiver trancada, você não estará entrando na caixa. Seu gsusuário também deve ter o FILEprivilégio mysql para realmente executar essa consulta.
O problema é que você pode não ter permissões permanentes selecionadas? As permissões do MySQL não são controladas pelas permissões do diretório. Você precisa usar o mysql -u <nome do usuário> -p para executar como um usuário mysql específico. Para dar ao usuário acesso a um banco de dados, dê uma olhada no MySql grant. dev.mysql.com/doc/refman/5.1/en/grant.html
Obrigado, este usuário tem SELECTpermissões. Costumo navegar no banco de dados como esse usuário.
dotancohen
Obrigado, Marc, era disso que eu tinha medo. Portanto, não posso ter uma pasta "caixa de entrada" na qual outros usuários possam gravar, sem permitir que eles também leiam / gravem no meu diretório pessoal?
dotancohen
2
Certifique-se de que o usuário tenha FILEprivilégios, conforme descrito pelos documentos do MySQL .
25812 Mike Purcell

Respostas:

12

De acordo com a documentação do MySQL em SELECT ... INTO OUTFILE

Qualquer arquivo criado por INTO OUTFILE ou INTO DUMPFILE é gravável por todos os usuários no host do servidor. A razão para isso é que o servidor MySQL não pode criar um arquivo que pertence a ninguém além do usuário em cuja conta está sendo executada. (Você nunca deve executar o mysqld como root por esse e outros motivos.) O arquivo deve ser gravável em todo o mundo para que você possa manipular seu conteúdo.

Você deve enviar SELECT INTO OUTFILEpara / var / lib / mysql da seguinte maneira

SELECT * FROM data INTO OUTFILE 'data.csv';

Obviamente, você precisa ter a permissão FILE em gs @ localhost.

Há duas maneiras de obter essa permissão

MÉTODO 1

GRANT FILE ON *.* TO 'gs'@'localhost';

MÉTODO # 2

UPDATE mysql.user SET File_priv = 'Y' WHERE user='gs' AND host='localhost';
FLUSH PRIVILEGES;

UPDATE 2012-05-01 07:09 EDT

Para se dar o privilégio FILE, faça o seguinte:

  • PASSO 01) service mysql restart --skip-networking --skip-grant-tables
  • PASSO 02) mysql <hit enter>
  • PASSO 03) UPDATE mysql.user SET File_priv = 'Y' WHERE user='gs' AND host='localhost';
  • PASSO 04) exit
  • PASSO 05) service mysql restart
RolandoMySQLDBA
fonte
Obrigado. Eu atualizei a pergunta com a saída de SHOW GRANTS. Parece que o usuário do banco de dados deve ter as permissões adequadas.
Dotancohen
O usuário do banco de dados não tem as permissões apropriadas. O privilégio FILE é concedido apenas a um usuário com GRANT ALL PRIVILEGES ON *.*, exatamente como RELOADe SHUTDOWN. Isso ocorre porque esses são privilégios administrativos globais. O GRANT ALLprivilégio que você possui é apenas para o gsbanco de dados.
RolandoMySQLDBA
1

Diferentes distribuições e sistemas operacionais nem todos lidam com os destinos de OUTFILEs da mesma forma.

Por exemplo, ao executar um daemon mysqld no Linux, que usa um soquete, o OUTFILE às vezes é gravado no /tmpdiretório Não é grande coisa, é apenas usar a abordagem OUTFILE com deficiências, como lidar com permissões e descobrir para onde o arquivo foi.

Como o objetivo desta pergunta não é especificamente "Como usar um OUTFILE", mas você está apenas procurando capturar alguns dados do MySQL em um arquivo, aqui está uma alternativa que não exige que você mexa nas permissões de FILE, etc. .

$ (echo 'SELECT * FROM data' | mysql -ugs -p[password])> /home/dotancohen/in/data.csv

A saída disso é delimitada por tabulação por padrão. Para vírgulas, basta passar por ela sedou algo assim antes de gravá-la no arquivo.

AaronDanielson
fonte
1

Passei horas tentando entender as sugestões nesta página e em muitas outras páginas do StackOverflow.

Não importa como eu alterei as permissões no MySql, não consegui fazer nada funcionar.

Voltei às permissões com as quais comecei.

Em última análise, o que funcionou para mim foi mais simples do que as sugestões dos outros:

echo "select id, emailAddress FROM contacts" | mysql --user=myusername --password mydatabasename > /home/my_output_file.tsv

Ryan
fonte
1
Seu método é adequado para uso quando na CLI do Bash. No entanto, a pergunta no OP pergunta sobre como enviar dados para um arquivo da CLI do cliente MySQL.
dotancohen 15/08/19
0

Com relação aos dois métodos de saída de dados para CSV (deve ser TSV de fato) mencionados acima, descobri que, se houver valores vazios nas entradas que você está exportando, existe o risco de que os dados possam ser danificados devido à má alocação de dados. os dados para as colunas correspondentes.

Com preocupação com a integridade dos dados para recuperação, encontrei este site:

https://www.eversql.com/exporting-mysql-schema-structure-to-xml-using-mysql-clients/

Ele mencionou que a --xmlopção in mysqldumppermite exportar os dados para o formato XML, que pode ser analisado por um script personalizado para qualquer formato necessário, incluindo o TSV.

Nguyen H Chan
fonte