Postgres 10 highlight - recovery_target_lsn(官方博客翻译)

本文介绍 PostgreSQL 10 中新增的 LSN 恢复目标特性,该特性允许用户通过指定 WAL 日志的位置来进行精确到记录级别的恢复操作,极大提升了数据恢复的灵活性和效率。

By, 神州飞象(北京)数据科技有限公司

原文链接:Postgres 10 highlight - recovery_target_lsn
翻译水平有限,请尽量阅读原文。

PITR时,PG提供几种估算停止点的方法来停止恢复(WAL重演):

  • recovery_target_time指定时间戳
  • recovery_target_name指定名字(用户使用函数pg_create_restore_point()定义的恢复目标)
  • recovery_target_xid指定XID,恢复到指定事务ID提交的时刻
  • recovery_target = ‘immediate’ 指定恢复到服务器能够到达的一致性状态

recovery_target_inclusive也可以影响恢复点设置,默认为true。(恢复参数列表见 这里)

今天的文章是关于新的恢复点类型,由下边的提交引入到PostgreSQL 10:

commit: 35250b6ad7a8ece5cfe54c0316c180df19f36c13
author: Simon Riggs <simon@2ndQuadrant.com>
date: Sat, 3 Sep 2016 17:48:01 +0100
New recovery target recovery_target_lsn

Michael Paquie

LSN是WAL流的位置(也可以成为WAL日志偏移量offset),简单说就是一组知道记录在哪里插入的位置定义,比如“0/7000290”,使用这个参数可以指定记录级恢复。在很多案例中这非常有用,最常见的例子是WAL损坏而用户想尽可能多的恢复数据,不需要深度分析WAL段去查找设置哪一个事务ID或者时间,只需要把它设置到某一记录就好。甚至可以利用像pg_current_xlog_location()这样常规的SQL,找到正在运行的服务器的当前LSN位置。

下边用一个做过基础备份(能够向前重演)的数据库作为例子演示:

=# CREATE TABLE data_to_recover(id int);
CREATE TABLE
=# INSERT INTO data_to_recover VALUES (generate_series(1, 100));
INSERT 0 100
=# SELECT pg_current_xlog_location();
 pg_current_xlog_location
--------------------------
 0/3019838
(1 row)

插入到数据库中的数据使用WAL到位置“0/3019838”(原文 0/152F080怀疑有误),继续插入更多数据:

=# INSERT INTO data_to_recover VALUES (generate_series(101, 200));
INSERT 0 100
=# SELECT pg_current_xlog_location();
 pg_current_xlog_location
--------------------------
 0/301B1B0
(1 row)

后来插入的数据消耗了一些(WAL)记录,现在我们用包含下边内容的recovery.conf恢复到前100条记录的插入状态(确定最后的WAL段已经归档)。

recovery_target_lsn = '0/3019838'
restore_command = 'cp /path/to/archive/%f %p'

PITR完成以后,会提示类似下边内容的日志(然后恢复暂停)

LOG:  recovery stopping after WAL position (LSN) "0/3019838"

登录到这个结点,只有100条数据:

=# SELECT count(*) FROM data_to_recover;
 count
-------
   100
(1 row)

对我个人而言,它是个强大的工具。

转载于:https://my.oschina.net/quanzl/blog/746213

<think>好的,用户需要一个包含PostgreSQL和Redis的Docker Compose配置文件示例。首先,我需要回忆Docker Compose的基本结构和常用配置选项。根据引用[2],docker-compose.yml需要包含version和services部分。版本号需要根据Docker引擎的版本来定,比如version: '3.8'比较常见。接下来,服务部分要定义postgres和redis两个服务。 对于PostgreSQL,通常需要指定image、环境变量、端口映射和卷挂载。镜像使用官方postgres,环境变量包括POSTGRES_USER、POSTGRES_PASSWORD和POSTGRES_DB。端口映射5432,卷挂载到本地目录以持久化数据。 Redis方面,使用官方redis镜像,设置密码可以通过REDIS_PASSWORD环境变量。端口6379,持久化数据可能需要配置volumes,但Redis默认不开启持久化,用户可能需要添加--save参数或者配置文件。不过用户示例中可能只需要基础配置,所以暂时保持简单。 另外,用户可能希望服务之间能够通过容器名称通信,如引用[2]提到的,容器名称可以直接ping通。因此,在配置中不需要额外网络设置,使用默认网络即可。同时,要确保服务名称在配置中正确,比如在app中连接redis时使用服务名。 最后,检查语法是否正确,比如缩进和冒号的使用,确保没有错误。然后提供一个完整的示例,并添加注释说明各部分的作用,帮助用户理解。可能还需要提醒用户根据实际需求调整端口、密码和卷路径,以及如何运行docker-compose up命令启动服务。</think>以下是一个包含PostgreSQL和Redis的Docker Compose配置文件示例,该配置包含持久化存储和基础安全设置: ```yaml version: '3.8' services: postgres: image: postgres:15-alpine container_name: postgres_db environment: POSTGRES_USER: admin POSTGRES_PASSWORD: securepassword POSTGRES_DB: app_db ports: - "5432:5432" volumes: - postgres_data:/var/lib/postgresql/data networks: - app_network redis: image: redis:7-alpine container_name: redis_cache command: redis-server --requirepass redispassword ports: - "6379:6379" volumes: - redis_data:/data networks: - app_network volumes: postgres_data: redis_data: networks: app_network: driver: bridge ``` 主要配置说明: 1. 使用Alpine版镜像减小体积 2. 通过volumes实现数据持久化[^2] 3. 通过networks创建专用网络隔离服务 4. 设置数据库密码等安全凭证 5. 暴露标准端口用于外部访问 使用方式: 1. 保存为`docker-compose.yml` 2. 执行 `docker-compose up -d` 3. 应用连接时使用服务名称作为host(如`postgres://admin:securepassword@postgres_db:5432/app_db`)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值