Ошибка резервного копирования базы данных Postgres - специальный символ в пароле - PullRequest
3 голосов
/ 18 мая 2019

Я пытаюсь сделать резервную копию PostgreSQL с pg_dump. Но я не могу принять его из-за следующей ошибки.

Я успешно создал резервные копии для разных 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"

Я не могу сменить пароль, потому что это рабочий.

1 Ответ

2 голосов
/ 18 мая 2019

Как я вижу ...Символ без кавычек & в командной строке отправляет задачу в фоновый режим, как описано, например, здесь: Linux: команда запуска в фоновом режиме .Так что все, что после & символа игнорируется (или интерпретируется как отдельная команда) оболочкой * nix. Решение Просто попробуйте процитировать всю строку следующим образом:

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 означает Background job #4 with process ID 8555 was startedА одинарные кавычки вокруг строки позволяют интерпретировать ее «как есть», без подстановки параметров и интерпретации других специальных символов.

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
...