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

Pra*_*man 202 mysql

我想知道在没有密码提示的情况下执行数据库的mysqldump的命令.

原因:我想运行一个cron作业,每天一次获取数据库的mysqldump.因此,在提示时我将无法插入密码.

我该怎么解决这个问题?

Fra*_*ine 372

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

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

[mysqldump]
user=mysqluser
password=secret
Run Code Online (Sandbox Code Playgroud)

这使您可以作为需要密码的MySQL用户进行连接,而无需实际输入密码.你甚至不需要-p或--password.

脚本mysql和mysqldump命令非常方便.

可以在此链接中找到实现此目的的步骤.

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

mysqldump -u [user name] -p[password] [database name] > [dump file]
Run Code Online (Sandbox Code Playgroud)

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

  • downvoted在命令行上传递-p的其他答案,因为任何用户都可以通过ps aux来查看root或用户的密码.使用上面的文件建议是最安全的 (53认同)
  • 如果全局设置不是一个选项(如果你不只要连接一个mysql实例),你可以通过`--defaults-file`设置配置文件.比如`mysqldump --defaults-file = my_other.cnf --print-defaults` (14认同)
  • 在Windows上,配置文件不在`〜/ .my.cnf`.请参见http://stackoverflow.com/a/14653239/470749.MySql期望我的位于`c:\ wamp\bin\mysql\mysql5.5.24\my.cnf`.所以我在那里创建了一个文件.不需要重新启动Mysql; 它立即为我的下一个mysqldump工作. (6认同)
  • 要添加一定程度的安全性,您应该使用专用的,非数据库特定的只读用户,而不是root用户.可以这样做:`GRANT LOCK TABLES,SELECT ON*.*''BACKUPUSER'@'%'由'PASSWORD'识别;; (4认同)
  • @kante:很安全.它仅适用于.my.cnf文件所属的用户. (3认同)
  • 很棒的答案!我一直在寻找一种方法,让我的密码不只存在于我的脚本中,这确实有效:) +1 以确保安全! (2认同)
  • 将普通根的密码放在my.cnf文件中是否完全安全?还有...这将允许服务器上的每个用户执行没有密码的转储... ex.apache用户也是(例如www-data)这意味着如果有人发现对你的机器执行命令的漏洞可以自由地转储和读取所有你的数据,因为root权限? (2认同)
  • 如果密码包含奇怪的字符(如#),则必须使用双引号,例如`password =“ weird#@)(”` (2认同)
  • 出于安全原因,请确保将`.my.cnf`设置为0400 (2认同)

Nel*_*elu 81

添加到@ 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
Run Code Online (Sandbox Code Playgroud)

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

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

  • 该死,很多 XAMPP 教程都包含 -p 但没有解释它。它不适用于绕过空白密码... (3认同)

chu*_*utz 42

一些答案提到将密码放在配置文件中.

或者,您可以从脚本中进行操作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 */;
Run Code Online (Sandbox Code Playgroud)

  • @MatheusOl:环境变量仅对root用户和用户本身可见-仍然是有权访问拥有密码的配置文件的同一用户。 (3认同)
  • @mniss你错了。`export MYSQL_PWD=...` 不会出现在进程列表中。哪怕是一瞬间也没有。这是因为“export”命令是(并且必须是)shell 内置命令。因此,如果您在 shell 中执行命令,shell 不会使用命令的参数来 fork/exec 进程。 (3认同)
  • 这应该被接受。赞成。 (2认同)
  • oneliner 怎么样:`MYSQL_PWD=xoF3mafn5Batxasdfuo mysqldump -u root mysql` 不需要`export`。这应该够了吧? (2认同)
  • @mniess正如我说过的,mysql文档非常糟糕且具有误导性。使用Linux和其他系统时,“必须被视为极度不安全,不应该使用”是错误的和不明智的建议。这不支持您的主张,即:“因为将密码放入ENV使得其他用户仍然可以看到它”。旁注:有趣的是,尽管Oracle如何不反对在命令行上传递密码,但实际上这是极其不安全的。 (2认同)
  • 这个问题仍然引起关注,因此更新了一些外部信息。@maxschlepzig 我希望你不介意我在答案中添加了你的“旁注”。当我看到它时,我很高兴。 (2认同)

Fre*_*ers 38

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

