PostgreSQL 最佳实践 - pg_rman 以standby为源的备份浅析

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: 背景 为了降低备份对数据库的性能影响,我们在有standby的情况下,可以选择从standby备份PostgreSQL。 pg_rman是一个备份工具,同样支持从standby备份数据库,但是有一些使用的注意事项。 例如需要连接主库,需要能读取归档目录,需要告诉主库和备库的连接地址,需要备库的

背景

为了降低备份对数据库的性能影响,我们在有standby的情况下,可以选择从standby备份PostgreSQL。

pg_rman是一个备份工具,同样支持从standby备份数据库,但是有一些使用的注意事项。

例如需要连接主库,需要能读取归档目录,需要告诉主库和备库的连接地址,需要备库的$PGDATA等等。

为什么既要连接主库,还要能力连接备库。

pg_rman需要连接到主库执行pg_start_backup,pg_stop_backup。

同时需要连接到standby数据库查看pg_last_xlog_replay_location(),检查是否已恢复到pg_start_backup返回的LSN,然后才能开始备份。

归档如何备份?

因为PostgreSQL 9.5以前的版本,备库是不会产生归档的,所以如果从备库备份,必须确保pg_rman能访问备库postgresql.conf中配置的archive_command所指定的归档目录,或在pg_rman.ini中配置的ARCLOG_PATH。

并且确保ARCLOG_PATH所在的位置正是主库的归档写入位置。

通常这需要一个主备共享的归档位置,例如分布式文件系统,或主备都能访问的NFS。

如果你使用的是9.5或者更新的版本,那么可以配置备库的 archive_mode=always,让备库也产生归档

archive_mode (enum)
When archive_mode is enabled, completed WAL segments are sent to archive storage by setting archive_command. 
In addition to off, to disable, there are two modes: 
    on, and always. 

During normal operation, there is no difference between the two modes, but when set to always the WAL archiver is enabled also during archive recovery or standby mode. 
In always mode, all files restored from the archive or streamed with streaming replication will be archived (again). 
See Section 25.2.9 for details.

另外,备份是从standby的$PGDATA拷贝文件的,所以你需要告诉pg_rman standby的$PGDATA位置。

配置备库

postgresql.conf

listen_addresses = '0.0.0.0'            # what IP address(es) to listen on;  
port = 1922                             # (change requires restart)  
max_connections = 100                   # (change requires restart)  
superuser_reserved_connections = 3      # (change requires restart)  
unix_socket_directories = '.'   # comma-separated list of directories  
shared_buffers = 8GB                    # min 128kB  
maintenance_work_mem = 512MB            # min 1MB  
autovacuum_work_mem = 1GB               # min 1MB, or -1 to use maintenance_work_mem  
vacuum_cost_delay = 0                   # 0-100 milliseconds  
bgwriter_delay = 10ms                   # 10-10000ms between rounds  
wal_level = hot_standby                 # minimal, archive, hot_standby, or logical  
fsync = on                              # turns forced synchronization on or off  
synchronous_commit = off                # synchronization level;  
full_page_writes = off                  # recover from partial page writes  
wal_buffers = 16MB                      # min 32kB, -1 sets based on shared_buffers  
commit_delay = 0                        # range 0-100000, in microseconds  
commit_siblings = 15                    # range 1-1000  
checkpoint_timeout = 55min              # range 30s-1h  
max_wal_size = 32GB  
checkpoint_completion_target = 0.9      # checkpoint target duration, 0.0 - 1.0  
archive_mode = always               # enables archiving; off, on, or always  
archive_command = 'cp %p /data04/digoal/arc_log1922/%f'         # command to use to archive a logfile segment  
max_wal_senders = 10            # max number of walsender processes  
hot_standby = on                        # "on" allows queries during recovery  
hot_standby_feedback = on               # send info from standby to prevent  
log_destination = 'csvlog'              # Valid values are combinations of  
logging_collector = on          # Enable capturing of stderr and csvlog  
log_truncate_on_rotation = on           # If on, an existing log file with the  
log_error_verbosity = verbose  # terse, default, or verbose messages  
log_timezone = 'PRC'  
autovacuum = on                 # Enable autovacuum subprocess?  'on'  
autovacuum_max_workers = 8              # max number of autovacuum subprocesses  
autovacuum_naptime = 1s         # time between autovacuum runs  
autovacuum_vacuum_threshold = 50        # min number of row updates before  
autovacuum_analyze_threshold = 50       # min number of row updates before  
autovacuum_vacuum_scale_factor = 0.002  # fraction of table size before vacuum  
autovacuum_analyze_scale_factor = 0.001 # fraction of table size before analyze  
autovacuum_vacuum_cost_delay = 0        # default vacuum cost delay for  
datestyle = 'iso, mdy'  
timezone = 'PRC'  
client_encoding = UTF8          # actually, defaults to database  
lc_messages = 'C'                       # locale for system error message  
lc_monetary = 'C'                       # locale for monetary formatting  
lc_numeric = 'C'                        # locale for number formatting  
lc_time = 'C'                           # locale for time formatting  
default_text_search_config = 'pg_catalog.english'  

