¿Cómo realizar un mysqldump sin una solicitud de contraseña?

229

Me gustaría conocer el comando para realizar un mysqldump de una base de datos sin la solicitud de la contraseña.

MOTIVO: Me gustaría ejecutar un trabajo cron, que toma un mysqldump de la base de datos una vez al día. Por lo tanto, no podré insertar la contraseña cuando me lo solicite.

¿Cómo podría resolver esto?

Prakash Raman
fuente

Respuestas:

412

Como está usando Ubuntu, todo lo que necesita hacer es agregar un archivo en su directorio de inicio y deshabilitará la solicitud de contraseña de mysqldump. Esto se hace creando el archivo ~/.my.cnf(los permisos deben ser 600).

Agregue esto al archivo .my.cnf

[mysqldump]
user=mysqluser
password=secret

Esto le permite conectarse como un usuario de MySQL que requiere una contraseña sin tener que ingresarla. Ni siquiera necesita la contraseña -p o -.

Muy útil para scripts de comandos mysql y mysqldump.

Los pasos para lograr esto se pueden encontrar en este enlace .

Alternativamente, puede usar el siguiente comando:

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

pero tenga en cuenta que es inherentemente inseguro, ya que cualquier otro usuario del sistema puede ver el comando completo (incluida la contraseña) mientras se ejecuta el volcado, con un ps axcomando simple .

Frankline
fuente
55
Las otras respuestas se votaron negativamente al pasar -p en la línea de comando, ya que cualquier usuario puede ps aux para ver la raíz o la contraseña del usuario. El uso de la sugerencia de archivo anterior es más seguro
Eddie
19
Si una configuración global no es una opción (en caso de que no solo tenga una instancia de mysql para conectarse), puede configurar el archivo de configuración a través de --defaults-file. Como `mysqldump --defaults-file = my_other.cnf --print-defaults`
dennis
3
@kante: es seguro. Solo está disponible para los usuarios a los que pertenece el archivo .my.cnf.
Yann Sagon el
77
En Windows, el archivo de configuración no está en ~/.my.cnf. Ver stackoverflow.com/a/14653239/470749 . MySql esperaba que el mío estuviera en c:\wamp\bin\mysql\mysql5.5.24\my.cnf. Entonces creé un archivo allí. Reiniciar Mysql no fue necesario; funcionó de inmediato para mi próximo mysqldump.
Ryan
66
Para agregar un nivel de seguridad, debe usar un usuario dedicado, no específico de la base de datos, de solo lectura, y en ningún caso el usuario raíz. Se puede hacer así:GRANT LOCK TABLES, SELECT ON *.* TO 'BACKUPUSER'@'%' IDENTIFIED BY 'PASSWORD';
gadjou
86

Agregando a la respuesta de @ Frankline:

La -popción debe excluirse del comando para usar la contraseña en el archivo de configuración.

Correcto:
mysqldump –u my_username my_db > my_db.sql

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



.my.cnf puede omitir el nombre de usuario.

[mysqldump]
password=my_password

Si su .my.cnfarchivo no está en una ubicación predeterminada y mysqldumpno lo ve, especifíquelo usando --defaults-file.

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

Nelu
fuente
Maldición, muchos tutoriales de XAMPP incluyen -p sin explicarlo. NO funciona para eludir una contraseña en blanco ...
Nelson
47

Algunas respuestas mencionan poner la contraseña en un archivo de configuración.

Alternativamente, desde su script puede hacerlo export MYSQL_PWD=yourverysecretpassword.

La ventaja de este método sobre el uso de un archivo de configuración es que no necesita un archivo de configuración separado para mantenerse sincronizado con su script. Solo tiene que mantener el script.

No hay inconveniente en este método.

La contraseña no es visible para otros usuarios en el sistema (sería visible si está en la línea de comando). Las variables de entorno solo son visibles para el usuario que ejecuta el comando mysql y root.

