Come eseguire un mysqldump senza una richiesta di password?


229

Vorrei conoscere il comando per eseguire un mysqldump di un database senza la richiesta della password.

MOTIVO: Vorrei eseguire un lavoro cron, che richiede un mysqldump del database una volta ogni giorno. Pertanto, non sarò in grado di inserire la password quando richiesto.

Come ho potuto risolvere questo?

Risposte:


412

Dato che stai usando Ubuntu, tutto ciò che devi fare è solo aggiungere un file nella tua home directory e disabiliterà la richiesta della password di mysqldump. Questo viene fatto creando il file ~/.my.cnf(le autorizzazioni devono essere 600).

Aggiungi questo al file .my.cnf

[mysqldump]
user=mysqluser
password=secret

Ciò ti consente di connetterti come utente MySQL che richiede una password senza dover inserire effettivamente la password. Non hai nemmeno bisogno di -p o --password.

Molto utile per lo scripting dei comandi mysql e mysqldump.

I passaggi per raggiungere questo obiettivo sono disponibili in questo link .

In alternativa, è possibile utilizzare il seguente comando:

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

ma tieni presente che è intrinsecamente insicuro, poiché l'intero comando (inclusa la password) può essere visualizzato da qualsiasi altro utente sul sistema mentre il dump è in esecuzione, con un semplice ps axcomando.


55
ha effettuato il downgrade delle altre risposte passando -p sulla riga di comando, poiché qualsiasi utente può ps aux vedere la password di root o dell'utente. L'utilizzo del suggerimento file sopra è più sicuro
Eddie,

19
Se un'impostazione globale non è un'opzione (nel caso in cui non ci sia una sola istanza mysql a cui connettersi), è possibile impostare il file di configurazione tramite --defaults-file. Come `mysqldump --defaults-file = my_other.cnf --print-defaults`
dennis

3
@kante: è sicuro. È disponibile solo per gli utenti a cui appartiene il file .my.cnf.
Yann Sagon,

7
Su Windows, il file di configurazione non è in ~/.my.cnf. Vedi stackoverflow.com/a/14653239/470749 . MySql si aspettava che il mio fosse c:\wamp\bin\mysql\mysql5.5.24\my.cnf. Quindi ho creato un file lì. Il riavvio di Mysql non era necessario; ha funzionato immediatamente per il mio prossimo mysqldump.
Ryan,

6
per aggiungere un livello di sicurezza, è necessario utilizzare un utente dedicato, non specifico del database, di sola lettura e in nessun caso l'utente root. Può essere fatto in questo modo:GRANT LOCK TABLES, SELECT ON *.* TO 'BACKUPUSER'@'%' IDENTIFIED BY 'PASSWORD';
gadjou,

86

Aggiungendo alla risposta di @ Frankline:

L' -popzione deve essere esclusa dal comando per utilizzare la password nel file di configurazione.

Corretta:
mysqldump –u my_username my_db > my_db.sql

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



.my.cnf può omettere il nome utente.

[mysqldump]
password=my_password

Se il tuo .my.cnffile non si trova in un percorso predefinito e mysqldumpnon lo vede, specificalo usando --defaults-file.

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


Dannazione, molti tutorial di XAMPP includono -p senza spiegarlo. NON funziona per bypassare una password vuota ...
Nelson

47

Alcune risposte menzionano l'inserimento della password in un file di configurazione.

In alternativa, dalla tua sceneggiatura puoi export MYSQL_PWD=yourverysecretpassword.

L'aspetto positivo di questo metodo rispetto all'utilizzo di un file di configurazione è che non è necessario un file di configurazione separato per rimanere sincronizzato con lo script. Hai solo lo script da mantenere.

Non vi è alcun aspetto negativo di questo metodo.

La password non è visibile agli altri utenti sul sistema (sarebbe visibile se si trova sulla riga di comando). Le variabili di ambiente sono visibili solo all'utente che esegue il comando mysql e root.

