【发布时间】:2012-03-06 18:35:22
【问题描述】:
我想知道在不提示输入密码的情况下执行数据库 mysqldump 的命令。
原因: 我想运行一个 cron 作业,它每天需要一次数据库的 mysqldump。因此,我将无法在提示时输入密码。
我该如何解决这个问题?
【问题讨论】:
标签: mysql
我想知道在不提示输入密码的情况下执行数据库 mysqldump 的命令。
原因: 我想运行一个 cron 作业,它每天需要一次数据库的 mysqldump。因此,我将无法在提示时输入密码。
我该如何解决这个问题?
【问题讨论】:
标签: mysql
您可以在命令行中指定密码,如下所示:
mysqldump -h <host> -u <user> -p<password> dumpfile
mysqldump 的选项区分大小写!
【讨论】:
mysqldump -u root -pmypassword
由于您使用的是 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 命令查看整个命令(包括密码)。
【讨论】:
--defaults-file 设置配置文件。像`mysqldump --defaults-file=my_other.cnf --print-defaults`
~/.my.cnf。见stackoverflow.com/a/14653239/470749。 MySql 预计我的地址是c:\wamp\bin\mysql\mysql5.5.24\my.cnf。所以我在那里创建了一个文件。不需要重启 Mysql;它立即为我的下一个 mysqldump 工作。
GRANT LOCK TABLES, SELECT ON *.* TO 'BACKUPUSER'@'%' IDENTIFIED BY 'PASSWORD';
当然,我认为将完整的 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
【讨论】:
添加到@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
【讨论】:
是的,这很容易....只是在一个神奇的命令行没有更多
mysqldump --user='myusername' --password='mypassword' -h MyUrlOrIPAddress databasename > myfile.sql
完成了:)
【讨论】:
要使用操作系统内部任何位置的文件,请使用--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 是不正确的。
【讨论】:
一些答案提到将密码放在配置文件中。
或者,您可以从您的脚本中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 的最新文档版本仍然支持此方法: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 不反对在命令行上传递密码,但实际上 非常不安全
【讨论】:
MYSQL_PWD=xoF3mafn5Batxasdfuo mysqldump -u root mysql 不需要 export。那应该可以解决问题吗?
export MYSQL_PWD=... 确实不显示在进程列表中。哪怕是一瞬间。这是因为export 命令是(并且必须是)内置的shell。因此,如果您在 shell 中执行它,shell 不会使用命令的参数分叉/执行进程。
对我来说,使用 MariaDB 我必须这样做:添加文件 ~/.my.cnf 并通过执行 chmod 600 ~/.my.cnf 更改权限。然后将您的凭据添加到文件中。我缺少的神奇之处在于密码需要在客户端块下(参考:docs),如下所示:
[client]
password = "my_password"
[mysqldump]
user = root
host = localhost
如果您碰巧来到这里寻找如何使用 MariaDB 进行 mysqldump。将密码放在 [client] 块下,然后将用户放在 [mysqldump] 块下。
【讨论】:
[mysqldump] 部分下,它就可以正常工作。 Ubuntu 18.04 LTS
我有以下。
/etc/mysqlpwd
[mysql]
user=root
password=password
使用以下别名。
alias 'mysql -p'='mysql --defaults-extra-file=/etc/mysqlpwd'
要进行恢复,我只需使用:
mysql -p [database] [file.sql]
【讨论】:
--password="" 怎么样 在 5.1.51 上为我工作
mysqldump -h localhost -u <user> --password="<password>"
【讨论】:
--password=xxx 将使密码对任何能够读取 proc(或执行完整 ps)的人可见 - 这是非常默认的。跨度>
这是 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。
希望它能帮助你,就像它可以帮助我一样!
【讨论】:
检查您的密码!
我花了一段时间才注意到我在 ~/.my.cnf 中使用的用户名和密码不正确
在向 crontab 备份条目添加额外选项之前检查用户/密码基础知识
如果在 mysqldump 中指定 --defaults-extra-file,那么这必须是第一个选项
一个 cron 作业在主文件夹中使用 .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 选项,您可以运行不会锁定表或锁定其他地方可能需要的资源的备份。
【讨论】:
您可以通过 4 个简单的步骤实现这一目标
以下是详细步骤
第一步
使用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 文件底部的文本假定您的备份应在每天午夜运行。
这就是你所需要的一切 ;)
【讨论】: