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


229

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

原因:我想运行一个cron作业,该作业每天执行一次mysqldump数据库的转储。因此,出现提示时,我将无法插入密码。

我该如何解决?

Answers:


412

由于您正在使用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命令查看整个命令(包括密码)。


55
否决了在命令行中通过-p的其他答案,因为任何用户都可以ps aux来查看root或用户的密码。使用上面的文件建议最安全
Eddie 2013年

19
如果不是全局设置(如果您不仅要连接一个mysql实例),可以通过设置配置文件--defaults-file。像`mysqldump的--defaults文件= my_other.cnf --print-defaults`
丹尼斯

3
@kante:很安全。它仅对.my.cnf文件所属的用户可用。
Yann Sagon 2014年

7
在Windows上,配置文件不在~/.my.cnf。请参阅stackoverflow.com/a/14653239/470749。MySql预计我的会在c:\wamp\bin\mysql\mysql5.5.24\my.cnf。所以我在那里创建了一个文件。不需要重新启动Mysql。它立即为我的下一个mysqldump工作。
瑞安

6
为了增加安全级别,您应该使用专用的,非特定于数据库的只读用户,并且绝对不能使用root用户。可以这样完成:GRANT LOCK TABLES, SELECT ON *.* TO 'BACKUPUSER'@'%' IDENTIFIED BY 'PASSWORD';
gadjou

86

添加到@Frankline的答案:

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

正确:
mysqldump –u my_username my_db > my_db.sql

错误:
mysqldump –u my_username -p my_db > my_db.sql



.my.cnf 可以省略用户名。

[mysqldump]
password=my_password

如果您的.my.cnf文件不在默认位置并且mysqldump看不到它,请使用指定它--defaults-file

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


该死的,许多XAMPP教程都包含-p而不作解释。绕过空白密码不起作用...
尼尔森

47

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

另外,您也可以从脚本中进行操作export MYSQL_PWD=yourverysecretpassword

与使用配置文件相比,此方法的好处在于,不需要单独的配置文件即可与脚本保持同步。您只有要维护的脚本。

没有缺点给此方法。

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

任何可以读取脚本本身的人都可以看到该密码,因此请确保脚本本身受到保护。这与保护配置文件没有什么不同。如果想让脚本公开可读(export MYSQL_PWD=$(cat /root/mysql_password)例如),仍然可以从单独的文件中获取密码。导出变量比构建配置文件要容易得多。

例如,

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

尽管此答案并不是真的“不正确”,但它尚不安全,在程序运行时仍可以轻松看到导出的环境变量...
MatheusOl 2016年

4
@MatheusOl:环境变量仅对root用户和用户本身可见-仍然是有权访问拥有密码的配置文件的同一用户。
chutz '16

1
@mniess你错了。该export MYSQL_PWD=...不会没有在进程列表中显示出来。即使一瞬间也没有。这是因为该export命令是(并且必须是)内置的Shell。因此,如果您在shell中执行命令,则shell不会使用命令的参数派生/执行进程。
maxschlepzig

1
@maxschlepzig你是正确的。在这种情况下,这没关系,因为将密码放入ENV使其仍然对其他用户可见(如mysql文档中所警告)
mniess 19-10-27

2
@mniess正如我说过的,mysql文档非常糟糕且具有误导性。使用Linux和其他系统时,“必须被视为极度不安全,不应该使用”是错误的和错误的建议。这不支持您的主张:“因为将密码放入ENV会使其他用户仍然可以看到它”。旁注:有趣的是,尽管Oracle如何不反对在命令行中传递密码,但这实际上非常不安全的。
maxschlepzig

42

要使用操作系统内部任何位置的文件,请使用--defaults-extra-file例如:

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

注意:.sqlpwd仅是示例文件名。您可以使用任何您想要的东西。

注意:MySQL会自动检查~/.my.cnf哪些可以代替--defaults-extra-file

如果您像我一样使用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]输入该条目。

