如何在没有密码提示的情况下执行 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?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有提示的情况下执行 ssh-keygen

如何在不询问密码提示的情况下自动执行rsync [关闭]

如何在 Mac OS 上的 XAMPP 下运行 mysqldump

sqlserver修改sa密码(在windows登陆没有权限的情况下)

在cmd上执行mysqldump命令提示“拒绝访问”啥原因啊

如何在没有确认提示的情况下执行 Set-GPPermissions 命令