Comment effectuer un mysqldump sans invite de mot de passe?

229

Je voudrais connaître la commande pour effectuer un mysqldump d'une base de données sans demander le mot de passe.

RAISON: Je voudrais exécuter un travail cron, qui prend un mysqldump de la base de données une fois par jour. Par conséquent, je ne pourrai pas insérer le mot de passe à l'invite.

Comment pourrais-je résoudre ce problème?

Prakash Raman
la source

Réponses:

412

Puisque vous utilisez Ubuntu, tout ce que vous avez à faire est simplement d'ajouter un fichier dans votre répertoire personnel et cela désactivera l'invite de mot de passe mysqldump. Cela se fait en créant le fichier ~/.my.cnf(les autorisations doivent être de 600).

Ajoutez ceci au fichier .my.cnf

[mysqldump]
user=mysqluser
password=secret

Cela vous permet de vous connecter en tant qu'utilisateur MySQL qui nécessite un mot de passe sans avoir à entrer réellement le mot de passe. Vous n'avez même pas besoin du mot de passe -p ou -.

Très pratique pour l'écriture de scripts mysql et mysqldump.

Les étapes pour y parvenir se trouvent dans ce lien .

Vous pouvez également utiliser la commande suivante:

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

mais sachez qu'elle est intrinsèquement non sécurisée, car l'intégralité de la commande (y compris le mot de passe) peut être visualisée par tout autre utilisateur du système pendant l'exécution du vidage, à l'aide d'une simple ps axcommande.

Frankline
la source
55
a rétrogradé les autres réponses en passant -p sur la ligne de commande, car tout utilisateur peut ps aux pour voir root ou le mot de passe de l'utilisateur. L'utilisation de la suggestion de fichier ci-dessus est la plus sûre
Eddie
19
Si un paramètre global n'est pas une option (au cas où vous n'auriez pas qu'une seule instance mysql pour vous connecter), vous pouvez définir le fichier de configuration via --defaults-file. Comme `mysqldump --defaults-file = my_other.cnf --print-defaults`
dennis
3
@kante: c'est sûr. Il n'est disponible que pour les utilisateurs auxquels appartient le fichier .my.cnf.
Yann Sagon
7
Sous Windows, le fichier de configuration n'est pas à ~/.my.cnf. Voir stackoverflow.com/a/14653239/470749 . MySql s'attendait à ce que le mien soit à c:\wamp\bin\mysql\mysql5.5.24\my.cnf. J'ai donc créé un fichier là-bas. Le redémarrage de Mysql n'était pas nécessaire; cela a fonctionné immédiatement pour mon prochain mysqldump.
Ryan
6
pour ajouter un niveau de sécurité, vous devez utiliser un utilisateur dédié, non spécifique à la base de données, en lecture seule et en aucun cas l'utilisateur root. Cela peut être fait comme ceci:GRANT LOCK TABLES, SELECT ON *.* TO 'BACKUPUSER'@'%' IDENTIFIED BY 'PASSWORD';
gadjou
86

Ajout à la réponse de @ Frankline:

le -p option doit être exclue de la commande pour utiliser le mot de passe dans le fichier de configuration.

Correct:
mysqldump –u my_username my_db > my_db.sql

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



.my.cnf peut omettre le nom d'utilisateur.

[mysqldump]
password=my_password

Si votre .my.cnffichier ne se trouve pas dans un emplacement par défaut et mysqldumpne le voit pas, spécifiez-le à l'aide de --defaults-file.

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

Nelu
la source
Merde, beaucoup de tutoriels XAMPP incluent le -p sans l'expliquer. Cela ne fonctionne PAS pour contourner un mot de passe vide ...
Nelson
47

Quelques réponses mentionnent la mise du mot de passe dans un fichier de configuration.

Alternativement, à partir de votre script, vous pouvez export MYSQL_PWD=yourverysecretpassword.

L'avantage de cette méthode par rapport à l'utilisation d'un fichier de configuration est que vous n'avez pas besoin d'un fichier de configuration distinct pour rester synchronisé avec votre script. Vous n'avez que le script à maintenir.

Il n'y a aucun inconvénient à cette méthode.

Le mot de passe n'est pas visible pour les autres utilisateurs du système (il serait visible s'il se trouve sur la ligne de commande). Les variables d'environnement ne sont visibles que par l'utilisateur exécutant la commande mysql et root.

