如何在没有密码提示的情况下执行 mysqldump?
Posted
技术标签:
【中文标题】如何在没有密码提示的情况下执行 mysqldump?【英文标题】:How to perform a mysqldump without a password prompt? 【发布时间】:2012-03-06 18:35:22 【问题描述】:我想知道在不提示输入密码的情况下执行数据库 mysqldump 的命令。
原因: 我想运行一个 cron 作业,它每天需要一次数据库的 mysqldump。因此,我将无法在提示时输入密码。
我该如何解决这个问题?
【问题讨论】:
【参考方案1】:由于您使用的是 Ubuntu,您只需在您的主目录中添加一个文件,它将禁用 mysqldump 密码提示。这是通过创建文件~/.my.cnf
来完成的(权限需要为600)。
将此添加到.my.cnf
文件中
[mysqldump]
user=mysqluser
password=secret
这使您可以作为需要密码的 MySQL 用户进行连接,而无需实际输入密码。您甚至不需要 -p 或 --password。
非常方便编写 mysql 和 mysqldump 命令的脚本。
可在this link 中找到实现此目的的步骤。
或者,您可以使用以下命令:
mysqldump -u [user name] -p[password] [database name] > [dump file]
但请注意,它本质上是不安全的,因为在转储运行时,系统上的任何其他用户都可以通过简单的ps ax
命令查看整个命令(包括密码)。
【讨论】:
在命令行上通过 -p 否决了其他答案,因为任何用户都可以 ps aux 来查看 root 或用户的密码。使用上面的文件建议是最安全的 如果全局设置不是一个选项(如果您不仅要连接一个 mysql 实例),您可以通过--defaults-file
设置配置文件。像`mysqldump --defaults-file=my_other.cnf --print-defaults`
@kante:它是安全的。它仅对 .my.cnf 文件所属的用户可用。
在 Windows 上,配置文件不在~/.my.cnf
。见***.com/a/14653239/470749。 MySql 预计我的地址是c:\wamp\bin\mysql\mysql5.5.24\my.cnf
。所以我在那里创建了一个文件。不需要重启 Mysql;它立即为我的下一个 mysqldump 工作。
要增加安全级别,您应该使用专用的、非数据库特定的、只读用户,在任何情况下都不能使用 root 用户。可以这样做:GRANT LOCK TABLES, SELECT ON *.* TO 'BACKUPUSER'@'%' IDENTIFIED BY 'PASSWORD';
【参考方案2】:
添加到@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
文件不在default location 中并且mysqldump
看不到它,请使用--defaults-file
指定它。
mysqldump --defaults-file=/path-to-file/.my.cnf –u my_username my_db > my_db.sql
【讨论】:
该死,很多 XAMPP 教程都包含 -p 而没有解释它。它不适用于绕过空白密码...【参考方案3】:一些答案提到将密码放在配置文件中。
或者,您可以从您的脚本中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 */;
玛丽亚数据库
MariaDBdocuments the use of MYSQL_PWD
as:
连接mysqld时的默认密码。强烈建议使用更安全的方法将密码发送到服务器。
该页面没有提及“更安全”的方法可能是什么。
MySQL
MySQL 的最新文档版本仍然支持此方法:https://dev.mysql.com/doc/refman/8.0/en/environment-variables.html,尽管它带有以下警告:
使用
MYSQL_PWD
指定MySQL 密码必须被视为极度不安全,不应使用。某些版本的 ps 包含一个选项来显示正在运行的进程的环境。在某些系统上,如果您设置了MYSQL_PWD
,您的密码就会暴露给运行 ps 的任何其他用户。即使在没有这种 ps 版本的系统上,假设没有其他方法可供用户检查进程环境也是不明智的。
https://security.stackexchange.com/a/14009/10002 详细介绍了环境变量的安全性,此答案还解决了 cmets 中提到的问题。 TL;DR 十多年来无关紧要。
话虽如此,MySQL 文档也警告说:
MYSQL_PWD
自 MySQL 8.0 起已弃用;预计它会在 MySQL 的未来版本中被删除。
我将在下面留下maxschlepzig 的评论:
有趣的是,虽然 Oracle 不反对在命令行上传递密码,但实际上 非常不安全
【讨论】:
@MatheusOl:环境变量只对 root 和用户本身可见——这些用户无论如何都可以访问持有密码的配置文件。 oneliner 怎么样:MYSQL_PWD=xoF3mafn5Batxasdfuo mysqldump -u root mysql
不需要 export
。那应该可以解决问题吗?
@mniess 你错了。 export MYSQL_PWD=...
确实不显示在进程列表中。哪怕是一瞬间。这是因为export
命令是(并且必须是)内置的shell。因此,如果您在 shell 中执行它,shell 不会使用命令的参数分叉/执行进程。
@maxschlepzig 你是对的。在这种情况下,这无关紧要,因为将密码放在 ENV 中会使其对其他用户可见(正如 mysql 文档中所警告的那样)
@mniess 正如我所说的,mysql 文档非常糟糕且具有误导性。在使用 Linux 和其他系统时,“必须被认为非常不安全并且不应该使用”是完全错误和糟糕的建议。这不支持您的主张,即:“因为将密码放入 ENV 使其无论如何都对其他用户可见”。旁注:有趣的是,虽然 Oracle 不反对在命令行上传递密码,但实际上 非常不安全。【参考方案4】:
要使用操作系统内部任何位置的文件,请使用--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]
条目。
您现在可以创建一个别名来自动将您连接到 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
是不正确的。
【讨论】:
这是最好的答案,尤其是在考虑多个数据库和用户/密码时。 顺便说一句,长选项(例如 --defaults-file)应该放在短选项(例如 -u)之前。在 mysqldump 版本 5.7.17 上测试。 @Sysadmin 选项参数以一个破折号或两个破折号开头,具体取决于它是选项名称的短格式还是长格式。许多选项都有短格式和长格式。例如, -?和 --help 是指示 MySQL 程序显示其帮助消息的选项的短形式和长形式。 dev.mysql.com/doc/refman/8.0/en/command-line-options.html【参考方案5】:是的,这很容易....只是在一个神奇的命令行没有更多
mysqldump --user='myusername' --password='mypassword' -h MyUrlOrIPAddress databasename > myfile.sql
完成了:)
【讨论】:
警告:在命令行界面上使用密码可能不安全。 @Yottatron 这可能是不安全的,尤其是在古代 Unix 系统在一天的大部分时间里很容易有 10-15 人登录并且 vi 陷入困境的那一天。在现代 VPS 上,虽然您可以让 10-15 人进入并使用 IRC,但通常只有管理员才能拥有 shell 访问权限。 谢谢你,我只是在 Docker devbox 中使用它。所以安全不是问题。【参考方案6】:对我来说,使用 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【参考方案7】:
这是 Docker 在脚本 /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'
替换 [MYSQL_CONTAINER_NAME]
并确保在您的容器中设置了环境变量 MYSQL_ROOT_PASSWORD
。
希望它能帮助你,就像它可以帮助我一样!
【讨论】:
【参考方案8】:您可以通过 4 个简单的步骤实现这一目标
-
创建目录来存储脚本和 DB_backups
创建 ~/.my.cnf
创建一个 ~/.script.sh shell 脚本来运行 mysqldump
添加一个 cronjob 来运行 mysql 转储。
以下是详细步骤
第一步
使用sudo mkdir ~/backup
在您的主目录上创建一个目录
第 2 步
在您的主目录中运行 sudo nano ~/.my.cnf
并添加下面的文本并保存
[mysqldump]
#use this if your password has special characters (!@#$%^&..etc) in it
password="YourPasswordWithSpecialCharactersInIt"
#use this if it has no special characters
password=myPassword
第 2 步
cd
到 ~/backup
并创建另一个文件 script.sh
将以下文本添加到其中
SQLFILE=/path/to/where/you/want/to/dump/dbname.sql
DATABASE=dbname
USER=myUsername
mysqldump --defaults-file=~/.my.cnf -u $USER $DATABASE|gzip > dbName_$(date +\%Y\%m\%d_\%H\%M
).sql.gz
第 3 步
在您的控制台中,输入 crontab -e
打开将执行自动备份作业的 cron 文件
将下面的文本添加到文件的底部
0 0 * * * ./backup/script.sh
添加到 cron 文件底部的文本假定您的备份应在每天午夜运行。
这就是你所需要的一切 ;)
【讨论】:
【参考方案9】:我有以下。
/etc/mysqlpwd
[mysql]
user=root
password=password
使用以下别名。
alias 'mysql -p'='mysql --defaults-extra-file=/etc/mysqlpwd'
要进行恢复,我只需使用:
mysql -p [database] [file.sql]
【讨论】:
为什么不使用默认文件名 /etc/my.cnf 或 $HOME/.my.cnf?【参考方案10】:检查您的密码!
我花了一段时间才注意到我在 ~/.my.cnf
中使用的用户名和密码不正确
在向 crontab 备份条目添加额外选项之前检查用户/密码基础知识
如果在 mysqldump 中指定 --defaults-extra-file
,那么这必须是第一个选项
在主文件夹中使用 .my.cnf 可以正常工作,因此无需指定 --defaults-extra-file
如果使用 mysqlpump(不是 mysqldump)相应地修改.my.cnf
~/.my.cnf 需要设置权限,因此只有所有者具有读/写访问权限:
chmod 600 ~/.my.cnf
这是一个例子.my.cnf
:
[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
本地主机不需要主机和端口条目
如果您在 linux 中的用户名与用于备份的用户名相同,则不需要 user
另一个提示,当您为 mysqldump 执行 cronjob 条目时,您可以使用 ionice -c 3 nice 19
将其设置为低优先级任务。结合 InnoDB 的 --single-transaction
选项,您可以运行不会锁定表或锁定其他地方可能需要的资源的备份。
【讨论】:
【参考方案11】:--password="" 怎么样 在 5.1.51 上为我工作
mysqldump -h localhost -u <user> --password="<password>"
【讨论】:
在命令行中包含--password=xxx
将使密码对任何能够读取 proc(或执行完整 ps)的人可见 - 这是非常默认的。跨度>
【参考方案12】:
当然,我认为将完整的 cmd 行放在根 crontab 中会更好,更安全,并带有凭据。 至少 crontab 编辑被限制(可读)给已经知道密码的人......所以不用担心以纯文本形式显示它......
如果需要的不仅仅是一个简单的 mysqldump...只需放置一个 bash 脚本,该脚本接受凭据作为参数并在其中执行所有便利...
简单的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
【讨论】:
不,这不会更安全,当您将密码添加到命令行时,任何能够读取 proc(或执行完整 ps)的人都可以看到它 - 这是非常默认的。当您添加 .my.cnf 文件并设置 600 权限时,它仅对您可见。【参考方案13】:您可以在命令行中指定密码,如下所示:
mysqldump -h <host> -u <user> -p<password> dumpfile
mysqldump 的选项区分大小写!
【讨论】:
不,它不起作用,我认为它不明白 -p 是密码 不确定这是如何获得 1 票的,我对此表示反对。如此处的其他答案所示,-p 和给定密码之间不应有空格。此外,您应该将输出重定向到转储文件,而不是像您正在做的那样指定它,否则它会被假定为一个表名。 @buzypi 说得最好。 它应该可以工作(虽然不安全,因为其他用户很容易看到密码)你只需要确保 -p 和密码之间没有空格,例如mysqldump -u root -pmypassword
以上是关于如何在没有密码提示的情况下执行 mysqldump?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Mac OS 上的 XAMPP 下运行 mysqldump
sqlserver修改sa密码(在windows登陆没有权限的情况下)