35

我正在尝试使用mysqldump转储模式,它主要工作,但我遇到了一个好奇心:-por--password选项似乎在做其他事情而不是设置密码(正如man页面和--help输出所说的那样)。

具体来说,它似乎正在执行此处指示的操作:http: //snippets.dzone.com/posts/show/360 - 即将数据库设置为转储。

为了支持我有点古怪的说法,我可以告诉你,如果我不指定--password(or -p) 选项,该命令会打印使用语句并退出并出现错误。如果我确实指定了它,我会立即提示我输入密码 (!),然后--password转储选项中指定的数据库(或者在通常情况下会给出错误,即指定的密码与任何数据库名称都不匹配)。

这是一个成绩单:

    $ mysqldump -u test -h myhost --no-data --tables --password lost
    输入密码:
    -- MySQL 转储 10.10
    mysqldump: 得到错误: 1044: Access denied for user 'test'@'%' to
    选择数据库时数据库“丢失”

那么,什么给了?这是应该的工作方式吗?它肯定看起来没有意义,也不符合官方文档。最后,如果这就是它的工作方式,我该如何指定要在自动化作业中使用的密码?使用expect???

我正在使用mysqldump Ver 10.10 Distrib 5.0.22, for pc-linux-gnu (i486).

4

10 回答 10

80

从人 mysqldump :

--password[=密码], -p[密码]

连接到服务器时使用的密码。如果使用短选项形式 (-p),则选项和密码之间不能有空格。如果您在命令行中省略了 --password 或 -p 选项后面的密码值,系统会提示您输入密码值。
在命令行上指定密码应该被认为是不安全的。请参阅第 6.6 节“保护您的密码安全”。

从语法上讲,您没有正确使用 --password 开关。因此,命令行解析器将您使用“lose”作为独立参数,mysqldump 将其解释为数据库名称,就像您尝试使用更简单的命令一样mysqldump lose

要更正此问题,请尝试使用--password=loseor-plose或简单地使用-por--password并在出现提示时键入密码。

于 2008-09-29T14:41:13.970 回答
13

另一种选择是创建文件~/.my.cnf(权限需要为 600)。

将此添加到 .my.cnf 文件

[client]
password=lose

这使您可以作为需要密码的 MySQL 用户进行连接,而无需实际输入密码。您甚至不需要 -p 或 --password。

对于编写 mysql 和 mysqldump 命令的脚本非常方便。

于 2008-09-29T14:45:27.813 回答
11

我发现如果您的密码中包含特殊字符,就会发生这种情况。这里的mysql密码有一个!在其中,所以我必须做 ==password='xxx!xxxx' 才能正常工作。注意 ' 标记。

于 2010-04-08T16:18:17.547 回答
4

尝试在 --password lost 之间放置一个“=”,例如:

--password=lose

如果使用-p,则-p 和密码之间不能有空格,即'-plose'。

于 2008-09-29T14:41:41.270 回答
3

我不确定它是否适用于 --password 版本,但如果您使用 -p 您可以在之后立即指定密码(关键是不要包含空格):

mysqldump -pmy密码...

于 2008-09-29T14:39:41.213 回答
2

您是否尝试过 --password=whatever-password-is ?

也许我错过了这个问题,但这就是我运行该工具的方式。

于 2008-09-29T14:39:13.180 回答
1

如果您使用 -p 或 --password 不带参数,您将收到提示,要求插入密码。

如果要在命令行中指定密码,则必须使用 -pYOURPASSWORD 或 --password=YOURPASSWORD。请注意,-p 后面没有空格,--password 后面有一个“=”符号。

在您的示例中,mysqldump 要求输入密码,然后将“丢失”视为数据库名称。如果那是您的密码,您应该包含一个“=”

于 2008-09-29T14:46:40.573 回答
0

-p 选项不需要参数。您只需输入 -p 或 --password 以表明您将使用密码来访问数据库。它转储数据库的原因是您在 -p 之后放置的任何名称是 mysqldump 的最后一个参数应该是您要转储的数据库的名称(或者 --all-databases 如果您想要它们全部)。

@Nathan 的回答也是正确的。您可以在 -p 开关之后立即指定密码(在脚本中很有用,在执行命令后您无法手动输入密码的情况下)。

于 2008-09-29T14:40:07.093 回答
0

--密码[=密码]

这是文档

于 2008-09-29T14:42:28.507 回答
-2

也许您的用户“测试”没有访问您的“丢失”数据库的权限?

于 2008-09-29T15:11:00.000 回答