Як передати пароль на pg_dump?


294

Я намагаюся створити кронштейн для резервного копіювання моєї бази даних щовечора, перш ніж трапиться щось катастрофічне. Схоже, ця команда повинна відповідати моїм потребам:

0 3 * * * pg_dump dbname | gzip > ~/backup/db/$(date +%Y-%m-%d).psql.gz

За винятком після запуску цього, очікує, що я введу пароль. Я не можу цього зробити, якщо запускаю його з cron. Як я можу передати його автоматично?


можливо корисна публікація, яку я писав про автоматизацію pg_restore! medium.com/@trinity/…
kittyminky

відповідь, використовуючи рядок з'єднання тут: stackoverflow.com/a/29101292/1579667
Benj

Відповіді:


304

Створіть .pgpassфайл у домашній директорії облікового запису, який pg_dumpпрацюватиме як. Докладніше про формат (див. Останній абзац, де він пояснює, що він буде ігноруватися, якщо ви не встановите режим для цього режиму ), перегляньте документацію Postgresql libpq-pgpass0600 .


99
Створіть ~ / .pgpass з localhost: 5432: mydbname: postgres: mypass Тоді chmod 600 ~ / .pgpass
Mircea Stanciu

6
Можливо, корисно: На Ubuntu "sudo su postgres" перейти на користувача "postgres", потім створити .pgpass-файл і виконати дамп.
п’ятидогіт

1
Я слідував за вашою відповіддю, але все ще не зміг успішно створити файл резервної копії. Будь ласка , дивіться мою посилання: unix.stackexchange.com/questions/257898 / ... . Дякую.
alyssaeliyah

Працює 9.6.2: о)
Андрій

2
Зверніть увагу на sudo su postgresте, що користувач Unix не обов'язково існує. Це не потрібно. Але користувач БД повинен.
Фаб’єн Хаддаді

216

Або ви можете встановити crontab для запуску сценарію. Всередині цього сценарію ви можете встановити змінну середовища на зразок цієї: export PGPASSWORD="$put_here_the_password"

Таким чином, якщо у вас є кілька команд, які потребують пароля, ви можете помістити їх у сценарій. Якщо пароль зміниться, його потрібно змінити лише в одному місці (скрипт).

І я погоджуюся з Джошуа, використовуючи pg_dump -Fcгенеруючий самий гнучкий формат експорту, який вже стискається. Для отримання додаткової інформації див: pg_dump документація

Напр

# dump the database in custom-format archive
pg_dump -Fc mydb > db.dump

# restore the database
pg_restore -d newdb db.dump

3
це не ідеально. Якщо кинути його .pgpass, все також збережеться в одному місці, не додаючи зайвого шару непрямості. плюс, якби все, що я хотів зробити з експортом змінної, я би робив це у своєму .bashrcфайлі чи будь-що це є.
квітня 11.11

9
Я бачу, чому .pgpassфайл стане кращим рішенням. Я щойно давав альтернативу, не впевнений, чи заслуговує вона на перемогу :)
Макс

13
Я не став голосом. Це був хтось інший; Я також не думав, що це є підставою для знищення. Майте +1, щоб компенсувати це.
вересня 1111

7
Стільки ненависників. Я ціную цю відповідь і приймаю її за власну заяву.
Джеймс Т Снелл

8
Налаштування змінної середовища PGPASSWORD не є рекомендованою практикою в документації ( postgresql.org/docs/current/static/libpq-envars.html ): Використання цієї змінної середовища не рекомендується з міркувань безпеки, оскільки деякі операційні системи дозволяють користувачі root бачити змінні середовища процесу через ps; замість цього подумайте про використання файлу ~ / .pgpass
bouchon

175

Якщо ви хочете зробити це в одній команді:

PGPASSWORD="mypass" pg_dump mydb > mydb.dump

27
Налаштування змінної середовища PGPASSWORD не є рекомендованою практикою в документації ( postgresql.org/docs/current/static/libpq-envars.html ): Використання цієї змінної середовища не рекомендується з міркувань безпеки, оскільки деякі операційні системи дозволяють користувачі root бачити змінні середовища процесу через ps; замість цього подумайте про використання файлу ~ / .pgpass
bouchon

18
Це все ще корисний коментар. Є багато випадків розгортання, коли це все ще корисно.
Ієн Дункан

1
Я завжди отримував помилку "Невдача аутентифікація одноранців для користувача" ім'я користувача "'. Рішення було: PGPASSWORD = "mypass" pg_dump -U ім'я користувача -h localhost> mydb.dump
Мартін Пабст

4
На мою думку, набагато краще встановити змінну середовища (де ви маєте контроль, де і як буде зберігатися пароль), як у відомому незашифрованому місці. Ця частина документа postgresql є помилковою, і ця відповідь є хорошою.
петерх

1
У моєму паролі було "@". Це спрацювало. Я не міг зрозуміти, як змусити його працювати з postgres://синтаксисом. Не спробував, .pgpassтому що мій користувач після прогресу не має домашнього каталогу.
jmathew