recovery.conf

recovery_target_timeline = 'latest'  
standby_mode = on  
primary_conninfo = 'host=127.0.0.1 port=1921 user=postgres'             # e.g. 'host=localhost port=5432'  

初始化pg_rman

mkdir -p /data05/digoal/pgstdbak  

指定备库$PGDATA以及备份目录

pg_rman init -D /data04/digoal/pg_root_1922 -B /data05/digoal/pgstdbak   

INFO: ARCLOG_PATH is set to '/data04/digoal/arc_log1922'  
INFO: SRVLOG_PATH is set to '/data04/digoal/pg_root_1922/pg_log'  

如果ARCLOG_PATH目录不是主库的归档目录,需要修改一下。(指PostgreSQL < 9.5的版本)

方法举例

1. 修改PostgreSQL内核,让备库支持归档(指PostgreSQL < 9.5的版本)

2. 主备使用分布式文件系统或共享的NFS作为归档目录(指PostgreSQL < 9.5的版本)

3. 主备分别开启nfs server服务,并且相互mount对方的归档目录(指PostgreSQL < 9.5的版本)

4. 改造pg_rman, 让它可以从pg_xlog目录备份需要的redo文件(可能需要流式备份,否则频繁产生redo的大库xlog容易被删除或覆盖)(指PostgreSQL < 9.5的版本)

那么pg_rman只要能访问到真正的归档位置即可。 (指PostgreSQL < 9.5的版本)

digoal@iZ28tqoemgtZ-> cd /data05/digoal/pgstdbak/  
digoal@iZ28tqoemgtZ-> ll  
total 16K  
drwx------ 4 digoal digoal 4.0K Aug 29 14:13 backup  
-rw-rw-r-- 1 digoal digoal   91 Aug 29 14:13 pg_rman.ini  
-rw-rw-r-- 1 digoal digoal   40 Aug 29 14:13 system_identifier  
drwx------ 2 digoal digoal 4.0K Aug 29 14:13 timeline_history  

digoal@iZ28tqoemgtZ-> cat pg_rman.ini   
ARCLOG_PATH='/data04/digoal/arc_log'   # 这个应该改成真实的归档目录, 而不是standby配置的(指PostgreSQL < 9.5的版本) 
SRVLOG_PATH='/data04/digoal/pg_root_1922/pg_log'  

digoal@iZ28tqoemgtZ-> cat system_identifier   
SYSTEM_IDENTIFIER='6318621837015461309'  

全量备份举例

export PGPASSWORD=postgres         # 超级用户密码  

pg_rman backup \    
-b full \                          # 全量备份   
-B /data05/digoal/pgstdbak \       # 备份目录  
-D /data04/digoal/pg_root_1922 \   # 备库的$PGDATA  
-s \                               # 备份pg_log  
-Z \                               # 压缩  
--keep-data-generations=3 \        # 保留3个全量备份,删除不需要的全量备份  
--keep-data-days=10 \              # 保证能恢复到10天内的任意时间点,删除不需要的  
--keep-arclog-files=30 \           # 保留最近30个归档文件  
--keep-arclog-days=20 \            # 保留20天内的归档文件  
--keep-srvlog-files=10 \           # 保留最近10个日志文件(pg_log)  
--keep-srvlog-days=20 \            # 保留20天内的日志文件(pg_log)  
--standby-host=127.0.0.1 \         # 如何连接standby  
--standby-port=1922 \              # 如何连接standby  
-h 127.0.0.1 \                     # 如何连接primary  
-p 1921 \                          # 如何连接primary  
-U postgres \                      # 如何连接primary, standby(超级用户)  
-d postgres                        # 如何连接primary, standby(database name)  