mysqldump --defaults-extra-file=/path/.sqlpwd [database] > [desiredoutput].sql
Run Code Online (Sandbox Code Playgroud)

注意:.sqlpwd只是一个示例文件名.你可以随意使用.

注意:MySQL会自动检查~/.my.cnf可以使用哪个而不是--defaults-extra-file

如果您像我一样使用CRON,试试吧!

mysqldump --defaults-extra-file=/path/.sqlpwd [database] > "$(date '+%F').sql"
Run Code Online (Sandbox Code Playgroud)

所需许可和建议所有权

sudo chmod 600 /path/.sqlpwd && sudo chown $USER:nogroup /path/.sqlpwd
Run Code Online (Sandbox Code Playgroud)

.sqlpwd 内容:

[mysqldump]
user=username
password=password
Run Code Online (Sandbox Code Playgroud)

传入的其他例子.cnf.sqlpwd

[mysql]
user=username
password=password

[mysqldiff]
user=username
password=password

[client]
user=username
password=password
Run Code Online (Sandbox Code Playgroud)

如果您想自动登录数据库,则需要[mysql]输入该条目.

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

alias whateveryouwant="mysql --defaults-extra-file=/path/.sqlpwd [database]"
Run Code Online (Sandbox Code Playgroud)

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

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

mysqldump -u [user_name] -p[password] [database] > [desiredoutput].sql
Run Code Online (Sandbox Code Playgroud)

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

例如-pPassWord,当-p Password错误时是正确的.

  • 这是最佳答案,尤其是在考虑多个数据库和用户/密码时. (2认同)

Tar*_*aji 24

是的,这很容易....只是在一个神奇的命令行中不再

mysqldump --user='myusername' --password='mypassword' -h MyUrlOrIPAddress databasename > myfile.sql
Run Code Online (Sandbox Code Playgroud)

并做了 :)

  • 警告:在命令行界面上使用密码可能不安全. (30认同)
  • @Yottatron它可能是不安全的,特别是在古老的Unix系统很容易让10-15人在一天中的大部分时间登录并且vi陷入困境的那一天.在现代VPS上,虽然你可以让10-15人被炮击并使用IRC,但只有管理员才能拥有shell访问权限. (4认同)
  • 谢谢你,我只是在Docker devbox中使用它.所以安全不是问题. (3认同)
  • 只需在命令前面添加一个空格,该命令就不会出现在历史记录中 (3认同)

Ben*_*llo 9

只需 4 个简单步骤即可实现此目标

  1. 创建目录来存储脚本和DB_backups
  2. 创建~/.my.cnf
  3. 创建 ~/.script.sh shell 脚本来运行 mysqldump
  4. 添加一个 cronjob 来运行 mysql 转储。

下面是详细步骤

步骤1

使用以下命令在您的主目录上创建一个目录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
Run Code Online (Sandbox Code Playgroud)

步骤3

cd进入~/backup并创建另一个文件,script.sh 将以下文本添加到其中

SQLFILE=/path/to/where/you/want/to/dump/dbname.sql
DATABASE=dbname
USER=myUsername
Run Code Online (Sandbox Code Playgroud)

mysqldump --defaults-file=~/.my.cnf -u ${USER} ${DATABASE}|gzip > dbName_$( date +\%Y\%m\%d_\%H\%M).sql.gz

步骤4

在控制台中,键入crontab -e以打开将在其中执行自动备份作业的 cron 文件

将以下文本添加到文件底部

0 0 * * * ./backup/script.sh
Run Code Online (Sandbox Code Playgroud)

添加到 cron 文件底部的文本假定您的备份将每天在午夜运行。

这就是你所需要的一切;)


Mic*_*sen 6

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

[client]
password = "my_password"

[mysqldump]
user = root
host = localhost
Run Code Online (Sandbox Code Playgroud)

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

  • 我也在使用 MariaDB(具体来说是 10.4),我只需将密码放在“[mysqldump]”部分下,它就可以正常工作,没有任何问题。Ubuntu 18.04 LTS (2认同)

小智 6

以下是脚本 /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'
Run Code Online (Sandbox Code Playgroud)

替换[MYSQL_CONTAINER_NAME]并确保MYSQL_ROOT_PASSWORD在容器中设置环境变量。

希望它能帮助你,就像它能帮助我一样!