-
Notifications
You must be signed in to change notification settings - Fork 144
/
db_restore.sh
37 lines (31 loc) · 1.69 KB
/
db_restore.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!/bin/bash
# https://habr.com/ru/company/ruvds/blog/325522/ - Bash documentation
# https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
# set -e - прекращает выполнение скрипта, если команда завершилась ошибкой
# set -u - прекращает выполнение скрипта, если встретилась несуществующая переменная
# set -x - выводит выполняемые команды в stdout перед выполнением (только для отладки, а то замусоривает журнал!)
# set -o pipefail - прекращает выполнение скрипта, даже если одна из частей пайпа завершилась ошибкой
set -euo pipefail
SCRIPT_FILE=$(readlink -f "$0")
SCRIPT_DIR=$(dirname "$SCRIPT_FILE")
# Check syntax this file
bash -n "${SCRIPT_FILE}" || exit
# если есть файл ~/.pgpass, то можно просто ввести Enter
read -s -r -p "Enter password for user postgres: " PGPASSWORD
echo
export PGPASSWORD
LOG_DIR=/tmp
ARCHIVE_DIR=/mnt/backup_db/active_full/tmp
for dbname in my_db1 my_db2
do
time ( \
psql -U postgres -X -c "DROP DATABASE IF EXISTS ${dbname} WITH (FORCE)" -c "CREATE DATABASE ${dbname}" && \
pv "${ARCHIVE_DIR}/${dbname}.sql.zst" \
| zstd -dcq 2> "${LOG_DIR}/zstd.stderr.${dbname}.log" \
| psql -U postgres -X \
--dbname=${dbname} \
--echo-errors \
--log-file="${LOG_DIR}/psql.stdout.${dbname}.log" \
2> "${LOG_DIR}/psql.stderr.${dbname}.log" \
)
done