PostgreSQL数据备份策略

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
日志服务 SLS,月写入数据量 50GB 1个月
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: 概述任何数据库搭建完成,准备投入使用之后,首先要确定的就是数据库的备份策略,合理有规划的备份是数据安全的关键。以下就是针对于PostgreSQL数据库,设计的一整套备份策略WAL归档策略wal日志所谓wal,即 write ahead log。

概述

任何数据库搭建完成,准备投入使用之后,首先要确定的就是数据库的备份策略,合理有规划的备份是数据安全的关键。
以下就是针对于PostgreSQL数据库,设计的一整套备份策略

WAL归档策略

wal日志

所谓wal,即 write ahead log。存储了数据库系统中所有更改和操作的历史,以确保数据库不会因为故障(例如掉电或其他导致服务器崩溃的故障)而丢失数据。它是在写的操作完成之前写好,但当写真正完成之后,它的意义似乎就没那么大了,但是绝不是以所用。虽然在默认的设置中wal归档并不是开启的,而是会自动删除。
有时我们使用全备进行恢复数据时,时间点总是没那么精确,因为全备一般都是一段时间之前的数据,这之间的数据可以通过应用wal找回。这也是我们推荐开启wal归档的原因

参数配置

在开启wal日志归档前,首先需要设置几个参数

  • wal_level = replica
    该参数的可选的值有minimal,replica和logical,wal的级别依次增高,在wal的信息也越多。由于minimal这一级别的wal不包含从基础的备份和wal日志重建数据的足够信息,在该模式下,无法开启wal日志归档
  • archive_mode = on
    上述参数为on,表示打开归档备份,可选的参数为on,off,always 默认值为off,所以要手动打开
  • archive_command = 'cp %p /pgdata/10/archive_wals%f'
    该参数的默认值是一个空字符串,他的值可以是一条shell命令或者一个复杂的shell脚本。在shell脚本或命令中可以用 “%p” 表示将要归档的wal文件包含完整路径的信息的文件名,用“%f” 代表不包含路径信息的wal文件的文件名

注意:wal_level和archive_mode参数修改都需要重新启动数据库才可以生效。而修改archive_command则不需要。所以一般配置新系统时,无论当时是否需要归档,这要建议将这两个参数开启

归档策略脚本

这次分享的策略是使用一个shell脚本来管理归档:
在postgres家目录下,分别创建bin,log目录。bin目录存放此脚本,log则记录执行日志
归档策略是 在/data下的 archivedir中,按日期为名归档日志,保留20天。20天前的自动删除
archive_command参数的配置为:

archive_command ='/bin/bash /home/postgres/bin/pg_archive.sh %p %f'

archive_command命令在归档时不再使用简单的cp命令,而是使用预定好的脚本来备份,脚本内容为

#!/bin/bash
source /home/postgres/.bash_profile

DATE=`date +%Y%m%d`
DIR="/data/archivedir/$DATE"
BACK="/data/archivedir/"`date -d '-20 day' +%Y%m%d`
if [ -d "$BACK" ]; then
                rm -rf $BACK
                echo "success rm $BACK" > /home/postgres/logs/pg_archive_logs
        else
                echo "the old backup file not exists!" > /home/postgres/logs/pg_archive_logs
fi

(test -d $DIR || mkdir -p $DIR) && cp $1 $DIR/$2

物理全备

使用pg_basebackup

PG数据库自带全备的备份命令,提供方便基础备份的工具,这个命令会把整个数据库实例的数据都拷贝出来。经常用来搭建主备 ,做全量备份

需要注意的是,在使用 pg_basebackup 的备份终端服务器上,必须要有访问数据库的权限,即在pg_hba.conf中要指定好权限
每一次的备份都会使用一个wal槽max_wal_senders。

备份脚本

每天一点备份,保留2周的全备

00 00 */1 * *     /home/postgres/bin/pgbackup.sh >/home/postgres/logs/pgbackup.log 2>&1 &

#!/bin/bash

back="/data/sas_pgbackup/"`date -d '-2 week' +%Y-%m-%d`

backf="/data/sas_pgbackup/"`date +%F`"/base.tar"

echo "starting backup....."

pg_basebackup -D /data/sas_pgbackup/`date +%F` -x -R -P -F t -U postgres

if [ -f "$backf" ]; then
    echo "success backup to $backf"
        if [ -d "$back" ]; then
                rm -rf $back
        echo "success rm $back"
        else
                echo "the old backup file not exists!"
        fi
else
    echo "backup failed, because of the file $backf not found"
fi

备份管理工具

pg_rman

pg_rman是一款专门为PostgreSQL数据库打造的优秀开源备份软件,其使用的思路类似Oracle的rman,是一个非常方便的备份管理工具

pg_rman最大的亮点就是实现了增量备份,注意不是基于WAL日志的增量备份,是基于上次全量备份之后发生的变化数据块的增量备份

