源码先锋

源码先锋

超详细的pg12.2数据库五种备份恢复机制总结,值得收藏

admin 38 154
概述

备份重于一切,今天主要介绍PG的五种备份方式,仅供参考。

一、pg_dump备份及pg_restore恢复

1、语法

可以在本地及远程进行备份,只需要表的读权限即可备份。pg_dump创建的备份是一致的,在pg_dump运行时数据库产生快照,不阻塞数据库的DML操作,但是会阻塞需要排他锁的操作,如altertable等。特别注意的是,pg_dump一次只能备份一个单独的数据库,且不能备份角色和表空间信息(因为这些信息是cluster-wide,而不是在某个数据库中(per-database))。

使用pg_dump的自定义转储格式。.如果PostgreSQL所在的系统上安装了zlib压缩库,自定义转储格式将在写出数据到输出文件时对其压缩。这将产生和使用gzip时差不多大小的转储文件,但是这种方式的一个优势是其中的表可以被有选择地恢复。

下面的命令使用自定义转储格式来转储一个数据库:
pg_dump-Fcdbnamefilename
自定义格式的转储不是psql的脚本,只能通过pg_restore恢复,例如:
pg_restore-ddbnamefilename

pg_dump[OPTION][DBNAME]pg_restore[OPTION][FILE]

2、常见用法

--导出指定库(不含createdatabase语句)pg_.142-Uhwb-p55432-dpas_db/data/pgbackup/pas_db__level=replicaarchive_mode=on-Fp表示以plain格式数据,-Xs表示以stream方式包含所需的WAL文件,-P表示显示进度,-R表示为replication写配置信息。中写入了主库的连接信息(可手工添加primary_conninfo信息)。pg_basebackup--progress-D/data/

2、恢复

--在data目录下创建一个空文件:修改文件把archive相关参数全部注释掉并增加两行:restore_command='cp/data/pgarch/%f%p'recovery_target_time='2020-12-1416:13:23.10133+08'a.恢复到最新:restore_command='cp/data/pgarch/%f%p'recovery_target_timeline='latest'b.恢复到指定的时间点:restore_command='cp/data/pgarch/%f%p'recovery_target_time='2020-12-1416:13:23.10133+08'c.创建还原点:SELECTpg_create_restore_point('restore_point1');d.恢复到还原点:restore_command='cp/data/pgarch/%f%p'recovery_target_name='restore_point1'--启动数据库进行恢复systemctlrestartpostgresql
五、PG快照备份与恢复

PostgreSQL有一个导出和导入事务快照的功能,这个功能在9.2版本开始支持,允许事务共享它当时的snapshot给其他的事务使用。
SETTRANSACTIONSNAPSHOT命令允许新的事务使用与一个现有事务相同的快照运行。已经存在的事务必须已经把它的快照用pg_export_snapshot函数导出。该函数会返回一个快照标识符,SETTRANSACTIONSNAPSHOT需要被给定一个快照标识符来指定要导入的快照。
需要注意的是:只有事务是SERIALIZABLE以及repeatableread时,DEFERRABLE事务属性才会有效。

PostGreSQL采用“快照”方式来实现MVCC。具体地说,这意味着每一个事务中的查询仅能看到:

1)该事务启动之前已经提交的事务所作出的数据更改。

2)当前事务中该查询之前的查询所作出的更改。

下面基于事务隔离级别repeatableread进行测试

1、建表

createtabletest(idint);insertintotestvalues(1),(2);--开启五个会话进行测试


2、session1:

beginTRANSACTIONISOLATIONLEVELrepeatableread;SELECTpg_export_snapshot();--0000B-1insertintotestvalues(3);SELECTpg_export_snapshot();--0000B-2select*fromtxid_current();select*fromtxid_current_snapshot();

3、session2(插入一条新数据并提交):

insertintotestvalues(4);

4、session3(能查看到会话2插入的数据):

select*fromtest;

5、session4(导入s1的第一个snapshot,因此看不到s2提交的数据):

beginTRANSACTIONISOLATIONLEVELrepeatableread;SETTRANSACTIONSNAPSHOT'0000B-1';select*fromtest;select*fromtxid_current();select*fromtxid_current_snapshot();

6、session5(导入s1的第二个snapshot,因此看不到s2提交的数据,同时验证了看不到s1修改过的数据):

beginTRANSACTIONISOLATIONLEVELREPEATABLEREAD;SETTRANSACTIONSNAPSHOT'0000B-2';select*fromtest;select*fromtxid_current();select*fromtxid_current_snapshot();

7、session1(提交):

8、session4(s1提交后,这个snapshot还存在,只要还有导入了这个snapshot的事务存在着):

select*fromtest;

9、session5(s1提交后,这个snapshot还存在,只要还有导入了这个snapshot的事务存在着)