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

时间:2012-02-15 12:05:18

标签: mysql

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

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

我怎么解决这个问题?

13 个答案:

答案 0 :(得分:346)

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

答案 1 :(得分:72)

添加@ 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 locationmysqldump没有看到,请使用--defaults-file指定。

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

答案 2 :(得分:37)

要使用操作系统内任何位置的文件,请使用--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不正确时是正确的。

答案 3 :(得分:34)

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

或者,您可以在脚本中export MYSQL_PWD=yourverysecretpassword

此方法优于使用配置文件的好处是,您不需要单独的配置文件来与脚本保持同步。您只需要维护脚本。

这种方法没有任何缺点。

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

可见

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

如,

$ export MYSQL_PWD=xoF3mafn5Batxasdfuo
$ 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 */;

答案 4 :(得分:22)

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

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

并完成:)

答案 5 :(得分:5)

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

[client]
password = "my_password"

[mysqldump]
user = root
host = localhost

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

答案 6 :(得分:1)

以下是脚本/ 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

希望它会帮助你,因为它可以帮助我!

答案 7 :(得分:0)

我有以下内容。

的/ etc / mysqlpwd

[mysql]
user=root
password=password

使用以下别名。

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

要进行恢复,我只需使用:

mysql -p [database] [file.sql]

答案 8 :(得分:0)

怎么样--password =“” 为我工作5.1.51

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

答案 9 :(得分:0)

检查您的密码!

  • 花点时间注意到我在~/.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
  • localhost不需要主机和端口条目

  • 如果您在linux中的用户名与用于备份的用户名相同,则不需要user

另一个提示,当您为mysqldump执行cronjob条目时,可以使用ionice -c 3 nice 19将其设置为低优先级任务。与InnoDB的--single-transaction选项结合使用,您可以运行不会锁定表或锁定其他位置可能需要的资源的备份。

答案 10 :(得分:0)

您可以通过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

第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 > ${SQLFILE}.gz

第3步

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

将下面的文本添加到文件底部

0 0 * * * ./backup/script.sh

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

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

答案 11 :(得分:-9)

当然,我认为将完整的cmd行放在root crontab中并使用credentails更好更安全。 至少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

答案 12 :(得分:-20)

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

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

mysqldump的选项是区分大小写的!