Pgsql数据库: psql 命令非交互式备份与恢复

通常, 我们在使用 psql 命令的时候, 使用交互式命令, 输入密码, 保证安全。

1
2
3
4
5
# 备份
pg_dump -U root -h 172.17.101.250 -W -d intelliep_event > demo.sql

# 登录
psql -U root -h 172.17.101.250 -W -d  intelliep_event < demo.sql

非交互式操作

但是在 脚本 中执行备份和恢复的时候, 交互式的输入密码就非常不方便了。

要实现非交互式, 非常简单。 只需要在 环境变量 中为 pg 命令提供密码就行了。

1
PGPASSWORD=YOURpassWORD

通常提供密码有两种方式

  1. 在命令前提供
1
2
3
4
##恢复
$ PGPASSWORD=YOURpassWORD psql -U root -h 172.16.0.3 -d workflow < workflow.sql
##备份
$ PGPASSWORD=YOURpassWORD pg_dump -U root -h 172.16.0.3 -d workflow > workflow.sql
  1. 使用 export 设置环境变量
1
2
3
$ export PGPASSWORD=YOURpassWORD
$ pg_dump -U root -h 172.16.0.3 -d workflow > workflow.sql
$ psql -U root -h 172.16.0.3 -d workflow < workflow.sql

但最好在 脚本文件中 中设置。 并且通过 fork 子进程的方式执行, 也就我们通常说的

1
$ bash filename.sh

Pgsql 备份恢复脚本

下面是一个常用的备份恢复脚本。

使用 pg_dump 备份数据库, 配合 pg_restore 恢复数据

 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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#!/bin/bash
# filename: pgsql-dump-and-restore.sh

## 源站
Source_PgUSER="ORIGIN_USER"
Source_PgPASS="ORIGIN_PASS"
Source_HOST="ORIGIN_HOST"
Source_PORT=5432
Source_DBName="ORIGIN_DBName"


## 目标站
Dest_PgUSER="New_User"
Dest_PgPASS="New_Pgpass"
Dest_HOST="New_Host"
Dest_PORT=5432
Dest_DBName="New_DBName"
FromFile="${Source_DBName}.dump"


function _usage (){
    echo "Usage: $0 [dump|restore]"
    exit 1
}

# https://www.postgresql.org/docs/13/app-pgdump.html
# -Fc
function dump (){
    PGPASSWORD=${Source_PgPASS} pg_dump -U ${Source_PgUSER} -h ${Source_HOST} --port ${Source_PORT} -d ${Source_DBName} > ${Source_DBName}.dump
}


# https://www.postgresql.org/docs/13/app-pgrestore.html
# --no-owner
# --role=new_user
# PGPASSWORD=${Dest_PgPASS} pg_restore -U ${Dest_PgUSER} -h ${Dest_HOST} --port ${Dest_PORT} -d ${Dest_DBName} --no-owner --role=${Dest_PgUSER} ${FromFile}
function restore(){
    echo "# import: pg_restore -U ${Dest_PgUSER} -h ${Dest_HOST} --port ${Dest_PORT}"
    echo "#   from: ${FromFile}"
    echo "wait 15s to cacle : Ctrl+C"
    sleep 15
    PGPASSWORD=${Dest_PgPASS} psql -U ${Dest_PgUSER} -h ${Dest_HOST} --port ${Dest_PORT} -d ${Dest_DBName} -f ${FromFile}

}


case $1 in
dump) dump;;
restore) restore;;
*) _usage ;;
esac