Le mot de passe sera également visible par toute personne pouvant lire le script lui-même, alors assurez-vous que le script lui-même est protégé. Ce n'est en rien différent de la protection d'un fichier de configuration. Vous pouvez toujours obtenir le mot de passe à partir d'un fichier séparé si vous souhaitez que le script soit publiquement lisible (export MYSQL_PWD=$(cat /root/mysql_password) par exemple). Il est toujours plus facile d'exporter une variable que de créer un fichier de configuration.

Par exemple,

$ 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
la source
Bien que cette réponse ne soit pas vraiment "incorrecte", elle n'est pas encore sécurisée, les variables d'environnement exportées sont toujours facilement visibles lorsque le programme s'exécute ...
MatheusOl
4
@MatheusOl: Les variables d'environnement ne sont visibles que pour root et l'utilisateur lui-même - les mêmes utilisateurs qui auraient de toute façon accès à un fichier de configuration contenant le mot de passe.
chutz
1
@mniess Vous vous trompez. Le export MYSQL_PWD=...n'apparaît pas dans la liste des processus. Pas même une fraction de seconde. En effet, la exportcommande est (et doit être) un shell intégré. Ainsi, le shell ne fork / exécute pas un processus avec l'argument de la commande si vous l'exécutez dans votre shell.
maxschlepzig
1
@maxschlepzig, vous avez raison. Dans ce cas, cela n'a pas d'importance car le fait de mettre le mot de passe dans ENV le rend visible aux autres utilisateurs de toute façon (comme mis en garde dans la documentation mysql)
mniess
2
@mniess Comme je l'ai dit, la documentation mysql est très pauvre et trompeuse. «doit être considéré comme extrêmement précaire et ne doit pas être utilisé» est tout simplement un mauvais et mauvais conseil lors de l'utilisation de Linux et d'autres systèmes. Et cela ne prend pas en charge votre affirmation qui était: «parce que le fait de mettre le mot de passe dans ENV le rend visible aux autres utilisateurs». Side note: comment Oracle si drôle ne pas désapprouver passer le mot de passe sur la ligne de commande qui , en fait , est extrêmement précaire.
maxschlepzig
42

Pour utiliser un fichier qui se trouve n'importe où dans le système d'exploitation, utilisez --defaults-extra-filepar exemple:

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

Remarque: .sqlpwdn'est qu'un exemple de nom de fichier. Vous pouvez utiliser tout ce que vous désirez.

Remarque: MySQL vérifiera automatiquement ~/.my.cnfce qui peut être utilisé au lieu de--defaults-extra-file

Si vous utilisez CRON comme moi, essayez ceci!

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

Autorisation requise et propriété recommandée

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

.sqlpwd Contenu:

[mysqldump]
user=username
password=password

Autres exemples à passer .cnfou.sqlpwd

[mysql]
user=username
password=password

[mysqldiff]
user=username
password=password

[client]
user=username
password=password

Si vous souhaitez vous connecter automatiquement à une base de données, vous aurez besoin de l' [mysql]entrée par exemple.

Vous pouvez maintenant créer un alias qui vous connecte automatiquement à la base de données

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

Vous ne pouvez également mettre que le mot de passe à l'intérieur .sqlpwd et transmettre le nom d'utilisateur via le script / cli. Je ne sais pas si cela améliorerait la sécurité ou non, ce serait une question tout à fait différente.

Par souci d'exhaustivité, je dirai que vous pouvez effectuer les opérations suivantes, mais qu'elles sont extrêmement précaires et ne doivent jamais être utilisées dans un environnement de production:

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

Remarque: il n'y a AUCUN ESPACE entre -p et le mot de passe.

Par exemple, -pPassWordest correct alors qu'il -p Passwordest incorrect.

FreeSoftwareServers
la source
2
C'est la meilleure réponse, surtout lorsque l'on considère plusieurs bases de données et utilisateurs / mots de passe.
Hazok
BTW, les options longues (par exemple --defaults-file) doivent être placées avant les options courtes (comme -u). Testé sur mysqldump version 5.7.17.
Sysadmin
@Sysadmin Un argument d'option commence par un tiret ou deux tirets, selon qu'il s'agit d'une forme courte ou longue du nom de l'option. De nombreuses options ont des formes courtes et longues. Par exemple, -? et --help sont les formes courtes et longues de l'option qui demande à un programme MySQL d'afficher son message d'aide. dev.mysql.com/doc/refman/8.0/en/command-line-options.html
FreeSoftwareServers
29

Oui, c'est très facile .... juste en une seule ligne de commande magique plus

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

Et.. Voila :)

