PostgreSQL 物化视图(Oracle同步到PG,PG同步到PG) - by pgsnapshot (plperlu trigger) (支持类似Oracle的mvlog fast complete force刷新)

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
简介: 标签PostgreSQL , 物化视图 , 增量刷新 , mvlog , Oracle 同步到 PG , PG 同步到 PG背景PostgreSQL自身的物化视图没有MVLOG,也就是说,刷新的时候是VIEW定义产生的记录与MV已刷新的记录进行比对,进行增量更新的过程。

标签

PostgreSQL , 物化视图 , 增量刷新 , mvlog , Oracle 同步到 PG , PG 同步到 PG


背景

PostgreSQL自身的物化视图没有MVLOG,也就是说,刷新的时候是VIEW定义产生的记录与MV已刷新的记录进行比对,进行增量更新的过程。

PG的物化视图增量刷新,在MV记录数较少,并且更新频繁时,刷新效率更高。

而Oracle的mv,创建后,支持增量刷新是通过上游的变更量(mvlog),进行回放,所以在MV记录数非常多,并且更新(写入)频率较低时,效率更高。

PG通过pgsnapshot插件,在发布端对变更表创建plperlu的触发器,记录变更量到MVLOG中,可以实现与ORACLE类似的增量刷新机制。

实际上pg 的 londiste3插件也是类似的功效(基于触发器的mq增量)

pgsnapshot的使用

1、下载

https://www.postgresql.org/ftp/projects/pgFoundry/snapshot/snapshot/

wget https://ftp.postgresql.org/pub/projects/pgFoundry/snapshot/snapshot/Pgsnapshot-0.4.x/pgsnapshot-0.4.0.tgz  
  
tar -zxvf pgsnapshot-0.4.0.tgz  

2、依赖什么

1、PostgreSQL 8.0以上版本,

2、plperlu 数据库函数语言,

3、Perl 5.8.5或更高版本,

4、Make sure that DBI is installed on your Perl system and that the DBD of
the database you choose is also installed;

3、配置pgsnapshot

配置Makefile.sh,生成SQL文件。

1、Edit the Makefile.sh file and change the KEY variable to a better "secret"
value and the BASE_SCHEMA variable to where the base(internal) Pg::Snapshot tables should be placed.
Also remember to setup the remaining variables like SUPERUSER.

#!/bin/sh  
  
# You may change the following variables to best suit your needs  
  
##  
# KEY is the communication key between any two servers   
# or between a DBA workstation and a server  
##  
## 配置密钥(用于通讯)  
KEY=Digoalpwd123321PGDB_2018  
  
##  
# BASE_SCHEMA is the schema where all base(internal) tables of Pg::Snapshot will be placed  
##  
## 配置pgsnapshot的元数据、函数的SCHEMA  
BASE_SCHEMA=_pgmvlog  
  
##  
# LOCAL postgresql server superuser  
##  
## 配置订阅端的数据库超级用户名  
SUPERUSER=postgres  
  
# You may not need to change anything beyond this line  
if [ "$1" == "clean" ]; then  
        echo "Removing pgsnapshots.sql..."  
        rm -f pgsnapshots.sql  
        echo "Removing previously generated SQL drivers..."  
        find drivers -name snapshot.sql | xargs rm -f  
        echo "Cleaned."  
        exit 0  
fi  
  
function apply {  
        cat $1 | awk '/^INCLUDE .*$/ { system("cat src/pl/"$2"")} !/^INCLUDE .*$/ {print}' | sed "s/%BASE_SCHEMA%/$BASE_SCHEMA/g" | sed "s/%COMMUNICATION_KEY%/$KEY/g" | sed "s/%SUPERUSER%/$SUPERUSER/g"  
}  
  
IFS=' '  
SQLS='pgsnapshots_tables.sql pgsnapshots_dblink.sql pgsnapshots_create_snapshot.sql pgsnapshots_drop_snapshot.sql pgsnapshots_refresh_snapshot.sql pgsnapshots_snapshotlog.sql'  
  
rm -f pgsnapshots.sql  
for F in $SQLS; do  
        #echo $F  
        apply src/sql/$F >> pgsnapshots.sql  
done  
IFS=$'\n\t '  
for F in `find drivers -name snapshot.template.sql`; do  
        OUTFILE=`echo "$F" | sed "s/\.template\.sql/.sql/"`  
        cat $F | sed "s/%BASE_SCHEMA%/$BASE_SCHEMA/g" | sed "s/%COMMUNICATION_KEY%/$KEY/g" > $OUTFILE  
done  
echo "Done."  

2、执行Makefile.sh ,生成SQL文件。

4、发布端

1、需要在发布端(例如你在源库的postgres库,有一些表要发布)创建plperlu函数语言,

