我想知道在没有密码提示的情况下执行数据库的mysqldump的命令。
原因: 我想运行一个cron作业,每天一次获取数据库的mysqldump。因此,在提示时我将无法插入密码。
我怎么解决这个问题?
答案 0 :(得分:346)
由于您使用的是Ubuntu,所以您只需要在主目录中添加一个文件,它将禁用mysqldump密码提示。这是通过创建文件~/.my.cnf
(权限需要为600)来完成的。
将此添加到.my.cnf文件
[mysqldump]
user=mysqluser
password=secret
这使您可以作为需要密码的MySQL用户进行连接,而无需实际输入密码。你甚至不需要-p或--password。
非常方便脚本编写mysql& mysqldump命令。
可以在this link中找到实现此目标的步骤。
或者,您可以使用以下命令:
mysqldump -u [user name] -p[password] [database name] > [dump file]
但请注意,它本质上是不安全的,因为在转储运行时,系统上的任何其他用户都可以使用简单的ps ax
命令查看整个命令(包括密码)。
答案 1 :(得分:72)
添加@ 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
文件不在default location且mysqldump
没有看到,请使用--defaults-file
指定。
mysqldump --defaults-file=/path-to-file/.my.cnf –u my_username my_db > my_db.sql
答案 2 :(得分:37)
要使用操作系统内任何位置的文件,请使用--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]
条目。
您现在可以创建一个自动将您连接到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
不正确时是正确的。
答案 3 :(得分:34)
一些答案提到将密码放在配置文件中。
或者,您可以在脚本中export MYSQL_PWD=yourverysecretpassword
。
此方法优于使用配置文件的好处是,您不需要单独的配置文件来与脚本保持同步。您只需要维护脚本。
这种方法没有任何缺点。
密码不对系统上的其他用户可见(如果它在命令行中,则可以看到)。环境变量仅对运行mysql命令的用户和root。
可见任何能够阅读脚本的人都可以看到密码,因此请确保脚本本身受到保护。这与保护配置文件没有任何不同。如果您希望脚本可公开读取(例如export MYSQL_PWD=$(cat /root/mysql_password)
),您仍然可以从单独的文件中获取密码。导出变量比构建配置文件更容易。
如,
$ export MYSQL_PWD=xoF3mafn5Batxasdfuo
$ 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 */;
答案 4 :(得分:22)
是的,这很容易....只是在一个神奇的命令行不再
mysqldump --user='myusername' --password='mypassword' -h MyUrlOrIPAddress databasename > myfile.sql
并完成:)
答案 5 :(得分:5)
对我来说,使用MariaDB我必须这样做:添加文件~/.my.cnf
并通过chmod 600 ~/.my.cnf
更改权限。然后将您的凭据添加到该文件。我缺少的神奇之处在于密码需要在客户端块下(参考:docs),如下所示:
[client]
password = "my_password"
[mysqldump]
user = root
host = localhost
如果您碰巧来到这里寻找如何使用MariaDB进行mysqldump。将密码放在[client]块下,然后将用户放在[mysqldump]块下。
答案 6 :(得分:1)
以下是脚本/ 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
。
希望它会帮助你,因为它可以帮助我!
答案 7 :(得分:0)
我有以下内容。
的/ etc / mysqlpwd
[mysql]
user=root
password=password
使用以下别名。
alias 'mysql -p'='mysql --defaults-extra-file=/etc/mysqlpwd'
要进行恢复,我只需使用:
mysql -p [database] [file.sql]
答案 8 :(得分:0)
怎么样--password =“” 为我工作5.1.51
mysqldump -h localhost -u <user> --password="<password>"
答案 9 :(得分:0)
检查您的密码!
花点时间注意到我在~/.my.cnf
中未使用正确的用户名和密码
在向crontab备份条目中添加其他选项之前,请检查用户/密码基础知识
如果在mysqldump中指定--defaults-extra-file
,则必须是第一个选项
Cron作业可以与主文件夹中的.my.cnf一起正常工作,因此无需指定--defaults-extra-file
如果使用mysqlpump(而非mysqldump),则相应地修订.my.cnf
〜/ .my.cnf需要设置权限,因此只有所有者才能使用以下方式进行读/写访问:
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 3 nice 19
将其设置为低优先级任务。与InnoDB的--single-transaction
选项结合使用,您可以运行不会锁定表或锁定其他位置可能需要的资源的备份。
答案 10 :(得分:0)
您可以通过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
第2步
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} ${DATABASE}|gzip > ${SQLFILE}.gz
第3步
在控制台中,键入crontab -e
以打开cron文件,将在该文件中执行自动备份作业
将下面的文本添加到文件底部
0 0 * * * ./backup/script.sh
添加到cron文件底部的文本假定您的备份应每天在午夜进行。
这就是您所需要的一切 ;)
答案 11 :(得分:-9)
当然,我认为将完整的cmd行放在root crontab中并使用credentails更好更安全。 至少crontab编辑对已经知道密码的人有限制(可读)..所以不用担心以纯文本显示...
如果需要的话不仅仅是一个简单的mysqldump ...只需放置一个bash脚本,接受证书作为参数并执行所有设施......
简单的
中的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
答案 12 :(得分:-20)
您可以在命令行中指定密码,如下所示:
mysqldump -h <host> -u <user> -p<password> dumpfile
mysqldump的选项是区分大小写的!