La contraseña también será visible para cualquiera que pueda leer el script en sí, así que asegúrese de que el script esté protegido. Esto no es diferente a proteger un archivo de configuración. Todavía puede obtener la contraseña de un archivo separado si desea que el script se pueda leer públicamente (export MYSQL_PWD=$(cat /root/mysql_password) por ejemplo). Todavía es más fácil exportar una variable que construir un archivo de configuración.

P.ej,

$ 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
fuente
Aunque esta respuesta no es realmente "incorrecta", aún no es segura, las variables de entorno exportadas aún son fácilmente visibles cuando el programa se está ejecutando ...
MatheusOl
44
@MatheusOl: las variables de entorno solo son visibles para el usuario root y el usuario mismo, los mismos usuarios que tendrían acceso a un archivo de configuración que tiene la contraseña de todos modos.
chutz
1
@mniess Estás equivocado. El export MYSQL_PWD=...qué no aparecen en la lista de procesos. Ni siquiera por una fracción de segundo. Esto se debe a que el exportcomando es (y tiene que ser) un shell incorporado. Por lo tanto, el shell no bifurca / ejecuta un proceso con el argumento del comando si lo ejecuta en su shell.
maxschlepzig
1
@maxschlepzig tienes razón. En este caso no importa porque poner la contraseña en ENV hace que sea visible para otros usuarios de todos modos (como se advirtió en contra de la documentación de MySQL)
mniess
2
@mniess Como dije, la documentación de mysql es muy pobre y engañosa. 'debe considerarse extremadamente inseguro y no debe usarse' es simplemente un mal y un mal consejo al usar Linux y otros sistemas. Y esto no respalda su afirmación que era: 'porque poner la contraseña en ENV lo hace visible para otros usuarios de todos modos'. Nota al margen: es curioso cómo Oracle no desaprueba pasar la contraseña en la línea de comando, que de hecho es extremadamente insegura.
maxschlepzig
42

Para usar un archivo que esté en cualquier lugar dentro del sistema operativo, use, --defaults-extra-filepor ejemplo:

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

Nota: .sqlpwdes solo un nombre de archivo de ejemplo. Puedes usar lo que desees.

Nota: MySQL verificará automáticamente ~/.my.cnfqué se puede usar en lugar de--defaults-extra-file

Si estás usando CRON como yo, ¡prueba esto!

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

Permiso requerido y propiedad recomendada

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

.sqlpwd contenido:

[mysqldump]
user=username
password=password

Otros ejemplos para pasar .cnfo.sqlpwd

[mysql]
user=username
password=password

[mysqldiff]
user=username
password=password

[client]
user=username
password=password

Si desea iniciar sesión en una base de datos automáticamente, necesitaría la [mysql]entrada, por ejemplo.

Ahora puede hacer un alias que lo conecte automáticamente a DB

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

También solo puede poner la contraseña dentro .sqlpwdy pasar el nombre de usuario a través del script / cli. No estoy seguro de si esto mejoraría la seguridad o no, esa sería una pregunta diferente en conjunto.

Para completar, afirmaré que puede hacer lo siguiente, pero es extremadamente inseguro y nunca debe usarse en un entorno de producción:

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

Nota: NO HAY ESPACIO entre -p y la contraseña.

Por ejemplo, -pPassWordes correcto mientras que -p Passwordes incorrecto.

FreeSoftwareServers
fuente
2
Esta es la mejor respuesta, especialmente cuando se consideran múltiples bases de datos y usuarios / contraseñas.
Hazok
Por cierto, las opciones largas (por ejemplo, --defaults-file) deben colocarse antes de las opciones cortas (como -u). Probado en mysqldump versión 5.7.17.
Sysadmin
@Sysadmin Un argumento de opción comienza con un guión o dos guiones, dependiendo de si es una forma corta o larga del nombre de la opción. Muchas opciones tienen formas cortas y largas. Por ejemplo, -? y --help son las formas cortas y largas de la opción que indica a un programa MySQL que muestre su mensaje de ayuda. dev.mysql.com/doc/refman/8.0/en/command-line-options.html
FreeSoftwareServers
29

Sí, es muy fácil ... solo en una línea de comando mágica no más

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

y hecho :)