现在,您可以创建一个别名,以自动将您连接到数据库

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

您也只能将密码放入其中,.sqlpwd并通过脚本/ cli传递用户名。我不确定这是否会提高安全性,这将是一个完全不同的问题。

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

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

注意:-p和密码之间没有空格。

例如-pPassWord正确而-p Password错误。


2
这是最佳答案,尤其是在考虑多个数据库和用户/密码时。
哈佐2015年

顺便说一句,长选项(例如--defaults-file)应该放在短选项(例如-u)之前。在mysqldump版本5.7.17上测试。
Sysadmin

@Sysadmin选项参数以一个破折号或两个破折号开头,具体取决于它是选项名称的短格式还是长格式。许多选项都有长短形式。例如, -?和--help是指示MySQL程序显示其帮助消息的选项的长短形式。dev.mysql.com/doc/refman/8.0/en/command-line-options.html
FreeSoftwareServers

29

是的,这很容易.... 不再需要一个神奇的命令行

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

并做了 :)


33
警告:在命令行界面上使用密码可能不安全。
93196.93 2015年

6
@Yottatron这可能是不安全的,尤其是在古老的Unix系统在一天中的大部分时间内很容易有10-15个人登录并且vi陷入困境的时候。在现代的VPS上,虽然可以容纳10-15个人并使用IRC,但通常只有管理员才能拥有Shell访问权限。
Christos Hayward

3
谢谢,我只是在Docker devbox中使用它。因此安全性不是问题。
MikeiLL

7

对我来说,使用MariaDB必须做到这一点:通过添加文件~/.my.cnf并更改权限chmod 600 ~/.my.cnf。然后将您的凭据添加到文件中。我缺少的神奇之处在于密码需要在客户端块下(参见:docs),如下所示:

[client]
password = "my_password"

[mysqldump]
user = root
host = localhost

如果您碰巧来这里寻找如何使用MariaDB做mysqldump。将密码放在[client]块下,然后将用户放在[mysqldump]块下。


我也使用了MariaDB(具体来说是10.4),我只是在该[mysqldump]部分下面输入了密码,所以没有任何问题。Ubuntu 18.04 LTS
Paul Davis

3

这是脚本/ bin / sh中的Docker解决方案:

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_CONTAINER_NAME]并确保MYSQL_ROOT_PASSWORD在容器中设置了环境变量。

希望它能对您有所帮助!


0

我有以下几点。

/ etc / mysqlpwd

[mysql]
user=root
password=password

具有以下别名。

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

要进行还原,我只需使用:

mysql -p [database] [file.sql]

-2

--password =“”可以在5.1.51上运行对我有用吗

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

包括--password=xxx在命令行上将使具有读取proc(或执行完整ps)功能的任何人都可以看到
拉法

-11

绝对可以,将完整的cmd行放在crerontails的根crontab中会更好,更安全。至少将crontab编辑限制(可读)给已经知道密码的人..所以不用担心以纯文本形式显示密码...

如果需要的不仅仅是一个简单的mysqldump ...,只需放置一个bash脚本即可接受credentails作为参数并在其中执行所有便利...

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

3
不,这不会更安全,当您在命令行中添加密码时,任何能够读取proc(或执行完整ps)功能的人都可以看到它-这是默认设置。当您添加.my.cnf文件并设置600个权限时,只有您自己可见。
rombarcz 2014年

-21

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

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

mysqldump的选项区分大小写!


不,它不起作用,我不认为它了解-p是密码
Prakash Raman 2012年

1
不确定如何获得1票,我对此表示反对。如此处其他答案所示,-p和给定密码之间不应有空格。另外,您应该将输出重定向到dumpfile,而不要像现在那样指定它,否则将假定它为表名。@buzypi表示最好。
2012年

它应该可以工作(尽管不安全,因为其他用户很容易看到密码),您只需要确保-p和密码之间没有空格即可,例如mysqldump -u root -pmypassword
jx12345,2016年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.