136

Для однолінійного типу, наприклад, для переміщення бази даних, ви можете використовувати --dbnameрядок з'єднання (включаючи пароль), як зазначено в посібнику pg_dump

По суті.

pg_dump --dbname=postgresql://username:password@127.0.0.1:5432/mydatabase

Примітка. Переконайтеся, що ви використовуєте опцію --dbnameзамість коротшої -dта використовуєте дійсний префікс URI, postgresql://або postgres://.

Загальна форма URI така:

postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]

Найкраща практика у вашому випадку (повторюване завдання в кроні) цього не слід робити через проблеми безпеки. Якби не .pgpassфайл, я збережу рядок з'єднання як змінну середовища.

export MYDB=postgresql://username:password@127.0.0.1:5432/mydatabase

то майте у своєму кронтабі

0 3 * * * pg_dump --dbname=$MYDB | gzip > ~/backup/db/$(date +%Y-%m-%d).psql.gz


Версія 9.1 Postgre виводить невідомий варіант для dbname
akohout

Це було протестовано з версіями 9.4 та 9.3 для арки та RHEL відповідно. чи можете ви розмістити рядок з'єднання? анонімізовано звичайно.
Джозеу Олександр Ібарра

Дякую, @JosueIbarra. Успішно випробувано на PostgreSQL 9.3, Ubuntu 14.04.
Cao Minh Tu

1
@EntryLevelR вам потрібно передати висновок у файл, щоб зберегти його. дивіться це відповідне запитання askubuntu.com/questions/420981/…
Josue Alexander Ibarra

4
це має бути прийнятою відповіддю. Один вкладиш, прозорий.
swdev

48
$ PGPASSWORD="mypass" pg_dump -i -h localhost -p 5432 -U username -F c -b -v -f dumpfilename.dump databasename

Приємно, але, на жаль, не працює для мене, я отримую "запит не вдався: ПОМИЛКА: у дозволі відмовлено у зв’язку з направленням_лоокуп"
James T Snell

@До ви спробували дати необхідні дозволи користувачеві pg?
Франциско Луз

33

Цей один лайнер допомагає мені під час створення дампа єдиної бази даних.

PGPASSWORD="yourpassword" pg_dump -U postgres -h localhost mydb > mydb.pgsql

1
дуже допомогли ... thnxxx
ronit

19

@Josue Олександр Ібарра відповідь працює на centos 7 та версію 9.5, якщо --dbname не передано.

pg_dump postgresql://username:password@127.0.0.1:5432/mydatabase 

1
Ви маєте рацію, ось як це повинно виглядати, я думаю, що через кілька років було неправильно, це була моя конфігурація оболонки. Ось чому для мене це було важливо використовувати--dbname
Джозеу Олександр Ібарра

7

Зауважте, що у вікнах pgpass.confфайл повинен бути у такій папці:

%APPDATA%\postgresql\pgpass.conf

якщо postgresqlвсередині папки немає %APPDATA%папки, створіть її.

pgpass.confвміст файлу що - щось на кшталт:

localhost:5432:dbname:dbusername:dbpassword

ура


4

Виправте мене, якщо я помиляюся, але якщо користувач системи такий, як користувач бази даних, PostgreSQL не запитуватиме пароль - він покладається на систему для автентифікації. Це може бути питанням конфігурації.

Таким чином, коли я хотів власника бази даних postgresдля резервного копіювання своїх баз даних щоночі, я міг би створити кронтаб для нього: crontab -e -u postgres. Звичайно, postgresпотрібно було б дозволити виконувати завдання cron; таким чином він повинен бути вказаний у /etc/cron.allow, або він /etc/cron.denyповинен бути порожнім.


Ви начебто тут. Конфігурація Postgres за замовчуванням використовує автентифікацію TRUST для локальних облікових записів системи. Однак більшість виробничих налаштувань позбавляються від цього блоку відразу після встановлення RDBMS.
Яцек Прусія

4

Резервне копіювання ssh паролем за допомогою тимчасових даних .pgpass та натисніть на S3:

#!/usr/bin/env bash
cd "$(dirname "$0")"

DB_HOST="*******.*********.us-west-2.rds.amazonaws.com"
DB_USER="*******"
SSH_HOST="my_user@host.my_domain.com"
BUCKET_PATH="bucket_name/backup"