postgres@pg11-test-> psql  
psql (11.1)  
Type "help" for help.  
  
db1=# create language plperlu;  
CREATE LANGUAGE  

2、执行Makefile.sh生成的两个SQL文件。(在发布端(例如你在源库的postgres库,有一些表要发布))

psql -d <database> -h <host> -U <user> -f ./drivers/pg/snapshot.sql  
psql -d <database> -h <host> -U <user> -f pgsnapshots.sql  

对于ORACLE的发布端来说,需要执行如下

SQL> @./drivers/oracle/snapshot.sql  

3、配置pg_hba.conf,允许订阅端访问发布端数据库。

vi $PGDATA/pg_hba.conf  
  
host all all 0.0.0.0/0 md5  
  
pg_ctl reload -D $PGDATA  

4、发布要被订阅的表(注意表需要主键)。

在发布端的目标库执行((在发布端(例如你在源库的postgres库,有一些表要发布))),允许订阅端连接到发布端

select _pgmvlog.snapshot_do('<key>', 'ALLOW', '<masterschema>', '<mastername>', '<ip>');  

对于ORACLE的发布端来说,需要执行如下

SQL> begin  
         snapshot_do('<key>', 'ALLOW', '<masterschema>', '<mastername>', '<ip>');  
         end;  
         /  
    Where:  
        <key> is the "secret" value placed on the KEY variable inside the Makefile.sh file.  Makefile.sh中配置的密码,用于物化视图通讯   
        <masterschema> is the schema name of the master table you wish to allow access to   
        <mastername> is the name of the master table you wish to allow access to   
        <ip> is the IP address of your workstation/server to whom you wish to give access  订阅端的出口IP地址   

