本文主要介绍pg_dump、pg_dumpall、copy、pg_basebackup的使用。
一. pg_basebackup
pg_basebackup ------ 获得PostgreSQL集簇的一个基础备份。
pg_basebackup是集合API函数pg_start_backup和 pg_stop_backup,在9.1版本之前的物理备份可以通过pg_start_backup和pg_stop_backup函数来进行实现备份,对于pg_basebackup来说步骤较多,注意的事项也比较多(比如复制槽、表空间等问题)。
备份通过一个使用复制协议常规PostgreSQL连接制作。该连接必须由一个具有REPLICATION权限或者具有超级用户权限的用户ID建立,并且pg_hba.conf必须允许该复制连接。
该服务器还必须被配置,使max_wal_senders设置得足够高以提供至少一个walsender用于备份以及一个WAL流(如果使用流)。
pg_basebackup [option…]
举例1:
pg_basebackup -h192.168.254.128 -p5432 -Urepli -r 100M -Fp -P -R --verbose -c fast -D /home/postgres/basebackup/
(建议如果是制作从库,并且打算加上复制槽,可以加上参数-C --slot=slotname。)
举例2:
pg_basebackup -h192.168.254.128 -p5432 -Urepli -r 100M -Ft -P --verbose -R -c fast -D /home/postgres/basebackup/
使用tar方式,如果有非默认表空间,会生成以该表空间的oid为名的压缩包,解压之后文件tablespace_map内包含独立表空间的绝对路径(如果想更改该路径可以在该文件中改动,并且需要在启动之后,在pg_tblspc中创建一下软连接)。
在此做测试时:如果在服务器启动前即便是设置好我们的tablespace_map,启动之后我们这里依然需要再重新设置一下,个人感觉这是一个需要优化的地方。
附:查看哪些有使用该表空间:
select a.oid,a.relname,reltablespace,spcname,b.oid spcoid from pg_class a join pg_tablespace b on a.reltablespace=b.oid where b.oid=16417;
一般生产中用pg_basebackup来备份,可能会需要恢复到某个时间点上。这样就需要备份文件加WAL日志来进行恢复。下面是演示过程:
环境介绍:
主:192.168.254.128 (创建了独立表空间)
备:192.168.254.129
从192.168.254.129上进行备份:
在192.168.254.128上进行删除数据操作,并记录下时间和对应的数据情况:
在128上打包wal日志,传输至129上进行相关测试:
在129上设置恢复的时间点:
这里可以看到这里的t3数据量是和128这个时间点的数据量是吻合的。
二.pg_dump/pg_dumpall pg_restore
pg_dump/pg_dumpall的备份方式是逻辑备份。
pg_dump只转储单个数据库。要备份一个集簇或者集簇中对于所有数据库公共的全局对象(例如角色和表空间),应使用 pg_dumpall。pg_dump不阻塞其他用户访问数据库(读取或写入)。
pg_dumpall对一个集簇中所有的PostgreSQL数据库写出到(转储)一个脚本文件。该脚本文件包含可以用作psql的输入SQL命令来恢复数据库。它会对集簇中的每个数据库调用pg_dump来完成该工作。pg_dumpall还转储对所有数据库公用的全局对象(pg_dump不保存这些对象),也就是说数据库角色和表空间都会被转储。目前这包括适数据库用户和组、表空间以及适合所有数据库的访问权限等属性。
pg_restore是用来从pg_dump创建的非文本格式归档恢复PostgreSQL数据库的工具。
$ pg_dump testaubu |gzip > testaubu.sql.gz
$ pg_dump testaubu -t test1 > testaubu_test1.sql
导入:
$ psql -p6432 -d test2 < testaubu_test1.sql
或者直接不落地导入:
$ pg_dump testaubu -t test1 | psql -p6432 -d test2
$ pg_dump testaubu -t 'users*' > testaubu_users.sql
$pg_dump -h192.168.254.128 -p5432 postgres -Fc > dumptest_postgresdump_c
用pg_restore进行恢复(需要注意,如果目标库中不存在源端所需的用户和表空间,需要提前建立好,否则会出问题)
$ pg_restore -p 4432 -d postgres dumptest_dump_c
pg_dump -h192.168.254.128 -p5432 postgres -Fd -j5 -f dumptest1 pg_restore -p 4432 -d testdb1 -j5 /data/dumptest1/
$ pg_dump -h192.168.254.128 -p5432 postgres -Fc | pg_restore -p 4432 -d testdb
三.单表数据备份恢复copy
copy命令在平时日常维护中使用较为广泛,一方面是数据CSV的导出,另一方面是单表数据(特别是数据量不大时)的转移或者导出,都有很多的应用。
copy与\copy 差异:
权限
copy需要superuser或pg_execute_server_program角色的用户; \copy一般用户即可,只要对表有查询权限
位置
copy是去服务器端寻找或者导出 \copy 是在客户端进行寻找或者导出
\copy (select * from testcopy1) to /tmp/testcopy1.csv with csv
其中只要()中是select语句,不管多复杂的SQL,都可以进行特定数据的导出,这对于数据查询导出比较有用。
示例:
PG 12版本以及以后copy from后面支持Where条件: