Como executar um mysqldump sem um prompt de senha?

229

Gostaria de saber o comando para executar um mysqldump de um banco de dados sem a solicitação da senha.

MOTIVO: Eu gostaria de executar um trabalho cron, que pega um mysqldump do banco de dados uma vez por dia. Portanto, não poderei inserir a senha quando solicitado.

Como eu poderia resolver isso?

Prakash Raman
fonte

Respostas:

412

Como você está usando o Ubuntu, tudo o que você precisa fazer é adicionar um arquivo no diretório inicial e ele desativará a solicitação de senha do mysqldump. Isso é feito criando o arquivo ~/.my.cnf(as permissões precisam ser 600).

Adicione isso ao arquivo .my.cnf

[mysqldump]
user=mysqluser
password=secret

Isso permite que você se conecte como um usuário MySQL que requer uma senha sem ter que realmente digitar a senha. Você nem precisa da senha -p ou --password.

Muito útil para scripts de comandos mysql e mysqldump.

As etapas para conseguir isso podem ser encontradas neste link .

Como alternativa, você pode usar o seguinte comando:

mysqldump -u [user name] -p[password] [database name] > [dump file]

mas lembre-se de que ele é inerentemente inseguro, pois o comando inteiro (incluindo senha) pode ser visualizado por qualquer outro usuário no sistema enquanto o dump estiver em execução, com um ps axcomando simples .

Frankline
fonte
55
reduziu o voto das outras respostas passando -p na linha de comando, pois qualquer usuário pode usar o ps aux para ver o root ou a senha do usuário. Usando a sugestão de arquivo acima é mais seguro
Eddie
19
Se uma configuração global não for uma opção (caso você não tenha apenas uma instância do mysql à qual se conectar), você poderá definir o arquivo de configuração via --defaults-file. Como `mysqldump --defaults-file = my_other.cnf --print-defaults`
dennis
3
@ Kante: é seguro. Está disponível apenas para usuários aos quais o arquivo .my.cnf pertence.
usar o seguinte código
7
No Windows, o arquivo de configuração não está em ~/.my.cnf. Consulte stackoverflow.com/a/14653239/470749 . O MySql esperava que o meu estivesse em c:\wamp\bin\mysql\mysql5.5.24\my.cnf. Então, eu criei um arquivo lá. Reiniciar o Mysql não era necessário; funcionou imediatamente para o meu próximo mysqldump.
Ryan
6
Para adicionar um nível de segurança, você deve usar um usuário dedicado, não específico do banco de dados, somente leitura e, em nenhum caso, o usuário root. Isso pode ser feito da seguinte forma:GRANT LOCK TABLES, SELECT ON *.* TO 'BACKUPUSER'@'%' IDENTIFIED BY 'PASSWORD';
gadjou
86

Adicionando à resposta da @ Frankline:

A -popção deve ser excluída do comando para usar a senha no arquivo de configuração.

Corrigir:
mysqldump –u my_username my_db > my_db.sql

Errado:
mysqldump –u my_username -p my_db > my_db.sql



.my.cnf pode omitir o nome de usuário.

[mysqldump]
password=my_password

Se o seu .my.cnfarquivo não estiver em um local padrão e mysqldumpnão o vir, especifique-o usando --defaults-file.

mysqldump --defaults-file=/path-to-file/.my.cnf –u my_username my_db > my_db.sql

Nelu
fonte
Porra, muitos tutoriais do XAMPP incluem o -p sem explicá-lo. Ele não não funciona para contornar uma senha em branco ...
Nelson
47

Algumas respostas mencionam colocar a senha em um arquivo de configuração.

Como alternativa, no seu script, você pode export MYSQL_PWD=yourverysecretpassword.

A vantagem desse método em relação ao uso de um arquivo de configuração é que você não precisa de um arquivo de configuração separado para manter a sincronização com seu script. Você só tem o script para manter.

Não há desvantagem nesse método.

A senha não é visível para outros usuários no sistema (seria visível se estiver na linha de comando). As variáveis ​​de ambiente são visíveis apenas para o usuário que executa o comando mysql e root.

A senha também estará visível para qualquer pessoa que possa ler o próprio script, portanto, verifique se o próprio script está protegido. Isso não é diferente de proteger um arquivo de configuração. Você ainda pode obter a senha de um arquivo separado se desejar que o script possa ser lido publicamente (export MYSQL_PWD=$(cat /root/mysql_password) por exemplo). Ainda é mais fácil exportar uma variável do que criar um arquivo de configuração.

Por exemplo,

