postgresql可以使用pg_dump,pg_restore等命令来进行备份与恢复,那种情况不用停止pgsql服务,只需要执行备份恢复命令即可。
今天介绍的这种备份方式,类似于文件系统的备份与恢复,它需要使用pg_basebackup命令来进行备份,这个命令可以将pgsql的数据文件备份为两个压缩文件:base.tar pg_wal.tar。本别是数据文件和归档文件,恢复的时候,需要设置按照归档文件来恢复。
这种恢复,需要先把备份的压缩文件替换当前的数据文件,然后修改postgresql.conf,因为这个配置文件在data文件夹中,所以只能是在把base.tar解压到数据库当前数据位置,也就是我们默认初始化指定的数据保存位置data文件夹中,才能修改配置,在配置好归档设置以后,可以启动pgsql服务,进行启动恢复。
在恢复过程中,会拷贝归档文件,进行数据恢复。
恢复成功,也就是数据库服务启动成功。这个时候我们访问数据库,它是作为归档状态存在的,所以只能读,不能写操作。
为了恢复数据库写操作,我们需要在命令行下执行切换数据库状态的指令。切换成功之后,才可以进行读写操作。
下面实际演示这些流程:
1、准备数据
2、数据备份
数据备份使用命令pg_basebackup -D backup -Ft -Pv
其中-D指定数据备份的位置。这里指定的是当前文件夹下的backup,也可以指定绝对路径。
-F表示备份文件格式,这里t表示是tar压缩文件格式。
-Pv表示显示备份过程。
因为是本机数据库,所以这里省略了-U -h -p等数据库连接相关的设置。
生成的备份文件:
3、停止数据库服务
bin\pg_ctl stop
4、清空当前数据目录
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 到的目录。
restore_command,recovery_target两个配置在postgresql.conf配置文件中是注释掉的。这两个变量设置在pg12以后是合并到了postgresql.conf中,在老的版本中,需要新建recovery.conf并设置。
为了配合恢复,我们需要在data目录中新建一个recovery.signal的空文件。
7、启动恢复
恢复成功之后,可以验证数据是否恢复成功,但是这时候,只能读,不能写。
这个时候数据库是归档状态,可以通过pg_controldata命令查看数据库簇状态:
8、切换数据库状态
执行pg_ctl promote命令即可。
9、验证读写
当数据库状态切换到正在运行中之后,数据库就不再是只读了。