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

news2024/11/17 16:01:02

1. 应用场景

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

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

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

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

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

CREATE SEQUENCE tb_sys_mvv_definittion_id_seq
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 1
  CACHE 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$
declare
	current_schema_name TEXT;
begin
	RunState=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 all

					select ''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 all

					select 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 all

					select 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 all

					select 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 all

					select 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,False
					from 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 VOLATILE
  COST 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.coloradmin.cn/o/827031.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(学习笔记-内存管理)内存满了会发生什么?

内存分配过程 应用程序通过 malloc 函数申请内存的时候,实际上申请的是虚拟内存,此时并不会分配物理内存。 当应用程序读写了这块虚拟内存,CPU就会去访问这个虚拟内存,这时会发现这个虚拟内存没有映射到物理内存,CPU…

【WiFi】国产WiFi芯片

目录 1.概述 2.WiFi芯片的市场格局 3.中国的WiFi芯片公司 3.1.华为海思 3.2.乐鑫科技 3.3.博通集成 3.4.紫光展锐 3.5.康希通信 3.6.南方硅谷 4.国产WiFi芯片竞争格局 4.1.内卷WiFi 4 4.2.缺席WiFi 5 4.3.发力WiFi 6 4.4.逐鹿WiFi 7 5.不得不提的WiFi FEM 1.概述…

视频创作者福音,蝰蛇峡谷NUC12SNKI7视频剪辑测评

英特尔NUC绝对是PC市场里最为特殊的产品,相比众多OEM设计制造的台式机而言,英特尔NUC主打小体积、高度集成化、强扩展性以及尽可能优异的性能表现。尤其是在主打游戏体验的NUC产品出现之后,更是将极致体验演绎到了极致。 在搭载独显的幻影峡谷…

Python爬虫教程篇+图形化整理数据(数学建模可用)

一、首先我们先看要求 1.写一个爬虫程序 2、爬取目标网站数据,关键项不能少于5项。 3、存储数据到数据库,可以进行增删改查操作。 4、扩展:将库中数据进行可视化展示。 二、操作步骤: 首先我们根据要求找到一个适合自己的网…

gitlab CI/CD 安装 gitlab runner

一、为什么需要安装gitlab runner ? 极狐GitLab Runner 极狐GitLab Runner 是在流水线中运行作业的应用,与极狐GitLab CI/CD 配合运作。 说白了就是你部署的一个agent。 二、如何安装? 1.介绍通过helm部署github runner 2.helm添加仓库 h…

k8s kubeedge安装metrics-server监控节点cpu内存使用情况

k8s kubeedge安装metrics-server监控节点cpu内存使用情况 官方安装地址: https://kubeedge.io/en/docs/advanced/metrics/ k8s的master节点上安装metrics-server #在k8s的master节点上执行#创建目录 mkdir metrics-server #下载deploy文件 wget https://github.com/kubernet…

ansible安装及rhel8仓库配置

目录 一、本地仓库 问题: 解决: 1.创建一个仓库: 内容: 2.挂载: 挂载: 测试: 3.或者直接使用阿里云的源 二.配置ansible仓库 1.下载: 2.检查 一、本地仓库 问题: 当…

史上最细,接口自动化测试框架-Pytest+Allure+Excel整理(代码)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 Allure框架 Allu…

第一百二十天学习记录::计算机硬件技术基础:存储器及存储管理

分级存储器系统 存储器从内到外分为四级:内部寄存器、高速缓冲存储器、内存储器和外存储器。它们在存取速度上逐级递减,在存储容量上逐级递增。 内部寄存器 内部寄存器是计算机处理器内部的一种高速缓存,是用来存储临时数据和指令等信息的…

python与深度学习(十四):CNN和IKUN模型二

目录 1. 说明2. IKUN模型的CNN模型测试2.1 导入相关库2.2 加载模型2.3 设置保存图片的路径2.4 加载图片2.5 图片预处理2.6 对图片进行预测2.7 显示图片 3. 完整代码和显示结果4. 多张图片进行测试的完整代码以及结果 1. 说明 本篇文章是对上篇文章猫狗大战训练的模型进行测试。…

opencv 31-图像平滑处理-方框滤波cv2.boxFilter()

方框滤波(Box Filtering)是一种简单的图像平滑处理方法,它主要用于去除图像中的噪声和减少细节,同时保持图像的整体亮度分布。 方框滤波的原理很简单:对于图像中的每个像素,将其周围的一个固定大小的邻域内…

DP-GAN剩余代码

在前面计算完损失后,该进行更新: 1:netEMA是模型的生成器: 遍历生成器的state_dict,将每一个键对应的值乘以EMA_decay。 接着根据当前迭代步数计算num_upd,每1000,2500,10000代倍数就执行一次。 当num…

MyBatis查询数据库1(概念+创建项目+基础交互)

目录 1.MyBatis是什么? 2.为什么学习MyBatis? 3. 怎么学 MyBatis 4.第⼀个MyBatis查询 4.1 添加MyBatis框架支持 4.1.1老项目添加MyBatis 4.1.2 新项目添加MyBatis 4.2 配置连接字符串和MyBatis 4.2.1 配置连接字符串 4.2.2 配置 MyBatis 中的…

PHM的设备故障模型如何构建?

预测性维护与健康管理(Prognostics Health Management,PHM)是现代工业中的一个关键概念,它旨在通过使用数据和先进的分析技术,实现设备故障的早期预测和预防,从而最大限度地提高设备的可用性和可靠性。而在…

DAY1,C高级(命令,Linux的文件系统,软、硬链接文件)

1.今日思维导图; 2.创建链接文件; 文件系统中的每个文件都与唯一的 inode 相关联,inode 存储了文件的元数据和数据块的地址,文件名与 inode 之间的链接关系称为硬链接或软链接。 硬链接文件的创建: ln 被链接文件的…

14-1_Qt 5.9 C++开发指南_网络编程及主机信息查询_HostInfo

Qt 网络模块提供了用于编写 TCP/IP 客户端和服务器端程序的各种类,如用于 TCP 通信的QTcpSocket 和 QTcpServer,用于 UDP 通信的 QUdpSocket,还有用于实现 HTTP、FTP 等普通网络协议的高级类如 QNetworkRequest,QNetworkReply 和Q…

【英杰送书-第六期】spring—加载监听器

前几天的时候,项目里有一个需求,需要一个开关控制代码中是否执行一段逻辑,于是理所当然的在yml文件中配置了一个属性作为开关,再配合nacos就可以随时改变这个值达到我们的目的,yml文件中是这样写的: switc…

SpringMVC学习记录

SpringMVC技术与servlet技术功能等同,均属于web层开发技术 SpringMVC简介 SpringMVC概述 SpringMVC是一种基于Java实现MIVC模型的轻量级web框架 优点 使用简单,开发便捷(相比于servlet)灵活性强 SpringMVC是一种表现层框架技术 Spring…

万字长文解析深度学习中的术语

引言 新手在学习深度学习或者在看深度学习论文的过程中,有不少专业词汇,软件翻译不出来,就算是翻译出来也看不懂,因为不少术语是借用其他学科的概念,这里整理了一些在深度学习中常见的术语,并对一些概念进…

一文读懂Etcd及其原理和应用场景

文章目录 0. 前言1. ETCD的概念和设计2.ETCD的命令示例查看ETCD的版本信息列出ETCD集群中的成员检查ETCD集群的健康状态获取指定key的值设置指定key的值删除指定key及其对应的值监控指定key的变化将ETCD的数据备份到指定文件中 3. ETCD的使用场景4. ETCD的优缺点5. 配置文件示例…