PgSQL · 内核开发 · 利用一致性快照迁移你的数据

一.背景

众所周知 PostgreSQL 的物理复制以稳定可靠著称,目前经成为默认的高可用方案。但较少有人关注到,PostgreSQL 的逻辑复制经过几个大版本迭代,已异常的强大。它结合了很多黑科技,本文就一一介绍给大家。

二. MVCC 和 snapshot

大家都知道,PostgreSQL 使用 MVCC 和 WAL 两项技术实现 ACID 特性。 MVCC 即多版本并发控制,简单的说,是数据库中的同一份有效数据,会同时保留多个修改版;用 snapshot 即快照,来定义一个事务能看到哪些版本的数据。

2.1 导出一个快照的唯一标识,即 snapshotid

一个连接进行查询或修改数据时会开启一个事务(只读事务或读写事务),事务的可见性由事务中的快照决定。 也就是说,两个事务的快照相同,那么看到的数据是完全相同的。 PostgreSQL 9.3 开始,支持函数:pg_export_snapshot,它能返回一个快照的唯标识,便于其他事务也使用相同的快照查看数据。

BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SELECT pg_export_snapshot();
pg_export_snapshot
--------------------
000003A1-1
(1 row)

详见:1.如何导出一个快照 Table 9-64. Snapshot Synchronization Functions

2.2 启动对应快照的事务

从 PostgreSQL 9.3 开始,支持开启一个事务到一个指定的的快照版本。

BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SET TRANSACTION SNAPSHOT '000003A1-1';

2.开启指定一个存在的快照的详细说明 SET TRANSACTION

2.3 利用导出快照实现严格一致的并行逻辑备份

如果使用多个连接并行的备份数据库中的不同的表,在数据库还在同时修改数据库的状态下是无法获得一个完全一致的数据的。我有几张阿里云幸运券分享给你,用券购买或者升级阿里云相应产品会有特惠惊喜哦!把想要买的产品的幸运券都领走吧!快下手,马上就要抢光了。

这时,使用上述连个特性,我们可以在 PostgreSQL 9.3 和以上版本做到拿到一份一致版本的数据。 大致的步骤是

  1. 备份程序主进程连接数据库,开启只读事务,并使用函数 pg_export_snapshot 导出对应的snapshotid。
  2. 开启 N 个子进程,连接数据库,分别设置主进程中获得的 snapshotid,开始并行备份数据。
    实际上 PostgreSQL 自带的逻辑备份和恢复工具在 9.3 和之后的版本就已经这么做了

1) pg_dump 的并行备份开关 -j

-j njobs
--jobs=njobs
Run the dump in parallel by dumping njobs tables simultaneously. This option reduces the time of the dump but it also increases the load on the database server. You can only use this option with the directory output format because this is the only output format where multiple processes can write their data at the same time.
  • 注意:备份的并行粒度是以表为单位,且需要以 directory 模式备份数据,也就是备份数据到一个目录中,目录中每个表的数据都用一个或多个文件存放。
  • 该模式加上备份压缩开关,是效率最高的逻辑备份方式。
    3.并行逻辑备份 pg_dump

2) pg_resotre 也支持并行恢复

原文链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值