数据库同步时,通过存储过程找出时间内发生变化的视图和物化视图

news/2024/11/19 6:17:48/

1. 应用场景

在软件开发或数据库运维过程,每一次数据库同步都是运维人员的痛苦的过程。

  • 如果每次都是无脑全量更新,则工作量较大
  • 如果每次都是增量更新,则需要知道哪些视图谁在什么时候修改了,增加了什么信息(因为往往时团队去搭建数据库,根据业务模块去构建数据库中的视图和物化视图)。

2. 写一个存储过程,获取每一次的增量更新的信息

将每一个时间段之内发生的视图和物化视图发生修改的信息,通过版本和一定的机制获取出来,然后通过列表去编写增量更新的脚本。

2.1. 每次增量更新表单信息

CREATE SEQUENCE tb_sys_mvv_definittion_id_seqINCREMENT 1MINVALUE 1MAXVALUE 9223372036854775807START 1CACHE 1 CYCLE;CREATE TABLE "tb_sys_mvw_definition" ("id" int4 NOT NULL DEFAULT nextval('tb_sys_mvv_definittion_id_seq'::regclass),"view_kindtype" varchar(30) COLLATE "pg_catalog"."default","view_name" varchar(100) COLLATE "pg_catalog"."default","view_definition" text COLLATE "pg_catalog"."default","view_lastversion_definition" text COLLATE "pg_catalog"."default","view_changestatus" varchar(20) COLLATE "pg_catalog"."default","view_time" timestamp(6),"view_hasindexs" bool
)
;
COMMENT ON COLUMN "tb_sys_mvw_definition"."id" IS 'ID';
COMMENT ON COLUMN "tb_sys_mvw_definition"."view_kindtype" IS '视图类型';
COMMENT ON COLUMN "tb_sys_mvw_definition"."view_name" IS '视图名称';
COMMENT ON COLUMN "tb_sys_mvw_definition"."view_definition" IS '视图定义';
COMMENT ON COLUMN "tb_sys_mvw_definition"."view_lastversion_definition" IS '历史版本视图定义';
COMMENT ON COLUMN "tb_sys_mvw_definition"."view_changestatus" IS '视图变化状态';
COMMENT ON COLUMN "tb_sys_mvw_definition"."view_time" IS '视图信息记录时点信息';
COMMENT ON COLUMN "tb_sys_mvw_definition"."view_hasindexs" IS '视图是否存在索引信息';-- ----------------------------
-- Primary Key structure for table tb_sys_mvw_definition
-- ----------------------------
ALTER TABLE "tb_sys_mvw_definition" ADD CONSTRAINT "tb_sys_mvv_definittion_pkey" PRIMARY KEY ("id");

2.2. 历史版本视图定义表

CREATE TABLE "tb_sys_mvw_definition_lastversion" ("id" int4 NOT NULL,"view_kindtype" varchar(30) COLLATE "pg_catalog"."default","view_name" varchar(100) COLLATE "pg_catalog"."default","view_definition" text COLLATE "pg_catalog"."default","view_lastversion_definition" text COLLATE "pg_catalog"."default","view_changestatus" varchar(20) COLLATE "pg_catalog"."default","view_time" timestamp(6),"view_hasindexs" bool
)
;
COMMENT ON COLUMN "tb_sys_mvw_definition_lastversion"."id" IS 'ID';
COMMENT ON COLUMN "tb_sys_mvw_definition_lastversion"."view_kindtype" IS '视图类型';
COMMENT ON COLUMN "tb_sys_mvw_definition_lastversion"."view_name" IS '视图名称';
COMMENT ON COLUMN "tb_sys_mvw_definition_lastversion"."view_definition" IS '视图定义';
COMMENT ON COLUMN "tb_sys_mvw_definition_lastversion"."view_lastversion_definition" IS '历史版本视图定义';
COMMENT ON COLUMN "tb_sys_mvw_definition_lastversion"."view_changestatus" IS '视图变化状态';
COMMENT ON COLUMN "tb_sys_mvw_definition_lastversion"."view_time" IS '视图信息记录时点信息';
COMMENT ON COLUMN "tb_sys_mvw_definition_lastversion"."view_hasindexs" IS '视图是否存在索引信息';-- ----------------------------
-- Primary Key structure for table tb_sys_mvw_definition_lastversion
-- ----------------------------
ALTER TABLE "tb_sys_mvw_definition_lastversion" ADD CONSTRAINT "tb_sys_mvv_definition_lastversion_pkey" PRIMARY KEY ("id");

2.3. 版本比对存储过程

