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

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

我怎么解决这个问题呢?


当前回答

你可以通过4个简单的步骤来实现这一点

创建目录存储脚本和DB_backups 创建~ / .my.cnf 创建一个~/.script.sh shell脚本来运行mysqldump 添加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

步骤3

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} ${数据库}| gzip > dbName_美元(日期+ Y \ % m \ % d_ \ \ % % H \ % m) .sql.gz

步骤4

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

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

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

添加到cron文件底部的文本假设您的备份将在每天午夜运行。

这就是你需要的,伙计们 ;)

其他回答

对我来说,使用MariaDB我必须这样做:添加文件~/.my.cnf,并通过执行chmod 600 ~/.my.cnf更改权限。然后将您的凭据添加到文件中。神奇的是,我错过了密码需要在客户端块下(参考:docs),就像这样:

[client]
password = "my_password"

[mysqldump]
user = root
host = localhost

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

我用不同的方式,使用Plink(Putty命令行)连接到remotehost,然后下面的命令是在远程服务器上运行的Plink文件中,然后我使用RSYNC从windows获取它并备份到onprem NAS。

sudo mysqldump -u root --all-databases --events --routines --single-transaction > dump.sql

我在远程主机上设置了密钥,并使用PowerShell,通过任务调度器每周运行一次。

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

下面是Docker在/bin/sh脚本中的解决方案:

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。

希望它能像帮助我一样帮助你!