mysqldump出现问题:"--defaults-extra-file"选项的工作效果不如预期。

73
我在Windows命令行中运行以下命令来备份我的数据库:
...\right_path\mysqldump --add-drop-database --databases my_database_name
                         --defaults-extra-file=d:\1.cnf

其中 d:\1.cnf 包含以下内容:

[client]
user="my_user"
password="my_password"

很遗憾,我收到了以下错误信息:
mysqldump: unknown variable 'defaults-extra-file=d:\1.cnf'

如果我这样做:
...\right_path\mysqldump --add-drop-database --databases my_database_name
                         --user="my_user" --password="my_password"

它按预期工作。

我做错了什么?

7个回答

137

我找到了答案:--defaults-extra-file 必须是第一个选项。以下代码可正常运行:

...\right_path\mysqldump --defaults-extra-file=d:\1.cnf
                         --add-drop-database --databases my_database_name

另外:当您将普通的“--defaults-file”参数传递给例如mysqld时,顺序也很关键。 - domi27
7
在某些系统上,mysql 和 mysqldump 被设置为别名,例如 alias mysql='mysql --skip-secure-auth'。因此,如果你首先设置了 --defaults-extra-file,但仍然无法工作,请检查是否存在此类别名,使用例如 which mysql - Mo Sander

3

供日后参考:

被接受的答案是正确的,需要在第一位放置--defaults-extra-file选项。

尝试在容器中运行时,有一个选项:

$ docker network create dbnet
$ docker run --network dbnet -it --rm \
    --name db -e MYSQL_ROOT_PASSWORD=example \
    mysql echo "[client]\npassword=example\n">.mydbcreds.cnf  
$ docker run --network dbnet -it --rm \
    --name db-client -v "$PWD:/app/" mysql \
    mysql --defaults-extra-file=/app/.mydbcreds.cnf \
        --host db --user root \
        -e "SHOW SCHEMAS;"

不要忘记将凭据保管妥善并远离版本控制系统:

echo ".mydbcreds.cnf">>.gitignore

该文件可以包含所有连接参数(主机、用户等)。

不幸的是,这个文件不能包含数据库名称,每个环境使用不同的文件更好。 现在我们需要在文件中设置所有连接参数,并在命令中设置数据库名称。


这并没有回答该人的问题。 - Leo Romanovsky
1
接受的答案是正确的。正如所指出的,如果有人像我一样搜索相同的关键字,这将作为未来参考。这是一个 Docker 示例,展示了如何正确存储凭据以及如何使用 --defaults-extra-file 读取它。这些内容非常罕见,因此没有必要为一个小注释而开启一个新问题。 - Vladimir Vukanac

2

还遇到了这个问题。发现还有另一种情况会导致--defaults-extra-file选项无法识别。

当您在脚本中更改IFS时,可能会遇到此问题。解决方法是在执行mysql语句之前重置IFS。

供参考。


1
我知道这是与Linux相关的内容,但我的搜索结果带我来到这里。
我正在使用Bitnami的LAMP堆栈,并发现他们的“mysqldump”实际上是一个脚本:
LD_LIBRARY_PATH=/opt/lampstack-5.5.3-0/mysql/lib:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH
case "$@" in
  *--no-defaults*)
    exec $0.bin "$@"
    exit
esac
exec $0.bin --defaults-file=/opt/lampstack-5.5.3-0/mysql/my.cnf "$@"

似乎不允许传递--defaults-file并起作用(如此处所接受的答案)。


@LeifSegen 直接调用 .bin 版本即可。 - Peter K.

1

--defaults-extra-file 被忽略的另一个可能性是您的主目录中存在 .my.cnf 文件。 ~/.my.cnf 文件会覆盖您尝试在 --defaults-extra-file 中设置的值。


1
目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Albert Logic Einstein

0
我遇到了与下面显示的相同的错误:
[ERROR] 未知变量 'defaults-file=C:\ProgramData\MySQL\MySQL Server 8.0\my.ini'。
[ERROR] 未知变量 'defaults-extra-file=C:\ProgramData\MySQL\MySQL Server 8.0\my.ini'。
当我尝试使用-u john--defaults-file=--defaults-extra-file=登录时,如下所示:
mysql -u john --defaults-file='C:\ProgramData\MySQL\MySQL Server 8.0\my.ini'

或者:

mysql -u john --defaults-extra-file='C:\ProgramData\MySQL\MySQL Server 8.0\my.ini'

所以,我改变了-u john--defaults-file=--defaults-extra-file=的顺序,如下所示,然后我就能登录了:
mysql --defaults-file='C:\ProgramData\MySQL\MySQL Server 8.0\my.ini' -u john

或者:

mysql --defaults-extra-file='C:\ProgramData\MySQL\MySQL Server 8.0\my.ini' -u john

0

另一种可能性是您以这种方式调用了MySQL:

mysql --defaults-extra-file my.cnf ...

请注意,在MySQL 5.7上,该程序不支持使用空格字符分隔命令行选项及其参数,必须使用等号字符才能使程序识别该选项:
mysql --defaults-extra-file=my.cnf ...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接