La password sarà visibile anche a chiunque sia in grado di leggere lo script stesso, quindi assicurati che lo script stesso sia protetto. Questo non è affatto diverso dalla protezione di un file di configurazione. È comunque possibile ottenere la password da un file separato se si desidera che lo script sia leggibile pubblicamente ( export MYSQL_PWD=$(cat /root/mysql_password)ad esempio). È ancora più semplice esportare una variabile che creare un file di configurazione.

Per esempio,

$ 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 */;

Sebbene questa risposta non sia realmente "errata", non è ancora sicura, le variabili di ambiente esportate sono ancora facilmente visibili quando il programma è in esecuzione ...
MatheusOl

4
@MatheusOl: le variabili di ambiente sono visibili solo alla radice e all'utente stesso, gli stessi utenti che avrebbero comunque accesso a un file di configurazione con la password.
chutz,

1
@mniess Ti sbagli. La export MYSQL_PWD=...fa non compare nella lista dei processi. Neanche per una frazione di secondo. Questo perché il exportcomando è (e deve essere) un built-in della shell. Pertanto la shell non esegue il fork / exec di un processo con l'argomento del comando se lo si esegue nella shell.
maxschlepzig,

1
@maxschlepzig hai ragione. In questo caso non importa perché mettere la password in ENV la rende comunque visibile ad altri utenti (come messo in guardia dalla documentazione mysql)
mniess

2
@mniess Come ho già detto, la documentazione di mysql è molto scarsa e fuorviante. 'deve essere considerato estremamente insicuro e non deve essere usato' è semplicemente un consiglio sbagliato e cattivo quando si usano Linux e altri sistemi. E questo non supporta il tuo reclamo che era: "perché mettere la password in ENV la rende comunque visibile agli altri utenti". Nota a margine: divertente però come Oracle non si deprechi passando la password sulla riga di comando che in realtà è estremamente insicura.
maxschlepzig,

42

Per utilizzare un file che si trova ovunque all'interno del sistema operativo, utilizzare --defaults-extra-filead esempio:

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

Nota: .sqlpwdè solo un nome file di esempio. Puoi usare quello che desideri.

Nota: MySQL verificherà automaticamente ~/.my.cnfquali possono essere utilizzati al posto di--defaults-extra-file

Se usi CRON come me, prova questo!

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

Autorizzazione richiesta e proprietà raccomandata

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

.sqlpwd Contenuti:

[mysqldump]
user=username
password=password

Altri esempi da passare .cnfo.sqlpwd

[mysql]
user=username
password=password

[mysqldiff]
user=username
password=password

[client]
user=username
password=password

Se si desidera accedere automaticamente a un database, è necessario [mysql]ad esempio la voce.

Ora puoi creare un alias che ti connette automaticamente al DB

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

Puoi anche inserire la password .sqlpwde passare il nome utente tramite lo script / cli. Non sono sicuro che questo migliorerebbe la sicurezza o no, che sarebbe una domanda diversa tutti insieme.

Per completezza, ti dirò che puoi fare quanto segue, ma è estremamente insicuro e non dovrebbe mai essere usato in un ambiente di produzione:

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

Nota: NON c'è SPAZIO tra -p e la password.

Ad esempio, -pPassWordè corretto mentre -p Passwordnon è corretto.


2
Questa è la risposta migliore, soprattutto se si considerano più database e utenti / password.
Hazok,

A proposito, le opzioni lunghe (es. --Defaults-file) dovrebbero essere posizionate prima delle opzioni brevi (come -u). Testato su mysqldump versione 5.7.17.
Sysadmin,

@Sysadmin Un argomento di opzione inizia con uno o due trattini, a seconda che si tratti di una forma breve o lunga del nome dell'opzione. Molte opzioni hanno forme sia corte che lunghe. Per esempio, -? e --help sono le forme brevi e lunghe dell'opzione che indica a un programma MySQL di visualizzare il suo messaggio di aiuto. dev.mysql.com/doc/refman/8.0/en/command-line-options.html
FreeSoftwareServers

29

Sì, è molto facile .... solo in una riga di comando magica non di più

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