$ export MYSQL_PWD=$(>&2 read -s -p "Input password (will not echo): "; echo "$REPLY")
$ mysqldump -u root mysql | head
-- MySQL dump 10.13  Distrib 5.6.23, for Linux (x86_64)
--
-- Host: localhost    Database: mysql
-- ------------------------------------------------------
-- Server version   5.6.23
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
$ mysqldump -u root mysql | head
-- MySQL dump 10.13  Distrib 5.6.23, for Linux (x86_64)
--
-- Host: localhost    Database: mysql
-- ------------------------------------------------------
-- Server version   5.6.23
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
chutz
fonte
Embora esta resposta não é realmente "incorreto", ainda não é segura, as variáveis de ambiente exportadas ainda são facilmente visíveis quando o programa está sendo executado ...
MatheusOl
4
@MatheusOl: As variáveis ​​de ambiente são visíveis apenas para o root e o próprio usuário - os mesmos usuários que teriam acesso a um arquivo de configuração contendo a senha de qualquer maneira.
chutz
1
@mniess Você está errado. O export MYSQL_PWD=...que não aparecem na lista de processos. Nem mesmo por uma fração de segundo. Isso ocorre porque o exportcomando é (e deve ser) um shell embutido. Portanto, o shell não bifurca / executa um processo com o argumento do comando se você o executar no seu shell.
maxschlepzig
1
@maxschlepzig você está certo. Neste caso, não importa, porque colocar a senha no ENV torna visível para outros usuários de qualquer maneira (como advertiu contra na documentação mysql)
mniess
2
@mniess Como eu disse, a documentação do mysql é muito pobre e enganosa. 'deve ser considerado extremamente inseguro e não deve ser usado' é simplesmente um conselho errado e ruim ao usar o Linux e outros sistemas. E isso não suporta sua reivindicação, que era: 'porque colocar a senha em ENV a torna visível para outros usuários de qualquer maneira'. Nota lateral: apesar de engraçado, o modo como a Oracle não deprecia a passagem da senha na linha de comando, o que de fato é extremamente inseguro.
maxschlepzig
42

Para usar um arquivo que esteja em qualquer lugar dentro do sistema operacional, use, --defaults-extra-filepor exemplo:

mysqldump --defaults-extra-file=/path/.sqlpwd [database] > [desiredoutput].sql

Nota: .sqlpwdé apenas um exemplo de nome de arquivo. Você pode usar o que quiser.

Nota: O MySQL irá verificar automaticamente ~/.my.cnfqual pode ser usado em vez de--defaults-extra-file

Se você estiver usando o CRON como eu, tente isso!

mysqldump --defaults-extra-file=/path/.sqlpwd [database] > "$(date '+%F').sql"

Permissão necessária e propriedade recomendada

sudo chmod 600 /path/.sqlpwd && sudo chown $USER:nogroup /path/.sqlpwd

.sqlpwd conteúdo:

[mysqldump]
user=username
password=password

Outros exemplos para passar .cnfou.sqlpwd

[mysql]
user=username
password=password

[mysqldiff]
user=username
password=password

[client]
user=username
password=password

Se você deseja efetuar login automaticamente em um banco de dados, precisará da [mysql]entrada, por exemplo.

Agora você pode criar um alias que o conecta automaticamente ao banco de dados

alias whateveryouwant="mysql --defaults-extra-file=/path/.sqlpwd [database]"

Você também pode inserir a senha apenas .sqlpwde passar o nome de usuário através do script / cli. Não tenho certeza se isso melhoraria a segurança ou não, isso seria uma pergunta totalmente diferente.

Para garantir a integridade, declararei que você pode fazer o seguinte, mas é extremamente inseguro e nunca deve ser usado em um ambiente de produção:

mysqldump -u [user_name] -p[password] [database] > [desiredoutput].sql

Nota: NÃO HÁ ESPAÇO entre -p e a senha.

Por exemplo, -pPassWordestá correto enquanto -p Passwordestá incorreto.

FreeSoftwareServers
fonte
2
Essa é a melhor resposta, especialmente quando se considera vários bancos de dados e usuários / senhas.
Hazok 27/10/2015
BTW, opções longas (por exemplo - arquivo-padrão) devem ser colocadas antes das opções curtas (como -u). Testado no mysqldump versão 5.7.17.
Sysadmin 14/06
@Sysadmin Um argumento de opção começa com um traço ou dois traços, dependendo se é um formato curto ou longo do nome da opção. Muitas opções têm formas curtas e longas. Por exemplo, -? e --help são as formas curtas e longas da opção que instrui um programa MySQL a exibir sua mensagem de ajuda. dev.mysql.com/doc/refman/8.0/en/command-line-options.html
FreeSoftwareServers
29

Sim, é muito fácil .... apenas em uma linha de comando mágica não mais

mysqldump --user='myusername' --password='mypassword' -h MyUrlOrIPAddress databasename > myfile.sql

E feito :)

