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

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

我怎么解决这个问题呢?


当前回答

补充@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文件不在默认位置,mysqldump也看不到它,使用——defaults-file指定它。

Mysqldump——defaults-file=/path-to-file/.my.cnf -u my_username my_db > my_db.sql . Mysqldump

其他回答

检查你的密码!

Took me a while to notice that I was not using the correct user name and password in ~/.my.cnf Check the user/pass basics before adding in extra options to crontab backup entries If specifying --defaults-extra-file in mysqldump then this has to be the first option A cron job works fine with .my.cnf in the home folder so there is no need to specify --defaults-extra-file If using mysqlpump (not mysqldump) amend .my.cnf accordingly The ~/.my.cnf needs permissions set so only the owner has read/write access with: 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将它设置为低优先级任务。结合InnoDB的——single-transaction选项,你可以运行备份,不会锁定表或锁定其他地方可能需要的资源。

这就是我如何使用扩展变量备份MariaDB数据库。

我在Docker-Compose设置中使用了一个“secrets”文件来防止密码进入Git,所以我只是在脚本中的一个扩展变量中添加了它。

注意:下面的命令是从Docker主机本身执行的:

mysqldump -h192.168.1.2 -p"$(cat /docker-compose-directory/mariadb_root_password.txt)" -uroot DB-Name > /backupsDir/DB-Name_`date +%Y%m%d-%H:%M:%S`.sql

经过测试,在Ubuntu 20.04 LTS中使用mariadb-client可以正确工作。

补充@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文件不在默认位置,mysqldump也看不到它,使用——defaults-file指定它。

Mysqldump——defaults-file=/path-to-file/.my.cnf -u my_username my_db > my_db.sql . Mysqldump

当然,我认为把完整的cmd行放在根crontab中会更好,更安全。 至少crontab编辑被限制(可读)给已经知道密码的人。所以不用担心用纯文本显示它……

如果需要一个简单的mysqldump…只需放置一个bash脚本,接受cred作为参数,并在里面执行所有设施…

bas文件在simple

#!/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

使用——defaults-extra-file eg:

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是不正确的。