INFO: copying database files  
NOTICE:  pg_stop_backup complete, all required WAL segments have been archived  
INFO: copying archived WAL files  
INFO: copying server log files  
INFO: backup complete  
HINT: Please execute 'pg_rman validate' to verify the files are correctly copied.  
INFO: start deleting old archived WAL files from ARCLOG_PATH (keep files = 30, keep days = 20)  
INFO: the threshold timestamp calculated by keep days is "2016-08-09 00:00:00"  
INFO: start deleting old server files from SRVLOG_PATH (keep files = 10, keep days = 20)  
INFO: the threshold timestamp calculated by keep days is "2016-08-09 00:00:00"  
INFO: start deleting old backup (keep generations = 3 AND keep after = 2016-08-19 00:00:00)  
INFO: does not include the backup just taken  


digoal@iZ28tqoemgtZ-> pg_rman validate -B /data05/digoal/pgstdbak  
INFO: validate: "2016-08-29 14:18:26" backup, archive log files and server log files by CRC  
INFO: backup "2016-08-29 14:18:26" is valid  


digoal@iZ28tqoemgtZ-> pg_rman show -B /data05/digoal/pgstdbak
==========================================================
 StartTime           Mode  Duration    Size   TLI  Status 
==========================================================
2016-08-29 15:05:32  FULL        0m   178MB     1  OK
2016-08-29 15:04:07  FULL        0m   178MB     1  OK
2016-08-29 15:02:48  FULL        0m   178MB     1  OK
2016-08-29 14:41:05  INCR        0m    275B     1  OK
2016-08-29 14:38:12  FULL        0m   178MB     1  OK
2016-08-29 14:18:26  FULL        0m   178MB     1  OK

Count

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
4月前
|
存储 关系型数据库 数据库
PostgreSQL的备份策略
【8月更文挑战第4天】PostgreSQL的备份策略
141 4
|
2月前
|
关系型数据库 MySQL 数据库
MySQL数据库:基础概念、应用与最佳实践
一、引言随着互联网技术的快速发展,数据库管理系统在现代信息系统中扮演着核心角色。在众多数据库管理系统中,MySQL以其开源、稳定、可靠以及跨平台的特性受到了广泛的关注和应用。本文将详细介绍MySQL数据库的基本概念、特性、应用领域以及最佳实践,帮助读者更好地理解和应用MySQL数据库。二、MySQL
135 5
|
4月前
|
存储 Ubuntu 关系型数据库
如何在 Ubuntu VPS 上备份 PostgreSQL 数据库
如何在 Ubuntu VPS 上备份 PostgreSQL 数据库
32 1
|
4月前
|
关系型数据库 数据库 PostgreSQL
Linux 环境手动备份postgresql数据库
【8月更文挑战第12天】在Docker环境中使用命令行工具对PostgreSQL数据库进行备份和恢复。首先,通过dockerexec进入容器,使用pg_dump进行数据库模式的备份,然后使用dockercp将备份文件导出。接着,若需导入数据到另一数据库,先将备份文件复制到目标容器,再利用psql命令进行数据恢复。整个过程需确保目标数据库无同名模式,以防止导入失败
50 3
|
4月前
|
存储 监控 关系型数据库
PostgreSQL的备份策略是什么?
【8月更文挑战第4天】PostgreSQL的备份策略是什么?
63 7
|
4月前
|
SQL 关系型数据库 数据库
[postgresql]逻辑备份与还原
[postgresql]逻辑备份与还原
|
4月前
|
关系型数据库 MySQL 数据库连接
绝对干货!从MySQL5.7平滑升级到MySQL8.0的最佳实践分享
绝对干货!从MySQL5.7平滑升级到MySQL8.0的最佳实践分享
214 0
|
5月前
|
存储 关系型数据库 分布式数据库
PolarDB产品使用问题之如何查看PolarDB for PostgreSQL的备份信息
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
6月前
|
SQL 存储 关系型数据库
精通MySQL:从基础到高级应用与最佳实践
第一章:MySQL基础入门 1.1 MySQL概述 介绍MySQL的历史、发展、优势以及应用领域
|
5月前
|
网络协议 关系型数据库 MySQL
【最佳实践】MySQL数据库迁移到PXC集群
借本次数据库迁移实践,再次总结一下MySQL数据库迁移到PXC的最佳操作路径。
106 0

相关产品

  • 云原生数据库 PolarDB
  • 云数据库 RDS PostgreSQL 版