Tarek Kalaji
fuente
33
Advertencia: el uso de una contraseña en la interfaz de línea de comandos puede ser inseguro.
93196.93
66
@Yottatron Puede ser inseguro, especialmente en aquellos días en que los sistemas antiguos de Unix fácilmente tenían 10-15 personas conectadas durante la mayor parte del día y estaban empantanadas. En un VPS moderno, aunque puede tener entre 10 y 15 personas peladas y utilizando IRC, es común que solo los administradores tengan acceso a shell.
Christos Hayward
3
Gracias por esto, solo lo estoy usando en un devbox de Docker. Entonces la seguridad no es un problema.
MikeiLL
7

Para mí, usando MariaDB tuve que hacer esto: agregar el archivo ~/.my.cnfy cambiar los permisos haciendo chmod 600 ~/.my.cnf. Luego agregue sus credenciales al archivo. La pieza mágica que me faltaba era que la contraseña debe estar bajo el bloque del cliente (ref: docs ), así:

[client]
password = "my_password"

[mysqldump]
user = root
host = localhost

Si vienes aquí buscando cómo hacer un mysqldump con MariaDB. Coloque la contraseña debajo de un bloque [cliente], y luego el usuario debajo de un bloque [mysqldump].

Michael Johansen
fuente
Estoy usando MariaDB también (10.4 para ser específico) y simplemente puse la contraseña debajo de la [mysqldump]sección y funcionó sin ningún problema. Ubuntu 18.04 LTS
Paul Davis
3

Aquí hay una solución para Docker en 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'

Reemplace [MYSQL_CONTAINER_NAME]y asegúrese de que la variable de entornoMYSQL_ROOT_PASSWORD esté configurada en su contenedor.

Espero que te ayude como me podría ayudar!

pcmanprogrammeur
fuente
0

Tengo lo siguiente

/ etc / mysqlpwd

[mysql]
user=root
password=password

Con el siguiente alias.

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

Para hacer una restauración simplemente uso:

mysql -p [database] [file.sql]
halcón
fuente
-2

¿Qué pasa con --password = "" funcionó para mí corriendo en 5.1.51

mysqldump -h localhost -u <user> --password="<password>"
Joe Velez
fuente
incluso --password=xxxen la línea de comando hará que la contraseña sea visible para cualquier persona con capacidad de leer proc (o hacer ps completa), lo cual es bastante predeterminado.
Rafa
-11

Definitivamente, creo que sería mejor y más seguro colocar la línea cmd completa en el crontab raíz, con credentails. Al menos la edición crontab está restringida (legible) a alguien que ya conoce la contraseña ... así que no se preocupe por mostrarla en texto plano ...

Si necesita más que un simple mysqldump ... simplemente coloque un script bash que acepte credentails como params y realice todas las comodidades dentro ...

El archivo bas en simple

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

En el Crontab:

0 0 * * * bash /path/to/above/bash/file.sh root secretpwd 2>&1 /var/log/mycustomMysqlDump.log
kante
fuente
3
No, no sería más seguro, cuando agrega una contraseña a la línea de comandos, es visible para cualquier persona con capacidad de leer proc (o hacer ps completa), que es bastante predeterminado. Cuando agrega el archivo .my.cnf y establece 600 derechos, solo usted lo puede ver.
rombarcz
-21

Puede especificar la contraseña en la línea de comando de la siguiente manera:

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

¡Las opciones para mysqldump son sensibles a mayúsculas y minúsculas!

jx12345
fuente
no, no funciona, no creo que entienda que -p es la contraseña
Prakash Raman
1
No estoy seguro de cómo esto obtuvo 1 voto, estoy rechazando esto. Como se ve en otras respuestas aquí, no debe haber espacio entre -p y la contraseña dada. También debe redirigir la salida al archivo de volcado, no especificarlo como lo está haciendo, o se supondrá que es un nombre de tabla. @buzypi lo dijo mejor.
Neek
debería funcionar (aunque es inseguro porque es bastante fácil para otros usuarios ver la contraseña) solo necesita asegurarse de que no haya espacio entre -p y contraseña, por ejemplomysqldump -u root -pmypassword
jx12345