我正在尝试使用 pg_dump
进行 PostgreSQL 备份。但由于以下错误,我无法接受它。
我已经成功地为不同的 IP 地址备份了没有特殊字符@
。
使用和工作的命令
sudo /usr/bin/pg_dump --file "/home/myusername/my_first_db.backup" \
--verbose --format=t --blobs -v \
--dbname postgresql://postgres:myfirstpassowrd@112.112.113.114:5432/my_first_db
命令已使用但不工作
sudo /usr/bin/pg_dump --file "/home/myuser/xyz_db/DB_BACKUP/db_file.backup" \
--verbose --format=t --blobs -v \
--dbname postgresql://111.222.333.444:5432/prod_live?password=123th@123th4&user=postgres
sudo /usr/bin/pg_dump --file "/home/myuser/xyz_db/DB_BACKUP/db_file.backup" \
--verbose --format=t --blobs -v \
--dbname postgresql://111.222.333.444:5432/prod_live?password=123th%40123th4&user=postgres
我得到的错误:
[4] 8555
myuser@myuser:~$ pg_dump: [archiver (db)] connection to database "prod_live" failed: FATAL: password authentication failed for user "root"
FATAL: password authentication failed for user "root"
我不能更改密码,因为它是生产。
最佳答案
如我所见...
命令行中未加引号的字符 &
将任务发送到后台,例如,此处:Linux: Start Command In Background .所以 &
字符之后的任何内容都被 *nix shell 忽略(或解释为单独的命令)。
解决方案
只需尝试像这样引用整个字符串:
sudo /usr/bin/pg_dump --file "/home/myuser/xyz_db/DB_BACKUP/db_file.backup" \
--verbose --format=t --blobs -v \
--dbname 'postgresql://111.222.333.444:5432/prod_live?password=123th@123th4&user=postgres'
解释
在您提供的输出中,行 [4] 8555
表示 进程 ID 为 8555 的后台作业 #4 已启动
字符串周围的单引号允许“按原样”解释它,无需参数替换和其他特殊字符解释。
PS:使用$'...'
语法来翻译特殊的转义字符,如\n
\t
\uxxxx
等。
有几个例子:
$ echo abc&defgh [1] 3426 abc defgh: command not found [1]+ Done echo abc
如您所见,输出类似于您在 [x] xxxx
部分提供的输出
$ echo 'abc&defgh' abc&defgh
在这种情况下命令 echo
打印出你想要的内容
最后但同样重要的是:
$ echo '1: abc&\ndefgh'; echo $'2: abc&\ndefgh' 1: abc&\ndefgh 2: abc& defgh
关于database - Postgres数据库备份错误-密码中的特殊字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56196491/