PostgreSQL 最佳实践 - 块级增量备份(ZFS篇)备份集自动校验

本文涉及的产品
PolarClaw,2核4GB
简介: 背景 前面我写过一篇关于使用ZFS的快照特性和PostgreSQL流复制来完成数据库块级别的增量PITR备份的文章。 达到可控的备份与恢复SLA。 https://yq.aliyun.com/articles/59363 本文将基于这个备份机制, 写一个自动的恢复测试

背景

前面我写过一篇关于使用ZFS的快照特性和PostgreSQL流复制来完成数据库块级别的增量PITR备份的文章。

达到可控的备份与恢复SLA。

https://yq.aliyun.com/articles/59363

本文将基于这个备份机制, 写一个自动的恢复测试脚本。

(假设快照每天一个, 并且按规则命名)

备份集测试校验脚本

2个脚本如下

入口脚本

因为可能有多个恢复实例,这样统一管理比较方便。

# mkdir /root/test_recovery  
  
[root@db-pitr test_recovery]# cat recovery_entry.sh  
#!/bin/bash  
/root/test_recovery/recovery_test.sh pg000001 >>/root/test_recovery/pg000001.log 2>&1  
sleep 10  
/root/test_recovery/recovery_test.sh pg000002 >>/root/test_recovery/pg000002.log 2>&1  

恢复测试脚本

本脚本还可以再改进一下测试流程,在每个表空间创建测试表,写入数据,生成检查点。

[root@db-pitr test_recovery]# cat recovery_test.sh   
#!/bin/bash  
  
