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

时间: 2024-10-27 18:09:06

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

PostgreSQL 最佳实践 - pg_rman 数据库恢复示例 与 软件限制解说

背景 pg_rman备份已经讲完了,接下来讲一下数据恢复. 由于pg_rman使用了物理备份,所以恢复时,与普通物理备份的恢复原理是一样的. 需要将数据文件恢复,同时需要提供recovery.conf,在recovery.conf中指定需要恢复到哪个位置,以及如何获取XLOG归档文件等配置. 数据库恢复 pg_rman数据恢复时的两个必要要素 1. 新的$PGDATA 2. 备份目录 命令的选项也很简单,甚至可以不指定任何option Restore options: The parameter

PostgreSQL 最佳实践 - 任意时间点恢复源码分析

背景 我们知道PostgreSQL是支持任意时间点恢复的,那么背后的原理是什么? 本文将对PG的时间点恢复进行详细的讲解,帮助用户理解. 本文涉及源码参考PostgreSQL 9.2.2版本. 时间点恢复涉及的参数 我们知道PostgreSQL 支持PITR, 基于时间点的恢复. 通过配置recovery.conf可以指定3种恢复目标, 如下 : recovery_target_name (string) This parameter specifies the named restore po

海量实时计算+OLTP+OLAP DB设计 - 阿里云(RDS、HybridDB) for PostgreSQL最佳实践 - 泛电网系统应用

标签 PostgreSQL , 国家电网 , 电表 , 余额 , 流式计算 , 状态监测 , 上下文相关 背景 电网系统是一个关系民生,又非常典型的传统系统,虽然传统,量可不小.在互联网化(物联网化)的今天,有很多值得借鉴和思考的点供给其他相关系统参考. 每个省份大概有亿级户电表,最大的地市可能有千万户级别. 以往我们电费是怎么交的呢?我们小区是两个月交一次,也就是说先消费,再付款的方式.这么说起来电网真的是很仁义啊,现在哪有这么多先消费再付款的呀.移动话费.家庭宽带.天然气等等,都是充值后使用

PostgreSQL 最佳实践 - 读写分离

背景 一直以来PostgreSQL数据库在scale up和scale out的方向都走得比较靠前,例如 单元化技术 oleg postgrespro的 PostgreSQL cluster,在分布式事务性能提升,选举算法方面的贡献非常大.https://github.com/postgrespro/postgres_cluster sim 他们的udr, bdr已经趋于成熟.https://2ndquadrant.com/en/resources/bdr/ 分片技术 10年前postgresq

PostgreSQL 最佳实践 - 块级增量备份(ZFS篇)多zfs卷场景一致性备份

背景 当我们使用了多个ZFS卷或者文件系统时,如果一个实例的多个部分,如表空间,放在了不同的zfs上,再使用基于ZFS快照的备份时,可能出现多个文件系统不一致的情况. 例如控制文件是新的,但是数据是旧的. 保物理备份的一致性检查 基于文件的物理备份,为了保证备份的一致性,在备份开始时,需要做一个检查点,同时打开FULL PAGE WRTIE,同时还会生成backup_label文件记录备份开始时的WAL文件,检查点位置等信息. backup_label文件内容示例 START WAL LOCAT

PostgreSQL 助力企业打开时空之门 - 阿里云(RDS、HybridDB) for PostgreSQL最佳实践

标签 PostgreSQL , Greenplum , 时间 , 空间 , 对象 , 多维透视 , 多维分析 背景 时空数据无处不在,未来空间数据的占比会越来越高,在TP与AP场景的需求也会越来越旺盛. 选址.网格运营 空间数据自动聚集分析:时间+多边形圈人:驻留时间分析:舆情分析:... 室内定位 3D坐标:相对坐标系:+以上:运营活动效果分析报表: 科研 太空探索.测绘.气象.地震预测.溯源 无人驾驶 点云:动态路径规划: 空间调度(菜鸟.饿了么.滴滴.高德.快递...) 实时位置更新:多边

(新零售)商户网格化运营 - 阿里云RDS PostgreSQL最佳实践

标签 PostgreSQL , PostGIS , 地理位置 , KNN , 近邻检索 , 网格检索 , polygon中心点 , 半径搜索 背景 伟大的马老师说: "纯电商时代很快会结束,未来的十年.二十年,没有电子商务这一说,只有新零售这一说,也就是说线上线下和物流必须结合在一起,才能诞生真正的新零售" 线上是指云平台,线下是指销售门店或生产商,新物流消灭库存,减少囤货量. 电子商务平台消失是指,现有的电商平台分散,每个人都有自己的电商平台,不再入驻天猫.京东.亚马逊大型电子商务平

音视图(泛内容)网站透视分析 DB设计 - 阿里云(RDS、HybridDB) for PostgreSQL最佳实践

标签 PostgreSQL , 用户透视 , 设备透视 , 圈人 , 标签 , 视频网站 , 优酷 , 土豆 , 喜马拉雅 背景 日常生活中,人们使用最多的除了社交类网站.购物网站,估计就是音频.视频.图文信息类内容网站了. 视频网站,已经渗透到各种终端,除了喜闻乐见的手机,还包括移动终端.电脑.盒子.电视.投影仪等.有设备属性.会员属性.渠道属性等. 内容运营是非常重要的环节,而透视则是运营的重要武器. 业务需求 1.生成设备.会员画像 ID.各个维度的标签.其中包括一些多值列标签(例如最近7

云端流计算、在线业务、实时分析 闭环设计 - 阿里云RDS、HybridDB for PostgreSQL最佳实践

背景 水的流动汇成江河大海,孕育生命,形成大自然生态.数据流动,推进社会进步,拓展业务边界. <从人类河流文明 洞察 数据流动的重要性> 以某淘系业务案例展开,看看用户如何利用阿里云RDS PostgreSQL,HybridDB for PostgreSQL,海量对象存储OSS,打造一个从流计算到在线业务,再到数据分析和挖掘的业务,发挥数据的价值,拓展业务的边界. 业务简介 一个电商业务通常会涉及 商家.门店.物流.用户.支付渠道.贷款渠道.商品.平台.小二.广告商.厂家.分销商.店主.店员.