如何在没有密码提示的情况下执行mysqldump?

如何在没有密码提示的情况下执行mysqldump?,mysql,Mysql,我想知道在不提示输入密码的情况下执行数据库mysqldump的命令 原因: 我想运行一个cron作业,它每天对数据库进行一次mysqldump。因此,当提示时,我将无法插入密码 如何解决此问题?您可以在命令行中指定密码,如下所示: mysqldump -h <host> -u <user> -p<password> dumpfile mysqldump-h-u-p转储文件 mysqldump的选项区分大小写 由于您使用的是Ubuntu,您只需在主目录中添加

我想知道在不提示输入密码的情况下执行数据库mysqldump的命令

原因: 我想运行一个cron作业,它每天对数据库进行一次mysqldump。因此,当提示时,我将无法插入密码


如何解决此问题?

您可以在命令行中指定密码,如下所示:

mysqldump -h <host> -u <user> -p<password> dumpfile
mysqldump-h-u-p转储文件

mysqldump的选项区分大小写

由于您使用的是Ubuntu,您只需在主目录中添加一个文件,它就会禁用mysqldump密码提示。这是通过创建文件
~/.my.cnf
(权限需要为600)来完成的

将其添加到
.my.cnf
文件中

[mysqldump]
user=mysqluser
password=secret
这使您可以作为需要密码的MySQL用户进行连接,而无需实际输入密码。您甚至不需要-p或--password

非常方便编写mysql和mysqldump命令的脚本

实现这一目标的步骤可以在中找到

或者,您可以使用以下命令:

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

但是请注意,它本身是不安全的,因为在转储运行时,系统上的任何其他用户都可以通过一个简单的
ps ax
命令查看整个命令(包括密码)。

我肯定认为将完整的cmd行放在根crontab中,使用credentail会更好、更安全。 至少crontab编辑被重新定义(可读)给已经知道密码的人。。所以不用担心用纯文本显示它

如果需要的不仅仅是一个简单的mysqldump。。。只需放置一个bash脚本,该脚本接受Credentail作为参数,并在其中执行所有功能

bas文件的简单格式

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

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

在@Frankline的回答中添加:

必须从命令中排除
-p
选项,才能在配置文件中使用密码

正确:
mysqldump–我的用户名我的数据库>我的数据库.sql

错误:
mysqldump–u my_用户名-p my_db>my_db.sql



.my.cnf
可以省略用户名

[mysqldump]
password=my_password

如果您的
.my.cnf
文件不在文件中,并且
mysqldump
没有看到它,请使用
--默认文件
指定它


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

是的,这很容易。。。。只需一个神奇的命令行就可以了

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

并完成:)

要使用操作系统中任何位置的文件,请使用
--默认的额外文件
例如:

mysqldump --defaults-extra-file=/path/.sqlpwd [database] > [desiredoutput].sql
注意:
.sqlpwd
只是一个示例文件名。你可以随心所欲

注意:MySQL将自动检查
~/.my.cnf
,该文件可以代替
——默认的额外文件

如果你像我一样使用CRON,试试这个

mysqldump --defaults-extra-file=/path/.sqlpwd [database] > "$(date '+%F').sql"
所需的权限和建议的所有权

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

[mysqldump]
user=username
password=password
要传入的其他示例
.cnf
.sqlpwd

[mysql]
user=username
password=password

[mysqldiff]
user=username
password=password

[client]
user=username
password=password
如果您想自动登录到数据库,您可能需要
[mysql]
条目

您现在可以创建一个自动连接到DB的别名

alias whateveryouwant="mysql --defaults-extra-file=/path/.sqlpwd [database]"
您也只能将密码放入
.sqlpwd
中,并通过脚本/cli传递用户名。我不确定这是否会提高安全性,这将是一个完全不同的问题

为完整起见,我将声明您可以执行以下操作,但这是非常不安全的,不应在生产环境中使用:

mysqldump -u [user_name] -p[password] [database] > [desiredoutput].sql
注意,-p和密码之间没有空格


例如
-pPassWord
正确,而
-p Password
不正确。

一些回答提到将密码放入配置文件中

或者,您可以通过脚本
导出MYSQL\u PWD=yourVeryScretPassword

与使用配置文件相比,这种方法的优点是不需要单独的配置文件来与脚本保持同步。您只有要维护的脚本

这种方法没有缺点

密码对系统上的其他用户不可见(如果在命令行上,则可见)。环境变量仅对运行mysql命令的用户和root用户可见

任何可以读取脚本本身的人都可以看到密码,因此请确保脚本本身受到保护。这与保护配置文件没有任何区别。如果希望脚本公开可读,您仍然可以从单独的文件中获取密码(例如,
export-MYSQL\u-PWD=$(cat/root/MYSQL\u-password)
)。导出变量比构建配置文件更容易

例如:

更新后新冠病毒-19: 此方法在MySQL的最新文档版本中仍然有效:尽管它附带以下警告:

使用
MYSQL\u PWD
指定MYSQL密码必须被认为是非常不安全的,不应使用。某些版本的ps包含一个显示运行进程环境的选项。在某些系统上,如果您设置了
MYSQL\u PWD
,您的密码将向运行ps的任何其他用户公开。即使在没有此类版本的ps的系统上,假设没有其他方法供用户检查流程环境也是不明智的

环境变量的安全性在中有详细介绍,此答案也解决了评论中提到的问题。TL;博士已经有十多年的时间了

话虽如此,MySQL文档还警告:

MYSQL\u PWD
从MYSQL 8.0开始就被弃用;预计它将在MySQL的未来版本中删除

对此,我将留下您的评论
$ 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 */;
[client]
password = "my_password"

[mysqldump]
user = root
host = localhost
[mysql]
user=root
password=password
alias 'mysql -p'='mysql --defaults-extra-file=/etc/mysqlpwd'
mysql -p [database] [file.sql]
mysqldump -h localhost -u <user> --password="<password>"
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'
[mysql]
host = localhost
port = 3306
user = BACKUP_USER
password = CORRECTBATTERYHORSESTAPLE
[mysqldump]
host = localhost
port = 3306
user = BACKUP_USER
password = CORRECTBATTERYHORSESTAPLE
[mysqlpump]
host = localhost
port = 3306
user = BACKUP_USER
password = CORRECTBATTERYHORSESTAPLE
[mysqldump]
#use this if your password has special characters (!@#$%^&..etc) in it
 password="YourPasswordWithSpecialCharactersInIt"
  
 #use this if it has no special characters
 password=myPassword
SQLFILE=/path/to/where/you/want/to/dump/dbname.sql
DATABASE=dbname
USER=myUsername
0 0 * * * ./backup/script.sh