-
物化视图(MaterializedView)和普通视图(View)在性能和使用场景上有一些显著的差异。以下是它们的主要区别以及如何选择的建议:物化视图与普通视图的性能差异:存储方式:物化视图:实际上存储了查询结果集,因此它是一个物理存储的表。普通视图:不存储数据,每次查询时动态生成结果。查询性能:物化视图:由于数据已经预先计算并存储,查询速度通常比普通视图快。普通视图:每次查询都需要执行视图定义中的SQL语句,可能会较慢,尤其是当视图定义包含复杂逻辑时。维护成本:物化视图:需要定期刷新以保持数据的最新状态,这可能涉及到额外的维护成本。普通视图:不需要刷新,始终反映底层表的最新数据。数据一致性:物化视图:可能存在数据不一致的风险,特别是在底层数据频繁更新的情况下。普通视图:总是与底层表保持一致。写操作支持:物化视图:通常不支持INSERT、UPDATE或DELETE操作。普通视图:在满足一定条件的情况下,可能支持这些操作。如何选择:查询频率:如果某个查询非常频繁,并且查询成本较高,考虑使用物化视图。数据更新频率:如果底层数据经常变动,普通视图可能更合适,因为它们总是反映最新的数据。数据一致性需求:如果数据一致性至关重要,普通视图可能是更好的选择。维护资源:如果有足够的资源来维护物化视图的刷新,可以考虑使用物化视图来提高查询性能。写操作需求:如果需要对视图进行INSERT、UPDATE或DELETE操作,普通视图可能更合适。性能测试:在决定使用哪种视图之前,进行性能测试以评估不同视图对查询性能的影响。业务场景:根据具体的业务需求和场景来选择。例如,报表生成、数据分析等场景可能更适合使用物化视图。成本与效益分析:考虑物化视图的存储成本和刷新成本与查询性能提升之间的关系,进行综合评估。总结来说,选择物化视图还是普通视图取决于具体的业务需求、数据更新频率、查询性能要求以及维护成本。在某些情况下,两者可以结合使用,以实现最佳的性能和数据一致性。
-
在GaussDB中,优化视图的性能以提高查询效率可以通过以下方法实现:使用索引:尽管视图本身不存储数据,但可以对视图所引用的表进行索引优化。确保视图查询中涉及的表字段上有适当的索引,可以加快查询速度。避免复杂查询:视图的定义应避免过于复杂的SQL查询,如多层嵌套的子查询、复杂的连接操作等,这些都可能影响性能。使用物化视图:对于频繁访问且查询成本较高的视图,可以考虑使用物化视图(Materialized View)。物化视图会实际存储查询结果,从而避免了每次查询时的计算成本。限制视图的数据量:在创建视图时,尽量使用WHERE子句来限制返回的数据量,减少数据的传输和处理。使用WITH CHECK OPTION:使用WITH CHECK OPTION可以确保通过视图插入或更新的数据满足视图定义中的WHERE条件,从而避免无效的写操作。定期维护:定期检查和优化视图所依赖的表的统计信息和索引,保持数据库的统计信息是最新的,有助于查询优化器选择最佳的查询计划。使用合适的JOIN类型:在视图的定义中使用合适的JOIN类型,如INNER JOIN、LEFT JOIN等,根据数据的实际分布和查询需求选择合适的JOIN操作。避免使用星号(*):在定义视图时,避免使用星号(*)来选择所有列,这会导致不必要的数据加载和处理。明确指定需要的列可以提高查询效率。使用视图的替代方案:对于某些场景,可以考虑使用替代方案,如使用存储过程或函数来封装复杂的逻辑,或者使用临时表来存储中间结果。监控和分析:使用GaussDB提供的监控工具来分析查询性能,识别瓶颈,并根据分析结果进行优化。合理使用分区:如果视图所依赖的表数据量很大,可以考虑使用分区技术来管理数据,这有助于提高查询效率,尤其是在处理大型表时。
-
在GaussDB中,视图(View)和表(Table)是两种不同的数据库对象,它们各自有不同的特性和适用场景。以下是它们的主要区别以及各自适用的场景:视图(View)的特点:虚拟表:视图是一个虚拟表,它不存储数据,而是根据定义的查询结果动态生成数据。简化查询:视图可以简化复杂的SQL查询,使得用户可以通过简单的查询语句访问复杂的数据集。逻辑封装:视图可以封装复杂的业务逻辑,使得应用程序代码更简洁,逻辑更清晰。数据安全:通过视图,可以限制用户对某些数据的访问,提高数据的安全性。不可更新性:某些视图可能不允许进行INSERT、UPDATE或DELETE操作,特别是当视图定义包含聚合函数、DISTINCT、GROUP BY或HAVING等子句时。适用场景:当需要对复杂查询进行封装,以便简化用户操作时。当需要提供数据的逻辑抽象,隐藏底层表结构的复杂性时。当需要限制用户访问特定数据,提高数据安全性时。表(Table)的特点:物理存储:表是实际存储数据的数据库对象,具有固定的数据结构和存储位置。数据持久性:表中的数据是持久存储的,即使数据库关闭,数据也不会丢失。完全可操作性:表支持所有的SQL操作,包括SELECT、INSERT、UPDATE、DELETE等。性能优化:表可以通过索引、分区等数据库技术进行优化,提高查询和更新的性能。数据完整性:表可以通过设置主键、外键、唯一约束等来保证数据的完整性。适用场景:当需要存储和管理实际的数据时。当需要对数据进行复杂的操作和维护数据完整性时。当需要对数据进行性能优化,如建立索引、分区等操作时。总结视图和表各有其优势和适用场景。视图更适合用于简化查询、封装逻辑和提高数据安全性的场景,而表则更适合于实际的数据存储、操作和性能优化。在实际应用中,视图和表通常会结合使用,以满足不同的业务需求和数据管理策略。
-
快照每小时自动生成1个,如下:postgres=> select * from snapshot.snapshot; snapshot_id | start_ts | end_ts -------------+-------------------------------+------------------------------- 520373 | 2024-07-26 13:32:46.176369+08 | 2024-07-26 14:13:37.007075+08 520423 | 2024-07-28 15:33:14.359294+08 | 2024-07-28 16:09:18.124334+08 520426 | 2024-07-28 18:33:37.145366+08 | 2024-07-28 19:15:58.348715+08 520328 | 2024-07-24 16:32:23.673771+08 | 2024-07-24 17:11:45.80476+08 520329 | 2024-07-24 17:32:21.356826+08 | 2024-07-24 18:09:27.29694+08 520335 | 2024-07-24 23:32:34.126799+08 | 2024-07-25 00:06:18.783855+08 520340 | 2024-07-25 04:32:26.899023+08 | 2024-07-25 05:05:42.95102+08然后,用gsql手动生成wdr,相关命令如下:postgres=> \a \t \o wdr2024073001.html Output format is unaligned. Showing only tuples. postgres=> select generate_wdr_report(520470, 520471,'all','node','cn_5001');最终发现生成的WDR报告中,CPU_TIME等相关统计信息缺失。页面中有如下WARNING信息。有专家知道问题原因吗,帮忙解决一下?-SQL ordered by Elapsed TimeSQL ordered by Elapsed TimeList top 200 recordsAvg Elapse Time(us) represents the Average Elapsed Time of SQL between two snapshots[WARNING] Because some WDR snapshot data fails to be obtainedThe missing data affects the entire table.Unique SQL IdUser NameTotal Elapse Time(us)CallsAvg Elapse Time(us)Avg CPU Time(us)Avg Returned RowsAvg Tuples FetchedAvg Tuples ReturnedAvg Physical ReadAvg Logical ReadAvg Tuples AffectedAvg Data IO Time(us)Sort CountSort Time(us)Sort Mem Used(KB)Sort Spill CountSort Spill Size(KB)Hash CountHash Time(us)Hash Mem Used(KB)Hash Spill CountHash Spill Size(KB)SQL TextBack to SQL StatisticsBack to Report Details-SQL ordered by CPU TimeSQL ordered by Logical Reads
-
开发过程中连接gaussdb提示连接数过多,但是显示的连接数远小于配置的最大连接数,请问该如何解决,使用的是jdbc连接,使用的包是<dependency> <groupId>com.huawei.gaussdb</groupId> <artifactId>gaussdbjdbc</artifactId> <version>5.0.0-htrunk3.csi.gaussdb_kernel.opengaussjdbc.r3</version></dependency>
-
文章出自 “Gauss松鼠会小助手2”本文主要是对其干货进行一个汇总,方便大家查询GaussDB关键技术原理|高可用:逻辑复制 cid:link_22GaussDB关键技术原理:高性能(五) cid:link_0GaussDB数据库SQL系列-触发器 cid:link_1【GaussDB关键技术原理|高可用】DCF&双集群容灾 cid:link_2GaussDB数据库SQL系列-表连接(JOIN) cid:link_23GaussDB云数据库SQL应用系列—分区表管理 cid:link_24GaussDB SQL基础语法示例-GOTO语句 cid:link_3GaussDB SQL基础语法示例-循环语句 cid:link_25GaussDB SQL基础语法示例-数组表达式 cid:link_26GaussDB SQL基础语法-变量&常量 cid:link_4GaussDB SQL基础语法示例-常见的条件表达式 cid:link_27GaussDB数据库如何创建修改数据库和数据表 cid:link_28GaussDB数据库特性-物化视图简介 cid:link_29对GaussDB数据库和数据管理的简单介绍 cid:link_30GaussDB SQL基本语法示例-CASE表达式 cid:link_31GaussDB技术解读——GaussDB架构介绍(四) cid:link_5GaussDB技术解读——GaussDB架构介绍(五) cid:link_32GaussDB关键技术原理:高性能(一) cid:link_6GaussDB SQL基础语法示例-BOOLEAN表达式 cid:link_33GaussDB关键技术原理:高性能(二) cid:link_34GaussDB技术解读——GaussDB架构介绍(三) cid:link_35GaussDB技术解读——GaussDB架构介绍(一) cid:link_7GaussDB技术解读——GaussDB架构介绍(二) cid:link_36GaussDB OLTP云数据库配套工具DDM cid:link_37GaussDB OLTP云数据库配套工具DRS cid:link_8GaussDB OLTP 云数据库配套工具DAS cid:link_9GaussDB云数据库配套工具UGO cid:link_38GaussDB数据库的元数据及其管理简介 cid:link_39GaussDB数据库SQL系列-DROP & TRUNCATE & DELETE cid:link_40GaussDB数据库SQL系列-行列转换 cid:link_10【酷哥说库|GaussDB微动画】GaussDB数据库的分区表 cid:link_41【酷哥说库|GaussDB微动画】GaussDB数据库两地三中心异地容灾解决方案 cid:link_42GaussDB数据库SQL系列-数据去重 cid:link_43GaussDB数据库SQL系列-SQL与ETL浅谈 cid:link_44GaussDB数据库SQL系列-自定义函数 cid:link_45GaussDB数据库SQL系列-UNION & UNION ALL cid:link_46GaussDB OLTP云数据库配套工具DDM cid:link_11GaussDB的行存表与列存表的选择 cid:link_12GaussDB数据库SQL系列-复合查询 cid:link_47《GaussDB数据类型介绍》 cid:link_48GaussDB数据库事务介绍 cid:link_49再识华为云数据库——GaussDB cid:link_50GuassDB数据库的GRANT & REVOKE cid:link_51GaussDB云数据库SQL应用系列-基础使用 cid:link_13JDBC连接GaussDB云数据库操作示例 cid:link_14GaussDB OLTP 云数据库配套工具DAS cid:link_52GaussDB云数据库SQL应用系列-视图管理 cid:link_53GaussDB OLTP云数据库配套工具DRS cid:link_54数据库模型设计案例分享(GaussDB版) cid:link_55GaussDB云数据库SQL应用系列-视图管理 cid:link_15GaussDB数据库基础函数介绍-下 cid:link_56GaussDB数据库中的MERGE INTO介绍 cid:link_57GaussDB数据类型转换介绍 cid:link_58GaussDB数据库SQL系列-聚合函数 cid:link_16由数据插入超长引起的问题——了解GaussDB和openGauss的字符集 cid:link_17上周末D-SMART高斯生态版 cid:link_59GaussDB数据库SQL系列-LOCK TABLE cid:link_60GaussDB数据库的索引管理 cid:link_61GaussDB数据库SQL系列-动态语句 cid:link_62利用GaussDB的可观测性能力构建故障模型 cid:link_63GaussDB WDR分析之集群报告篇 cid:link_64Kylin V10 SP1安装GaussDB手册(基于云数据库GaussDB管理平台) cid:link_65openGauss 5.0版本 问题:1、怎么修改template数据库的字符集;2、为啥操作系统的字符集是UTF-8,但安装完成还,template数据库的字符集还是ASCII? cid:link_66openGauss配置文件的备份与恢复 cid:link_67openGauss逻辑备份与恢复 cid:link_68Gauss松鼠会2022半年度优秀会员评选活动启动通知 cid:link_79GaussDB数据库SQL系列-定义重载函数 cid:link_18GaussDB数据类型介绍 cid:link_69GaussDB数据库SQL系列-子查询 cid:link_70GaussDB数据库SQL系列-层次递归查询 cid:link_71 (base) PS E:\work\python\myspyder\playwright> (base) PS E:\work\python\myspyder\playwright> (base) PS E:\work\python\myspyder\playwright> (base) PS E:\work\python\myspyder\playwright> (base) PS E:\work\python\myspyder\playwright> python .\huawei_gaussdb.py Gauss松鼠会小助手2的论坛主题_云社区-华为云GaussDB关键技术原理|高可用:逻辑复制 cid:link_22GaussDB关键技术原理:高性能(五) cid:link_0GaussDB数据库SQL系列-触发器 cid:link_1【GaussDB关键技术原理|高可用】DCF&双集群容灾 cid:link_2GaussDB数据库SQL系列-表连接(JOIN) cid:link_23GaussDB云数据库SQL应用系列—分区表管理 cid:link_24GaussDB SQL基础语法示例-GOTO语句 cid:link_3GaussDB SQL基础语法示例-循环语句 cid:link_25GaussDB SQL基础语法示例-数组表达式 cid:link_26GaussDB SQL基础语法-变量&常量 cid:link_4GaussDB SQL基础语法示例-常见的条件表达式 cid:link_27GaussDB数据库如何创建修改数据库和数据表 cid:link_28GaussDB数据库特性-物化视图简介 cid:link_29对GaussDB数据库和数据管理的简单介绍 cid:link_30GaussDB SQL基本语法示例-CASE表达式 cid:link_31GaussDB技术解读——GaussDB架构介绍(四) cid:link_5GaussDB技术解读——GaussDB架构介绍(五) cid:link_32GaussDB关键技术原理:高性能(一) cid:link_6GaussDB SQL基础语法示例-BOOLEAN表达式 cid:link_33GaussDB关键技术原理:高性能(二) cid:link_34GaussDB技术解读——GaussDB架构介绍(三) cid:link_35GaussDB技术解读——GaussDB架构介绍(一) cid:link_7GaussDB技术解读——GaussDB架构介绍(二) cid:link_36GaussDB OLTP云数据库配套工具DDM cid:link_37GaussDB OLTP云数据库配套工具DRS cid:link_8GaussDB OLTP 云数据库配套工具DAS cid:link_9GaussDB云数据库配套工具UGO cid:link_38GaussDB数据库的元数据及其管理简介 cid:link_39GaussDB数据库SQL系列-DROP & TRUNCATE & DELETE cid:link_40GaussDB数据库SQL系列-行列转换 cid:link_10【酷哥说库|GaussDB微动画】GaussDB数据库的分区表 cid:link_41【酷哥说库|GaussDB微动画】GaussDB数据库两地三中心异地容灾解决方案 cid:link_42GaussDB数据库SQL系列-数据去重 cid:link_43GaussDB数据库SQL系列-SQL与ETL浅谈 cid:link_44GaussDB数据库SQL系列-自定义函数 cid:link_45GaussDB数据库SQL系列-UNION & UNION ALL cid:link_46GaussDB OLTP云数据库配套工具DDM cid:link_11GaussDB的行存表与列存表的选择 cid:link_12GaussDB数据库SQL系列-复合查询 cid:link_47《GaussDB数据类型介绍》 cid:link_48GaussDB数据库事务介绍 cid:link_49再识华为云数据库——GaussDB cid:link_50GuassDB数据库的GRANT & REVOKE cid:link_51GaussDB云数据库SQL应用系列-基础使用 cid:link_13JDBC连接GaussDB云数据库操作示例 cid:link_14GaussDB OLTP 云数据库配套工具DAS cid:link_52GaussDB云数据库SQL应用系列-视图管理 cid:link_53GaussDB OLTP云数据库配套工具DRS cid:link_54数据库模型设计案例分享(GaussDB版) cid:link_55GaussDB云数据库SQL应用系列-视图管理 cid:link_15GaussDB数据库基础函数介绍-下 cid:link_56GaussDB数据库中的MERGE INTO介绍 cid:link_57GaussDB数据类型转换介绍 cid:link_58GaussDB数据库SQL系列-聚合函数 cid:link_16由数据插入超长引起的问题——了解GaussDB和openGauss的字符集 cid:link_17上周末D-SMART高斯生态版 cid:link_59GaussDB数据库SQL系列-LOCK TABLE cid:link_60GaussDB数据库的索引管理 cid:link_61GaussDB数据库SQL系列-动态语句 cid:link_62利用GaussDB的可观测性能力构建故障模型 cid:link_63GaussDB WDR分析之集群报告篇 cid:link_64Kylin V10 SP1安装GaussDB手册(基于云数据库GaussDB管理平台) cid:link_65openGauss 5.0版本 问题:1、怎么修改template数据库的字符集;2、为啥操作系统的字符集是UTF-8,但安装完成还,template数据库的字符集还是ASCII? cid:link_66openGauss配置文件的备份与恢复 cid:link_67openGauss逻辑备份与恢复 cid:link_68Gauss松鼠会2022半年度优秀会员评选活动启动通知 cid:link_79GaussDB数据库SQL系列-定义重载函数 cid:link_18GaussDB数据类型介绍 cid:link_69GaussDB数据库SQL系列-子查询 cid:link_70GaussDB数据库SQL系列-层次递归查询 cid:link_71GaussDB关键技术原理:高性能(三) cid:link_19【GaussDB技术解读】GaussDB数据库关键技术原理文章集合,宝藏内容值得收藏 cid:link_20GaussDB关键技术原理:高性能(四) cid:link_21数据库模型设计案例分享(GaussDB版) cid:link_72GaussDB数据库SQL系列-游标管理 cid:link_73openGauss通过VIP实现的故障转移 cid:link_74DBAIOPS适配GaussDB工作顺利进行,预期3月底上线该功能 cid:link_75openGauss 5.0.0企业版一主一备安装部署 cid:link_76【酷哥说库|GaussDB微动画】GaussDB数据库透明数据加密 cid:link_77GaussDB与openGauss有什么不同? cid:link_78
-
一、GaussDB(DWS)简介GaussDB(DWS)是一款基于华为自主研发的数据库管理系统,适用于大规模数据处理和分析场景。作为一款面向企业级应用的数据库产品,GaussDB(DWS)在性能、可靠性、易用性等方面具有显著优势。二、关键技术特性2.1 存储引擎GaussDB(DWS)采用列式存储引擎,相较于传统的行式存储,列式存储在数据压缩和查询性能方面具有明显优势。它能够针对特定列进行高效压缩,减少 I/O 消耗,提高查询效率。2.2 计算引擎GaussDB(DWS)的计算引擎采用自适应的查询优化技术,能够根据实际数据分布和查询特点,自动选择最优的执行计划。此外,计算引擎还支持向量化和代码生成技术,提高 CPU 利用率和计算性能。2.3 分布式事务管理GaussDB(DWS)采用两阶段提交协议(2PC)和乐观并发控制(OCC)机制,保证分布式环境下的数据一致性和事务的原子性、一致性、隔离性和持久性。2.4 高可用与容灾能力GaussDB(DWS)通过多副本机制和故障自动切换技术,实现了系统的高可用性。即使单个节点出现故障,系统也能迅速恢复,保证业务连续性。同时,它支持跨地域的容灾部署,进一步增强了数据安全性。2.5 数据安全与隐私保护GaussDB(DWS)提供多层次的数据安全机制,包括数据加密、访问控制、审计和脱敏等功能,确保数据在存储、传输和处理过程中的安全性。2.6 弹性伸缩面对数据量的动态变化,GaussDB(DWS)支持弹性伸缩,可以根据业务需求自动或手动调整集群规模,既保证了资源的高效利用,也避免了因数据增长导致的性能瓶颈。2.7 智能优化借助于AI和机器学习技术,GaussDB(DWS)能够自动分析历史查询模式,预测并优化查询计划,实现智能化的资源分配和查询优化,从而提升整体系统性能。三、应用场景与价值3.1 大数据分析在金融、电信、电商等行业,GaussDB(DWS)能够高效处理海量数据,支持复杂的OLAP查询,助力企业快速进行市场分析、客户行为分析等,为决策提供数据支持。3.2 实时报表与BIGaussDB(DWS)支持实时查询功能,适用于对实时性要求较高的场景,如物联网、金融风控等。凭借其高速的查询响应能力,GaussDB(DWS)成为构建实时报表和BI分析系统的理想选择,帮助企业实时监控业务状况,及时发现并解决问题。3.3 数据湖分析GaussDB(DWS)可以作为数据仓库使用,支持企业构建统一的数据平台,实现数据资产的集中管理和分析。结合数据湖技术,GaussDB(DWS)可以作为数据湖上的高性能分析引擎,对原始数据进行深度挖掘,实现更广泛的数据价值发现。3.4 机器学习GaussDB(DWS)支持机器学习算法,可以为用户提供智能化的数据分析和预测服务。四、结语总而言之,GaussDB(DWS)凭借其强大的数据处理能力、高度的灵活性和卓越的扩展性,正在为众多行业提供强有力的数据分析支撑。随着大数据和AI技术的不断融合,GaussDB(DWS)无疑将在推动企业智能化转型的道路上发挥更加关键的作用。未来,期待它能在更多领域展现其技术魅力,引领数据仓库技术的新一轮变革
-
GaussDB关键技术原理|高可用:DCF&双集群容灾从DCF与双集群容灾技术两方面对GaussDB的高可用能力进行了介绍,本篇将从逻辑复制方面继续解读GaussDB高可用技术。3 逻辑复制逻辑复制属于数据复制服务(Data Replication Service,简称DRS)一种,是一种易用、稳定、高效的数据库迁移和数据库同步。逻辑复制由逻辑解码和数据复制两部分组成,逻辑解码输出以事务为单位组织的逻辑日志,业务或数据库中间件对逻辑日志进行解析回放并最终实现数据复制。逻辑复制对目标数据库的形态限制较少,支持异构数据库、同构异形数据库,且同步期间目标库可读可写。另一方面,相比数据迁移工具定期同步数据逻辑复制数据同步时延低,提供实时数据复制的能力。众所周知,在不同选型数据库或数据库不同版本间,通常在物理日志、数据存储格式等方面存在差异,差异导致无法在物理层面实现数据复制。逻辑复制解析事务物理日志(数据及其操作记录)抽取具有类SQL的逻辑日志,通过逻辑日志重放屏蔽源和目标数据库物理差异从而实现数据同步。例如 GaussDB 解析WAL日志,通过DRS工具转为SQL发送到 Oracle 执行,完成GaussDB和Oracle这种异构数据库之间数据备份,如图所示。端到端的逻辑复制分成三部分:解码源端事务物理日志从中抽取业务操作对应的逻辑日志。DRS工具将逻辑日志转换/变型成目标端支持的SQL/调用。目标端接收DRS转换的SQL/调用并高效执行实现数据复制。值的注意的是,逻辑复制不是“SQL”复制,而是复制SQL操作的结果。异构数据库的逻辑复制一般都通过SQL标准语法作为中间桥梁(共同理解的语言),从而实现异构数据库间的等价语义传递。物理复制和逻辑复制各有优劣,分别有其适用的业务场景。逻辑复制使用场景和优点主要体现在灵活、细粒度、双向、异构等,适用场景但不限于:关键数据备份(细粒度复制)、数据分发/合聚复制、异构数据在线迁移、大版本滚动升级、数据抢救找回、数据异地容灾等。但在低时延、低损耗、读写分离等一致性要求非常严格的场景,建议选择物理复制。对于逻辑复制特性,GaussDB聚焦于物理日志到逻辑日志的解码转换(提供CDC所需要的基础设施),提供多种逻辑日志格式以便于二次开发,以及提升逻辑解码和日志重放性能来降低复制时延,保证数据同步的时效性和一致性。如图所示,GaussDB针对异构数据库间逻辑复制(蓝色链路)仅提供“逻辑解码”基础能力,DRS等数据库中间件处理逻辑日志并适配目标数据库回放,协同构建完整的逻辑复制。而同构的GaussDB之间通过发布订阅(黄色链路)特性承载,消除逻辑日志中转和翻译等,实现更高效更低时延的逻辑复制。3.1 基本概念复制行标识(Replica ID)数据库复制技术进行数据同步时用于标识数据库中复制的行或记录的唯一标识符。该标识可以是一个自增数字、全局唯一的UUID或其他形式,例如:逻辑日志主键列集或者唯一索引列集。复制行标识的主要作用包括:数据一致性:通过复制行标识确保不同的数据库实例之间复制的行唯一性和一致性,避免数据冲突和重复复制。冲突解决:复制行标识定位冲突行,依据行不同内容识别正确的版本。同步跟踪:根据行标识确定哪些行已经被复制,哪些行还未被复制。GaussDB逻辑复制的行标识通过ALTER TABLE .. REPLICA IDENTITY指定四种复制行标识:DEFAULT记录主键列的旧值,没有主键则不记录。USING INDEX记录索引列的旧值,索引必须是全局唯一的、不可延迟的,并且索引列含有NOT NULL约束。FULL记录该行中所有列的旧值。NOTHING不记录有关旧行的信息。逻辑复制源逻辑复制源是逻辑复制中同步的数据库实例、库或表,通过解析和重放逻辑日志,将源数据库的数据变更复制到目标数据库。逻辑复制的源与目标之间可以是主从关系,也可以是多对多的关系;多对多关系意味着源和目标之间可以相互复制。通过给逻辑复制源赋予一个标识,重放设置逻辑日志来自的逻辑复制源标识,解码过滤重放物理日志的逻辑日志,从而避免循环无限复制。GaussDB逻辑复制源使用流程:pg_replication_origin_create()创建复制源。pg_replication_origin_session_setup()设置会话重放逻辑日志的复制源。逻辑解码指定启动选项only-local过滤重放会话的逻辑日志。补充日志解码补充日志(Supplemental Logging)并不是独立的一种日志,它是对重做记录中变更内容的补充,增加的信息量以满足逻辑解码的基本要求或增强功能。若缺少解码补充日志,逻辑解码将无法正常工作。补充日志通常有:行标识、版本信息、事务用户等。GaussDB通过GUC参数WAL_LEVEL=logical调整物理日志记录级别,配置系统记录解码补充日志(重启生效) 。同时,该参数生效时阻塞AUTO VACCUM提前回收系统表中逻辑解码依赖的旧版本对象信息(被删除行)。增量复制相对全量复制,增量复制仅仅处理全量后被修改的增量(插、删、改)数据。逻辑解码通过解析增量的物理日志提取逻辑操作,提供一套完整的全量和增量数据的衔接,保证逻辑复制的数据完整性。GaussDB创建逻辑复制槽用于新建一个逻辑解码任务,返回的查询快照可以用于构建解码相关的全量复制数据。3.2 逻辑解码逻辑解码是一项数据库技术,用于将数据库的事务日志解析为易于理解和处理的格式。它允许用户对数据库操作进行实时监控、数据变更跟踪和数据复制等应用。当启用逻辑解码时,GaussDB将每个事务的基本操作和解码辅助信息记录到事务日志中,并以一种结构化的方式存储。这些事务(物理)日志包含数据库中发生的所有数据变更的细节,包括插入、更新和删除等操作,同时包含了诸多用户理解不友好的数据库内部细节和特有实现。逻辑解码通过输出格式插件形式将这些事务日志解析为易于理解的格式,例如JSON或自定义二进制格式等多种更高级别的事件或操作,使得用户可以根据自身需求来解析和处理这些数据变更事件。物理日志和系统表对象元数据是逻辑解码的内容来源。逻辑解码从物理日志捕获用户表DML的变更记录,依据其中的物理存储标识(relfilenode)和记录时系统提交序号(CSN)到加载系统表对应时刻的对象元信息;继而将物理变更记录中强耦合的内部信息转换为用户可理解的表内容,生成和数据库实现无关的逻辑变更记录;最后重排和发送逻辑变更记录。如上图所示,逻辑解码实现涉及五大部分:(1)修改内核配置支持逻辑解码,设置捕获表复制行标识。(2)创建逻辑解码任务——逻辑复制槽。(3)生成用于逻辑解码的物理日志,阻塞回收系统表旧版本对象元数据。(4)启动逻辑解码从物理日志中抽取用户期望格式的逻辑日志。(5)重排汇总事务逻辑日志,以事务为单位按照提交顺序发送逻辑日志。GaussDB提供两种获取逻辑日志的接口:函数解码和流式解码。函数解码属于用户多次执行SQL拉取(PULL),SQL调用系统解码函数按照数据集的方式返回逻辑日志;流式解码不同于函数解码,内核持续不断的解码并PUSH逻辑日志,用户侧从数据流中不断接收逻辑日志。当前函数解码只支持串行解码,流式解码支持串行和并行解码;流式解码相对函数解码性能好时延低,更适用于实时同步的业务场景。当前JDBC驱动封装逻辑复制接口,流式解码流程大致如图所示:(1)复制业务或工具设定解码选项,通过JDBC封装接口启动内核逻辑解码,得到获取逻辑日志的数据流;(2)内核解析选项启动逻辑解码,处理存量物理日志并监测新日志产生,持续抽取逻辑日志并将其推送(PUSH)到数据流;(3)复制业务或工具从数据流中读取(readPending)逻辑日志进行处理或传递下游;(4)完成逻辑日志处理,复制业务或工具反馈(setFlushedLSN+forceUpdateStatus)内核来推进逻辑解码任务,后续启动解码将不再发送已处理的逻辑日志。注意:复制业务或工具若是提前反馈,内核推进了逻辑解码任务可能导致数据丢失;若是不反馈或者反馈周期较长,内核将出现物理日志堆积和系统表膨胀影响正常业务。3.3 备机解码逻辑解码读取物理日志消耗大量IO,逻辑日志生成消耗大量CPU,是一个资源密集型功能。考虑逻辑解码读取的物理日志和系统表,属于“读”操作不会产生数据变更,若在备机逻辑解码将会规避使用主机资源,降低对在线业务的影响。备机逻辑解码实现需要解决:(1)可以加载哪些物理日志解码;(2)解码是否可以读取系统表的历史版本元组;(3)推进逻辑复制槽的“写”如何实现。针对(1),虽然解码到事务提交才将事务逻辑日志返回给下游客户,但没有达成大多数派的物理日志不能参与逻辑解码。针对(2),逻辑解码依赖备机读功能,要求并行回放、极致RTO场景实现系统表的历史版本一致性访问。因此,备机解码加载的物理日志不超过ReplayLSN,保证解码日志所需的系统表可以正常读取。针对(3),备机解码首先根据客户反馈推进本地逻辑复制槽,然后创建内部到主机的连接使用复制advance协议推进逻辑复制槽,并通过物理日志实现与其他备机的逻辑复制槽同步。3.4 并行解码通过分析串行解码,逻辑解码三个主要步骤(读取日志、解码日志、发送日志)中的解码日志耗时占整个流程的70%以上,成为性能瓶颈。解码日志阶段属于CPU密集型业务,并行解码利用多线程并发技术,极大提高了逻辑解码吞吐量。并行解码基于日志粒度实现并行,如图所示,它包含三类线程:Reader线程读取物理日志,抽取业务DML操作以及解码必要内容构建LogicalLogChange变更,完成TOAST元组拼接并在主表的元组展开,轮询分发到Decoder线程的输入队列;Decoder线程从输入队列获取LogicalLogChange,根据日志版本内容加载数据表的元信息,将日志中物理数据转换成表名、列名、列数据外部形式等用户易理解的逻辑数据,传递转换后LogicalLog到输出队列;Sender线程按照DML日志生成顺序收集解码后的LogicalLog,根据事务ID桶排序进行汇总,以事务的提交顺序发送逻辑日志。并行解码解除了串行解码可见性判断逻辑需要构建活跃事务链表快照的依赖,基于CSN轻量化可见性判断逻辑极大简化了并行解码元数据加载。并行解码Reader和Decoder线程过程中访问系统表加载并缓存解码元数据;由于业务DDL引起元数据发生变更,Reader线程在DDL日志或事务结束时失效本地相应缓存,并将失效消息加入Decoder线程输入队列,广播通知Decoder线程失效缓存。3.5 一致性解码事务CSN改造优化快照获取消除gtm瓶颈,GaussDB对业务可见性的事务一致性序CommitCSN。为保证基于逻辑复制的备机数据对业务可见性和主机一致,逻辑解码提供基于事务CommitCSN有序发送逻辑日志,并根据下游反馈推进逻辑复制槽,回收系统表旧版本元组和物理日志。逻辑解码流式加载物理日志抽取逻辑日志,按照CommitLSN有序完成事务解析。考虑事务并发场景下先分配CommitCSN的事务不一定先获取锁写入物理日志,逻辑解码按照日志产生顺序从事务提交日志获取的CommitCSN并不保证有序递增。为了实现按照CommitCSN有序发送事务逻辑日志, 逻辑解码解析到事务提交日志发送前需要识别是否存在CommitCSN比该事务小的事务,优先发送较小CommitCSN事务的逻辑日志。如图所示,逻辑解码在发送逻辑日志进行事务重排逻辑:(1)新增两个双链表toplevel_by_committing_csn和toplevel_by_csn,记录正在提交的事务和已经提交待发送的事务。(2)解码事务句柄新增dependTxnCnt字段记录依赖该事务的数量,新增referTxns单链表记录依赖该事务的事务句柄。(3)解析事务的COMMITTING日志时,将事务按照committingCSN有序添加到toplevel_by_committing_csn链表。(4)解析到事务的COMMIT日志时:将当前事务从toplevel_by_committing_csn移除,所有等待该事务的事务等待计数dependTxnCnt减1;从头往尾遍历toplevel_by_committing_csn,将当前事务添加到CommittingCSN小于当前事务Commit CSN的事务的referTxns链表,并让其dependTxnCnt加1;从尾往头遍历,将当前事务按照CommitCSN有序添加到toplevel_by_csn链表;从头往尾遍历toplevel_by_csn,若事务dependTxnCnt为0,则从链表移除并发送其逻辑日志;直到遇到事务dependTxnCnt不为0或到达链表末尾。3.6 分布式解码事务提交顺序(CommitCSN)代表事务完成的先后顺序。对于有依赖两个事务,后执行事务的CommitCSN大于先执行事务的CommitCSN。若逻辑回放按照CommitCSN从小到大执行,实现业务视角的数据强一致性。分布式逻辑解码按照CommitCSN有序返回事务的逻辑日志,提供逻辑复制数据强一致的基础。如图所示,多DN各自按照事务提交顺序(CommitCSN)返回局部事务的逻辑日志,CN通过堆排序协调汇总来自多DN的事务逻辑日志,CN和DN配合提供全局分布式事务提交顺序(CommitCSN)有序的事务逻辑日志。CN逻辑解码可简单归纳为:从每个DN读取下一个待发送事务的CommitCSN(DN逻辑解码保证下一个事务是该DN CommitCSN最小的事务),通过堆排序查找所有DN中最小CommitCSN的事务,返回该事务的所有逻辑日志给业务。分布式事务涉及多DN的数据变化,每个DN相关事务拥有不同的事务号,但涉及DN所有事务拥有相同的分布式事务提交顺序(CommitCSN)序号。分布式事务对业务来说是一个完整的事务,分布式逻辑解码不能因分布式事务涉及数据分布在多个DN而拆分多个事务,而应该合并多DN的事务逻辑日志作为一个完整的事务。分布式事务的多DN事务逻辑日志合并需要考虑:(1) 多DN之间逻辑日志间的先后关系;(2)逻辑日志先后无关时DN间解码快慢差异。通过堆排序键<CommitCSN, CID, BATCH_ID>阐述相关问题和方案策略。CommitCSN:作为堆排序第一个键,实现按照CommitCSN的顺序返回事务的逻辑日志。CN发送时每次获取小顶堆的堆顶事务,返回来自DN该事务的所有逻辑日志,再根据该DN下一个事务的CommitCSN重新调整堆为小顶堆。CID:Command ID。DDL将单个DN的事务逻辑日志拆分成多个区段,每个区段表的元数据有差异,合并分布式事务在多个DN的逻辑日志需要按照DDL划分的区段进行合并。另外,虽然当前主键必须包含分布键且不允许更新分布键,DN节点内解码保证了主键唯一性的事务前后依赖(按照LSN返回事务的逻辑日志),但是分布式事务在多DN之间的DML操作也可能存在依赖关系。例如:业务操作全局唯一索引先在DN-1删除后在DN-2插入,如果CN逻辑解码合并事务成先在DN-2插入后在DN-1删除,逻辑日志回放出现违反唯一性约束错误。针对DDL和DML混合事务场景,CN汇总DN逻辑日志引入事务CID,实现事务间按照CommitCSN排序、事务内按照CID排序。BATCH_ID:分布式事务同一个SQL可能在不同DN产生众多逻辑日志,考虑DN解码性能和网络状况差异,CN若是在没有收到某DN所需所有逻辑日志之前能够返回其他DN节点该事务CID的就绪逻辑日志,可以减少CN不必要的等待,提升CN逻辑日志汇总性能。引入分布式事务的日志批次编号BATCH_ID,当CN返回DN就绪的某事务某CID的逻辑日志后,仍没有遇到DN该事务下一个CID或下一个事务,则更新该DN发送批次BATCH_ID。同事务同CID其他DN将被调整到堆顶,实现优先发送其他DN已就绪的逻辑日志。逻辑解码在较长时间没有和客户端通信时主动给客户端侧发送keepalive消息,要求客户端侧回复该消息;若是客户端没有回复keepalive消息,逻辑解码主动断开和客户侧的连接,避免客户端hang住长时间占有逻辑复制槽,导致业务无法及时切换启动新的逻辑解码任务。分布式逻辑解码采用多线程异步接收+多DN事务逻辑日志队列,CN及时响应DN发送的keepalive消息,同时减少获取DN事务逻辑日志的同步等待。当DN逻辑解码异常退出,CN将屏蔽集群内部异常,自动连接DN启动解码和异常恢复。以上内容从逻辑复制方面对GaussDB的高可用能力进行了解读,下篇将从两地三中心跨Region容灾方面继续介绍GaussDB高可用相关技术,敬请期待!
-
调度文件无法修改,没法保存
-
救救我,救救我。很奇怪,开始提示是/user/lib64也不存在,建完了之后提示/lib64
-
大神们帮忙看看,很奇怪。
-
GaussDB关键技术原理:高性能篇,从GaussDB数据库性能优化系统概述、查询处理综述、高性能关键技术等方面为大家进行了解读,并对高斯数据库性能优化做了总结。本篇将分享GaussDB高可用方面的相关知识,详细介绍GaussDB的DCF与双集群容灾技术。1 DCF DCF是Distributed Consensus Framework的简称,它是自研分布式一致性共识框架,基于Paxos协议开发,实现多数派节点自选主自仲裁、日志复制、一致性控制等高可用功能。 1.1 DCF(Distributed Consensus Framework)分布式一致性共识框架 DCF部署于gaussdb进程,以动态库形式提供给DN调用,实现DN节点间自选主自仲裁、XLOG日志复制、回放控制等。DCF主要设计特点如下: 独立API数据复制与内核逻辑隔离; 基于Paxos一致性协议实现日志多副本复制,实现跨AZ极致高可用; 支持多种节点角色:leader、follower、candidate、passive、logger; 支持多日志流通道,支持DN粒度和分区粒度日志分组复制能力; DCF内部实现通过多处的pipeline、batching、compress等手段提升整体性能。 1.2 DCF功能架构 DCF通过上层API提供给DB kernel调用,在DCF内部主要功能模块如下: 接口:对外提供写入、查询、注册回调等接口 选举:负责主节点的选举、心跳维持、状态通知 复制:负责日志的复制、提交、达成一致控制 元数据:负责管理集群配置信息 存储:负责日志数据的缓存管理和持久化 通信:提供节点间的数据通信功能,并支持压缩解压和SSL能力 基础库:提供线程、日志、锁、队列、定时器等基础能力 1.3 DCF选举流程及优化 选举流程介绍: 除了配置为不可当主的角色(logger、passive)外,启动时各节点一般默认是备机follower角色。节点启动后如果没有收到主节点的心跳,则达到选举超时时间后节点就会发起选主请求,如果节点收集到超过半数节点的应答则可升主。节点升主后会定期给其他节点发送心跳维持权威,其他节点收到心跳后作为备机工作。 每次选出新主都会产生一个新的任期term,这个term是单调递增的。当后续重新选主,term会跟着变大。 如果主节点故障,无法继续发送心跳,其他节点达到选举超时时间后会发起新一轮选举,集群选出新主,继续对外提供服务。 预选举优化: 为防止网络断连导致节点频繁发起选主请求造成term持续增加,采用了优化方案:在Follower变为Candidate前加入pre-candidate状态,发起term不变的预选举流程,成功后才将term增加发起正式选主流程,避免无效的term增加。 租约优化: Leader与多数派断连主动降备,防止出现事实双主。 在lease时间内不再响应新的选主消息,保证选主可靠性。 1.4 DCF日志复制流程 复制流程介绍: 在集群有主的情况下,上层可以调用DCF写接口将日志写给DCF主节点,DCF主节点将日志复制给各个备机,日志并行在主机和各备机落盘,主机收集自身和各备机日志落盘的位置,从而计算得到达成多数派一致性的日志落盘位置,即一致性点。主机会将一致性点同步给备机,整个过程异步、并行、流水线处理。各个节点都有了实时一致性点,主机可以利用一致性点控制业务提交、脏页刷盘、checkpoint等流程,备机可以利用一致性点控制XLOG日志回放,保证业务一致性、各节点不分叉。 1.5 DCF优先级选主和策略化多数派 优先级选主: (1)根据用户指定的AZ和节点优先级顺序,通过节点间信息交互及日志索取机制实现了确定性优先级选主。 (2)高优先级节点异常时,其他节点秒级感知,保证选主RTO。 (3)策略化多数派。 (4)支持灵活动态的策略化多数派,可通过参数配置。 (5)在发生AZ级或城市级故障时,能够在其他AZ选出新主,不丢失数据。 1.6 DCF性能设计 异步流水线: 日志采用全异步pipeline方式进行发送,不采用一问一答同步方式,且支持报文合并发送,提高系统整体吞吐量; Leader发送完一批log之后,记录发送位置,下次发送从这个位置持续发送,不用等follower响应回来; Follower落盘线程写完一批log之后,将最新的落盘点发送给leader,持续反馈最新的落盘点; Leader通过各节点的最新落盘点,推进一致性点。 数据合并与压缩: 报文收发和工作线程采用异步pipeline; 基于端到端共识流控算法自适应调整batch size、 pipeline并发数,提升系统最大吞吐量; 支持将报文按不同压缩算法进行压缩发送,减少网络带宽。 批量并行落盘: 应用端调用write接口,写入内存buffer就返回,不阻塞应用流程处理; 批量写盘和批量发送,日志到buffer之后,并行的将日志落入本地磁盘和发送到follower节点。 1.7 DCF日志与XLOG日志合一设计 为了减少磁盘空间和IO带宽占用、优化性能,我们进行了DCF日志与XLOG日志合一设计,实现XLOG日志只写一份。 DCF日志头和配置日志放在DCF侧(称为控制日志ctrllog)以方便DCF内部处理,XLOG日志格式和之前保持兼容。ctrllog和XLOG建立内部索引关系,相比XLOG其日志量可以忽略不计。 使用XLOG刷盘点计算多数派一致性点,控制业务提交;XLOG刷盘点也是选主的依据。DCF控制日志刷盘以方便业务处理和故障恢复逻辑,限制DCF控制日志刷盘频率避免对XLOG刷盘影响,保证整体性能。 1.8 DCF异常场景处理,高可靠 Leader故障 如图,三节点集群,红色节点表示主机、蓝色表示备机,各节点旁边数字第一行表示日志index,第二行表示任期term,每一列表示一条日志。 leader节点宕机,导致Leader心跳发送停止,日志复制停止。 Follower检测到心跳超时,转换为candidate,发起新任期选举。 Follower若接收到其他节点发起的选举,则判断任期和日志长度,确定是否投票给它。 candidate若得到超过半数的选票,则成为leader,拥有新的任期term。 新leader开始将自己的日志发送给其他follower。 Follower接收新leader来的日志信息,判断日志是否跟自己连续匹配,连续匹配则接受。若不连续则返回,leader重新发送前段日志;若term不匹配,则将新leader的日志覆盖到原来的位置,并将后面的日志truncate掉。最终所有节点的日志都是一致的。 网络分区 五节点集群,分裂为3+2,如图所示: 集群脑裂,分裂出两个小集群。 2节点小集群存在一个原leader,3节点新集群选举一个新leader,任期增1。 原leader无法达成大多数一致,日志无法提交,一定时间内会降备。 新leader能接受写请求进行写入操作,能够达成一致,进行日志提交。 脑裂消失之后,新leader的日志复制给旧leader,将旧leader未提交日志覆盖,集群正常。 2 双集群容灾 GaussDB 双集群容灾方案,是GaussDB提供的一种新架构和部署方式的容灾技术。在已有的容灾方案中,多采用单集群多副本的模式进行跨AZ部署,无法做到故障隔离,类似于集群管理组件的故障或其他区域性的故障将导致整个集群服务不可用;对于传统的基于网络的日志同步方式,数据库主备节点间地理距离的增大将导致传输时延的大幅度增加,直接影响到生产服务的性能。同时,金融、银行业对数据安全有着较高的要求,需要最大限度地保证数据的安全性以及服务的可用性。因此,GaussDB提供了支持RPO=0的数据库双集群容灾方案,即主集群在出现故障的情况下,备集群还具备继续提供服务的能力,当发生自然或人为灾难时,保护数据并快速进行恢复,对数据丢失零容忍。 数据中心架构 双集群部署方式,即每个数据中心分别部署一套独立的GaussDB数据库集群,其中一个数据库集群作为生产集群,提供读和写服务,另一个集群作为灾备集群。 每个数据中心都分别有一个独立的Region和AZ,用来部署GaussDB数据库集群。全量build同步通过云内跨Region跨VPC的BMS之间的网络承载,增量日志同步通过Dorado之间的主备复制承载。 主集群的Redo日志通过网络同步到备集群的存储设备中,主集群的备节点从存储设备中读取Redo日志并进行回放,备集群的备节点从所在分片的存储设备中读取Redo日志并进行回放。当数据库主节点写入的日志同步到备集群的存储设备之后,主节点的事务才会被提交,从而确保了集群切换RPO=0的性能指标。 数据存储不使用本地盘,而是采用Dorado(全闪存共享存储阵列),即每个GaussDB数据库集群都配置一套独立的Dorado作为存储;两套Dorado之间采用主备同步复制,数据复制的模式支持最大保护模式和最大可用模式。 数据中心内部实例级故障时,RPO=0、RTO<=30秒;跨数据中心集群间容灾时,RPO=0、RTO<=60秒。 在同城双集群容灾的基础上,可以和异地集群组成跨Region容灾,即增加一个异地的灾备中心,用于对同城双中心的数据备份,形成两地三中心的容灾解决方案。 核心优势 金融级高可用:支持RPO=0 、RTO<60s的容灾切换,保障业务的安全性和可靠性。当主集群发生故障时,备集群能够数据无损地快速完成切换,替代主集群继续提供生产服务。 高性能:第一,采用物理日志同步相对于逻辑日志同步性能可提升10倍;第二,通过Dorado存储硬件实现集群间日志的快速同步,利用Dorado固有网络协议(密集波分),降低网络时延一倍以上,同时利用Dorado存储的缓存能力,日志写入即刻持久化,降低了事务提交时延。 高可靠:数据安全实现双保险,一方面数据库内核的多副本保障了故障自动切换和恢复,不中断业务;另一方面,存储内核保障了磁盘亚健康、故障容错、硬件自愈等能力。 架构先进性:通过数据库内部计算与存储分离,将存储管理放到下层共享存储中,从而解决数据同步带来的延时问题,并同时增加了计算能力的横向扩展性。 集群隔离:数据库集群间解耦,故障域隔离从而避免全局性的网络故障;集群间版本隔离,避免Bug污染,能够快速回切;集群间资源隔离,按照Region进行资源管理和调度,方便数据库管理员对数据库系统资源使用进行规范和约束。 双集群容灾方案进一步提升了GaussDB的高可用能力,特别是针对性能和稳定性有更高要求的金融核心业务场景,提供了安全可靠的数据库服务,使数据库无惧灾难,为用户的生产业务保驾护航。 以上内容从DCF与双集群容灾技术两方面对GaussDB的高可用能力进行了解读,下篇将从逻辑复制方面继续介绍GaussDB高可用相关技术,敬请期待!
-
请问PostgreSQL 9.2.4 (GaussDB 8.1.3 build dda5d0f6)能否支持本地下载安装,进行业务开发调试?
-
时间范围分区表,怎么样创建表,让表根据数据,自动创建对应分区,比如 ,2024-12-01数据进来,就创建当日的分区。我的语句 CREATE table t2( gddwm VARCHAR2(20), sjsj date )partition by RANGE("sjsj") INTERVAL('1 day') ( PARTITION "P_20240101" VALUES LESS THAN(TO_DATE('2024-01-02 00:00:00','YYYY-MM-DD HH24:MI:SS')), PARTITION "P_20240102" VALUES LESS THAN(TO_DATE('2024-01-03 00:00:00','YYYY-MM-DD HH24:MI:SS')), PARTITION "P_20240103" VALUES LESS THAN(TO_DATE('2024-01-04 00:00:00','YYYY-MM-DD HH24:MI:SS')) ); 主备版本报错,ERROR:Interval partitioned table is only supported in single-node mode. 有什么替代方法?
-
一、引言openGauss 是一款开源关系型数据库管理系统,广泛应用于企业级应用中。随着数据量的增长和业务逻辑的复杂化,数据库管理和操作的自动化需求越来越高。存储过程(Stored Procedures)作为数据库中重要的编程工具,能够极大地简化复杂操作,提高系统的性能和安全性。本文将详细介绍 openGauss 的存储过程,并提供具体的代码和案例,以帮助读者更好地理解和应用这些工具。二、存储过程1. 什么是存储过程存储过程是一组预先编写好的 SQL 语句集合,存储在数据库中,可以通过调用存储过程来执行一系列操作。存储过程能够简化复杂的数据库操作,减少代码重复,提高效率。此外,存储过程运行在数据库服务器端,这意味着可以减少客户端和服务器之间的通信开销,提高执行效率。存储过程的特点包括:封装性:将一系列操作封装在一个过程里,简化调用。重用性:定义一次,可以在多个地方调用,减少代码重复。安全性:通过存储过程可以控制访问权限,提高数据安全性。性能:减少客户端和服务器之间的通信,执行效率高。2. 创建和使用存储过程在 openGauss 中,创建存储过程使用 CREATE PROCEDURE 语句。一个存储过程可以包含多个输入参数、输出参数,甚至没有参数。下面是一个详细的例子,演示如何创建和调用存储过程。创建员工表-- 创建员工表CREATE TABLE employees (id INT PRIMARY KEY,name VARCHAR(100),salary NUMERIC(15, 2),department VARCHAR(100));创建存储过程-- 创建插入员工的存储过程CREATE OR REPLACE PROCEDURE add_employee(emp_id INT,emp_name VARCHAR,emp_salary NUMERIC,emp_department VARCHAR)LANGUAGE plpgsql AS $$BEGININSERT INTO employees (id, name, salary, department)VALUES (emp_id, emp_name, emp_salary, emp_department);END;$$;-- 创建更新触发器函数-- 创建更新员工的存储过程CREATE OR REPLACE PROCEDURE update_employee(emp_id INT,emp_name VARCHAR,emp_salary NUMERIC,emp_department VARCHAR)LANGUAGE plpgsqlAS $$BEGINUPDATE employeesSET name = emp_name, salary = emp_salary, department = emp_departmentWHERE id = emp_id;END;$$;-- 创建删除员工的存储过程CREATE OR REPLACE PROCEDURE delete_employee(emp_id INT)LANGUAGE plpgsqlAS $$BEGINDELETE FROM employeesWHERE id = emp_id;END;$$;-- 创建查询员工的存储过程CREATE OR REPLACE PROCEDURE get_employee(emp_id INT)LANGUAGE plpgsqlAS $$BEGINPERFORM * FROM employees WHERE id = emp_id;END;$$;调用存储过程-- 调用存储过程插入员工CALL add_employee(1, 'John Doe', 50000, 'Engineering');-- 调用存储过程更新员工CALL update_employee(1, 'John Doe', 55000, 'Marketing');-- 调用存储过程删除员工CALL delete_employee(1);-- 调用存储过程查询员工CALL get_employee(1);3. 存储过程的高级应用存储过程不仅可以简化常见的增删改查操作,还可以用于更复杂的业务逻辑处理。以下是一些存储过程的高级应用场景:批量数据处理在实际业务中,经常需要对大量数据进行批量处理,如批量插入、批量更新等。使用存储过程可以极大地简化这些操作,并提高执行效率。-- 定义员工记录的复合类型CREATE TYPE emp_record AS (id INT,name VARCHAR(100),salary NUMERIC(15, 2),department VARCHAR(100));-- 创建批量插入员工的存储过程CREATE OR REPLACE PROCEDURE batch_insert_employees(emp_records emp_record[])LANGUAGE plpgsqlAS $$DECLARErec emp_record;BEGINFOREACH rec IN ARRAY emp_recordsLOOPINSERT INTO employees (id, name, salary, department)VALUES (rec.id, rec.name, rec.salary, rec.department);END LOOP;END;$$;-- 调用批量插入存储过程CALL batch_insert_employees(ARRAY[ROW(2, 'Jane Doe', 60000, 'HR')::emp_record,ROW(3, 'Alice', 70000, 'Finance')::emp_record,ROW(4, 'Bob', 80000, 'IT')::emp_record]);数据校验和清洗在存储过程中可以添加数据校验和清洗的逻辑,确保插入数据库的数据的完整性和准确性。例如,可以在插入员工数据前,检查数据是否符合业务规则。CREATE OR REPLACE PROCEDURE add_employee_with_validation(emp_id INT,emp_name VARCHAR,emp_salary NUMERIC,emp_department VARCHAR)LANGUAGE plpgsqlAS $$BEGINIF emp_salary < 0 THENRAISE EXCEPTION 'Salary cannot be negative';END IF;IF emp_department IS NULL THENRAISE EXCEPTION 'Department cannot be null';END IF;INSERT INTO employees (id, name, salary, department)VALUES (emp_id, emp_name, emp_salary, emp_department);END;$$;-- 调用存储过程插入员工CALL add_employee_with_validation(5, 'Charlie', 5000, 'Sales');自动化任务存储过程可以用于自动化任务,如定时任务、数据备份等。可以结合数据库调度器(如 cron 表达式)来实现定时调用存储过程,完成自动化管理。-- 定时任务:每天凌晨2点备份员工表CREATE OR REPLACE PROCEDURE backup_employees()LANGUAGE plpgsqlAS $$BEGINEXECUTE 'COPY employees TO ''/path/to/backup/employees_' || to_char(current_date, 'YYYYMMDD') || '.csv'' WITH CSV HEADER';END;$$;
上滑加载中
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第五期2026/09/04 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;蒋春阳-华为云AI开发者案例开发专家
本期直播内容: AI工具体验营 · 第5-8课连讲。Agent-Team 多智能体协作完成毕业设计实践
回顾中 -
华为云开发者AI素养ClassRoom·第六期2026/09/08 周二 19:00-20:00
樊渊-2026华为软件挑战赛冠军
高手来了:看软挑高手解析二维排样问题—从工业难题到算法突破
回顾中
热门标签