e fatto :)


33
Avvertenza: l'utilizzo di una password sull'interfaccia della riga di comando può essere insicuro.
93196.93,

6
@Yottatron Può essere insicuro, in particolare ai tempi in cui gli antichi sistemi Unix facevano facilmente accedere 10-15 persone per gran parte della giornata e vi impantanavano. Su un VPS moderno, mentre puoi avere 10-15 persone sgusciate e usando IRC, è comune che solo gli amministratori abbiano accesso alla shell.
Christos Hayward,

3
Grazie per questo, lo sto solo usando in un devbox Docker. Quindi la sicurezza non è un problema.
MikeiLL,

7

Per me, usando MariaDB ho dovuto fare questo: aggiungere il file ~/.my.cnfe modificare i permessi facendo chmod 600 ~/.my.cnf. Quindi aggiungi le tue credenziali al file. Il pezzo magico che mi mancava era che la password doveva trovarsi sotto il blocco client (ref: docs ), in questo modo:

[client]
password = "my_password"

[mysqldump]
user = root
host = localhost

Se vi capita di venire qui alla ricerca di come fare un mysqldump con MariaDB. Posizionare la password in un blocco [client], quindi l'utente in un blocco [mysqldump].


Sto usando anche MariaDB (10.4 per essere precisi) e ho semplicemente messo la password nella [mysqldump]sezione e ha funzionato senza problemi. Ubuntu 18.04 LTS
Paul Davis,

3

Ecco una soluzione per Docker in uno 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'

Sostituisci [MYSQL_CONTAINER_NAME]e assicurati che la variabile di ambiente MYSQL_ROOT_PASSWORDsia impostata nel tuo contenitore.

Spero che ti aiuterà come potrebbe aiutarmi!


0

Ho il seguente.

/ Etc / mysqlpwd

[mysql]
user=root
password=password

Con il seguente alias.

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

Per eseguire un ripristino, utilizzo semplicemente:

mysql -p [database] [file.sql]

-2

che dire --password = "" ha funzionato per me in esecuzione su 5.1.51

mysqldump -h localhost -u <user> --password="<password>"

incluso --password=xxxnella riga di comando renderà la password visibile a chiunque abbia la capacità di leggere proc (o fare ps completo) - che è piuttosto predefinito.
Rafa,

-11

Sicuramente penso che sarebbe meglio e più sicuro posizionare l'intera linea cmd nel crontab di root, con credentails. Almeno la modifica di crontab è limitata (leggibile) a qualcuno che già conosce la password .. quindi non preoccuparti di mostrarla in testo semplice ...

Se necessario più di un semplice mysqldump ... basta inserire uno script bash che accetta le credentails come parametri ed esegue tutti i servizi all'interno ...

Il file bas in semplice

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

Nel Crontab:

0 0 * * * bash /path/to/above/bash/file.sh root secretpwd 2>&1 /var/log/mycustomMysqlDump.log

3
No, non sarebbe più sicuro, quando aggiungi la password alla riga di comando è visibile a chiunque abbia la capacità di leggere proc (o fare ps completo) - che è piuttosto predefinito. Quando aggiungi il file .my.cnf e imposti 600 diritti è visibile solo a TE.
rombarcz,

-21

È possibile specificare la password dalla riga di comando come segue:

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

Le opzioni per mysqldump sono case sensitive!


no, non funziona, non credo che capisca che -p è la password
Prakash Raman,

1
Non sono sicuro di come abbia ottenuto 1 voto, sto votando questo. Come visto in altre risposte qui, non ci dovrebbe essere spazio tra -p e la password data. Inoltre, dovresti reindirizzare l'output su dumpfile, non specificarlo come stai facendo, o si presume che sia un nome di tabella. @buzypi l'ha detto meglio.
Neek,

dovrebbe funzionare (anche se non è sicuro in quanto è abbastanza facile per gli altri utenti vedere la password) devi solo assicurarti che non ci sia spazio tra -p e password es.mysqldump -u root -pmypassword
jx12345
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.