【问题标题】:Does mysqldump --password really do what it says?mysqldump --password 真的按照它说的做吗?
【发布时间】:2010-09-14 00:27:38
【问题描述】:

我正在尝试使用 mysqldump 转储架构,它主要工作但我遇到了一个好奇心:-p--password 选项似乎除了设置密码之外还做了其他事情(如man 页面和 --help 输出说应该)。

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

为了支持我有点古怪的说法,我可以告诉你,如果我不指定 --password(或 -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)

【问题讨论】:

  • 删除了通用标签,添加了陷阱

标签: mysql mysqldump mysql-error-1044


【解决方案1】:

来自 man mysqldump:

--password[=password], -p[password]

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

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

要更正此问题,请尝试使用 --password=lose-plose 或直接使用 -p--password 并在出现提示时输入密码。

【讨论】:

  • 你说的很对——谢谢。 -u username 选项允许空格,但 -ppassword 选项不允许空格,这真的很奇怪。不是直观的设计。
  • 知道如何让mysqldump 给我“警告:在命令行界面上使用密码可能不安全”吗?
【解决方案2】:

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

【讨论】:

  • 谢谢!节省了我的时间
  • 也为我节省了几个小时!
【解决方案3】:

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

将此添加到 .my.cnf 文件中

[client]
password=lose

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

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

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

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

      【讨论】:

        【解决方案6】:

        --密码[=密码]

        这里是documentation

        【讨论】:

          【解决方案7】:

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

          --password=lose
          

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

          【讨论】:

            【解决方案8】:

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

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

            【讨论】:

              【解决方案9】:

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

              mysqldump -pmypassword ...

              【讨论】:

                【解决方案10】:

                您尝试过 --password=whatever-password-is 吗?

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2013-12-28
                  • 1970-01-01
                  • 1970-01-01
                  • 2016-03-31
                  • 2013-05-18
                  • 2010-11-04
                  • 2013-07-31
                  • 1970-01-01
                  相关资源
                  最近更新 更多