Estou tentando despejar o conteúdo de uma tabela em um arquivo csv usando uma instrução SELECT INTO OUTFILE do MySQL. Se eu fizer:
SELECT column1, column2
INTO OUTFILE 'outfile.csv'
FIELDS TERMINATED BY ','
FROM table_name;
outfile.csv será criado no servidor no mesmo diretório onde os arquivos deste banco de dados estão armazenados.
No entanto, quando eu mudo minha consulta para:
SELECT column1, column2
INTO OUTFILE '/data/outfile.csv'
FIELDS TERMINATED BY ','
FROM table_name;
Eu recebo:
ERROR 1 (HY000): Can't create/write to file '/data/outfile.csv' (Errcode: 13)
Errcode 13 é um erro de permissão, mas eu o recebo mesmo se eu mudar a propriedade de / data para mysql: mysql e conceder a ele 777 permissões. O MySQL está sendo executado como usuário "mysql".
Estranhamente, posso criar o arquivo em / tmp, mas não em qualquer outro diretório que tentei, mesmo com permissões definidas de forma que o usuário mysql possa gravar no diretório.
Este é o MySQL 5.0.75 em execução no Ubuntu.
mysql
sql
into-outfile
Ryan Olson
fonte
fonte
/tmp
.Respostas:
Qual versão particular do Ubuntu é esta e esta é o Ubuntu Server Edition?
As edições recentes do Ubuntu Server (como a 10.04) vêm com o AppArmor e o perfil do MySQL pode estar no modo obrigatório por padrão. Você pode verificar isso executando da seguinte
sudo aa-status
forma:Se o mysqld estiver incluído no modo forçado, provavelmente é ele que nega a gravação. As entradas também seriam gravadas
/var/log/messages
quando o AppArmor bloquear as gravações / acessos. O que você pode fazer é editar/etc/apparmor.d/usr.sbin.mysqld
e adicionar/data/
e/data/*
próximo à parte inferior, assim:E então faça o AppArmor recarregar os perfis.
AVISO: a mudança acima permitirá que o MySQL leia e grave no diretório / data. Esperamos que você já tenha considerado as implicações de segurança disso.
fonte
/your/abs/folder/ r, /your/abs/folder/** rwk, }
não se esqueça de colocar a vírgula no final!Ubuntu usa AppArmor e isso é o que está impedindo você de acessar / data /. O Fedora usa selinux e isso impediria isso em uma máquina RHEL / Fedora / CentOS.
Para modificar o AppArmor para permitir que o MySQL acesse / data / faça o seguinte:
sudo gedit /etc/apparmor.d/usr.sbin.mysqld
adicione esta linha em qualquer lugar na lista de diretórios:
/data/ rw,
então faça um:
sudo /etc/init.d/apparmor restart
Outra opção é desabilitar o AppArmor para mysql completamente, isso NÃO É RECOMENDADO :
sudo mv /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/
Não se esqueça de reiniciar o aparelho:
sudo /etc/init.d/apparmor restart
fonte
Eu sei que você disse que já tentou definir as permissões para 777, mas como tenho uma evidência de que para mim era um problema de permissão, estou postando o que exatamente executei esperando que possa ajudar. Aqui está minha experiência:
fonte
O MySQL está ficando estúpido aqui. Ele tenta criar arquivos em / tmp / data / .... Então, o que você pode fazer é o seguinte:
Em seguida, tente sua consulta. Isso funcionou para mim depois de horas depurando o problema.
fonte
Esse problema já me incomoda há muito tempo. Percebi que essa discussão não aponta a solução no RHEL / Fecora. Estou usando o RHEL e não encontro os arquivos de configuração correspondentes ao AppArmer no Ubuntu, mas resolvi meu problema tornando CADA diretório no diretório PATH legível e acessível por mysql. Por exemplo, se você criar um diretório / tmp, os dois comandos a seguir tornam SELECT INTO OUTFILE capaz de gerar o arquivo .sql E .sql
Se você criar um diretório em seu diretório pessoal / home / tom, você deve fazer isso para / home e / home / tom.
fonte
chown mysql:mysql
resolveu meu problemaVocê consegue fazer isso :
fonte
Algumas coisas para tentar:
secure_file_priv
variável sistema está definida? Se for, todos os arquivos devem ser gravados nesse diretório.fonte
Eu tenho o mesmo problema e resolvi-o seguindo as etapas:
sudo gedit /etc/apparmor.d/usr.sbin.mysqld
agora o arquivo será aberto no editor, adicione seu diretório lá
/ var / www / csv / * rw,
da mesma forma, adicionei em meu arquivo, como a seguinte imagem dada:
sudo /etc/init.d/apparmor restart
Feito com sucesso e gravar todas as linhas com colunas selecionadas no arquivo OUTPUT.csv ...
fonte
No meu caso, a solução foi tornar cada diretório no caminho do diretório legível e acessível por
mysql
(chmod a+rx
). O diretório ainda foi especificado por seu caminho relativo na linha de comando.fonte
Acabei de encontrar o mesmo problema. Meu problema era que o diretório no qual eu estava tentando despejar não tinha permissão de gravação para o processo mysqld. O dump inicial do sql seria gravado, mas a gravação do arquivo csv / txt falharia. Parece que o dump sql é executado como o usuário atual e a conversão para csv / txt é executada como o usuário que está executando o mysqld. Portanto, o diretório precisa de permissões de gravação para ambos os usuários.
fonte
Você precisa fornecer um caminho absoluto, não um caminho relativo.
Forneça o caminho completo para o diretório / data no qual você está tentando gravar.
fonte
touch /data/outfile.csv
su --shell=/bin/sh nameofaccount
Ubuntu usa SELinux? Verifique se está habilitado e obrigatório. /var/log/audit/audit.log pode ser útil (se é onde o Ubuntu o coloca - é a localização do RHEL / Fedora).
fonte
Eu tive o mesmo problema em um CentOs 6.7 No meu caso todas as permissões foram definidas e ainda assim ocorreu o erro. O problema era que o SE Linux estava no modo "enforcing".
Mudei para "permissivo" usando o comando
sudo setenforce 0
Então tudo deu certo para mim.
fonte