CREATE OR REPLACE FUNCTION "public"."fun_sync_operation_mvw_log"(OUT "runstate" bool)RETURNS "pg_catalog"."bool" AS $BODY$
declarecurrent_schema_name TEXT;
beginRunState=True;SELECT current_schema INTO current_schema_name;EXECUTE 'delete from tb_sys_mvw_definition_lastversion';EXECUTE 'insert into tb_sys_mvw_definition_lastversion select * from tb_sys_mvw_definition';EXECUTE 'delete from tb_sys_mvw_definition';EXECUTE 'insert into tb_sys_mvw_definition(view_kindtype,view_name,view_definition,view_lastversion_definition,view_changestatus,view_time,view_hasindexs)select ''MaterializedView'',matviewname,definition,'''',''Add'',now(),hasindexes from pg_matviews where schemaname='''||current_schema_name||''' and matviewname not in (select view_name from tb_sys_mvw_definition_lastversion where view_kindtype=''MaterializedView'')union allselect ''View'',viewname,definition,'''',''Add'',now(),false from pg_views where schemaname='''||current_schema_name||''' and viewname not in (select view_name from tb_sys_mvw_definition_lastversion where view_kindtype=''View'')union allselect view_kindtype,view_name,'''',view_definition,''Drop'',view_time,False from tb_sys_mvw_definition_lastversion where view_kindtype=''MaterializedView'' and view_name not in (select matviewname from pg_matviews)union allselect view_kindtype,view_name,'''',view_definition,''Drop'',view_time,False from tb_sys_mvw_definition_lastversion where view_kindtype=''View'' and view_name not in (select viewname from pg_views)union allselect view_kindtype,view_name,pg_matviews.definition,tb_sys_mvw_definition_lastversion.view_definition,case when pg_matviews.definition=tb_sys_mvw_definition_lastversion.view_definition then ''UnChanged'' else ''Alter'' end,view_time,pg_matviews.hasindexes from tb_sys_mvw_definition_lastversion,pg_matviews where view_kindtype=''MaterializedView'' and tb_sys_mvw_definition_lastversion.view_name =pg_matviews.matviewname union allselect view_kindtype,view_name,pg_views.definition,tb_sys_mvw_definition_lastversion.view_definition,case when pg_views.definition=tb_sys_mvw_definition_lastversion.view_definition then ''UnChanged'' else ''Alter'' end,view_time,Falsefrom tb_sys_mvw_definition_lastversion,pg_views where view_kindtype=''View'' and tb_sys_mvw_definition_lastversion.view_name =pg_views.viewname 'Return;
end;
$BODY$LANGUAGE plpgsql VOLATILECOST 100

3. 实际使用

3.1. 版本1:创建了一个视图,创建了一个物化视图

create MATERIALIZED view mvc__dic_aaa
as
select now();create view vw_dic_aaa
as
select now();select fun_sync_operation_mvw_log();select * from tb_sys_mvw_definition order by id 

在这里插入图片描述

3.2. 版本2:修改视图的基本信息

drop  MATERIALIZED view mvc__dic_aaa;create  MATERIALIZED view mvc__dic_aaa
as
select now() as date_into1,now() as date_into2;drop view vw_dic_aaa;create  view vw_dic_aaa
as
select now() as date_into1,now() as date_into2;select fun_sync_operation_mvw_log();select * from tb_sys_mvw_definition where view_changestatus='Alter' order by id ;

在这里插入图片描述

3.3. 删除物化视图

drop  MATERIALIZED view mvc__dic_aaa;drop view vw_dic_aaa;select fun_sync_operation_mvw_log();select * from tb_sys_mvw_definition where view_changestatus='Drop' order by id ;

在这里插入图片描述


http://www.ppmy.cn/news/1000035.html

相关文章

【python学习笔记】extend() 方法和append()方法

当使用 extend() 方法时,可以将一个可迭代对象中的元素添加到列表中,而不是将整个可迭代对象作为单个元素添加到列表中。这样可以实现列表的扩展,而不是简单地将另一个可迭代对象作为单个元素添加到列表中。 # 使用 extend() 方法前 fruits …

2023最新AI艺术二维码制作软件教程【软件工具+教程】下载

2023最新AI艺术二维码傻瓜式生成教程,不需要市面上繁琐的安装步骤和显卡的配置要求!我看了一眼市面上的要么只有视频教程,无工具纯纯牛马用来扯淡了。 要么就是安装繁琐,配置要求还高! 这期教程教大家怎么傻瓜式制作…

第六章:SpringMVC上

第六章:SpringMVC上 6.1:SpringMVC简介 什么是MVC MVC是一种软件架构的思想,将软件按照模型、视图、控制器来划分。 M:Model,模型层,指工程中的JavaBean,作用是处理数据。 一类称为实体类Bean&…

邀请媒体现场报道,有哪些作用?

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 邀请媒体现场报道活动具有多种重要作用和意义,可以为你的活动带来广泛的曝光和正面影响。以下是一些邀请媒体现场报道的作用和意义: 1. 增加活动曝光度&#xff…

rust vec如何转为数组?

使用 Vec 的 into_boxed_slice 方法将 Vec 转换为 Box<[T]> &#xff0c;然后使用 into_vec 方法将 Box<[T]> 转换为动态大小的数组。示例代码如下&#xff1a; let vec: Vec<i32> vec![1, 2, 3, 4, 5]; let array: Box<[i32]> vec.into_boxed_slic…

Matlab实现AGNES算法(每行代码标注详细注解)

在数据分析和机器学习中&#xff0c;聚类是一种常用的无监督学习方法&#xff0c;它可以将数据点按照某种相似度标准进行分组&#xff0c;从而发现数据中的结构和模式。聚类算法有很多种&#xff0c;其中一种比较经典的是AGNES算法&#xff0c;它是一种基于层次的聚类算法&…

速通pytorch库

速通pytorch库&#xff08;长文&#xff09; 前言 ​ 本篇文章主要为那些对于pytorch库不熟悉、还没有上手的朋友们准备&#xff0c;梳理pytorch库的主要内容&#xff0c;帮助大家入门深度学习最重要的库之一。 目录结构 文章目录 速通pytorch库&#xff08;长文&#xff09;1.…

Kotlin 协程与 Flow

简介 Kotlin的Flow 是 Kotlin 在异步编程方面的一个重要组件&#xff0c;它提供了一种声明式的、可组合的、基于协程的异步编程模型。Flow 的设计灵感来自于 Reactive Streams、RxJava、Flux 和其他异步编程库&#xff0c;但它与 Kotlin 协程无缝集成&#xff0c;并提供了一种更…