postgresql可以使用pg_dump,pg_restore等命令来进行备份与恢复,那种情况不用停止pgsql服务,只需要执行备份恢复命令即可。

    今天介绍的这种备份方式,类似于文件系统的备份与恢复,它需要使用pg_basebackup命令来进行备份,这个命令可以将pgsql的数据文件备份为两个压缩文件:base.tar pg_wal.tar。本别是数据文件和归档文件,恢复的时候,需要设置按照归档文件来恢复。

    这种恢复,需要先把备份的压缩文件替换当前的数据文件,然后修改postgresql.conf,因为这个配置文件在data文件夹中,所以只能是在把base.tar解压到数据库当前数据位置,也就是我们默认初始化指定的数据保存位置data文件夹中,才能修改配置,在配置好归档设置以后,可以启动pgsql服务,进行启动恢复。

    在恢复过程中,会拷贝归档文件,进行数据恢复。

    恢复成功,也就是数据库服务启动成功。这个时候我们访问数据库,它是作为归档状态存在的,所以只能读,不能写操作。

   为了恢复数据库写操作,我们需要在命令行下执行切换数据库状态的指令。切换成功之后,才可以进行读写操作。

    下面实际演示这些流程:

    1、准备数据

postgres pg_wal归档 pg数据库归档_postgresql

    2、数据备份

    数据备份使用命令pg_basebackup -D backup -Ft -Pv

    其中-D指定数据备份的位置。这里指定的是当前文件夹下的backup,也可以指定绝对路径。

    -F表示备份文件格式,这里t表示是tar压缩文件格式。

    -Pv表示显示备份过程。

    因为是本机数据库,所以这里省略了-U -h -p等数据库连接相关的设置。

postgres pg_wal归档 pg数据库归档_recovery_02

    生成的备份文件:

postgres pg_wal归档 pg数据库归档_recovery_03

 

    3、停止数据库服务

bin\pg_ctl stop

    4、清空当前数据目录

postgres pg_wal归档 pg数据库归档_数据库_04

 

    5、解压备份文件到指定位置

    解压数据文件base.tar到当前数据目录data中,解压归档文件pg_wal.tar到一个指定位置,这里指定到d:\\tools\\pgsql\\archive目录。

    6、修改postgresql.conf配置文件,指定restore_command,recovery_target

    restore_command命令在linux下拷贝是cp命令,在windows下是copy命令,最后注意一下windows下的路径需要使用 \\ 来表示目录分隔符。

    这里的archive目录就是我们在前面第5步中解压归档文件pg_wal.tar 到的目录。

postgres pg_wal归档 pg数据库归档_postgres pg_wal归档_05

    restore_command,recovery_target两个配置在postgresql.conf配置文件中是注释掉的。这两个变量设置在pg12以后是合并到了postgresql.conf中,在老的版本中,需要新建recovery.conf并设置。

    为了配合恢复,我们需要在data目录中新建一个recovery.signal的空文件。 

    7、启动恢复

    恢复成功之后,可以验证数据是否恢复成功,但是这时候,只能读,不能写。

postgres pg_wal归档 pg数据库归档_pg_basebackup_06

    这个时候数据库是归档状态,可以通过pg_controldata命令查看数据库簇状态:

postgres pg_wal归档 pg数据库归档_pg_basebackup_07

    8、切换数据库状态

    执行pg_ctl promote命令即可。

postgres pg_wal归档 pg数据库归档_pg_basebackup_08

    9、验证读写

postgres pg_wal归档 pg数据库归档_postgres pg_wal归档_09

     当数据库状态切换到正在运行中之后,数据库就不再是只读了。