Tarek Kalaji
fonte
33
Aviso: O uso de uma senha na interface da linha de comandos pode ser inseguro.
93196,93
6
@Yottatron Pode ser inseguro, especialmente nos dias em que os antigos sistemas Unix tinham facilmente entre 10 e 15 pessoas conectadas a maior parte do dia e vi atoladas. Em um VPS moderno, enquanto você pode ter entre 10 e 15 pessoas conectadas e usando o IRC, é comum apenas os administradores terem acesso ao shell.
Christos Hayward
3
Obrigado por isso, estou apenas usando-o em um devbox do Docker. Portanto, segurança não é um problema.
MikeiLL
7

Para mim, usando o MariaDB, tive que fazer o seguinte: Adicione o arquivo ~/.my.cnfe altere as permissões fazendo isso chmod 600 ~/.my.cnf. Em seguida, adicione suas credenciais ao arquivo. A parte mágica que estava faltando era que a senha precisava estar no bloco do cliente (ref: docs ), assim:

[client]
password = "my_password"

[mysqldump]
user = root
host = localhost

Se você vier aqui procurando como fazer um mysqldump com o MariaDB. Coloque a senha em um bloco [client] e, em seguida, o usuário em um bloco [mysqldump].

Michael Johansen
fonte
Também estou usando o MariaDB (10.4 para ser específico) e simplesmente coloquei a senha na [mysqldump]seção e funcionou sem problemas. Ubuntu 18.04 LTS
Paul Davis
3

Aqui está uma solução para o Docker em um script / bin / sh:

docker exec [MYSQL_CONTAINER_NAME] sh -c 'exec echo "[client]" > /root/mysql-credentials.cnf'

docker exec [MYSQL_CONTAINER_NAME] sh -c 'exec echo "user=root" >> /root/mysql-credentials.cnf'

docker exec [MYSQL_CONTAINER_NAME] sh -c 'exec echo "password=$MYSQL_ROOT_PASSWORD" >> /root/mysql-credentials.cnf'

docker exec [MYSQL_CONTAINER_NAME] sh -c 'exec mysqldump --defaults-extra-file=/root/mysql-credentials.cnf --all-databases'

Substitua [MYSQL_CONTAINER_NAME]e verifique se a variável de ambiente MYSQL_ROOT_PASSWORDestá definida no seu contêiner.

Espero que ajude você como se pudesse me ajudar!

pcmanprogrammeur
fonte
0

Eu tenho o seguinte.

/ etc / mysqlpwd

[mysql]
user=root
password=password

Com o seguinte alias.

alias 'mysql -p'='mysql --defaults-extra-file=/etc/mysqlpwd'

Para fazer uma restauração, basta usar:

mysql -p [database] [file.sql]
hawx
fonte
-2

what about --password = "" funcionou para mim rodando no 5.1.51

mysqldump -h localhost -u <user> --password="<password>"
Joe Velez
fonte
A inclusão --password=xxxna linha de comando tornará a senha visível para qualquer pessoa com capacidade de ler proc (ou fazer ps completo) - o que é bastante padrão.
Rafa
-11

Definitivamente, acho que seria melhor e mais seguro colocar a linha cmd completa no crontab raiz, com credentails. Pelo menos a edição do crontab é restrita (legível) a alguém que já conhece a senha. Portanto, não se preocupe em mostrá-la em texto simples ...

Se necessário, mais do que um simples mysqldump ... basta colocar um script bash que aceite credentails como parâmetros e execute todas as comodidades dentro ...

O arquivo bas em simples

#!/bin/bash
mysqldump -u$1 -p$2 yourdbname > /your/path/save.sql

No Crontab:

0 0 * * * bash /path/to/above/bash/file.sh root secretpwd 2>&1 /var/log/mycustomMysqlDump.log
kante
fonte
3
Não, não seria mais seguro, quando você adiciona uma senha à linha de comando, ela fica visível para qualquer pessoa com capacidade de ler proc (ou fazer ps completo) - o que é bastante padrão. Quando você adiciona o arquivo .my.cnf e define 600 direitos, ele é visível apenas para você.
rombarcz
-21

Você pode especificar a senha na linha de comandos da seguinte maneira:

mysqldump -h <host> -u <user> -p<password> dumpfile

As opções para o mysqldump diferenciam maiúsculas de minúsculas!

jx12345
fonte
Nope não trabalho, eu não acho que ele entende que -p é a senha
Prakash Raman
1
Não tenho certeza de como isso obteve 1 voto, estou com voto negativo. Como visto em outras respostas aqui, não deve haver espaço entre o -p e a senha fornecida. Além disso, você deve redirecionar a saída para o arquivo de despejo, não a especificar como está fazendo, ou será assumido como um nome de tabela. @buzypi disse o melhor.
Neek
ele deve funcionar (embora é insegura em que o seu muito fácil para que outros usuários vejam a senha) você só precisa ter certeza de que não há espaço entre, por exemplo -p e senhamysqldump -u root -pmypassword
jx12345