我想知道在不提示输入密码的情况下执行数据库mysqldump的命令。
原因:我想运行一个cron作业,该作业每天执行一次mysqldump数据库的转储。因此,出现提示时,我将无法插入密码。
我该如何解决?
我想知道在不提示输入密码的情况下执行数据库mysqldump的命令。
原因:我想运行一个cron作业,该作业每天执行一次mysqldump数据库的转储。因此,出现提示时,我将无法插入密码。
我该如何解决?
Answers:
由于您正在使用Ubuntu,因此您所要做的只是在主目录中添加一个文件,这将禁用mysqldump密码提示。这是通过创建文件来完成的~/.my.cnf
(权限需要为600)。
将此添加到.my.cnf文件
[mysqldump]
user=mysqluser
password=secret
这样,您就可以以需要密码的MySQL用户身份进行连接,而不必实际输入密码。您甚至不需要-p或--password。
对于编写mysql&mysqldump命令脚本非常方便。
可在此链接中找到实现此目标的步骤。
或者,您可以使用以下命令:
mysqldump -u [user name] -p[password] [database name] > [dump file]
但请注意,它本质上是不安全的,因为转储运行时,系统上的任何其他用户都可以使用简单的ps ax
命令查看整个命令(包括密码)。
--defaults-file
。像`mysqldump的--defaults文件= 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';
添加到@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
一些答案提到将密码放入配置文件中。
另外,您也可以从脚本中进行操作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 */;
export MYSQL_PWD=...
不会没有在进程列表中显示出来。即使一瞬间也没有。这是因为该export
命令是(并且必须是)内置的Shell。因此,如果您在shell中执行命令,则shell不会使用命令的参数派生/执行进程。
要使用操作系统内部任何位置的文件,请使用--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]
输入该条目。
现在,您可以创建一个别名,以自动将您连接到数据库
alias whateveryouwant="mysql --defaults-extra-file=/path/.sqlpwd [database]"
您也只能将密码放入其中,.sqlpwd
并通过脚本/ cli传递用户名。我不确定这是否会提高安全性,这将是一个完全不同的问题。
为了完整起见,我将声明您可以执行以下操作,但是此操作非常不安全,因此切勿在生产环境中使用:
mysqldump -u [user_name] -p[password] [database] > [desiredoutput].sql
注意:-p和密码之间没有空格。
例如-pPassWord
正确而-p Password
错误。
是的,这很容易.... 不再需要一个神奇的命令行
mysqldump --user='myusername' --password='mypassword' -h MyUrlOrIPAddress databasename > myfile.sql
并做了 :)
对我来说,使用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
这是脚本/ 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
在容器中设置了环境变量。
希望它能对您有所帮助!
绝对可以,将完整的cmd行放在crerontails的根crontab中会更好,更安全。至少将crontab编辑限制(可读)给已经知道密码的人..所以不用担心以纯文本形式显示密码...
如果需要的不仅仅是一个简单的mysqldump ...,只需放置一个bash脚本即可接受credentails作为参数并在其中执行所有便利...
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
您可以在命令行上指定密码,如下所示:
mysqldump -h <host> -u <user> -p<password> dumpfile
mysqldump的选项区分大小写!
mysqldump -u root -pmypassword