Wie führe ich einen mysqldump ohne Passwortabfrage durch?

229

Ich möchte den Befehl zum Ausführen eines mysqldump einer Datenbank ohne die Aufforderung zur Eingabe des Kennworts kennen.

GRUND: Ich möchte einen Cron-Job ausführen, der einmal täglich einen Mysqldump der Datenbank benötigt. Daher kann ich das Passwort nicht eingeben, wenn ich dazu aufgefordert werde.

Wie könnte ich das lösen?

Prakash Raman
quelle

Antworten:

412

Da Sie Ubuntu verwenden, müssen Sie lediglich eine Datei in Ihr Home-Verzeichnis einfügen, um die Eingabeaufforderung für das mysqldump-Kennwort zu deaktivieren. Dies erfolgt durch Erstellen der Datei ~/.my.cnf(Berechtigungen müssen 600 sein).

Fügen Sie dies der Datei .my.cnf hinzu

[mysqldump]
user=mysqluser
password=secret

Auf diese Weise können Sie eine Verbindung als MySQL-Benutzer herstellen, der ein Kennwort benötigt, ohne das Kennwort tatsächlich eingeben zu müssen. Sie brauchen nicht einmal das -p oder --password.

Sehr praktisch für die Skripterstellung von mysql- und mysqldump-Befehlen.

Die Schritte dazu finden Sie unter diesem Link .

Alternativ können Sie den folgenden Befehl verwenden:

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

Beachten Sie jedoch, dass dies von Natur aus unsicher ist, da der gesamte Befehl (einschließlich des Kennworts) von jedem anderen Benutzer im System mit einem einfachen ps axBefehl angezeigt werden kann, während der Speicherauszug ausgeführt wird .

Frankline
quelle
55
Die anderen Antworten, die -p in der Befehlszeile übergeben, wurden herabgestuft, da jeder Benutzer ps aux verwenden kann, um das Root- oder Benutzerpasswort anzuzeigen. Die Verwendung des obigen Dateivorschlags ist am sichersten
Eddie
19
Wenn eine globale Einstellung keine Option ist (falls Sie nicht nur eine MySQL-Instanz zum Herstellen einer Verbindung haben), können Sie die Konfigurationsdatei über festlegen --defaults-file. Wie `mysqldump --defaults-file = my_other.cnf --print-defaults`
dennis
3
@kante: es ist sicher. Es steht nur Benutzern zur Verfügung, denen die Datei .my.cnf gehört.
Yann Sagon
7
Unter Windows befindet sich die Konfigurationsdatei nicht unter ~/.my.cnf. Siehe stackoverflow.com/a/14653239/470749 . MySql erwartete, dass meine bei sein würde c:\wamp\bin\mysql\mysql5.5.24\my.cnf. Also habe ich dort eine Datei erstellt. Ein Neustart von MySQL war nicht erforderlich. es funktionierte sofort für meinen nächsten mysqldump.
Ryan
6
Um eine Sicherheitsstufe hinzuzufügen, sollten Sie einen dedizierten, nicht datenbankspezifischen, schreibgeschützten Benutzer und in keinem Fall den Root-Benutzer verwenden. Es kann so gemacht werden:GRANT LOCK TABLES, SELECT ON *.* TO 'BACKUPUSER'@'%' IDENTIFIED BY 'PASSWORD';
Gadjou
86

Zur Antwort von @ Frankline hinzufügen:

Die -pOption muss aus dem Befehl ausgeschlossen werden, um das Kennwort in der Konfigurationsdatei verwenden zu können.

Richtig:
mysqldump –u my_username my_db > my_db.sql

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



.my.cnf kann den Benutzernamen weglassen.

[mysqldump]
password=my_password

Wenn sich Ihre .my.cnfDatei nicht an einem Standardspeicherort befindet und mysqldumpnicht angezeigt wird , geben Sie sie mit an --defaults-file.

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

Nelu
quelle
Verdammt, viele XAMPP-Tutorials enthalten das -p, ohne es zu erklären. Es funktioniert NICHT, um ein leeres Passwort zu umgehen ...
Nelson
47

In einigen Antworten wird erwähnt, dass das Kennwort in eine Konfigurationsdatei eingefügt wird.

Alternativ können Sie von Ihrem Skript aus export MYSQL_PWD=yourverysecretpassword.

Der Vorteil dieser Methode gegenüber der Verwendung einer Konfigurationsdatei besteht darin, dass Sie keine separate Konfigurationsdatei benötigen, um mit Ihrem Skript synchron zu bleiben. Sie müssen nur das Skript verwalten.

Es ist kein Nachteil dieser Methode.

Das Kennwort ist für andere Benutzer im System nicht sichtbar (es wäre sichtbar, wenn es sich in der Befehlszeile befindet). Die Umgebungsvariablen sind nur für den Benutzer sichtbar, der den Befehl mysql und root ausführt.

