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

原因: 我想运行一个cron作业,每天对数据库进行一次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我必须这样做:添加文件~/.my.cnf,并通过执行chmod 600 ~/.my.cnf更改权限。然后将您的凭据添加到文件中。神奇的是,我错过了密码需要在客户端块下(参考:docs),就像这样:

[client]
password = "my_password"

[mysqldump]
user = root
host = localhost

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

是的,这很简单....只需要一个神奇的命令行

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

完成:)

检查你的密码!

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选项,你可以运行备份,不会锁定表或锁定其他地方可能需要的资源。

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

或者,从脚本中导出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 */;

玛丽亚数据库

MariaDB将MYSQL_PWD的使用记录为:

连接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上有详细介绍,这个答案也解决了评论中提到的问题。十多年来一直无关紧要。

话虽如此,MySQL文档也警告:

MYSQL_PWD从MySQL 8.0开始已弃用;希望它在MySQL的未来版本中被移除。

对此,我将在下面留下maxschlepzig的评论:

有趣的是,Oracle并没有反对在命令行上传递密码,这实际上是非常不安全的

最终的想法

使用单一身份验证因素(密码)连接到系统确实是不安全的。如果您担心安全性,您应该考虑在常规连接之上添加相互TLS,以便服务器和客户端都被正确地标识为已授权。

这就是我如何使用扩展变量备份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可以正确工作。