if [ $# -ne 2 ]; then
    echo "Error: 2 arguments required"
    echo "Usage:"
    echo "  my-backup-script.sh <DB-name> <password>"
    echo "  <DB-name> = The name of the DB to backup"
    echo "  <password> = The DB password, which is also used for GPG encryption of the backup file"
    echo "Example:"
    echo "  my-backup-script.sh my_db my_password"
    exit 1
fi

DATABASE=$1
PASSWORD=$2

echo "set remote PG password .."
echo "$DB_HOST:5432:$DATABASE:$DB_USER:$PASSWORD" | ssh "$SSH_HOST" "cat > ~/.pgpass; chmod 0600 ~/.pgpass"
echo "backup over SSH and gzip the backup .."
ssh "$SSH_HOST" "pg_dump -U $DB_USER -h $DB_HOST -C --column-inserts $DATABASE" | gzip > ./tmp.gz
echo "unset remote PG password .."
echo "*********" | ssh "$SSH_HOST" "cat > ~/.pgpass"
echo "encrypt the backup .."
gpg --batch --passphrase "$PASSWORD" --cipher-algo AES256 --compression-algo BZIP2 -co "$DATABASE.sql.gz.gpg" ./tmp.gz

# Backing up to AWS obviously requires having your credentials to be set locally
# EC2 instances can use instance permissions to push files to S3
DATETIME=`date "+%Y%m%d-%H%M%S"`
aws s3 cp ./"$DATABASE.sql.gz.gpg" s3://"$BUCKET_PATH"/"$DATABASE"/db/"$DATETIME".sql.gz.gpg
# s3 is cheap, so don't worry about a little temporary duplication here
# "latest" is always good to have because it makes it easier for dev-ops to use
aws s3 cp ./"$DATABASE.sql.gz.gpg" s3://"$BUCKET_PATH"/"$DATABASE"/db/latest.sql.gz.gpg

echo "local clean-up .."
rm ./tmp.gz
rm "$DATABASE.sql.gz.gpg"

echo "-----------------------"
echo "To decrypt and extract:"
echo "-----------------------"
echo "gpg -d ./$DATABASE.sql.gz.gpg | gunzip > tmp.sql"
echo

Просто замініть перші пару конфігураційних рядків на все, що вам потрібно - очевидно. Для тих, хто не зацікавлений у резервній частині S3, вийміть її - очевидно.

Цей скрипт видаляє облікові дані .pgpassзгодом, оскільки в деяких середовищах користувач SSH за замовчуванням може користуватися судом без пароля, наприклад, екземпляр EC2 з ubuntuкористувачем, тому використання .pgpassіншого облікового запису для захисту цих облікових даних може бути безглуздим.


Пароль буде отриманий вхід до терміналу historyтаким чином, ні?
mpen

1
@mpen Місцево, так. Віддалено, ні. У моєму випадку його нормально мати в моїй краєзнавчій справі, оскільки це захищена VM, яка не дозволяє віддалений доступ. Якщо у вашому випадку це не в порядку, просто зробіть history -c. Під час використання з Дженкінсом використовуйте Inject passwords to the build as environment variablesпараметр, щоб пароль маскувався
MikeM

4

Як детально описано в цій публікації щоденника , є два способи неінтерактивного надання пароля утилітам PostgreSQL, таким як команда "pg_dump": використання файлу ".pgpass" або використання змінної середовища "PGPASSWORD" .


-1

Інший (мабуть, не безпечний) спосіб передачі пароля - це використання переадресації вводу, тобто виклик

pg_dump [params] < [path to file containing password]


Щодо безпеки - цей файл повинен бути прочитаний лише призначеними користувачами; проте кожен, хто має права root, зможе змінити параметри безпеки і, таким чином, прочитати незашифрований пароль. Так так, це небезпечно ...
Тобіас

3
@Tobias чи є альтернатива? Здавалося б, кожен, хто має права root, завжди міг бачити пароль незалежно від іншої техніки, крім інтерактивного введення пароля (і питання стосується cron). postgresql.org/docs/9.3/static/auth-methods.html#GSSAPI-AUTH згадує GSSAPI, що підтримує єдиний вхід, але не зазначає, якщо це працює неінтерактивно.
Росс Бредбері

4
Будь-хто з правами root також може прочитати .pgpass, який є рекомендованим способом. Тому я б не вважав кореневий доступ небезпекою безпеки.
макс

-1

Ви можете передати пароль в pg_dump безпосередньо, скориставшись наведеними нижче способами:

pg_dump "host=localhost port=5432 dbname=mydb user=myuser password=mypass" > mydb_export.sql

Ласкаво просимо до переповнення стека! Хоча ваша відповідь може спрацювати, вона має серйозні наслідки для безпеки. Аргументи команди видно в ps (1) , тому якщо процес відстежує ps (1), то пароль порушений.
Джонатан Роза

-4

Найпростіший спосіб, на мою думку, це: ви редагуєте головний конфігураційний файл postgres: pg_hba.conf, там ви повинні додати наступний рядок:

host <you_db_name> <you_db_owner> 127.0.0.1/32 trust

і після цього вам потрібно запустити cron таким чином:

pg_dump -h 127.0.0.1 -U <you_db_user> <you_db_name> | gzip > /backup/db/$(date +%Y-%m-%d).psql.gz

і це працювало без пароля


А ви просто зруйнували безпеку системи. Гаразд для коробки для розробників, але нічого іншого.
Теодор Р. Сміт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.