Das Kennwort ist auch für alle sichtbar, die das Skript selbst lesen können. Stellen Sie daher sicher, dass das Skript selbst geschützt ist. Dies unterscheidet sich in keiner Weise vom Schutz einer Konfigurationsdatei. Sie können das Kennwort weiterhin aus einer separaten Datei beziehen, wenn das Skript beispielsweise öffentlich lesbar sein soll export MYSQL_PWD=$(cat /root/mysql_password). Es ist immer noch einfacher, eine Variable zu exportieren, als eine Konfigurationsdatei zu erstellen.

Z.B,

$ 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
quelle
Obwohl diese Antwort nicht wirklich "falsch" ist, ist sie noch nicht sicher, die exportierten Umgebungsvariablen sind immer noch gut sichtbar, wenn das Programm ausgeführt wird ...
MatheusOl
4
@MatheusOl: Die Umgebungsvariablen sind nur für root und den Benutzer selbst sichtbar - dieselben Benutzer, die ohnehin Zugriff auf eine Konfigurationsdatei mit dem Kennwort hätten.
Chutz
1
@mniess Du liegst falsch. Das export MYSQL_PWD=...wird nicht in der Prozessliste angezeigt. Nicht einmal für den Bruchteil einer Sekunde. Dies liegt daran, dass der exportBefehl eine integrierte Shell ist (und sein muss). Daher gibt die Shell keinen Prozess mit dem Argument des Befehls ab, wenn Sie ihn in Ihrer Shell ausführen.
Maxschlepzig
1
@maxschlepzig du hast recht. In diesem Fall spielt es keine Rolle, da das Einfügen des Passworts in ENV es ohnehin für andere Benutzer sichtbar macht (wie in der MySQL-Dokumentation gewarnt)
Mniess
2
@mniess Wie gesagt, die MySQL-Dokumentation ist sehr schlecht und irreführend. "Muss als äußerst unsicher angesehen werden und sollte nicht verwendet werden" ist einfach ein falscher und schlechter Rat bei der Verwendung von Linux und anderen Systemen. Und dies stützt Ihre Behauptung nicht: "Weil das Einfügen des Passworts in ENV es ohnehin für andere Benutzer sichtbar macht". Randbemerkung: lustig , obwohl , wie Oracle hat deprecate das Passwort nicht auf der Linie , die in der Tat Befehl vorbei ist extrem unsicher.
Maxschlepzig
42

Verwenden Sie zum Verwenden einer Datei, die sich irgendwo innerhalb des Betriebssystems befindet, --defaults-extra-filez.

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

Hinweis: .sqlpwdist nur ein Beispieldateiname. Sie können verwenden, was Sie wollen.

Hinweis: MySQL prüft automatisch, ~/.my.cnfwelche anstelle von verwendet werden kann--defaults-extra-file

Wenn Sie CRON wie ich verwenden, versuchen Sie dies!

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

Erforderliche Erlaubnis und empfohlenes Eigentum

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

.sqlpwd Inhalt:

[mysqldump]
user=username
password=password

Andere Beispiele zu übergeben .cnfoder.sqlpwd

[mysql]
user=username
password=password

[mysqldiff]
user=username
password=password

[client]
user=username
password=password

Wenn Sie sich automatisch bei einer Datenbank anmelden möchten, benötigen Sie beispielsweise den [mysql]Eintrag.

Sie können jetzt einen Alias ​​erstellen, der Sie automatisch mit der Datenbank verbindet

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

Sie können das Passwort auch nur eingeben .sqlpwdund den Benutzernamen über das Skript / cli übergeben. Ich bin mir nicht sicher, ob dies die Sicherheit verbessern würde oder nicht, das wäre insgesamt eine andere Frage.

Der Vollständigkeit halber möchte ich sagen, dass Sie Folgendes tun können, dies ist jedoch äußerst unsicher und sollte niemals in einer Produktionsumgebung verwendet werden:

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

Hinweis: Zwischen -p und dem Kennwort steht KEIN Leerzeichen.

ZB -pPassWordist richtig, während -p Passwordfalsch ist.

FreeSoftwareServer
quelle
2
Dies ist die beste Antwort, insbesondere wenn mehrere Datenbanken und Benutzer / Kennwörter berücksichtigt werden.
Hazok
Übrigens sollten lange Optionen (z. B. --defaults-file) vor kurzen Optionen (wie -u) stehen. Getestet auf mysqldump Version 5.7.17.
Sysadmin
@Sysadmin Ein Optionsargument beginnt mit einem Bindestrich oder zwei Bindestrichen, je nachdem, ob es sich um eine Kurzform oder eine Langform des Optionsnamens handelt. Viele Optionen haben sowohl kurze als auch lange Formen. Zum Beispiel, -? und --help sind die kurzen und langen Formen der Option, mit der ein MySQL-Programm angewiesen wird, seine Hilfemeldung anzuzeigen. dev.mysql.com/doc/refman/8.0/de/command-line-options.html
FreeSoftwareServers
29

Ja, es ist sehr einfach ... nur in einer magischen Kommandozeile nicht mehr

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

und fertig :)

