我想知道在没有密码提示的情况下执行数据库的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命令查看整个命令(包括密码).
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
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)
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错误时是正确的.
Tar*_*aji 24
是的,这很容易....只是在一个神奇的命令行中不再
mysqldump --user='myusername' --password='mypassword' -h MyUrlOrIPAddress databasename > myfile.sql
Run Code Online (Sandbox Code Playgroud)
并做了 :)
只需 4 个简单步骤即可实现此目标
下面是详细步骤
步骤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 文件底部的文本假定您的备份将每天在午夜运行。
这就是你所需要的一切;)
对我来说,使用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]块下。
小智 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在容器中设置环境变量。
希望它能帮助你,就像它能帮助我一样!
| 归档时间: |
|
| 查看次数: |
232131 次 |
| 最近记录: |