mysqldump --password真的能做到它说的吗?

时间:2008-09-29 14:36:26

标签: mysql mysqldump mysql-error-1044

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

具体来说,看起来它正在执行此处指示的内容:http://snippets.dzone.com/posts/show/360 - 即将数据库设置为dump。

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

以下是成绩单:

    $ mysqldump -u test -h myhost --no-data --tables --password lose
    Enter password: 
    -- MySQL dump 10.10
    mysqldump: Got error: 1044: Access denied for user 'test'@'%' to
    database 'lose' when selecting the database

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

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

10 个答案:

答案 0 :(得分:79)

来自man mysqldump:

  

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

     

连接服务器时使用的密码。如果你使用   短选项表单(-p),你不能在选项之间有空格             和密码。如果省略后面的密码值              - 命令行上的--password或-p选项,系统会提示您输入             之一。
            应考虑在命令行上指定密码             不安全的。请参见第6.6节“保持密码安全”。

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

要解决此问题,请尝试使用--password=lose-plose或只使用-p--password,然后在系统提示时输入密码。

答案 1 :(得分:13)

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

将此添加到.my.cnf文件

[client]
password=lose

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

非常方便脚本编写mysql& mysqldump命令。

答案 2 :(得分:9)

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

答案 3 :(得分:3)

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

mysqldump -pmypassword ...

答案 4 :(得分:3)

尝试在 - 密码输入之间放置一个'=',如:

--password=lose

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

答案 5 :(得分:2)

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

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

答案 6 :(得分:1)

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

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

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

答案 7 :(得分:0)

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

@ Nathan的答案也是如此。您可以在-p开关后面指定密码 (在脚本中很有用,并且在执行命令后无法手动输入密码)。

答案 8 :(得分:0)

- 密码[=密码]

以下是documentation

答案 9 :(得分:-2)

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