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
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
|
- 使用
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
子进程的方式执行, 也就我们通常说的
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
|