Tarek Kalaji
quelle
33
Warnung: Die Verwendung eines Kennworts auf der Befehlszeilenschnittstelle kann unsicher sein.
93196.93
6
@Yottatron Es kann unsicher sein, besonders damals, als in alten Unix-Systemen 10-15 Personen den größten Teil des Tages angemeldet und vi festgefahren waren. Auf einem modernen VPS können zwar 10 bis 15 Personen in IRC eingeschält sein und IRC verwenden, es ist jedoch üblich, dass nur Administratoren Shell-Zugriff haben.
Christos Hayward
3
Vielen Dank dafür, ich verwende es nur in einer Docker-Devbox. Sicherheit ist also kein Thema.
MikeiLL
7

Mit MariaDB musste ich Folgendes tun: Fügen Sie die Datei hinzu ~/.my.cnfund ändern Sie die Berechtigungen, indem Sie dies tun chmod 600 ~/.my.cnf. Fügen Sie dann Ihre Anmeldeinformationen zur Datei hinzu. Das magische Stück, das mir fehlte, war, dass sich das Passwort unter dem Client-Block (ref: docs ) befinden muss, wie folgt:

[client]
password = "my_password"

[mysqldump]
user = root
host = localhost

Wenn Sie hierher kommen und suchen, wie Sie mit MariaDB einen Mysqldump machen können. Platzieren Sie das Passwort unter einem [Client] -Block und den Benutzer unter einem [mysqldump] -Block.

Michael Johansen
quelle
Ich benutze auch MariaDB (10.4 um genau zu sein) und ich habe einfach ein Passwort in den [mysqldump]Abschnitt eingefügt und es hat ohne Probleme funktioniert. Ubuntu 18.04 LTS
Paul Davis
3

Hier ist eine Lösung für Docker in einem Skript / 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'

Ersetzen Sie [MYSQL_CONTAINER_NAME]und stellen Sie sicher, dass die Umgebungsvariable MYSQL_ROOT_PASSWORDin Ihrem Container festgelegt ist.

Hoffe es wird dir helfen wie es mir helfen könnte!

pcmanprogrammeur
quelle
0

Ich habe folgendes.

/ etc / mysqlpwd

[mysql]
user=root
password=password

Mit folgendem Alias.

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

Um eine Wiederherstellung durchzuführen, benutze ich einfach:

mysql -p [database] [file.sql]
Hawx
quelle
-2

Was ist mit --password = "", das für mich unter 5.1.51 funktioniert hat?

mysqldump -h localhost -u <user> --password="<password>"
Joe Velez
quelle
Durch das Einfügen --password=xxxin die Befehlszeile wird das Kennwort für alle sichtbar, die proc lesen können (oder vollständige ps ausführen können) - was ziemlich standardmäßig ist.
Rafa
-11

Auf jeden Fall denke ich, dass es besser und sicherer wäre, die gesamte cmd-Zeile mit Credentails in der Root-Crontab zu platzieren. Zumindest ist die Crontab-Bearbeitung auf jemanden beschränkt (lesbar), der das Passwort bereits kennt. Sie müssen sich also keine Sorgen machen, es im Klartext anzuzeigen.

Wenn mehr als ein einfacher mysqldump benötigt wird ... platzieren Sie einfach ein Bash-Skript, das Credentails als Parameter akzeptiert und alle darin enthaltenen Annehmlichkeiten ausführt ...

Die Basisdatei ist einfach

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

In der Crontab:

0 0 * * * bash /path/to/above/bash/file.sh root secretpwd 2>&1 /var/log/mycustomMysqlDump.log
kante
quelle
3
Nein, es wäre nicht sicherer, wenn Sie der Befehlszeile ein Kennwort hinzufügen, das für jeden sichtbar ist, der proc lesen (oder vollständige ps ausführen) kann - was ziemlich standardmäßig ist. Wenn Sie die Datei .my.cnf hinzufügen und 600 Rechte festlegen, ist diese nur für SIE sichtbar.
Rombarcz
-21

Sie können das Kennwort in der Befehlszeile wie folgt angeben:

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

Die Optionen für mysqldump unterscheiden zwischen Groß- und Kleinschreibung!

jx12345
quelle
Nein, es funktioniert nicht, ich glaube nicht, dass es versteht, dass -p das Passwort ist
Prakash Raman
1
Ich bin mir nicht sicher, wie das 1 Stimme bekommen hat, ich stimme dem zu. Wie in anderen Antworten hier zu sehen ist, sollte zwischen -p und dem angegebenen Passwort kein Leerzeichen stehen. Außerdem sollten Sie die Ausgabe nach dumpfile umleiten und nicht wie angegeben angeben, da sonst davon ausgegangen wird, dass es sich um einen Tabellennamen handelt. @ Buzypi sagte es am besten.
Neek
Es sollte funktionieren (obwohl es unsicher ist, da es für andere Benutzer ziemlich einfach ist, das Passwort zu sehen). Sie müssen nur sicherstellen, dass zwischen -p und Passwort kein Leerzeichen steht, z. B.mysqldump -u root -pmypassword
jx12345