-
DataKit可获得性本特性自openGauss 5.0.0版本开始引入。特性简介DataKit是基于Web的openGauss的可视化的平台系统,目的是方便客户使用和管理openGauss可视化工具,可以为客户降低openGauss数据库安装使用门槛,做到安全中心管理,插件管理,以及其它功能包括一键化部署、卸载、组件化安装、多版本升级、日常运维和。客户价值openGauss的安装、运维场景对于初级用户或单纯想要测试openGauss数据库基本特性的使用者来说技术难度较大、过程较为复杂、学习曲线较为陡峭,尤其企业版安装对一般用户来说操作难度很大。使用可视化运维平台可以屏蔽openGauss的技术细节,让普通用户能够快速上手体验功能,让运维人员能够快速在企业环境中部署、卸载各类openGauss集群,减少了用户的学习成本和运维成本,实现了对openGauss各种常见操作的可视化,屏蔽了各种不同openGauss版本中的运维命令差异,可以让用户使用相同的方式操作数据库,不用知道命令细节也可以使用openGauss数据库的各项能力,让用户可以专注于自身的业务领域。特性描述DataKit是基于Web的openGauss的可视化的平台系统,目的是方便客户使用和管理openGauss可视化工具,可以为客户降低openGauss数据库安装使用门槛,做到安全中心管理,插件管理,以及其它功能包括一键化部署、卸载、组件化安装、多版本升级、日常运维和。特性增强业务开发插件:1、增强数据库对象管理:1)函数/过程调试能力:支持子函数进入/退出调试、调试存储过程覆盖度查看、导航栏显示package、调试package里的函数/过程2)视图管理:支持编辑视图名称/模式/代码3)模式管理:支持创建/编辑/删除模式4)支持普通表和分区表管理:表数据:增/删/改/条件筛选/排序筛选/分页查询数据、导入表数据 表管理:列/索引/约束的增/删/改/查、清空/截断/删除/分析表5)导出DDL和数据:支持导出模式DDL/DDL和数据、导出函数/过程DDL、导出表DDL/DDL和数据/数据、导出序列DDL/DDL和数据、导出视图DDL6)用户/角色管理:支持创建/删除用户/角色2、增强SQL终端管理:支持导入/导出SQL脚本、SQL助手、切换连接终端、重命名终端、查询执行历史3、页面窗口优化:窗口支持拖动实例监控插件:1、完善监控指标体系和下钻能力,增强从指标分析问题的能力2、支持集群的健康、延迟和资源压力监控3、支持通过ASP分析历史数据库问题智能诊断插件:1、支持基于专家知识库、历史视图和指标分析历史问题,智能给出问题根因与优化建议2、优化SQL诊断任务流程,丰富诊断知识库告警监控:1、支持多种通知渠道,支持自定义通知内容2、提供内置规则和自定义规则,支持基于指标和日志的告警3、可通过模板、配置等功能对不同数据库灵活配置所需的告警规则
-
openGauss- 参数调优与诊断可获得性本特性自openGauss 1.0.0版本开始引入特性简介本功能是一款数据库集成的参数调优工具,通过结合深度强化学习和全局搜索算法等AI技术,实现在无需人工干预的情况下,获取最佳数据库参数配置。本功能不强制与数据库环境部署到一起,支持独立部署,脱离数据库安装环境独立运行。客户价值该工具可以在任意场景下,快速给出当前负载的调参配置,减少DBA的人工干预,提升运维效果,满足客户期望。特性描述调优程序包含三种运行模式,分别是:recommend: 通过用户指定的用户名等信息登录到数据库环境中,获取当前正在运行的workload特征信息,根据上述特征信息生成参数推荐报告。报告当前数据库中不合理的参数配置和潜在风险等;输出根据当前正在运行的workload行为和特征;输出推荐的参数配置。该模式是秒级的,不涉及数据库的重启操作,其他模式可能需要反复重启数据库。train: 通过用户提供的benchmark信息,不断地进行参数修改和benchmark的执行。通过反复的迭代过程,训练强化学习模型,以便用户在后面通过tune模式加载该模型进行调优。tune: 使用优化算法进行数据库参数的调优,当前支持两大类算法,一种是深度强化学习,另一种是全局搜索算法(全局优化算法)。深度强化学习模式要求先运行train模式,生成训练后的调优模型,而使用全局搜索算法则不需要提前进行训练,可以直接进行搜索调优。特性增强 无特性约束数据库状态正常、客户端能够正常连接、且要求数据库内导入数据,以便调优程序可以执行benchmark测试调优效果。使用本工具需要指定登录到数据库的用户身份,要求该登录到数据库上的用户具有足够的权限,以便可以获得充足的数据库状态信息。使用登录到数据库宿主机上的Linux用户,需要将$GAUSSHOME/bin添加到PATH环境变量中,即能够直接运行gsql、gs_guc、gs_ctl等数据库运维工具。Python版本建议为Python3.6及以上,且运行环境中已经安装相应依赖,并能够正常启动调优程序。您可以独立安装一个python3.6+的环境,无需设置到全局环境变量中。不建议使用root用户权限安装本工具,如果以root身份安装本完毕工具,使用其他用户身份运行本工具时,需要确保配置文件有读取权限。本工具支持以三种模式运行,其中tune和train模式要求用户配置好benchmark运行环境,并导入数据,本工具将会通过迭代运行benchmark来判断修改后的参数是否有性能提升。recommend模式建议在数据库正在执行workload的过程中执行,以便获得更准确的实时workload信息。本工具默认带有TPC-C、TPC-H、TPC-DS以及sysbench的benchmark运行脚本样例,如果用户使用上述benchmark对数据库系统进行压力测试,则可以对上述配置文件进行适度修改或配置。如果需要适配用户自己的业务场景,需要您参照benchmark目录中的template.py文件编写驱动您自定义benchmark的脚本文件。依赖关系无详情查看:cid:link_1详情查看:cid:link_0
-
[openGauss] 堆表支持预读可获得性本特性自openGauss 6.0.0-RC1版本开始引入。特性简介在对堆表进行扫描进行顺序页面读取时,通过一次行读入多个页面,来减少因频繁读单页的IO损耗,提升对堆表进行线性扫描的性能表现。客户价值提升客户在频繁进行全表线性扫描场景下的性能表现。特性描述在对数据库中的堆表进行线性扫描时,系统会将磁盘中的页面逐一读入内存。如果待扫描的堆表数据量巨大,频繁地访问磁盘会导致显著的性能损耗。为了解决这一问题,引入了预读功能。预读是指在对磁盘文件进行扫描时,操作系统不是逐个页面地读取,而是通过一次磁盘IO操作读取多个页面,这样可以显著减少因单页访问引起的频繁IO损耗。在数据库环境中,此功能同样适用于对堆表的线性扫描,可以一次性将多个页面读入内存,从而降低磁盘IO的次数。在执行lazy vacuum对堆表进行清理时,利用预读功能也可以加快扫描和清理过程。用户可以根据自己的运行环境和业务需求来决定是否启用此功能,并适当调整参数大小。经验表明,在处理超过10GB数据的堆表时,启用预读功能能够有效提高线性扫描和lazy vacuum的性能。特性增强无。特性约束仅可用于非段页式、行存储引擎下的非压缩表的堆表线性扫描操作。依赖关系无。详情查看:cid:link_1详情查看:cid:link_0
-
[openGauss] 产品特点openGauss具有高性能、高可用、高安全性和可维护性好的特点。高性能通过列存储、向量化执行引擎、融合引擎等关键技术,实现百亿数据量查询秒级响应。高可用同城跨AZ(Available Zone)容灾,数据不丢失,分钟级恢复。高安全性支持访问控制、加密认证、数据库审计、动态数据脱敏等安全特性,提供全方位端到端的数据安全保护。高可靠闪回和回收站通常在表数据被错误的UPDATE、DELETE、TRUNCATE和DROP时数据难以恢复,即便恢复也仅能通过PITR(Point-in-time recovery,基于时间点恢复)的方式恢复到错误操作前的时刻。这种修复方式会导致整个数据库不可用,并且一些用户不希望“撤销”的表操作也同样会被“撤销”。openGauss对TIMECAPSULE以及RECYCLEBIN的支持,使用户可以通过指定时间戳进行闪回查询,或者指定时间戳对表进行闪回,获取到错误DELETE、UPDATE前的历史数据。通过从RECYCLEBIN中闪回TRUNCATE、以及DROP的表对象,用户可以将表数据恢复到错误操作前,大大提高了用户数据的可靠性。可维护性好支持WDR诊断、慢SQL诊断、Session诊断等多种维护手段,准确快速定位问题。具备AI4DB能力,能够通过AI算法实现数据库自调优、自监控、自诊断等。详情查看:cid:link_1详情查看:cid:link_0
-
前言 openGauss是一款提供面向多核的极致性能、全链路的业务和数据安全,基于AI的调优和高效运维的能力,是华为公司推出的全球领先的企业级开源关系型数据库。多种存储模式支持复合业务场景,新引入提供原地更新存储引擎。NUMA化数据结构支持高性能。Paxos一致性日志复制协议,主备模式,CRC校验支持高可用。支持全密态计算、账本数据库等安全特性,提供全方位端到端的数据安全保护。通过Table Access Method接口层支持多存储引擎。 本文主要针对高校和个人测试环境,介绍极简版安装过程,更加适合高校学生或者个人功能测试的场景。 一、openGauss极简版单节点安装1.环境准备操作系统:CentOS 7.6或openEuler 20.03LTS关闭操作系统防火墙//显示防火墙状态,active (running)为未关闭,inactive (dead)为已关闭 systemctl status firewalld //关闭防火墙 systemctl disable firewalld.service systemctl stop firewalld.service 2.获取安装包登录openGauss开源社区,选择对应平台的最新安装包下载。对于个人开发者或非企业级环境,下载极简安装包(不安装OM等组件)即可。3.检查安装包解压安装包,检查安装目录及文件是否齐全。在安装包所在目录执行以下命令:tar -jxf openGauss-x.x.x-openEuler-64bit.tar.bz2 ls -lb 执行ls命令,显示类似如下信息:total 90296 drwx------ 3 root root 4096 Mar 31 21:18 bin drwx------ 3 root root 4096 Mar 31 21:18 etc drwx------ 3 root root 4096 Mar 31 21:18 include drwx------ 4 root root 4096 Mar 31 21:18 jre drwx------ 5 root root 4096 Mar 31 21:18 lib -rw------- 1 root root 92427499 Apr 1 09:43 openGauss-x.x.x-openEuler-64bit.tar.bz2 drwx------ 5 root root 4096 Mar 31 21:18 share drwx------ 2 root root 4096 Mar 31 21:18 simpleInstall -rw------- 1 root root 32 Mar 31 21:18 version.cfg 4.单节点安装(1)创建普通用户omm,切换到此用户下,解压openGauss压缩包到安装目录。tar -jxf openGauss-x.x.x-openEuler-64bit.tar.bz2 -C /opt/software/openGauss (2)假定解压包的路径为/opt/software/openGauss,进入解压后目录下的simpleInstall。cd /opt/software/openGauss/simpleInstall (3)执行install.sh脚本安装openGauss。sh install.sh -w xxxx -w:初始化数据库密码(gs_initdb指定),安全需要必须设置。-p:指定的openGauss端口号,如不指定,默认为5432。-h|—help:打印使用说明。5.安装后检查(1)ps检查$ ps ux | grep gaussdb 执行ps命令,显示类似如下信息:omm 2358 9.3 21.8 5767796 758068 ? Ssl 23:09 0:23 /opt/openGauss/bin/gaussdb -D /opt/openGauss/data/single_node omm 2704 0.0 0.0 6352 2188 pts/0 S+ 23:13 0:00 grep --color=auto gaussdb (2)gs_ctl检查$ gs_ctl query -D $GAUSSHOME/data/master -M primary $ gs_ctl query -D $GAUSSHOME/data/master -M standby 执行gs_ctl命令,显示类似如下信息:gs_ctl query ,datadir is /opt/software/openGauss/data/single_node HA state: local_role : Normal static_connections : 0 db_state : Normal detail_information : Normal Senders info: No information Receiver info: No information安装完成~ 6.总结 openGauss有很多优点,高性能、高可用、高安全性和可维护性好。 高性能:通过列存储、向量化执行引擎、融合引擎等关键技术,实现百亿数据量查询秒级响应。 高可用:同城跨AZ(Available Zone)容灾,数据不丢失,分钟级恢复。 高安全性:支持访问控制、加密认证、数据库审计、动态数据脱敏等安全特性,提供全方位端到端的数据安全保护。 高可靠:通常在表数据被错误的UPDATE、DELETE、TRUNCATE和DROP时数据难以恢复,即便恢复也仅能通过PITR(Point-in-time recovery,基于时间点恢复)的方式恢复到错误操作前的时刻。这种修复方式会导致整个数据库不可用,并且一些用户不希望“撤销”的表操作也同样会被“撤销”。openGauss对TIMECAPSULE以及RECYCLEBIN的支持,使用户可以通过指定时间戳进行闪回查询,或者指定时间戳对表进行闪回,获取到错误DELETE、UPDATE前的历史数据。通过从RECYCLEBIN中闪回TRUNCATE、以及DROP的表对象,用户可以将表数据恢复到错误操作前,大大提高了用户数据的可靠性。 可维护性好:支持WDR诊断、慢SQL诊断、Session诊断等多种维护手段,准确快速定位问题。具备AI4DB能力,能够通过AI算法实现数据库自调优、自监控、自诊断等。 作者:杨梦梦~
-
[openGauss] 并行逻辑解码可获得性本特性自openGauss 3.0.0版本开始引入。特性简介支持多线程并行解码。客户价值大幅提升逻辑解码性能,解码速度由3~5MBps可提升到标准场景(16核CPU、内存128G、网络带宽 > 200MBps、表的列数为10~100、单行数据量0.1KB~1KB、DML操作以insert为主、不涉及落盘事务即单个事务中语句数量小于4096)下的100MBps。特性描述在使用JDBC或pg_recvlogical解码时,设置配置选项parallel-decode-num为大于1且小于等于20的值,开启并行解码特性,使用一个读取线程、多个解码线程以及一个发送线程协同进行逻辑解码操作,显著提升解码速度。特性增强无。特性约束当前的硬件和网络环境正常;由于逻辑日志一般为xlog的两倍,为保证xlog速度达到100MBps,I/O带宽至少保证200MBps;因为reader、decoder、sender线程均需预留资源,CPU需预留并发数+2的核数,如4并发场景需要预留6核。在实际场景中,使用备机解码即可保证需求,无需进行特殊的资源预留规划。为保证解码性能达标以及尽量降低对业务的影响,一台备机上应尽量仅建立一个并行解码连接,保证CPU、内存、带宽资源充足。日志级别的guc参数wal_level = logical。guc参数max_replication_slots >= 每个DN所需的(物理流复制槽数+备份槽数+逻辑复制槽数)。解码配置选项parallel-decode-num > 1且<= 20,指定并行的解码线程数。不支持DDL语句解码。不支持列存、数据页复制的解码。不支持解码分布式事务,当前机制为从DN解码,无法保证分布式事务一致性解码。单条元组大小不超过1GB,考虑解码结果可能大于插入数据,因此建议单条元组大小不超过500MB。不支持压缩表的DML语句解码。openGauss支持解码的数据类型为:INTEGER、BIGINT、SMALLILNT、TINYINT、SERIAL、SMALLSERIAL、BIGSERIAL、FLOAT、DOUBLE PRECISION、DATE、TIME[WITHOUT TIME ZONE]、TIMESTAMP[WITHOUT TIME ZONE]、CHAR(n)、VARCHAR(n)、TEXT。在需要ssl连接的场景,需要前置条件保证guc参数ssl = on。不支持interval partition表复制。在事务中执行DDL语句后,该DDL语句与之后的语句不会被解码。如需进行备机解码,需在对应主机上设置guc参数enable_slot_log = on。当前不支持超大CLOB解码。不允许主备,多个备机同时使用同一个复制槽解码,否则会产生数据不一致。禁止在使用逻辑复制槽时在其他节点对该复制槽进行操作,删除复制槽的操作需在该复制槽停止解码后执行。依赖关系依赖备机解码。详情查看:cid:link_1详情查看:cid:link_0
-
[openGauss] DB4AI: 数据库驱动AI可获得性本特性自openGauss 2.1.0版本开始引入。特性简介DB4AI是指利用数据库的能力驱动AI任务,实现数据存储、技术栈的同构。通过在数据库内集成AI算法,令openGauss具备数据库原生AI计算引擎、模型管理、AI算子、AI原生执行计划的能力,为用户提供普惠AI技术。不同于传统的AI建模流程,DB4AI“一站式”建模可以解决数据在各平台的反复流转问题,同时简化开发流程,并可通过数据库规划出最优执行路径,让开发者更专注于具体业务和模型的调优上,具备同类产品不具备的易用性与性能优势。客户价值通过本功能,用户无需手动编写AI模型代码,直接通过开箱即用的SQL语句即可执行机器学习模型的训练和预测,学习和使用成本极低;避免数据碎片化存储和反复搬迁导致的额外开销;更高的执行效率,本功能的AI模型训练效率极高,相比用户自行手动训练模型有数倍性能收益;更严密的安全防护,从而避免训练AI模型导致数据泄露。特性描述openGauss的原生DB4AI能力,通过引入原生AI算子,简化操作流程,充分利用数据库优化器、执行器的优化与执行能力,获得高性能的数据库内模型训练能力。更简化的模型训练与预测流程、更高的性能表现,让开发者在更短时间内能更专注于模型的调优与数据分析上,而避免了碎片化的技术栈与冗余的代码实现。特性增强在openGauss 3.0.0 版本中支持更多算法。特性约束数据库状态正常依赖关系无详情查看:cid:link_1 详情查看:cid:link_0
-
[openGauss] 动态数据脱敏机制可获得性本特性自openGauss 1.1.0版本开始引入。特性简介数据脱敏是行之有效的数据库隐私保护方案之一,可以在一定程度上限制非授权用户对隐私数据的窥探。动态数据脱敏机制是一种通过定制化制定脱敏策略从而实现对隐私数据保护的一种技术,可以有效地在保留原始数据的前提下解决非授权用户对敏感信息的访问问题。当管理员指定待脱敏对象和定制数据脱敏策略后,用户所查询的数据库资源如果关联到对应的脱敏策略时,则会根据用户身份和脱敏策略进行数据脱敏,从而限制非授权用户对隐私数据的访问。客户价值数据隐私保护是数据库安全所需要具备的安全能力之一,可以在一定程度上限制非授权用户对隐私数据的访问,保证隐私数据安全。动态数据脱敏机制可以通过配置脱敏策略实现对指定数据库资源信息的隐私保护,另一方面,脱敏策略的配置也具有一定的灵活性,可以仅针对特定用户场景实现有针对性的隐私保护能力。特性描述动态数据脱敏机制基于资源标签进行脱敏策略的定制化,可根据实际场景选择特定的脱敏方式,也可以针对某些特定用户制定脱敏策略。一个完整的脱敏策略创建的SQL语法如下所示:CREATE RESOURCE LABEL label_for_creditcard ADD COLUMN(user1.table1.creditcard); CREATE RESOURCE LABEL label_for_name ADD COLUMN(user1.table1.name); CREATE MASKING POLICY msk_creditcard creditcardmasking ON LABEL(label_for_creditcard); CREATE MASKING POLICY msk_name randommasking ON LABEL(label_for_name) FILTER ON IP(local), ROLES(dev);其中,label_for_creditcard和msk_name为本轮计划脱敏的资源标签,分别包含了两个列对象;creditcardmasking、randommasking为预置的脱敏函数;msk_creditcard定义了所有用户对label_for_creditcard标签所包含的资源访问时做creditcardmasking的脱敏策略,不区分访问源;msk_name定义了本地用户dev对label_for_name标签所包含的资源访问时做randommasking的脱敏策略;当不指定FILTER对象时则表示对所有用户生效,否则仅对标识场景的用户生效。当前,预置的脱敏函数包括:每个脱敏函数规格如下:脱敏函数名示例creditcardmasking'4880-9898-4545-2525' 将会被脱敏为 'xxxx-xxxx-xxxx-2525',该函数仅对后4位之前的数字进行脱敏basicemailmasking'abcd@gmail.com' 将会被脱敏为'xxxx@gmail.com', 对出现第一个'@'之前的文本进行脱敏fullemailmasking'abcd@gmail.com' 将会被脱敏为 'xxxx@xxxxx.com',对出现最后一个'.'之前的文本(除'@'符外)进行脱敏alldigitsmasking'alex123alex' 将会被脱敏为 'alex000alex', 仅对文本中的数字进行脱敏shufflemasking'hello word' 将会被随机打乱顺序脱敏为 'hlwoeor dl', 该函数通过字符乱序排列的方式实现,属于弱脱敏函数,语义较强的字符串不建议使用该函数脱敏。randommasking'hello word' 将会被脱敏为 'ad5f5ghdf5',将文本按字符随机脱敏regexpmasking需要用户顺序输入四个参数,reg为被替换的字符串,replace_text为替换后的字符串,pos为目标字符串开始替换的初始位置,为整数类型,reg_len为替换长度,为整数类型。reg、replace_text可以用正则表达,pos如果不指定则默认为0,reg_len如果不指定则默认为-1,即pos后所有字符串。如果用户输入参数与参数类型不一致,则会使用maskall方式脱敏。CREATE MASKING POLICY msk_creditcard regexpmasking('[\d+]', 'x', 5, 9 ) ON LABEL(label_for_creditcard);'4880-9898-4545-2525' 将会被脱敏为 '4880-xxxx-xxxx-2525'maskall'4880-9898-4545-2525' 将会被脱敏为 'xxxxxxxxxxxxxxxxxxx'对于不支持的数据类型,默认使用maskall函数进行数据脱敏,若数据类型不属于maskall支持的数据类型则全部使用数字0进行脱敏,如果脱敏列涉及隐式转换,则结果以隐式转换后的数据类型为基础进行脱敏。另外需要说明的是,如果脱敏策略应用到数据列并生效,此时对该列数据的操作将以脱敏后的结果为基础而进行。动态数据脱敏适用于和实际业务紧密相关的场景,根据业务需要为用户提供合理的脱敏查询接口,以避免通过撞库而获取原始数据。特性增强无。特性约束动态数据脱敏策略需要由具备POLADMIN或SYSADMIN属性的用户或初始用户创建,普通用户没有访问安全策略系统表和系统视图的权限。动态数据脱敏只在配置了脱敏策略的数据表上生效,而审计日志不在脱敏策略的生效范围内。在一个脱敏策略中,对于同一个资源标签仅可指定一种脱敏方式,不可重复指定。不允许多个脱敏策略对同一个资源标签进行脱敏,除以下脱敏场景外:使用FILTER指定策略生效的用户场景,包含相同资源标签的脱敏策略间FILTER生效场景无交集,此时可以根据用户场景明确辨别资源标签被哪种策略脱敏。Filter中的APP项建议仅在同一信任域内使用,由于客户端不可避免的可能出现伪造名称的情况,该选项使用时需要与客户端联合形成一套安全机制,减少误用风险。一般情况下不建议使用,使用时需要注意客户端仿冒的风险。对于带有query子句的INSERT或MERGE INTO操作,如果源表中包含脱敏列,则上述两种操作中插入或更新的结果为脱敏后的值,且不可还原。在内置安全策略开关开启的情况下,执行ALTER TABLE EXCHANGE PARTITION操作的源表若在脱敏列则执行失败。对于设置了动态数据脱敏策略的表,需要谨慎授予其他用户对该表的trigger权限,以免其他用户利用触发器绕过脱敏策略。最多支持创建98个动态数据脱敏策略。仅支持使用上述七种预置脱敏策略。仅支持对只包含COLUMN属性的资源标签做脱敏。仅支持对基本表的列进行数据脱敏。仅支持对SELECT查询到的数据进行脱敏。FILTER中的IP地址以ipv4为例支持如下格式。脱敏函数名支持的数据类型creditcardmaskingBPCHAR, VARCHAR, NVARCHAR, TEXT(注:仅针对信用卡格式的文本类数据)basicemailmaskingBPCHAR, VARCHAR, NVARCHAR, TEXT(注:仅针对email格式的文本类型数据)fullemailmaskingBPCHAR, VARCHAR, NVARCHAR, TEXT(注:仅针对email格式的文本类型数据)alldigitsmaskingBPCHAR, VARCHAR, NVARCHAR, TEXT(注:仅针对包含数字的文本类型数据)shufflemaskingBPCHAR, VARCHAR, NVARCHAR, TEXT(注:仅针对文本类型数据)randommaskingBPCHAR, VARCHAR, NVARCHAR, TEXT(注:仅针对文本类型数据)maskallBOOL, RELTIME, TIME, TIMETZ, INTERVAL, TIMESTAMP, TIMESTAMPTZ, SMALLDATETIME, ABSTIME,TEXT, BPCHAR, VARCHAR, NVARCHAR2, NAME, INT8, INT4, INT2, INT1, NUMRIC, FLOAT4, FLOAT8, CASHip地址格式示例单ip127.0.0.1掩码表示ip127.0.0.1|255.255.255.0cidr表示ip127.0.0.1/24ip区间127.0.0.1-127.0.0.5依赖关系无。详情查看:cid:link_1详情查看:cid:link_0
-
Copy接口支持容错机制可获得性本特性自openGauss 1.0.0版本开始引入。特性简介支持将Copy过程中的部分错误导入到指定的错误表中,并且保持Copy过程不被中断。客户价值提升Copy功能的可用性和易用性,提升对于源数据格式异常等常见错误的容忍性和鲁棒性。特性描述openGauss提供用于创建函数的封装好的Copy错误表,并允许用户在使用Copy From指令时指定容错选项,使得Copy From语句在执行过程中部分解析、数据格式、字符集等相关的报错不会中断事务,而是被记录至错误表中,使得在Copy From的目标文件即使有少量数据错误也可以完成入库操作。用户随后可以在错误表中对相关的错误进行定位以及进一步排查。特性增强无。特性约束支持容错的具体错误种类请参见《数据库运维指南》中“导入数据 > 使用COPY FROM STDIN导入数据 > 处理错误表”章节。依赖关系无。
-
Anomaly-detection:数据库指标采集、预测与异常监控可获得性本特性自openGauss1.1.0版本开始引入。特性简介anomaly_detection是openGauss集成的、可以用于数据库指标采集、预测以及异常监控与诊断的AI工具,是dbmind套间中的一个组件。支持采集的信息包括IO_Read、IO_Write、CPU_Usage、Memory_Usage以及数据库所占磁盘空间等。anomaly_detection可以同时监控多个指标,并预测每个指标未来的变化趋势,当发现某个指标在未来某段时间或者某个时刻会超出人工设置的阈值,该工具会通过日志进行报警。客户价值极大简化运维人员工作,释放大量劳动力,为公司节省成本。为用户提前发现异常情况,防止数据库发生意外,导致更大的损失。特性描述anomaly_detection由agent和detector两部分组成。agent和openGauss数据库环境部署在同一个服务器上,agent模块主要有两个作用。一个是定时采集数据库指标数据,并将采集到的数据存放到缓冲队列中;另一个作用是将缓冲队列中数据定时发送到detector端。detector模块基于http或https和agent模块通信,因此它可以部署到任何可以与agent端进行通信的服务器上,该模块主要主要有两个作用。一个是接受agent端发送的数据,并将收集到的数据缓存在本地;另外一个作用是基于收集到的数据库指标数据,对该指标的未来变化趋势进行预测和异常报警。特性增强无。特性约束数据库状态正常,并且用户已将数据目录写入环境变量,并以PGDATA命名。使用登录到数据库宿主机上的Linux用户,需要将$GAUSSHOME/bin添加到PATH环境变量中,即能够直接运行gsql、gs_guc、gs_ctl等数据库运维工具。Python版本建议为Python3.6及以上,且运行环境中已经安装相应依赖,并能够正常启动调优程序。本工具由Agent和Detector组成,Agent和Detector之间通过'http'或者'https'方式传递数据,因此需要保证Agent服务器和Detector服务器之间能够正常通信。Detector模块运行server和monitor服务, 需要分别启动。如果使用'https'方式进行通信,需要准备CA证书以及Agent和Detector的证书和密钥,并分别放入项目根目录certificate下的ca、agent、server中,同时将密钥加密密码放入certificate的pwf中,并将其权限设置为600,防止其他用户进行读写操作。用户也可以使用share中的脚本生成证书和密钥。依赖关系无。详情查看:cid:link_1 详情查看:cid:link_0
-
一、引言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 $$ BEGIN INSERT 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 plpgsql AS $$ BEGIN UPDATE employees SET name = emp_name, salary = emp_salary, department = emp_department WHERE id = emp_id; END;$$;-- 创建删除员工的存储过程CREATE OR REPLACE PROCEDURE delete_employee(emp_id INT) LANGUAGE plpgsql AS $$ BEGIN DELETE FROM employees WHERE id = emp_id; END;$$;-- 创建查询员工的存储过程CREATE OR REPLACE PROCEDURE get_employee(emp_id INT) LANGUAGE plpgsql AS $$ BEGIN PERFORM * 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 plpgsql AS $$ DECLARE rec emp_record; BEGIN FOREACH rec IN ARRAY emp_records LOOP INSERT 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 plpgsql AS $$ BEGIN IF emp_salary < 0 THEN RAISE EXCEPTION 'Salary cannot be negative'; END IF; IF emp_department IS NULL THEN RAISE 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 plpgsql AS $$ BEGIN EXECUTE 'COPY employees TO ''/path/to/backup/employees_' || to_char(current_date, 'YYYYMMDD') || '.csv'' WITH CSV HEADER'; END; $$;
-
在给客户部署业务系统时,由于openGauss数据库的预安装过程需要用到root用户执行,总会被挑战root用户权限太大,若有风险谁负责,只能怯怯的说我们仅安装一个数据库,很快用完了就释放。而openGauss 6.0版本和5.0版本相比,数据库安装流程中的预安装命令(gs_preinstall)以及校验操作系统命令,同时扩容命令可以用非root命令执行了。用非root命令执行预命令,在安全和易用性等方面都有很大的改进(当然还有一些前提条件需要root用户执行,期待后续版本的继续优化),可以减少用户执行过程的用户切换,也可以控制root用户权限控制。一定程度减少了用户误操作对整个系统的影响范围。除了gs_preinstall外,做了类似改进的还有扩容(gs_checkos)和校验(gs_checkos),本文仅介绍gs_preinstall。(其余命令待后文整理)。1.执行前提条件本文由于是单机版安装所以未执行gs_sshexkey -f host,直接执行设置os参数这步,需要注意的是,前提条件的操作,仍然需要以root用户执行。详情参考官网资料,点击文末阅读原文。1.1设置OS参数:注意直接按照官网资料执行会报错Invalid argument,如下:该问题为已知资料问题,执行时需去掉双引号,即可成功。echo 'kernel.sem=250 6400000 1000 25600' >> /etc/sysctl.conf1.2定时任务权限赋予普通用户执行定时任务的权限echo "xxx" >> /etc/cron.allow重启定时任务使生效。systemctl restart crond1.3 修改最大文件描述符2.切换至omm用户,执行preinstall[omm@ecs-oe-2203 script]$ ./gs_preinstall -U omm -G dbgrp -X /opt/software/opengauss/clusterconfig.xml3.source环境变量preinstall成功后,用omm用户执行gs_install,报错:因是环境变量问题,因此回退至root用户,先source环境变量,再执行gs_install命令,就可以成功。[root@ecs-oe-2203 script]# source /home/omm/.bashrc[root@ecs-oe-2203 script]# su omm4.执行gs_install切换至omm用户,继续执行gs_install,安装成功,登录默认数据库并查询。Gs_checkos和gs_expansion的会在后续发出,敬请关注。本文作者本文内容来自于数据库领域资深技术专家赵锋老师,希望我们的文章正好能解决你的问题。
-
作者:马顺华在运维管理领域深耕多年,具备扎实的理论基础与丰富的实践经验。我深耕于技术前沿,不断追求运维自动化与效率的最大化。我精通运维自动化流程,熟悉OceanBase、MySQL等多种数据库的部署与运维,具备从部署到维护的全流程管理能力。此外,我还持有OceanBase的OBCA和OBCP证书,以及OpenGauss社区认证结业证书、崖山DBCA、亚信AntDBCA、翰高HDCA、GBase 8a | 8c | 8s 等多项权威认证,这些不仅证明了我的专业技能,也展示了我对技术的深厚理解和热爱。在OceanBase & 墨天轮的技术征文大赛中,我凭借深厚的技术实力和独到的见解,多次荣获一、二、三等奖。同时,在openGauss第五届、第六届技术征文大赛中,我也屡获殊荣。此外,我还经常在墨天轮等平台发布原创技术文章,多次被首页推荐,积极与业界分享我的运维经验和见解。引言随着数字化时代的快速发展,数据库作为企业信息化的核心,其稳定性和性能对于企业至关重要。openGauss 6.0.0 openGauss是一款开源关系型数据库管理系统,采用木兰宽松许可证v2发行。openGauss内核深度融合华为在数据库领域多年的经验,结合企业级场景需求,持续构建竞争力特性。凭借其高性能、高可靠、高安全、易运维等特性,赢得了众多企业的青睐。本文将详细介绍openGauss 6.0.0 新版数据库的日常运维,帮助用户更好地管理和维护数据库。一、启停 openGauss以操作系统用户omm登录数据库主节点。[root@worker1 ~]# su - omm Last login: Fri May 17 16:29:59 CST 2024 on pts/0 [omm@worker1 ~]$ 1、启动openGauss使用以下命令启动openGauss。gs_om -t start实验示例[omm@worker1 script]$ gs_om -t start Starting cluster. ========================================= [SUCCESS] worker1: [2024-06-04 14:04:56.387][76539][][gs_ctl]: gs_ctl started,datadir is /opt/openGauss/install/data/dn1 [2024-06-04 14:04:56.390][76539][][gs_ctl]: another server might be running; Please use the restart command ========================================= Successfully started. [omm@worker1 script]$ 2、停止openGauss以操作系统用户omm登录数据库主节点。使用以下命令停止openGauss。gs_om -t stop实验示例[omm@worker1 script]$ gs_om -t stop Stopping cluster. ========================================= Successfully stopped cluster. ========================================= End stop cluster. [omm@worker1 script]$ 说明: 启停节点及AZ的操作请参见《工具与命令参考》中“服务端工具 > gs_om”章节。3、错误排查如果启动openGauss或者停止openGauss服务失败,请根据日志文件中的日志信息排查错误,参见日志参考。如果是超时导致启动失败,可以执行如下命令,设置启动超时时间,默认超时时间为300s。gs_om -t start --time-out=300[omm@worker1 script]$ gs_om -t start --time-out=300 Starting cluster. ========================================= [SUCCESS] worker1 2024-06-04 14:06:51.484 665eaefb.1 [unknown] 139781304941184 [unknown] 0 dn_6001 01000 0 [BACKEND] WARNING: could not create any HA TCP/IP sockets 2024-06-04 14:06:51.484 665eaefb.1 [unknown] 139781304941184 [unknown] 0 dn_6001 01000 0 [BACKEND] WARNING: could not create any HA TCP/IP sockets ========================================= Successfully started. [omm@worker1 script]$ 4、日志类型参考在数据库运行过程中,会出现大量日志,既有保证数据库安全可靠的WAL日志(预写式日志,也称为Xlog),也有用于数据库日常维护的运行和操作日志等。在数据库发生故障时,可以参考这些日志进行问题定位和数据库恢复的操作。日志类型日志类型的详细说明请参见下表。*类型**说明*系统日志数据库系统进程运行时产生的日志,记录系统进程的异常信息。操作日志通过客户端工具(例如gs_guc)操作数据库时产生的日志。Trace日志打开数据库的调试开关后,会记录大量的Trace日志。这些日志可以用来分析数据库的异常信息。黑匣子日志数据库系统崩溃的时候,通过故障现场堆、栈信息可以分析出故障发生时的进程上下文,方便故障定位。黑匣子具有在系统崩溃时,dump出进程和线程的堆、栈、寄存器信息的功能。审计日志开启数据库审计功能后,将数据库用户的某些操作记录在日志中,这些日志称为审计日志。WAL日志又称为REDO日志,在数据库异常损坏时,可以利用WAL日志进行恢复。由于WAL日志的重要性,所以需要经常备份这些日志。性能日志数据库系统在运行时检测物理资源的运行状态的日志,在对外部资源进行访问时的性能日志,例如:磁盘、OBS等。二、查看 openGauss 状态背景信息openGauss支持查看整个openGauss的状态,通过查询结果确认openGauss或者单个主机的运行状态是否正常。前提条件openGauss已经启动。操作步骤以操作系统用户omm登录数据库主节点。1、使用如下命令查询openGauss状态:[omm@worker1 script]$ gs_ctl status [2024-06-04 14:07:34.222][77045][][gs_ctl]: gs_ctl status,datadir is /opt/openGauss/install/data/dn1 gs_ctl: server is running (PID: 76866) /opt/openGauss/install/app/bin/gaussdb "-D" "/opt/openGauss/install/data/dn1" [omm@worker1 script]$ 2、若要查询某主机上的实例状态:请在命令中增加“-h”项。示例如下:[omm@worker1 script]$ gs_om -t status -h worker1 ----------------------------------------------------------------------- cluster_state : Normal redistributing : No ----------------------------------------------------------------------- node : 1 node_name : worker1 instance_id : 6001 node_ip : 172.10.20.121 data_path : /opt/openGauss/install/data/dn1 instance_port : 15000 type : Datanode instance_state : Normal az_name : AZ1 instance_role : Normal ----------------------------------------------------------------------- [omm@worker1 script]$ 其中,worker1为待查询主机的名称。3、查看openGauss详细状态信息,含实例状态信息。[omm@worker1 script]$ gs_om -t status --detail [ Cluster State ] cluster_state : Normal redistributing : No current_az : AZ_ALL [ Datanode State ] node node_ip port instance state -------------------------------------------------------------------------------------------------- 1 worker1 172.10.20.121 15000 6001 /opt/openGauss/install/data/dn1 P Primary Normal [omm@worker1 script]$ 三、openGauss 例行维护1、日维护检查项1.1 检查openGauss状态通过openGauss提供的工具查询数据库和实例状态,确认数据库和实例都处于正常的运行状态,可以对外提供数据服务。检查实例状态[omm@worker1 script]$ gs_check -U omm -i CheckClusterState Parsing the check items config file successfully Distribute the context file to remote hosts successfully Start to health check for the cluster. Total Items:1 Nodes:1 Checking... [=========================] 1/1 Start to analysis the check result CheckClusterState...........................OK The item run on 1 nodes. success: 1 Analysis the check result successfully Success. All check items run completed. Total:1 Success:1 For more information please refer to /opt/openGauss/install/tool/script/gspylib/inspection/output/CheckReport_202406045113977563.tar.gz [omm@worker1 script]$ 1.2 检查锁信息锁机制是数据库保证数据一致性的重要手段,检查相关信息可以检查数据库的事务和运行状况。查询数据库中的锁信息openGauss=# SELECT * FROM pg_locks; locktype | database | relation | page | tuple | bucket | virtualxid | transactionid | classid | objid | objsubid | virtualtransaction | pid | sessionid | mode | granted | fastpath | locktag | global_sessionid ------------+----------+----------+------+-------+--------+------------+---------------+---------+-------+----------+--------------------+-----------------+----------------- +-----------------+---------+----------+-------------------+------------------ relation | 15737 | 12191 | | | | | | | | | 10/361 | 139774354519808 | 139774354519808 | AccessShareLock | t | t | 3d79:2f9f:0:0:0:0 | 0:0#0 virtualxid | | | | | | 10/361 | | | | | 10/361 | 139774354519808 | 139774354519808 | ExclusiveLock | t | t | a:169:0:0:0:7 | 0:0#0 (2 rows) openGauss=# 查询等待锁的线程状态信息openGauss=# openGauss=# SELECT * FROM pg_thread_wait_status WHERE wait_status = 'acquire lock'; node_name | db_name | thread_name | query_id | tid | sessionid | lwtid | psessionid | tlevel | smpid | wait_status | wait_event | locktag | lockmode | block_sessionid | glo bal_sessionid -----------+---------+-------------+----------+-----+-----------+-------+------------+--------+-------+-------------+------------+---------+----------+-----------------+---- -------------- (0 rows) openGauss=# 结束系统进程查找正在运行的系统进程,然后使用kill命令结束此进程。ps ux kill -9 pid1.3 统计事件数据SQL语句长时间运行会占用大量系统资源,用户可以通过查看事件发生的时间,占用内存大小来了解现在数据库运行状态。查询事件的时间查询事件的线程启动时间、事务启动时间、SQL启动时间以及状态变更时间。openGauss=# openGauss=# SELECT backend_start,xact_start,query_start,state_change FROM pg_stat_activity; backend_start | xact_start | query_start | state_change -------------------------------+-------------------------------+-------------------------------+------------------------------- 2024-06-04 14:14:59.495553+08 | 2024-06-04 14:16:37.230204+08 | 2024-06-04 14:16:37.230204+08 | 2024-06-04 14:16:37.230213+08 2024-06-04 14:06:52.221142+08 | | | 2024-06-04 14:06:52.221165+08 2024-06-04 14:06:52.221488+08 | | | 2024-06-04 14:16:36.773155+08 2024-06-04 14:06:52.186252+08 | | | 2024-06-04 14:06:52.21675+08 2024-06-04 14:06:52.186624+08 | | | 2024-06-04 14:06:52.219453+08 2024-06-04 14:06:52.174372+08 | | | 2024-06-04 14:06:52.219536+08 2024-06-04 14:06:52.21677+08 | | | 2024-06-04 14:16:32.812367+08 2024-06-04 14:06:52.217589+08 | | | 2024-06-04 14:16:36.872384+08 (8 rows) openGauss=# 查询当前服务器的会话计数信息openGauss=# openGauss=# SELECT count(*) FROM pg_stat_activity; count ------- 8 (1 row) openGauss=# 查询系统级统计信息查询当前使用内存最多的会话信息。openGauss=# openGauss=# SELECT * FROM pv_session_memory_detail() ORDER BY usedsize desc limit 10; sessid | threadid | contextname | level | parent | totalsize | freesize | usedsize --------+----------+-------------+-------+--------+-----------+----------+---------- (0 rows) openGauss=# 1.4 对象检查表、索引、分区、约束等是数据库的核心存储对象,其核心信息和对象维护是DBA重要的日常工作。查询表统计信息 starelid | starelkind | staattnum | stainherit | stanullfrac | stawidth | stadistinct | stakind1 | stakind2 | stakind3 | stakind4 | stakind5 | staop1 | staop2 | staop3 | st aop4 | staop5 | stanumbers1 | stanumbers2 | stanumbers3 查询分区表信息openGauss=# openGauss=# SELECT * FROM pg_partition; relname | parttype | parentid | rangenum | intervalnum | partstrategy | relfilenode | reltablespace | relpages | reltuples | relallvisible | reltoastrelid | reltoastidxid | indextblid | indisusable | reldeltarelid | reldeltaidx | relcudescrelid | relcudescidx | relfrozenxid | intspnum | partkey | intervaltablespace | interval | boundaries | tr ansit | reloptions | relfrozenxid64 | relminmxid | partkeyexpr | partitionno | subpartitionno ---------+----------+----------+----------+-------------+--------------+-------------+---------------+----------+-----------+---------------+---------------+---------------+ ------------+-------------+---------------+-------------+----------------+--------------+--------------+----------+---------+--------------------+----------+------------+--- ------+------------+----------------+------------+-------------+-------------+---------------- (0 rows) openGauss=# 收集统计信息使用ANALYZE语句收集数据库相关的统计信息。使用VACUUM语句可以回收空间并更新统计信息。查询约束信息openGauss=# SELECT * FROM pg_partition; relname | parttype | parentid | rangenum | intervalnum | partstrategy | relfilenode | reltablespace | relpages | reltuples | relallvisible | reltoastrelid | reltoastidxid | indextblid | indisusable | reldeltarelid | reldeltaidx | relcudescrelid | relcudescidx | relfrozenxid | intspnum | partkey | intervaltablespace | interval | boundaries | tr ansit | reloptions | relfrozenxid64 | relminmxid | partkeyexpr | partitionno | subpartitionno ---------+----------+----------+----------+-------------+--------------+-------------+---------------+----------+-----------+---------------+---------------+---------------+ ------------+-------------+---------------+-------------+----------------+--------------+--------------+----------+---------+--------------------+----------+------------+--- ------+------------+----------------+------------+-------------+-------------+---------------- (0 rows) openGauss=# SELECT * FROM pg_constraint; conname | connamespace | contype | condeferrable | condeferred | convalidated | conrelid | contypid | conindid | confrelid | confupdtype | confdeltype | confmatchtype | conislocal | coninhcount | connoinherit | consoft | conopt | conkey | confkey | conpfeqop | conppeqop | conffeqop | conexclop | conbin | consrc | conincluding ------------------------------+--------------+---------+---------------+-------------+--------------+----------+----------+----------+-----------+-------------+------------- +---------------+------------+-------------+--------------+---------+--------+--------+---------+-----------+-----------+-----------+-----------+---------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------+--------------------------------------------------------------------------------------------+-------------- cardinal_number_domain_check | 14722 | c | f | f | t | 0 | 14735 | 0 | 0 | | | | t | 0 | f | f | f | | | | | | | {OPEXPR :opno 525 :opfuncid 150 :opresulttype 16 :opretset false :opcollid 0 :inputcollid 0 :args ({COERCETODOMAINVALUE :typeId 23 :typeMod -1 :collation 0 :location 5812} {CONST :consttype 23 :constt ypmod -1 :constcollid 0 :constlen 4 :constbyval true :constisnull false :ismaxvalue false :location 5821 :constvalue 4 [ 0 0 0 0 0 0 0 0 ] :cursor_data :row_count 0 :cur_dn o -1 :is_open false :found false :not_found false :null_open false :null_fetch false}) :location 5818} | (VALUE >= 0) | yes_or_no_check | 14722 | c | f | f | t | 0 | 14743 | 0 | 0 | | | | t | 0 | f | f | f | | | | | | | {SCALARARRAYOPEXPR :opno 98 :opfuncid 67 :useOr true :inputcollid 100 :args ({RELABELTYPE :arg {COERCETODOMAINVALUE :typeId 1043 :typeMod 7 :collation 100 :location 6507} :resulttype 25 :resulttypmod -1 :resultcollid 100 :relabelformat 2 :location -1} {ARRAYCOERCEEXPR :arg {ARRAY :array_typeid 1015 :array_collid 100 :element_typeid 1043 :elements ({CONST :consttype 1043 :consttypmod -1 :constcollid 100 :constlen -1 :constbyval false :constisnull false :ismaxvalue false :location 6517 :constvalue 7 [ 28 0 0 0 89 69 83 ] :cursor_data :row_co unt 0 :cur_dno -1 :is_open false :found false :not_found false :null_open false :null_fetch false} {CONST :consttype 1043 :consttypmod -1 :constcollid 100 :constlen -1 :cons tbyval false :constisnull false :ismaxvalue false :location 6524 :constvalue 6 [ 24 0 0 0 78 79 ] :cursor_data :row_count 0 :cur_dno -1 :is_open false :found false :not_fou nd false :null_open false :null_fetch false}) :multidims false :location -1} :elemfuncid 0 :resulttype 1009 :resulttypmod -1 :resultcollid 100 :isExplicit false :coerceforma t 2 :location -1}) :location 6513} | ((VALUE)::text = ANY ((ARRAY['YES'::character varying, 'NO'::character varying])::text[])) | 1.5 备份数据备份重于一切,日常应检查备份执行情况,并检查备份有效性,确保备份能够保障数据安全,备份安全加密也应兼顾。指定用户导出数据库[omm@worker1 script]$ gs_dump postgres -p 15000 -f out.sql -U omm -W password gs_dump[port='15000'][postgres][2024-06-04 14:30:29]: Begin scanning database. Progress: [==================================================] 100% (38/37, cur_step/total_step). finish scanning database gs_dump[port='15000'][postgres][2024-06-04 14:30:29]: Finish scanning database. gs_dump[port='15000'][postgres][2024-06-04 14:30:30]: Start dumping objects Progress: [==================================================] 100% (4825/4825, dumpObjNums/totalObjNums). dump objects gs_dump[port='15000'][postgres][2024-06-04 14:30:30]: Finish dumping objects gs_dump[port='15000'][postgres][2024-06-04 14:30:30]: dump database postgres successfully gs_dump[port='15000'][postgres][2024-06-04 14:30:30]: total time: 141 ms [omm@worker1 script]$ 1.6 基本信息检查基本信息包括版本、组件、补丁集等信息,定期检查数据库信息并登记在案是数据库生命周期管理的重要内容之一。版本信息[omm@worker1 script]$ gsql -d postgres -p 15000 gsql ((openGauss 6.0.0-RC1 build ed7f8e37) compiled at 2024-03-31 11:59:31 commit 0 last mr ) Non-SSL connection (SSL connection is recommended when requiring high-security) Type "help" for help. openGauss=# SELECT version(); version ----------------------------------------------------------------------------------------------------------------------------------------------------------- (openGauss 6.0.0-RC1 build ed7f8e37) compiled at 2024-03-31 11:59:31 commit 0 last mr on x86_64-unknown-linux-gnu, compiled by g++ (GCC) 10.3.0, 64-bit (1 row) openGauss=# 2、检查操作系统参数检查办法通过openGauss提供的gs_checkos工具可以完成操作系统状态检查。只能使用root用户执行gs_checkos命令。以root用户身份登录任意一台服务器。执行如下命令对openGauss节点服务器的OS参数进行检查。gs_checkos -i A检查节点服务器的OS参数的目的是保证openGauss正常通过预安装,并且在安装成功后可以安全高效的运行。详细的检查项目请参见《工具与命令参考》中“服务端工具 > gs_checkos”章节。实验示例:执行gs_checkos前需要先使用gs_preinstall工具执行前置脚本,准备环境。以参数“A”为例。[root@worker1 script]# ./gs_checkos -i A Checking items: A1. [ OS version status ] : Normal A2. [ Kernel version status ] : Normal A3. [ Unicode status ] : Normal A4. [ Time zone status ] : Normal A5. [ Swap memory status ] : Normal A6. [ System control parameters status ] : Warning A7. [ File system configuration status ] : Warning A8. [ Disk configuration status ] : Normal A9. [ Pre-read block size status ] : Normal A10.[ IO scheduler status ] : Normal A11.[ Network card configuration status ] : Warning A12.[ Time consistency status ] : Warning A13.[ Firewall service status ] : Normal A14.[ THP service status ] : Normal Total numbers:14. Abnormal numbers:0. Warning numbers:4. [root@worker1 script]# [root@worker1 script]# ./gs_checkos -i B Setting items: B1. [ Set system control parameters ] : Normal B2. [ Set file system configuration value ] : Normal B3. [ Set pre-read block size value ] : Normal B4. [ Set IO scheduler value ] : Normal B5. [ Set network card configuration value ] : Normal B6. [ Set THP service ] : Normal B7. [ Set RemoveIPC value ] : Normal B8. [ Set Session Process ] : Normal NOTICE: MTU value and some warning items can NOT be set. Please do it manually. Total numbers:8. Abnormal numbers:0. Warning numbers:0. [root@worker1 script]# 3、检查openGauss健康状态检查办法通过openGauss提供的gs_check工具可以开展openGauss健康状态检查。扩容新节点检查只能在root用户下执行,其他场景都必须在omm用户下执行。必须指定-i或-e参数,-i会检查指定的单项,-e会检查对应场景配置中的多项。如果-i参数中不包含root类检查项或-e场景配置列表中没有root类检查项,则不需要交互输入root权限的用户及其密码。可使用–skip-root-items跳过检查项中包含的root类检查,以免需要输入root权限用户及密码。检查扩容新节点与现有节点之间的一致性,在现有节点执行gs_check命令指定–hosts参数进行检查,其中hosts文件中需要写入新节点ip。方式1:以操作系统用户omm登录数据库主节点。执行如下命令对openGauss数据库状态进行检查。[root@worker1 script]# su - omm 上一次登录:二 6月 4 12:08:50 CST 2024pts/0 上 [omm@worker1 ~]$ cd /soft/script/ [omm@worker1 script]$ gs_check -i CheckClusterState Parsing the check items config file successfully Distribute the context file to remote hosts successfully Start to health check for the cluster. Total Items:1 Nodes:1 Checking... [=========================] 1/1 Start to analysis the check result CheckClusterState...........................OK The item run on 1 nodes. success: 1 Analysis the check result successfully Success. All check items run completed. Total:1 Success:1 For more information please refer to /opt/openGauss/install/tool/script/gspylib/inspection/output/CheckReport_202406045258581071.tar.gz [omm@worker1 script]$ 其中,-i指定检查项,注意区分大小写。格式:-i CheckClusterState、-i CheckCPU或-i CheckClusterState,CheckCPU。取值范围为所有支持的检查项名称,详细列表请参见《工具与命令参考》中“服务端工具 > gs_checkos > openGauss状态检查表”,用户可以根据需求自己编写新检查项。方式2:以操作系统用户omm登录数据库主节点。执行如下命令对openGauss数据库进行健康检查。[omm@worker1 script]$ ./gs_check -e inspect Parsing the check items config file successfully The below items require root privileges to execute:[CheckBlockdev CheckIOrequestqueue CheckIOConfigure CheckMTU CheckRXTX CheckMultiQueue CheckFirewall CheckSshdService CheckSshdConfig CheckCrondService CheckMaxProcMemory CheckBootItems CheckFilehandle CheckNICModel CheckDropCache] Please enter root privileges user[root]:root Please enter password for user[root]: Check root password connection successfully Distribute the context file to remote hosts successfully Start to health check for the cluster. Total Items:57 Nodes:1 Checking... [=========================] 57/57 Start to analysis the check result CheckClusterState...........................OK The item run on 1 nodes. success: 1 CheckDBParams...............................OK The item run on 1 nodes. success: 1 CheckDebugSwitch............................OK The item run on 1 nodes. success: 1 CheckDirPermissions.........................NG The item run on 1 nodes. ng: 1 其中,-e指定场景名,注意区分大小写。格式:-e inspect或-e upgrade。取值范围为所有支持的巡检场景名称,默认列表包括:inspect(例行巡检)、upgrade(升级前巡检)、install(安装)、binary_upgrade(就地升级前巡检)、health(健康检查巡检)、slow_node(节点)、longtime(耗时长巡检),用户可以根据需求自己编写场景。openGauss巡检的主要作用是在openGauss运行过程中,检查整个openGauss状态是否正常,或者重大操作前(升级、扩容),确保openGauss满足操作所需的环境条件和状态条件。详细的巡检项目和场景请参见《工具与命令参考》中“服务端工具 > gs_checkos > openGauss状态检查表”。实验示例:执行单项检查结果:[omm@worker1 script]$ gs_check -i CheckCPU Parsing the check items config file successfully Distribute the context file to remote hosts successfully Start to health check for the cluster. Total Items:1 Nodes:1 Checking... [=========================] 1/1 Start to analysis the check result CheckCPU....................................OK The item run on 1 nodes. success: 1 Analysis the check result successfully Success. All check items run completed. Total:1 Success:1 For more information please refer to /opt/openGauss/install/tool/script/gspylib/inspection/output/CheckReport_202406045339389877.tar.gz [omm@worker1 script]$ 本地执行结果:[omm@worker1 script]$ gs_check -i CheckCPU -L 2024-06-04 14:50:42 [NAM] CheckCPU 2024-06-04 14:50:42 [STD] 检查主机CPU占用率,如果idle 大于30%,或者 iowait 小于 30%.则检查项通过,否则检查项不通过 2024-06-04 14:50:42 [RST] OK 2024-06-04 14:50:42 [RAW] Linux 3.10.0-693.el7.x86_64 (worker1) 06/04/24 _x86_64_ (8 CPU) 14:50:37 CPU %user %nice %system %iowait %steal %idle 14:50:38 all 0.63 0.00 0.00 0.00 0.00 99.37 14:50:39 all 0.62 0.00 0.12 0.00 0.00 99.25 14:50:40 all 0.62 0.00 0.12 0.00 0.00 99.25 14:50:41 all 0.63 0.00 0.00 0.00 0.00 99.37 14:50:42 all 0.62 0.00 0.12 0.00 0.00 99.25 Average: all 0.63 0.00 0.08 0.00 0.00 99.30 [omm@worker1 script]$ 执行场景检查结果:[omm@worker1 script]$ gs_check -e inspect Parsing the check items config file successfully The below items require root privileges to execute:[CheckBlockdev CheckIOrequestqueue CheckIOConfigure CheckMTU CheckRXTX CheckMultiQueue CheckFirewall CheckSshdService CheckSshdConfig CheckCrondService CheckMaxProcMemory CheckBootItems CheckFilehandle CheckNICModel CheckDropCache] Please enter root privileges user[root]:root Please enter password for user[root]: Check root password connection successfully Distribute the context file to remote hosts successfully Start to health check for the cluster. Total Items:57 Nodes:1 Checking... [=========================] 57/57 Start to analysis the check result CheckClusterState...........................OK The item run on 1 nodes. success: 1 CheckDBParams...............................OK The item run on 1 nodes. success: 1 CheckDebugSwitch............................OK The item run on 1 nodes. success: 1 CheckDirPermissions.........................NG The item run on 1 nodes. ng: 1 The ng[worker1] value: 4、检查数据库性能通过openGauss提供的性能统计工具gs_checkperf可以对硬件性能进行检查。以操作系统用户omm登录数据库主节点。执行如下命令对openGauss数据库进行性能检查。[omm@worker1 script]$ gs_checkperf Cluster statistics information: Host CPU busy time ratio : .24 % MPPDB CPU time % in busy time : .04 % Shared Buffer Hit ratio : 97.10 % In-memory sort ratio : 0 Physical Reads : 1437 Physical Writes : 22 DB size : 51 MB Total Physical writes : 22 Active SQL count : 4 Session count : 8 [omm@worker1 script]$ 具体的性能统计项目请参见《工具与命令参考》中“服务端工具 > gs_checkperf > 性能检查项”。实验示例:以简要格式在屏幕上显示性能统计结果。[omm@worker1 script]$ gs_checkperf -i pmk -U omm Cluster statistics information: Host CPU busy time ratio : .24 % MPPDB CPU time % in busy time : .04 % Shared Buffer Hit ratio : 97.97 % In-memory sort ratio : 0 Physical Reads : 1451 Physical Writes : 155 DB size : 51 MB Total Physical writes : 155 Active SQL count : 4 Session count : 8 [omm@worker1 script]$ 5、检查和清理日志日志是检查系统运行及故障定位的关键手段。建议按月度例行查看操作系统日志及数据库的运行日志。同时,随着时间的推移,日志的增加会占用较多的磁盘空间。建议按月度清理数据库的运行日志。5.1 检查操作系统日志建议按月检查操作系统日志,排除操作系统运行异常隐患。执行如下命令查看操作系统日志文件。[root@worker1 script]# vim /var/log/messages关注其中近一个月出现的kernel、error、fatal等字样,根据系统报警信息进行处理。5.2 检查openGauss运行日志数据库运行时,某些操作在执行过程中可能会出现错误,数据库依然能够运行。但是此时数据库中的数据可能已经发生不一致的情况。建议按月检查openGauss运行日志,及时发现隐患。以操作系统用户omm登录数据库主节点。执行如下命令收集数据库日志。gs_collector --begin-time="20240604 01:01" --end-time="20240604 23:59"[omm@worker1 script]$ gs_collector --begin-time="20240604 01:01" --end-time="20240604 23:59" Successfully parsed the configuration file. create Dir. Successfully create dir. do System check 0:1 Collecting OS information. Successfully collected OS information. do Database check 0:1 Collecting catalog statistics. Successfully collected catalog statistics. do not enable dss, cannot collect dss config files do not enable dss, cannot collect dss disk info do Log check 0:1 Collecting Log files. The cmd is source /soft/script/ENVFILE; python3 '/opt/openGauss/install/tool/script/local/LocalCollect.py' -t log_copy -U omm -b '202406040101' -e '202406042359' -k '' -l /opt/openGauss/install/log/omm/om/gs_local.log -s 1048576 -S 0 -C '{#TypeName#: #Log#, #Content#: #DN,cm,om,bin,DSS,DMS,#, #Interval#: #0#, #Count#: #1#, #FileNumber#: #0#}' Failed collected Log files. do Config check 0:1 Collecting Config files. Successfully collected Config files. Collecting files. Successfully collected files. All results are stored in /opt/openGauss/install/log/omm/collector_20240604_220848.tar.gz. [omm@worker1 script]$ 20240604 01:01为日志的开始时间,20240604 23:59为日志的结束时间。根据界面输出提示,进入相应的日志收集目录,解压收集的日志,并检查数据库日志。以下以日志收集路径“/opt/openGauss/install/log/omm/collector_20240604_220848.tar.gz”为例进行操作。[omm@worker1 omm]$ tar -xvzf /opt/openGauss/install/log/omm/collector_20240604_220848.tar.gz collector_20240604_220848/ collector_20240604_220848/Detail.log collector_20240604_220848/worker1.tar.gz collector_20240604_220848/Summary.log [omm@worker1 omm]$ cd /opt/openGauss/install/log/omm/collector_20240604_220848 [omm@worker1 collector_20240604_220848]$ ls Detail.log Summary.log worker1.tar.gz [omm@worker1 collector_20240604_220848]$ 5.3 清理运行日志数据库运行过程中会产生大量运行日志,占用大量的磁盘空间,建议清理过期日志文件,只保留一个月的日志。操作步骤以操作系统用户omm登录数据库主节点。清理日志。a. 将超过1个月的日志备份到其他磁盘。b. 进入日志存放目录。[omm@worker1 script]$ cd $GAUSSLOG [omm@worker1 omm]$ ls asp_data cm collector_20240604_220848.tar.gz mem_log pg_audit pg_perf bin collector_20240604_220848 gs_profile om pg_log sql_monitor [omm@worker1 omm]$ c. 进入相应的子目录,使用如下方式删除1个月之前产生的日志。rm 日志名称日志文件的命名格式为“postgresql-年-月-日_HHMMSS”。[omm@worker1 omm]$ rm -rf collector_20240604_2208487、检查应用连接数如果应用程序与数据库的连接数超过最大值,则新的连接无法建立。建议每天检查连接数,及时释放空闲的连接或者增加最大连接数。操作步骤以操作系统用户omm登录数据库主节点。使用如下命令连接数据库。gsql -d postgres -p 15000postgres为需要连接的数据库名称,1500为数据库主节点的端口号。连接成功后,系统显示类似如下信息:[omm@worker1 omm]$ [omm@worker1 omm]$ gsql -d postgres -p 15000 gsql ((openGauss 6.0.0-RC1 build ed7f8e37) compiled at 2024-03-31 11:59:31 commit 0 last mr ) Non-SSL connection (SSL connection is recommended when requiring high-security) Type "help" for help. openGauss=# 执行如下SQL语句查看连接数。openGauss=# SELECT count(*) FROM (SELECT pg_stat_get_backend_idset() AS backendid) AS s;显示类似如下的信息,其中2表示当前有两个应用连接到数据库。openGauss=# openGauss=# SELECT count(*) FROM (SELECT pg_stat_get_backend_idset() AS backendid) AS s; count ------- 20 (1 row) openGauss=# 查看现有最大连接数。openGauss=# SHOW max_connections;显示信息如下,其中200为现在的最大连接数。openGauss=# openGauss=# SHOW max_connections; max_connections ----------------- 5000 (1 row) openGauss=# 四、数据安全维护建议为保证openGauss数据库中的数据安全,避免丢失数据、非法访问数据等事故发生,请仔细阅读以下内容。1、避免数据被丢失建议用户规划周期性的物理备份,且对备份文件进行可靠的保存。在系统发生严重错误的情况下,可以利用备份文件,将系统恢复到备份前的状态。2、避免数据被非法访问建议对数据库用户进行权限分级管理。数据库管理员根据业务需要,建立用户并赋予权限,保证各用户对数据库的合理访问。对于openGauss的服务端和客户端(或基于客户端库开发的应用程序),最好也部署在可信任的内网中。如果服务端和客户端一定要部署在非信任的网络中,需要在服务启动前,打开SSL加密,保证数据在非信任网络上的传输安全。需要注意的是,打开SSL加密会降低数据库的性能。3、避免系统日志泄露个人数据将调试日志发给他人进行分析前,请删除个人数据。说明: 因为日志级别(log_min_messages)设置为DEBUGx(x为DEBUG级别,取值范围为1~5)时,调试日志中记录的信息可能包含用户的个人数据。将系统日志发给其他人进行分析前,请删除个人数据。因为在默认配置下,当SQL语句执行错误时,日志中会记录出错的SQL语句,而这些SQL语句中可能包含用户个人数据。将log_min_error_statement参数的值设置为PANIC,可以避免将出错的SQL语句记录在系统日志中。若禁用该功能,当出现故障时,很难定位故障原因。总结本文详细介绍了openGauss 6.0.0数据库的日常运维,包括安装与部署、数据导入与导出、备份与恢复、性能调优与监控以及安全加固与防护等方面。希望能够帮助用户更好地管理和维护openGauss 6.0.0数据库,保障企业信息化建设的稳定和发展。
-
作者:风一样自由一、环境部署服务器信息IP主机名版本端口发布端(源端)192.168.59.149yf46.0.0-RC115000订阅端(目标端)192.168.59.151yf56.0.0-RC1150001.修改配置文件发布端:cat >> /opt/openGauss/install/data/dn1/postgresql.conf << "EOF"wal_level=logicalmax_replication_slots=8EOFwal_level:必须设置logical才支持逻辑复制max_replication_slots>=每个节点所需的(物理流复制槽数+逻辑复制槽数)cat >> /opt/openGauss/install/data/dn1/pg_hba.conf << "EOF"host replication repl 0.0.0.0/0 sha256EOF订阅端:cat >> /opt/openGauss/install/data/dn1/postgresql.conf << "EOF"wal_level=logicalmax_replication_slots=8EOF修改完发布端与订阅端参数文件,重启生效。gs_om -t restart2.发布端创建逻辑复制用户gsql -d postgres -p 15000 -c "CREATE USER repl REPLICATION SYSADMIN LOGIN ENCRYPTED PASSWORD 'repl@123'"[omm@yf4 opt]$ gsql -d postgres -p 15000 -c "CREATE USER repl REPLICATION SYSADMIN LOGIN ENCRYPTED PASSWORD 'repl@123'"CREATE ROLE注:用户需具有SYSADMIN、REPLICATION权限用户3.发布端创建表gsql -d postgres -p 15000 -c "CREATE TABLE logical_tb1(id int primary key,name varchar(10),create_time timestamp)"[omm@yf4 opt]$ gsql -d postgres -p 15000 -c "CREATE TABLE logical_tb1(id int primary key,name varchar(10),create_time timestamp)"NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "logical_tb1_pkey" for table "logical_tb1"CREATE TABLE4.发布端创建发布gsql -d postgres -p 15000 -c "CREATE PUBLICATION pub1 FOR ALL TABLES with(publish='insert,update,delete',ddl='table')"[omm@yf4 opt]$ gsql -d postgres -p 15000 -c "CREATE PUBLICATION pub1 FOR ALL TABLES with(publish='insert,update,delete',ddl='table')"CREATE PUBLICATION查询发布信息gsql -d postgres -p 15000 -c "select * from pg_publication"[omm@yf4 opt]$ gsql -d postgres -p 15000 -c "select * from pg_publication"pubname | pubowner | puballtables | pubinsert | pubupdate | pubdelete | pubddl---------+----------+--------------+-----------+-----------+-----------+-------pub1 | 10 | t | t | t | t | 1(1 row)5.订阅端创建表gsql -d postgres -p 15000 -c "CREATE TABLE logical_tb1(id int primary key,name varchar(10),create_time timestamp)"[omm@yf5 ~]$ gsql -d postgres -p 15000 -c "CREATE TABLE logical_tb1(id int primary key,name varchar(10),create_time timestamp)"NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "logical_tb1_pkey" for table "logical_tb1"CREATE TABLE6.订阅端创建加密文件gs_ssh -c "gs_guc generate -S repl@123 -D $GAUSSHOME/bin -o subscription"[omm@yf5 ~]$ gs_ssh -c "gs_guc generate -S repl@123 -D $GAUSSHOME/bin -o subscription"Successfully execute command on all nodes.Output:[SUCCESS] yf5:The gs_guc run with the following arguments: [gs_guc -S *** -D /opt/openGauss/install/app/bin -o subscription generate ].gs_guc generate -S ***7.订阅端创建订阅gsql -d postgres -p 15000 -c "CREATE SUBSCRIPTION sub1 CONNECTION 'host=192.168.59.149 port=15001 dbname=postgres user=repl password=repl@123' PUBLICATION pub1"[omm@yf5 ~]$ gsql -d postgres -p 15000 -c "CREATE SUBSCRIPTION sub1 CONNECTION 'host=192.168.59.149 port=15001 dbname=postgres user=repl password=repl@123' PUBLICATION pub1"NOTICE: created replication slot "sub1" on publisherCREATE SUBSCRIPTION注:端口号不能使用主端口,应该使用主端口+1端口,否则会与线程池冲突。8.查看发布订阅信息发布端:查看发布信息select * from pg_publication; openGauss=# select * from pg_publication; pubname | pubowner | puballtables | pubinsert | pubupdate | pubdelete | pubdd---------+----------+--------------+-----------+-----------+-----------+------pub1 | 10 | t | t | t | t | 1(1 row)发布端查看复制槽SELECT slot_name,plugin,slot_type,database,active,restart_lsn FROM pg_replication_slots where slot_name='sub1';openGauss=# SELECT slot_name,plugin,slot_type,database,active,restart_lsn FROM pg_replication_slots where slot_name='sub1'; slot_name | plugin | slot_type | database | active | restart_lsn-----------+----------+-----------+----------+--------+------------- sub1 | pgoutput | logical | postgres | t | 0/2493A48(1 row)订阅端:查看订阅信息select * from pg_subscription;openGauss=# select * from pg_subscription; subdbid | subname | subowner | subenabled | subconninfo | subslotname | subsynccommit | subpublications | subbinary | subskiplsn | submatchddlowner---------+---------+----------+------------+-----------------------------------------------------------------------------------------------------------------------------------------------+-------------+---------------+-----------------+-----------+------------+------------------15737 | sub1 | 10 | t | host=192.168.59.149 port=15001 dbname=postgres user=repl password=encryptOpty+wL5qbR/g1duD+0mVBEBTPUHu/DqESpg30CN6Bbh8go4hKEMAlGiKf8KtM6klUb| sub1 | off | {pub1} | f | 0/0 | t(1 row)二、逻辑复制测试数据同步测试1.发布端插入数据insert into logical_tb1 values(1,'yyf','2024-05-24'),(2,'jjj','2024-05-24');2.查看数据同步情况发布端:select * from logical_tb1;openGauss=# select * from logical_tb1 ; id | name | create_time----+------+--------------------- 1 | yyf | 2024-05-24 00:00:00 2 | jjj | 2024-05-24 00:00:00(2 rows)订阅端select * from logical_tb1;openGauss=# select * from logical_tb1; id | name | create_time----+------+--------------------- 1 | yyf | 2024-05-24 00:00:00 2 | jjj | 2024-05-24 00:00:00(2 rows)DDL同步测试(6.0版本新增功能)1.查看发布端与订阅端表发布端:\d+openGauss=# \d+ List of relations Schema | Name | Type | Owner | Size | Storage | Description--------+-------------+-------+-------+------------+----------------------------------+-------------public | logical_tb1 | table | omm | 8192 bytes | {orientation=row,compression=no} |(1 row)订阅端:\d+openGauss=# \d+ List of relations Schema | Name | Type | Owner | Size | Storage | Description--------+-------------+-------+-------+------------+----------------------------------+------------- public | logical_tb1 | table | omm | 8192 bytes | {orientation=row,compression=no} |(1 row)2.发布端删除表drop table logical_tb1;\d+openGauss=# drop table logical_tb1;DROP TABLEopenGauss=# \d+No relations found.3.查看订阅端表\d+openGauss=# \d+No relations found.三、逻辑复制发布及订阅其它相关操作发布端:--创建一个发布,发布两个表中所有更改。CREATE PUBLICATION mypublication FOR TABLE users, departments;--创建一个发布,发布所有表中的所有更改。CREATE PUBLICATION alltables FOR ALL TABLES;--创建一个发布,只发布一个表中的INSERT操作。CREATE PUBLICATION insert_only FOR TABLE mydata WITH (publish = 'insert');--修改发布的动作。ALTER PUBLICATION insert_only SET (publish='insert,update,delete');--向发布中添加表。ALTER PUBLICATION insert_only ADD TABLE mydata2;--删除发布。DROP PUBLICATION insert_only;--创建一个发布,发布所有的DDL操作CREATE PUBLICATION ddl_all FOR ALL TABLES WITH (ddl='all');--创建一个发布,发布类型为TABLE的DDL操作CREATE PUBLICATION ddl_all FOR ALL TABLES WITH (ddl='table');订阅端:--创建一个到远程服务器的订阅,复制发布mypublication和insert_only中的表,并在提交时立即开始复制。CREATE SUBSCRIPTION mysub CONNECTION 'host=192.168.1.50 port=15000 user=foo dbname=foodb password=xxxx' PUBLICATION mypublication, insert_only;--创建一个到远程服务器的订阅,复制insert_only发布中的表, 并且不开始复制直到稍后启用复制。CREATE SUBSCRIPTION mysub CONNECTION 'host=192.168.1.50 port=15000 user=foo dbname=foodb password=xxxx ' PUBLICATION insert_only WITH (enabled = false);--修改订阅的连接信息。ALTER SUBSCRIPTION mysub CONNECTION 'host=192.168.1.51 port=15000 user=foo dbname=foodb password=xxxx';--激活订阅。ALTER SUBSCRIPTION mysub SET(enabled=true);--删除订阅。DROP SUBSCRIPTION mysub;四、限制 发布订阅基于逻辑复制实现,继承所有逻辑复制的限制,同时发布订阅还有下列额外的限制或者缺失的功能。1.数据库模式和DDL命令不会被复制。初始模式可以手工使用gs_dump --schema-only进行拷贝。后续的模式改变需要手工保持同步。2.序列数据不被复制。后台由序列支撑的serial或者标识列中的数据当然将被作为表的一部分复制,但是序列本身在订阅者上仍将显示开始值。如果订阅者被用作一个只读数据库,那么这通常不会是什么问题。不过,如果订阅者数据库预期有某种转换或者容错,那么序列需要被更新到最后的值,要么通过从发布者拷贝当前数据的防范(也许使用gs_dump),要么从表本身决定一个足够高的值。3.只有表支持复制,包括分区表。试图复制其他类型的关系,例如视图、物化视图或外部表,将会导致错误。4.同一数据库内的多个订阅不应当订阅内容重复的发布(指发布相同的表),否则会产生数据重复或者主键冲突。5.如果被发布的表中包含不支持btree/hash索引的数据类型(如地理类型等),那么该表需要有主键,才能成功的复制UPDATE/DELETE操作到订阅端。否则复制会失败,同时订阅端会出现“FATAL: could not identify an equality operator for type xx”的日志。6.当前gs_probackup工具已支持备份发布订阅的逻辑复制槽,因此可使用gs_probackup或gs_basebackup工具备份发布端。注意当恢复到非最新时间点时,由于订阅端复制源记录的remote_lsn可能大于发布端当前的wal日志插入位置,因此在这之间提交的事务无法被解码复制,在remote_lsn之后提交的事务才被解码。7.产生列不会被复制,即如果发布端和订阅端的产生列计算定义不同,那么该列的值也会不一致五、总结 通过以上测试,opengauss 6.0版本较5.0版本逻辑复制新增DDL同步功能,仅支持部分DDL同步,如CREATE/DROP TABLE|TABLE PARTITION、CREATE/DROP INDEX,不支持ALTER TABLE操作,如遇到此需求,需手动操作,且逻辑复制本身限制比较多,带来使用不便。opengauss在逻辑复制功能方面不断冲破限制,提高功能的完整性,希望opengauss再接再厉,再创辉煌。
-
openGauss 是一款开源关系型数据库管理系统,广泛应用于企业级应用中。随着数据量的增长和业务逻辑的复杂化,数据库管理和操作的自动化需求越来越高。触发器(Triggers)作为数据库中重要的编程工具,能够极大地简化复杂操作,提高系统的性能和安全性。openGauss触发器会在指定的数据库事件发生时自动执行函数。本文将详细介绍 openGauss 的触发器,并提供具体的代码和案例,以帮助读者更好地理解和应用这些工具。 一、触发器1. 什么是触发器触发器是一种特殊类型的存储过程,它会在特定事件(如插入、更新、删除)发生时自动执行。触发器能够自动响应数据库表中的变化,进行数据验证、日志记录等操作。使用触发器可以确保数据的完整性、一致性,并实现复杂的业务逻辑。触发器的特点包括:自动执行:触发器在指定事件发生时自动执行,无需显式调用。灵活性:可以根据具体业务需求,灵活定义触发器的执行逻辑。实时性:触发器在事件发生时立即执行,保证数据的实时性。2. 创建和使用触发器在 openGauss 中,创建触发器需要使用 CREATE TRIGGER 语句。触发器通常需要配合触发器函数(存储过程)一起使用。下面是多个触发器的例子,演示如何创建和使用触发器。创建日志表-- 创建日志表CREATE TABLE employee_changes (change_id SERIAL PRIMARY KEY,emp_id INT,change_type VARCHAR(10),change_time TIMESTAMP,old_name VARCHAR(100),new_name VARCHAR(100),old_salary NUMERIC(15, 2),new_salary NUMERIC(15, 2),old_department VARCHAR(100),new_department VARCHAR(100));创建触发器函数和触发器-- 创建插入触发器函数CREATE OR REPLACE FUNCTION log_insert_employee()RETURNS TRIGGERLANGUAGE plpgsqlAS $$BEGININSERT INTO employee_changes (emp_id, change_type, change_time, new_name, new_salary, new_department)VALUES (NEW.id, 'INSERT', CURRENT_TIMESTAMP, NEW.name, NEW.salary, NEW.department);RETURN NEW;END;$$;-- 创建更新触发器函数CREATE OR REPLACE FUNCTION log_update_employee()RETURNS TRIGGERLANGUAGE plpgsqlAS $$BEGININSERT INTO employee_changes (emp_id, change_type, change_time, old_name, new_name, old_salary, new_salary, old_department, new_department)VALUES (OLD.id, 'UPDATE', CURRENT_TIMESTAMP, OLD.name, NEW.name, OLD.salary, NEW.salary, OLD.department, NEW.department);RETURN NEW;END;$$;-- 创建删除触发器函数CREATE OR REPLACE FUNCTION log_delete_employee()RETURNS TRIGGERLANGUAGE plpgsqlAS $$BEGININSERT INTO employee_changes (emp_id, change_type, change_time, old_name, old_salary, old_department)VALUES (OLD.id, 'DELETE', CURRENT_TIMESTAMP, OLD.name, OLD.salary, OLD.department);RETURN OLD;END;$$;-- 创建触发器CREATE TRIGGER trigger_insert_employeeAFTER INSERT ON employeesFOR EACH ROWEXECUTE FUNCTION log_insert_employee();CREATE TRIGGER trigger_update_employeeAFTER UPDATE ON employeesFOR EACH ROWEXECUTE FUNCTION log_update_employee();CREATE TRIGGER trigger_delete_employeeAFTER DELETE ON employeesFOR EACH ROWEXECUTE FUNCTION log_delete_employee();3. 验证触发器通过插入、更新和删除操作来验证触发器的功能,确保日志表记录了相应的变更。-- 插入员工数据以触发触发器INSERT INTO employees (id, name, salary, department)VALUES (1, 'John Doe', 50000, 'Engineering');-- 更新员工数据以触发触发器UPDATE employeesSET name = 'John Doe', salary = 55000, department = 'Marketing'WHERE id = 1;-- 删除员工数据以触发触发器DELETE FROM employeesWHERE id = 1;-- 查询日志表SELECT * FROM employee_changes;4. 触发器的高级应用触发器不仅可以用于基本的数据变更日志记录,还可以用于更复杂的业务逻辑处理。以下是一些触发器的高级应用场景:数据完整性维护触发器可以在数据插入、更新或删除时自动检查和维护数据的完整性。例如,可以在员工表中添加触发器,确保同一部门中的员工薪资总和不超过某个限制。-- 创建触发器函数CREATE OR REPLACE FUNCTION check_salary_limit()RETURNS TRIGGERLANGUAGE plpgsqlAS $$DECLAREtotal_salary NUMERIC;BEGINSELECT SUM(salary) INTO total_salaryFROM employeesWHERE department = NEW.department;IF total_salary + NEW.salary > 1000000 THENRAISE EXCEPTION 'Total salary in department % exceeds limit', NEW.department;END IF;RETURN NEW;END;$$;-- 创建触发器CREATE TRIGGER trigger_check_salary_limitBEFORE INSERT OR UPDATE ON employeesFOR EACH ROWEXECUTE FUNCTION check_salary_limit();审计和日志记录触发器可以记录数据的变化历史,便于追踪和审计。例如,可以在员工表中添加触发器,记录每次更新操作的详细信息,包括操作人、操作时间和更新前后的数据。-- 创建审计日志表CREATE TABLE audit_log (log_id SERIAL PRIMARY KEY,emp_id INT,operation VARCHAR(10),operation_time TIMESTAMP,operator VARCHAR(100),old_data JSON,new_data JSON);-- 创建触发器函数CREATE OR REPLACE FUNCTION log_audit()RETURNS TRIGGERLANGUAGE plpgsqlAS $$BEGININSERT INTO audit_log (emp_id, operation, operation_time, operator, old_data, new_data)VALUES (NEW.id,TG_OP,CURRENT_TIMESTAMP,current_user,ROW_TO_JSON(OLD),ROW_TO_JSON(NEW));RETURN NEW;END;$$;-- 创建触发器CREATE TRIGGER trigger_audit_logAFTER INSERT OR UPDATE OR DELETE ON employeesFOR EACH ROWEXECUTE FUNCTION log_audit();自动计算和更新触发器可以在数据发生变化时自动计算和更新相关联的数据,保持数据的一致性。例如,可以在订单表中添加触发器,当订单状态变为“已发货”时,自动更新库存表。-- 创建订单表CREATE TABLE orders (order_id INT PRIMARY KEY,product_id INT,quantity INT,status VARCHAR(20));-- 创建库存表CREATE TABLE inventory (product_id INT PRIMARY KEY,stock INT);-- 创建触发器函数CREATE OR REPLACE FUNCTION update_inventory()RETURNS TRIGGERLANGUAGE plpgsqlAS $$BEGINIF NEW.status = 'Shipped' THENUPDATE inventorySET stock = stock - NEW.quantityWHERE product_id = NEW.product_id;END IF;RETURN NEW;END;$$;-- 创建触发器CREATE TRIGGER trigger_update_inventoryAFTER UPDATE ON ordersFOR EACH ROWWHEN (NEW.status = 'Shipped')EXECUTE FUNCTION update_inventory();二、总结存储过程和触发器是 openGauss 数据库中的重要工具,能够帮助开发者简化复杂的数据库操作,实现自动化管理。在实际应用中,通过合理地使用存储过程和触发器,可以提高数据库系统的效率和可靠性。本文详细介绍了存储过程和触发器的基本概念、创建方法、应用场景,并提供了具体的代码和案例,帮助读者更好地理解和应用这些工具。希望本文能够对您在数据库开发和管理中有所帮助。
上滑加载中
推荐直播
-
HDC深度解读系列 - Serverless与MCP融合创新,构建AI应用全新智能中枢2025/08/20 周三 16:30-18:00
张昆鹏 HCDG北京核心组代表
HDC2025期间,华为云展示了Serverless与MCP融合创新的解决方案,本期访谈直播,由华为云开发者专家(HCDE)兼华为云开发者社区组织HCDG北京核心组代表张鹏先生主持,华为云PaaS服务产品部 Serverless总监Ewen为大家深度解读华为云Serverless与MCP如何融合构建AI应用全新智能中枢
回顾中 -
关于RISC-V生态发展的思考2025/09/02 周二 17:00-18:00
中国科学院计算技术研究所副所长包云岗教授
中科院包云岗老师将在本次直播中,探讨处理器生态的关键要素及其联系,分享过去几年推动RISC-V生态建设实践过程中的经验与教训。
回顾中 -
一键搞定华为云万级资源,3步轻松管理企业成本2025/09/09 周二 15:00-16:00
阿言 华为云交易产品经理
本直播重点介绍如何一键续费万级资源,3步轻松管理成本,帮助提升日常管理效率!
回顾中
热门标签