Як передати пароль на 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.