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)
mysql
linux
permissions
dotancohen
fonte
fonte
in
é inútil se o MySQL não puder acessardotanchoen
. 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. Seugs
usuário também deve ter oFILE
privilégio mysql para realmente executar essa consulta.SELECT
permissões. Costumo navegar no banco de dados como esse usuário.FILE
privilégios, conforme descrito pelos documentos do MySQL .Respostas:
De acordo com a documentação do MySQL em SELECT ... INTO OUTFILE
Você deve enviar
SELECT INTO OUTFILE
para / var / lib / mysql da seguinte maneiraObviamente, você precisa ter a permissão FILE em gs @ localhost.
Há duas maneiras de obter essa permissão
MÉTODO 1
MÉTODO # 2
UPDATE 2012-05-01 07:09 EDT
Para se dar o privilégio FILE, faça o seguinte:
service mysql restart --skip-networking --skip-grant-tables
mysql <hit enter>
UPDATE mysql.user SET File_priv = 'Y' WHERE user='gs' AND host='localhost';
exit
service mysql restart
fonte
SHOW GRANTS
. Parece que o usuário do banco de dados deve ter as permissões adequadas.GRANT ALL PRIVILEGES ON *.*
, exatamente comoRELOAD
eSHUTDOWN
. Isso ocorre porque esses são privilégios administrativos globais. OGRANT ALL
privilégio que você possui é apenas para ogs
banco de dados.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
/tmp
diretó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. .
A saída disso é delimitada por tabulação por padrão. Para vírgulas, basta passar por ela
sed
ou algo assim antes de gravá-la no arquivo.fonte
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
fonte
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
--xml
opção inmysqldump
permite exportar os dados para o formato XML, que pode ser analisado por um script personalizado para qualquer formato necessário, incluindo o TSV.fonte