例子(发布src表,允许订阅端访问,假设订阅端的IP为192.168.3.198

db1=# create table src (id int primary key, info text, crt_time timestamp);  
CREATE TABLE  
  
  
db1=# select _pgmvlog.snapshot_do('Digoalpwd123321PGDB_2018', 'ALLOW', 'public', 'src', '192.168.3.198');  
 snapshot_do   
-------------  
 t  
(1 row)  

5、创建一个角色,赋予发布表的读权限给这个用户,这个用户需要在订阅端使用,用来连接发布端,复制发布表的数据。

create role mv_ro login encrypted password 'abcdefg';  
  
grant select on public.src to mv_ro;  

5、订阅端

1、创建plperlu 函数语言

postgres@pg11-test-> psql  
psql (11.1)  
Type "help" for help.  
  
db2=# create language plperlu;  
CREATE LANGUAGE  

2、创建SERVER,取个名字,比如server1(代表发布端连接方式,(假设发布端的IP为192.168.3.199,数据库监听端口为1921))。

db2=# SELECT _pgmvlog.create_dblink('server2', 'dbi:Pg:dbname=db1;host=192.168.3.199;port=1921', 'mv_ro', 'abcdefg', '{AutoCommit => 0}');  
 create_dblink   
---------------  
 t  
(1 row)  
  
db2=# select * from _pgmvlog.pg_dblinks;  
 dblinkid | dblinkname |                 datasource                 |   username   | password |    attributes     |           ctime              
----------+------------+--------------------------------------------+--------------+----------+-------------------+----------------------------  
        1 | server2    | dbi:Pg:dbname=db1;host=192.168.3.199;port=1921 | mv_ro        | abcdefg  | {AutoCommit => 0} | 2018-12-17 21:54:29.55201  
(1 rows)  

3、创建物化视图。全量刷新。(有三种刷新方法COMPLETE , FORCE , FAST)

-- 创建物化视图  
SELECT _pgmvlog.create_snapshot('public', 'mv_tbl_src', 'select * from public.src', 'server2', 'COMPLETE', null);  
  
-- 刷新物化视图  
SELECT _pgmvlog.refresh_snapshot('public', 'mv_tbl_src');  

4、创建物化视图。增量刷新。

select _pgmvlog.drop_snapshot('public','mv_tbl_src'); -- 删除物化视图  

发布端(创建MVLOG)

select _pgmvlog.create_snapshot_log('public','src', 'PRIMARY KEY');   
  
db1=# \dp+  
                                    Access privileges  
 Schema |     Name     | Type  |     Access privileges     | Column privileges | Policies   
--------+--------------+-------+---------------------------+-------------------+----------  
 public | mlog$_src    | table | postgres=arwdDxt/postgres+|                   |   
        |              |       | mv_ro=r/postgres          |                   |   
 public | src          | table | postgres=arwdDxt/postgres+|                   |   
        |              |       | mv_ro=r/postgres          |                   |   
(4 rows)  

订阅端(创建增量刷新物化视图)

-- 创建物化视图  
SELECT _pgmvlog.create_snapshot('public', 'mv_tbl_src', 'select * from public.src', 'server2', 'FAST', null);  
  
-- 或  
  
SELECT _pgmvlog.create_snapshot('public', 'mv_tbl_src', 'select * from public.src', 'server2', 'FORCE', null);  -- 全清MVLOG  
  
-- 创建物化视图索引  
db2=# create unique index idx_mv_tbl_src_1 on mv_tbl_src (id);  
CREATE INDEX  
  
-- 增量刷新物化视图  
SELECT _pgmvlog.refresh_snapshot('public', 'mv_tbl_src');  

刷新速度

db1=# insert into src select generate_series(40002,400000), md5(random()::text), now();  
INSERT 0 359999  
  
db1=# \c db2  
You are now connected to database "db2" as user "postgres".  
db2=# SELECT _pgmvlog.refresh_snapshot('public', 'mv_tbl_src');  
NOTICE:  Refreshed 359999 records in 16 seconds.  
 refresh_snapshot   
------------------  
 t  
(1 row)  

Oracle 增量同步到PG (在PG中创建ORACLE的物化视图)

类似。

pgsnapshot手册

SAMPLES

USAGE.txt

USAGE.html

注意

版本比较老,生产就不要用了,不过有兴趣的同学可以借鉴这个思路把这个插件再维护一下。

可从mysql, oracle, pg等增量同步到PG。

参考

《使用Londiste3 增量同步 线下PostgreSQL 到 阿里云RDS PG》

《londiste3 copy table' snapshot & PostgreSQL logical replication's snapshot 不同之处》

《Londiste 3 replicate case - 1 下节》

《Londiste 3 replicate case - 1 上节》

《Londiste3 Install》

https://www.postgresql.org/ftp/projects/pgFoundry/snapshot/snapshot/

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
3月前
|
Oracle NoSQL 关系型数据库
主流数据库对比:MySQL、PostgreSQL、Oracle和Redis的优缺点分析
主流数据库对比:MySQL、PostgreSQL、Oracle和Redis的优缺点分析
654 2
|
4月前
|
监控 物联网 关系型数据库
使用PostgreSQL触发器解决物联网设备状态同步问题
在物联网监控系统中,确保设备状态(如在线与离线)的实时性和准确性至关重要。当设备状态因外部因素改变时,需迅速反映到系统内部。因设备状态数据分布在不同表中,直接通过应用同步可能引入复杂性和错误。采用PostgreSQL触发器自动同步状态变化是一种高效方法。首先定义触发函数,在设备状态改变时更新管理模块表;然后创建触发器,在状态字段更新后执行此函数。此外,还需进行充分测试、监控性能并实施优化,以及在触发函数中加入错误处理和日志记录功能。这种方法不仅提高自动化程度,增强数据一致性与实时性,还需注意其对性能的影响并采取优化措施。
|
7月前
|
SQL Oracle 关系型数据库
实时计算 Flink版产品使用合集之从Oracle数据库同步数据时,checkpoint恢复后无法捕获到任务暂停期间的变更日志,如何处理
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
6月前
|
SQL Oracle 关系型数据库
实时计算 Flink版产品使用问题之oracle无主键的表支持同步吗如何实现
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
6月前
|
Oracle 关系型数据库 数据处理
实时计算 Flink版产品使用问题之如何进行Oracle到HBase的同步
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
6月前
|
运维 Cloud Native 关系型数据库
云原生数据仓库AnalyticDB产品使用合集之PostgreSQL版是否直接支持实时物化视图
阿里云AnalyticDB提供了全面的数据导入、查询分析、数据管理、运维监控等功能,并通过扩展功能支持与AI平台集成、跨地域复制与联邦查询等高级应用场景,为企业构建实时、高效、可扩展的数据仓库解决方案。以下是对AnalyticDB产品使用合集的概述,包括数据导入、查询分析、数据管理、运维监控、扩展功能等方面。
137 3
|
6月前
|
运维 DataWorks Oracle
DataWorks产品使用合集之在标准模式下,当同步Oracle的表或视图时,是否需要在源端的测试和生产环境中都存在要同步的表或视图
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
54 3
|
7月前
|
SQL Oracle 关系型数据库
实时计算 Flink版产品使用合集之如何SQL同步数据到Oracle数据库中
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
6月前
|
SQL Oracle 关系型数据库
实时计算 Flink版产品使用问题之在进行Oracle数据库的全量同步时,只同步了一条数据而源表实际上包含多条数据,是什么原因
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
6月前
|
SQL Oracle 关系型数据库
实时计算 Flink版产品使用问题之同步oracle表时,数据量约800万,检查点异常,该如何排查
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。

相关产品

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

    更多