pg_rman的备份原理给介绍一下:

  • pg_rman不是使用流复制协议进行拷份的,而是使用文件拷贝,即先在主库上执行pg_start_backup()函数,然后拷贝整个数据库的数据目录,最后再执行 pg_stop_backup()函数来结束备份。
  • 所以pg_rman必须和数据库节点跑在一起。否则可以想的到是是无法拷贝数据库的数据文件,从而无法备份。所以通常备份时,需要使用NAS等NFS共享方法把备份机的文件系统mount到数据库机器上。
  • pg_rman可以在standby节点上做全库的备份,但需要通过网络连接到主库上执行pg_start_backup和pg_stop_backup。
  • pg_rman需要主库打开了归档才能更好的备份,所以需要在postgresql.conf中打开归档,以便让pg_rman判断出数据库的归档目录在哪里。pg_rman主要是读取postgresql.conf文件中archive_command参数的值。
  • pg_rman还能备份PostgreSQL数据库的一般程序日志,即pg_log目录的日志文件。所以pg_rman会读取postgresql.conf中的log_directory参数以确定这些日志在哪个目录下。当然这些程序日志通常不是太重要,可以不备份。

pg_rman使用

pg_rman的安装不再赘述,说说它的简单使用

做一次全备:

$ pg_rman backup --backup-mode=full
INFO: copying database files
INFO: copying archived WAL files
INFO: backup complete
INFO: Please execute 'pg_rman validate' to verify the files are correctly copied.

全备完之后要校验一下:

$ pg_rman validate
INFO: validate: "2019-6-13 17:45:07" backup and archive log files by CRC
INFO: backup "2019-6-13 17:45:07" is valid
然后用pg_rman show查看状态:

$ pg_rman show
=====================================================================
 StartTime EndTime Mode Size TLI Status
=====================================================================
2019-6-13 17:45:07 2019-6-13 17:45:09 FULL 50MB 1 OK

此时便可看到full备份已经ok

在增量完成之后,如果过了一段时间,数据库产生很多变化,还可以做全量备份

$ pg_rman backup --backup-mode=incremental --with-serverlog
INFO: copying database files
INFO: copying archived WAL files
INFO: copying server log files
INFO: backup complete
INFO: Please execute 'pg_rman validate' to verify the files are correctly copied.
[postgres@pg01 ~]$ pg_rman show
=====================================================================
 StartTime EndTime Mode Size TLI Status
=====================================================================
2019-6-13 17:47:44 2019-6-13 17:47:46 INCR 67MB 1 DONE
2019-6-13 17:45:07 2019-6-13 17:45:09 FULL 50MB 1 OK

每次备份完成,不要忘了做pg_rman validate:

$ pg_rman validate
INFO: validate: "2019-6-13 17:47:44" backup, archive log files and server log files by CRC
INFO: backup "2019-6-13 17:47:44" is valid
$ pg_rman show
=====================================================================
 StartTime EndTime Mode Size TLI Status
=====================================================================
2019-6-13 17:47:44 2019-6-13 17:47:46 INCR 67MB 1 OK
2019-6-13 17:45:07 2019-6-13 17:45:09 FULL 50MB 1 OK
相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
4月前
|
监控 关系型数据库 数据库
PostgreSQL的索引优化策略?
【8月更文挑战第26天】PostgreSQL的索引优化策略?
103 1
|
4月前
|
存储 关系型数据库 数据库
PostgreSQL的备份策略
【8月更文挑战第4天】PostgreSQL的备份策略
141 4
|
4月前
|
存储 监控 关系型数据库
PostgreSQL的备份策略是什么?
【8月更文挑战第4天】PostgreSQL的备份策略是什么?
61 7
|
4月前
|
SQL 存储 关系型数据库
PostgreSQL如何进行数据备份?
【8月更文挑战第4天】PostgreSQL如何进行数据备份?
566 6
|
4月前
|
存储 固态存储 关系型数据库
PostgreSQL核心操作之数据备份恢复
PostgreSQL核心操作之数据备份恢复
369 0
|
7月前
|
关系型数据库 MySQL 测试技术
【专栏】PostgreSQL数据库向MySQL迁移的过程、挑战及策略
【4月更文挑战第29天】本文探讨了PostgreSQL数据库向MySQL迁移的过程、挑战及策略。迁移步骤包括评估规划、数据导出与转换、创建MySQL数据库、数据导入。挑战包括数据类型不匹配、函数和语法差异、数据完整性和性能问题。应对策略涉及数据类型映射、代码调整、数据校验和性能优化。迁移后需进行数据验证、性能测试和业务验证,确保顺利过渡。在数字化时代,掌握数据库迁移技能对技术人员至关重要。
412 5
|
7月前
|
安全 关系型数据库 数据库
postgresql|数据库|基于本地备份的远程备份策略
postgresql|数据库|基于本地备份的远程备份策略
163 0
|
关系型数据库 PostgreSQL
PostgreSQL ring buffer策略
PostgreSQL ring buffer策略 When running a query that needs to access a large number of pages just once,such as VACUUM or a large sequential scan, a different strategy is used.
2070 0
|
SQL 安全 关系型数据库
PostgreSQL 10.1 手册_部分 II. SQL 语言_第 5 章 数据定义_5.7. 行安全性策略
5.7. 行安全性策略 除可以通过GRANT使用 SQL 标准的 特权系统之外,表还可以具有 行安全性策略,它针对每一个用户限制哪些行可以 被普通的查询返回或者可以被数据修改命令插入、更新或删除。
1097 0