PostgreSQL 的表传输功能

简介:

标签

PostgreSQL , transfer table , 表传输


背景

表传输的功能很有意思,比如一些企业会有中心数据库,边缘数据库。边缘数据库的数据需要周期性的导入到中心库进行汇总,例如每个工厂的日流水数据,每天导入到总部的中心数据库。

从边缘库导入到中心库,大家可能会想到使用ETL工具,或者是数据订阅(同步)的方式,但是大家有没有想过,这些方式都需要数据重新来一遍insert或者copy。

insert, copy是数据库的标准写入接口,没什么不好的,只不过当边缘数据库很多,数据量很大时,写入可能成为瓶颈(虽然PG已经是堆表,写入通常可以达到单机几百万行/s的速度)。如果有索引的话,更慢。

那么有没有效率更高的数据传输方法呢?

表传输应运而生,表传输可以理解为数据文件的拷贝,没有了BUILD INDEX,forming tuple,alloc extend的消耗,速度大幅提升。

pg_transfer插件是postgrespro 企业版本的一个插件,可以用来实现表传输。

pg_transfer用法

表传输前提

因为表传输是拷贝文件的方式传输数据,所以必须要求源、目标数据库具有物理文件兼容性。例如

1、数据库版本一致。

2、数据库所在操作系统架构一致(CPU架构、操作系统架构)。

3、数据库某些涉及物理格式的编译参数一致(块大小、是否开启CHECKSUM、数据文件段大小(涉及到文件寻址))。

准备步骤

源和目标都必须安装pg_transfer插件

create extension pg_transfer;  

将表置为只读

 ALTER TABLE table_name SET CONSTANT;  

收集统计信息

VACUUM (ANALYZE) table_name;  

迁移表定义

 pg_dump database -t table_name --schema-only -f transfer_dir/archive.out  
 pg_restore -d database --schema-only transfer_dir/archive.out  

获取目标库被迁移表的toast relid,备用。

psql target_database -c select reltoastrelid from pg_class where relname='table_name'  

迁移表、索引、TOAST数据

将表的数据刷盘,确保shared buffer中没有表的脏页。

同时需要输入前一步获得的目标库生成的TOAST relid。

psql -d database -c select pg_transfer_freeze('table_name'::regclass::oid, reltoastrelid::oid);  

导出表、索引、TOAST的数据文件

pg_dump database -Fc -t table_name --copy-mode-transfer --transfer-dir transfer_dir/ -f transfer_dir/archive.out  

将数据文件导入目标库,并挂接filenode。

pg_restore -d target_database --data-only --transfer-dir transfer_dir/ transfer_dir/archive.out  

注意事项

如果源和目标在同一个文件系统中,那么迁移过程中pg_dump或pg_restore 二选一,必须使用 --copy-mode-transfer 开关 。

如果目标库有slave,并且希望将表传输的数据通过WAL同步到目标库的slave,那么使用pg_restore时,必须加上--generate-wa选项,以产生WAL。

参考

https://postgrespro.com/docs/postgresproee/9.6/pgtransfer.html

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍如何基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
关系型数据库 Serverless 分布式数据库
【公测】PolarDB PostgreSQL版Serverless功能免费使用​!
【公测】PolarDB PostgreSQL版Serverless功能免费使用​,公测于2024年3月28日开始,持续三个月,公测期间可以免费使用!
|
SQL 关系型数据库 PostgreSQL
把PostgreSQL的表导入SQLite
把PostgreSQL的表导入SQLite
337 0
|
存储 关系型数据库 数据库
深入了解 PostgreSQL:功能、特性和部署
PostgreSQL,通常简称为Postgres,是一款强大且开源的关系型数据库管理系统(RDBMS),它在数据存储和处理方面提供了广泛的功能和灵活性。本文将详细介绍 PostgreSQL 的功能、特性以及如何部署和使用它。
1361 1
深入了解 PostgreSQL:功能、特性和部署
|
关系型数据库 Serverless 分布式数据库
PolarDB PostgreSQL版Serverless功能上线公测啦,公测期间免费使用!
Serverless数据库能够使得数据库集群资源随客户业务负载动态弹性扩缩,将客户从复杂的业务资源评估和运维工作中解放出来。PolarDB PostgreSQL版 Serverless提供了CPU、内存、存储、网络资源的实时弹性能力,构建计算与存储分离架构下的 PolarDB PostgreSQL版产品新形态。
|
SQL 关系型数据库 数据库
postgresql中连接两张表更新第三张表(updata)
如何结合两张表的数据来更新第三张表
695 0
|
SQL 监控 关系型数据库
实时计算 Flink版操作报错合集之在设置监控PostgreSQL数据库时,将wal_level设置为logical,出现一些表更新和删除操作报错,怎么办
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
关系型数据库 PostgreSQL
postgresql如何将没有关联关系的两张表的字段合并
【6月更文挑战第2天】postgresql如何将没有关联关系的两张表的字段合并
366 3
|
关系型数据库 PostgreSQL
postgresql将没有关联关系的两张表合并成一张
【5月更文挑战第4天】postgresql将没有关联关系的两张表合并成一张
493 5
|
SQL 关系型数据库 数据库连接
ClickHouse(20)ClickHouse集成PostgreSQL表引擎详细解析
ClickHouse的PostgreSQL引擎允许直接查询和插入远程PostgreSQL服务器的数据。`CREATE TABLE`语句示例展示了如何定义这样的表,包括服务器信息和权限。查询在只读事务中执行,简单筛选在PostgreSQL端处理,复杂操作在ClickHouse端完成。`INSERT`通过`COPY`命令在PostgreSQL事务中进行。注意,数组类型的处理和Nullable列的行为。示例展示了如何从PostgreSQL到ClickHouse同步数据。一系列的文章详细解释了ClickHouse的各种特性和表引擎。
595 0

相关产品

  • 云原生数据库 PolarDB
  • 云数据库 RDS PostgreSQL 版
  • 推荐镜像

    更多