if [ $# -ne 1 ]; then  
  echo "for exp: ./sh pg000001"  
  exit 1  
fi  
  
UN="$1"  
date +%F%T  
echo $UN  
  
. /etc/profile  
. /home/${UN}/.bash_profile  
  
DATE=`date -d '-1 day' +%Y%m%d`  
zfs clone -o mountpoint=/test_recovery zp1/${UN}@$DATE zp1/test_recovery  
  
rm -f /test_recovery/pg_root/postgresql.conf  
rm -f /test_recovery/pg_root/recovery.conf  
rm -f /test_recovery/pg_root/postmaster.pid  
rm -f /test_recovery/pg_root/pg_xlog/*  
cp -p /root/test_recovery/${UN}_postgresql.conf /test_recovery/pg_root/postgresql.conf  
cp -p /root/test_recovery/${UN}_recovery.conf /test_recovery/pg_root/recovery.conf  
  
su - ${UN} -c "postgres -D /test_recovery/pg_root &"  
  
for ((i=1;i<180;i++)) do  
  echo $i  
  sleep 20  
  /pg_home/${UN}/pgsql/bin/psql -h 127.0.0.1 -p 11111 postgres postgres -c "select now(),* from pg_database;"  
  ret=$?  
  if [ $ret -eq 0 ]; then  
    break  
  fi  
done  
  
su - ${UN} -c "pg_ctl stop -w -t 6000 -m immediate -D /test_recovery/pg_root"  
sleep 60  
  
zfs destroy zp1/test_recovery  

并且为了防止恢复测试时, 一些参数冲突, 我们需要事先准备好恢复文件和配置文件, 如下 :

[root@db-pitr test_recovery]# pwd  
/root/test_recovery  
[root@db-pitr test_recovery]# ll  
total 164  
-rw-r--r-- 1 root     root      3267 Dec 10 10:54 pg000001.log  
-rw------- 1 pg000001 pg000001 20415 Dec 10 10:38 pg000001_postgresql.conf  
-rw-r--r-- 1 pg000001 pg000001  4793 Dec 10 10:39 pg000001_recovery.conf  
-rw-r--r-- 1 root     root      4520 Dec 10 10:58 pg000002.log  
-rw------- 1 pg000002 pg000002 19767 Dec 10 10:41 pg000002_postgresql.conf  
-rw-r--r-- 1 pg000002 pg000002  4795 Dec 10 10:41 pg000002_recovery.conf  
-r-x------ 1 root     root       478 Dec 10 10:50 recovery_entry.sh  
-r-x------ 1 root     root       985 Dec 10 10:32 recovery_test.sh  

与本机standby的配置相比, 主要修改几个地方, 防止冲突, max_connections是为了防止不可启动hot standby :

例如 :

pg000001_postgresql.conf  
port = 11111  
max_connections = 10000  
shared_buffers = 4096MB  
archive_mode = off  
hot_standby = on  
log_directory = 'pg_log'  
  
pg000001_recovery.conf  
restore_command = 'cp /pg_arch/pg000001/arch/*/%f %p'  
standby_mode = on  
#primary_conninfo  

测试

# crontab -e  
52 10 10 6 * /root/test_recovery/recovery_entry.sh  
52 10 10 12 * /root/test_recovery/recovery_entry.sh  

每年6月10日10点52, 12月10日10点52自动执行.

执行恢复脚本的日志输出举例 :

能进入数据库,说明恢复正常。

最好再扫描一下表空间读写是否正常。

# cat pg000001.log   
2014-12-1010:52:02  
pg000001  
rm: cannot remove `/test_recovery/pg_root/pg_xlog/archive_status': Is a directory  
1  
LOG:  00000: loaded library "pg_stat_statements"  
LOCATION:  load_libraries, miscinit.c:1296  
LOG:  00000: redirecting log output to logging collector process  
HINT:  Future log output will appear in directory "pg_log".  
LOCATION:  SysLogger_Start, syslogger.c:649  
             now              |    datname     | datdba | encoding | datcollate | datctype | datistemplate | datallowconn | datconnlimit | datlastsysoid | datfrozenxid | datminmxid | dattablespace |                                                                datacl                                                                  
------------------------------+----------------+--------+----------+------------+----------+---------------+--------------+--------------+---------------+--------------+------------+---------------+--------------------------------------------------------------------------------------------------------------------------------------  
 2014-12-10 10:54:11.77975+08 | template0      |     10 |        6 | C          | C        | t             | f            |           -1 |         12809 |         1674 |          1 |          1663 | {=c/postgres,postgres=CTc/postgres}  
 2014-12-10 10:54:11.77975+08 | postgres       |     10 |        6 | C          | C        | f             | t            |           -1 |         12809 |         1674 |          1 |          1663 |   
 2014-12-10 10:54:11.77975+08 | digoal |  16396 |        6 | C          | C        | f             | t            |           -1 |         12809 |         1674 |          1 |          1663 |   
(3 rows)  
  
waiting for server to shut down.... done  
server stopped  

参考

1. https://yq.aliyun.com/articles/59363

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍如何基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
存储 关系型数据库 数据库
PostgreSQL的备份策略
【8月更文挑战第4天】PostgreSQL的备份策略
433 4
|
关系型数据库 MySQL 数据库
MySQL数据库:基础概念、应用与最佳实践
一、引言随着互联网技术的快速发展,数据库管理系统在现代信息系统中扮演着核心角色。在众多数据库管理系统中,MySQL以其开源、稳定、可靠以及跨平台的特性受到了广泛的关注和应用。本文将详细介绍MySQL数据库的基本概念、特性、应用领域以及最佳实践,帮助读者更好地理解和应用MySQL数据库。二、MySQL
1089 5
|
存储 监控 关系型数据库
PostgreSQL的备份策略是什么?
【8月更文挑战第4天】PostgreSQL的备份策略是什么?
271 7
|
关系型数据库 数据库 PostgreSQL
Linux 环境手动备份postgresql数据库
【8月更文挑战第12天】在Docker环境中使用命令行工具对PostgreSQL数据库进行备份和恢复。首先,通过dockerexec进入容器,使用pg_dump进行数据库模式的备份,然后使用dockercp将备份文件导出。接着,若需导入数据到另一数据库,先将备份文件复制到目标容器,再利用psql命令进行数据恢复。整个过程需确保目标数据库无同名模式,以防止导入失败
505 3
|
存储 Ubuntu 关系型数据库
如何在 Ubuntu VPS 上备份 PostgreSQL 数据库
如何在 Ubuntu VPS 上备份 PostgreSQL 数据库
237 1
|
SQL 关系型数据库 数据库
[postgresql]逻辑备份与还原
[postgresql]逻辑备份与还原
220 2
|
存储 关系型数据库 分布式数据库
PolarDB产品使用问题之如何查看PolarDB for PostgreSQL的备份信息
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
关系型数据库 MySQL 数据库连接
绝对干货!从MySQL5.7平滑升级到MySQL8.0的最佳实践分享
绝对干货!从MySQL5.7平滑升级到MySQL8.0的最佳实践分享
3162 0
|
10月前
|
存储 关系型数据库 测试技术
拯救海量数据:PostgreSQL分区表性能优化实战手册(附压测对比)
本文深入解析PostgreSQL分区表的核心原理与优化策略,涵盖性能痛点、实战案例及压测对比。首先阐述分区表作为继承表+路由规则的逻辑封装,分析分区裁剪失效、全局索引膨胀和VACUUM堆积三大性能杀手,并通过电商订单表崩溃事件说明旧分区维护的重要性。接着提出四维设计法优化分区策略,包括时间范围分区黄金法则与自动化维护体系。同时对比局部索引与全局索引性能,展示后者在特定场景下的优势。进一步探讨并行查询优化、冷热数据分层存储及故障复盘,解决分区锁竞争问题。
1403 2
|
关系型数据库 分布式数据库 PolarDB
《阿里云产品手册2022-2023 版》——PolarDB for PostgreSQL
《阿里云产品手册2022-2023 版》——PolarDB for PostgreSQL
620 0

推荐镜像

更多
下一篇
开通oss服务