Tarek Kalaji
la source
33
Avertissement: L'utilisation d'un mot de passe sur l'interface de ligne de commande peut être non sécurisée.
93196.93
6
@Yottatron Cela peut être peu sûr, en particulier à l'époque où les anciens systèmes Unix avaient facilement 10-15 personnes connectées pendant la majeure partie de la journée et vi enlisées. Sur un VPS moderne, alors que vous pouvez avoir 10-15 personnes shellées et utilisant IRC, il est courant que seuls les administrateurs aient accès au shell.
Christos Hayward
3
Merci pour cela, je ne fais que l'utiliser dans une devbox Docker. La sécurité n'est donc pas un problème.
MikeiLL
7

Pour moi, en utilisant MariaDB, je devais faire ceci: ajouter le fichier ~/.my.cnfet modifier les autorisations en faisant chmod 600 ~/.my.cnf. Ajoutez ensuite vos informations d'identification au fichier. La pièce magique qui me manquait était que le mot de passe doit être sous le bloc client (ref: docs ), comme ceci:

[client]
password = "my_password"

[mysqldump]
user = root
host = localhost

Si vous venez ici pour chercher comment faire un mysqldump avec MariaDB. Placez le mot de passe sous un bloc [client], puis l'utilisateur sous un bloc [mysqldump].

Michael Johansen
la source
J'utilise également MariaDB (10.4 pour être précis) et j'ai simplement mis le mot de passe sous la [mysqldump]section et cela a fonctionné sans aucun problème. Ubuntu 18.04 LTS
Paul Davis
3

Voici une solution pour Docker dans un 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'

Remplacez [MYSQL_CONTAINER_NAME]et assurez-vous que la variable d'environnement MYSQL_ROOT_PASSWORDest définie dans votre conteneur.

J'espère que cela vous aidera comme cela pourrait m'aider!

pcmanprogrammeur
la source
0

J'ai ce qui suit.

/ etc / mysqlpwd

[mysql]
user=root
password=password

Avec l'alias suivant.

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

Pour faire une restauration, j'utilise simplement:

mysql -p [database] [file.sql]
hawx
la source
-2

Qu'en est-il --password = "" a fonctionné pour moi fonctionnant sur 5.1.51

mysqldump -h localhost -u <user> --password="<password>"
Joe Velez
la source
y compris --password=xxxsur la ligne de commande rendra le mot de passe visible à toute personne ayant la capacité de lire proc (ou de faire un ps complet) - ce qui est assez par défaut.
Rafa
-11

Certainement, je pense qu'il serait préférable et plus sûr de placer la ligne cmd complète dans la crontab racine, avec credentails. Au moins, l'édition de crontab est réservée (lisible) à quelqu'un qui connaît déjà le mot de passe .. donc pas de soucis pour l'afficher en texte clair ...

Si besoin de plus qu'un simple mysqldump ... il suffit de placer un script bash qui accepte les informations d'identification comme paramètres et exécute toutes les commodités à l'intérieur ...

Le fichier bas en simple

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

Dans le Crontab:

0 0 * * * bash /path/to/above/bash/file.sh root secretpwd 2>&1 /var/log/mycustomMysqlDump.log
kante
la source
3
Non, ce ne serait pas plus sûr, lorsque vous ajoutez un mot de passe à la ligne de commande, il est visible par toute personne capable de lire proc (ou de faire un ps complet) - ce qui est assez par défaut. Lorsque vous ajoutez un fichier .my.cnf et définissez 600 droits, il n'est visible que par VOUS.
rombarcz
-21

Vous pouvez spécifier le mot de passe sur la ligne de commande comme suit:

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

Les options pour mysqldump sont sensibles à la casse!

jx12345
la source
non ça ne marche pas, je ne pense pas qu'il comprenne que -p est le mot de passe
Prakash Raman
1
Je ne sais pas comment cela a obtenu 1 vote, je vote en aval. Comme vu dans d'autres réponses ici, il ne devrait pas y avoir d'espace entre le -p et le mot de passe donné. Vous devez également rediriger la sortie vers un fichier de vidage, ne pas la spécifier comme vous le faites, ou elle sera supposée être un nom de table. @buzypi l'a dit le mieux.
Neek
cela devrait fonctionner (bien qu'il ne soit pas sûr dans la mesure où il est assez facile pour les autres utilisateurs de voir le mot de passe), vous devez simplement vous assurer qu'il n'y a pas d'espace entre -p et le mot de passe, par exemplemysqldump -u root -pmypassword
jx12345