MySQL 密码导致我的数据库备份出现问题。

22

好的,我需要对一个数据库进行mysqldump操作,这是我拥有的内容:

mysqldump -uroot -psdfas@N$pr!nT --databases app_pro > /srv/DUMPFILE.SQL

但我收到了这个错误

 -bash: !nT: event not found

似乎对密码有些困难...是否还有其他方法可以进行mysql转储

8个回答

39

用单引号将 -psdfas@N$pr!nT 包裹起来:

mysqldump -uroot '-psdfas@N$pr!nT' --databases app_pro > /srv/DUMPFILE.SQL
问题在于bash解释了!。而单引号中的字符串不会被解释。

我只是想访问数据库,但无法使用密码。我的密码以感叹号结尾,因此我尝试将整个-p命令放在单引号中,但仍然出现“错误1045(28000):用户'admin'@'localhost'被拒绝访问(使用密码:YES)”的错误提示。 - Ross Brasseaux

11

你需要转义密码中的 '!' 符号:

-psdfas@N$pr\!nT

1
还不够,$pr 位将会被解释为变量替代,因此你需要同时转义 $ 或者单引号括起整个密码,或者(最好的方法)在单独的提示符中输入它。 - Gordon Davisson

2

当然,如果这只是一次性的命令,那么这不是问题...但在这种情况下,我认为你只需使用“-p”并在提示符处输入密码。 - mghicks
一次性命令仍会被记录在shell历史中,并且对于任何运行ps的人都是可见的。在命令行上放置密码是一个非常糟糕的想法。 - Gordon Davisson

2

正如其他人已经说过的,您不应该在命令行上指定密码,因为任何其他进程都可以读取它。对于mysql来说,一个简单有效的解决方案是在运行mysql或mysqldump的用户的主目录中使用.my.cnf文件。

首先以安全的方式创建它:

sudo touch /root/.my.cnf
sudo chown 0:0 /root/.my.cnf
sudo chmod 600 /root/.my.cnf

然后确保 /root/.my.cnf 文件中包含以下内容:

[mysql]
user=root
password=sdfas@N$pr!nT

[mysqldump]
user=root
password=sdfas@N$pr!nT

对于您的“普通”(非root)mysql帐户,您可以并且应该执行此操作。然后,您永远不必再输入密码,仍然可以保持安全。只需在您自己的主目录中放置一个名为.my.cnf的文件,并在其中放置您的凭据,并确保只有您能够读取和写入该文件:

touch ~/.my.cnf
chmod 600 /root/.my.cnf

0

尝试

mysqldump -u root --password='sdfas@N$pr!nT' app_pro > /srv/DUMPFILE.SQL

那样行不通。$符号将在双引号字符串中被解释,shell将寻找一个不存在的$pr变量,并计算为空字符串,从而将密码更改为sdfas@N!nT。使用单引号就可以了。 - Marc B
有道理。PHP也做了同样的事情。 - pulsedemon

0

我不知道为什么它没有在文档中记录,但 man 手册确实列出了“-ppassword”等选项。 - moinudin
有趣。从其他答案来看,问题不在于参数分隔符,而是密码中的感叹号。 - JYelton

0

当你在命令行中使用!时,它的意思是查找以以下字母开头的最后一个运行命令,并将其放置在此处。 进入您的命令行并运行“history”,然后运行其他一些命令,如cd、ls等。 然后输入!h,您上次运行的以字母'h'开头的命令(在本例中为“history”)将被执行。

您需要转义那个感叹号(!)


0

您可以关闭历史扩展功能:

set +o histexpand

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