• [问题求助] PG_STAT_REPLICATION视图中write,flush,replay的理解
    gaussdb集中式主备版,pg_stat_replication视图的以下字段如何理解?接收端write具体是指写到哪里?flush是在做什么?replay是在做什么?麻烦稍微回答细致一些,感谢!
  • [技术干货] 云数据库选购 6 大误区:90% 企业都踩过的坑!
    在数字化转型加速的今天,云数据库早已成为企业存储数据、支撑业务的核心基础设施。无论是初创公司的小型应用,还是大型企业的核心业务系统,几乎都离不开云数据库的支持。但很多企业在选购云数据库时,往往陷入“凭感觉、看价格、听宣传”的误区,忽略了自身业务需求、数据特性和长期运维成本,导致买错产品、资源浪费、业务中断等问题——据统计,90% 的企业在云数据库选购过程中,都踩过至少一个坑。本文将客观拆解云数据库选购的 6 大核心误区,每个误区都结合「误区表现」「多维度对比」「误区危害」「正确做法」,全程通俗易懂,不堆砌专业术语,不涉及任何品牌信息,帮企业避开陷阱,选到最适配自身需求的云数据库。  核心原则先明确:云数据库选购的本质是「适配业务、平衡成本、保障稳定」,没有最好的产品,只有最适合自己的选择,盲目追求“高端”“便宜”“热门”,最终都会得不偿失。误区一:只看价格,忽略“隐性成本”这是最常见的误区,尤其是中小企业,往往将价格作为选购的核心甚至唯一标准,觉得“只要能存储数据,越便宜越好”,却忽略了云数据库的隐性成本——后续的运维、扩容、故障排查、数据迁移等,往往比初期采购成本更高。对比维度误区选择(只看低价)正确选择(兼顾隐性成本)初期采购成本极低,甚至有免费试用期限,短期性价比高中等,符合自身预算,不盲目追求低价运维成本极高,无内置运维工具,需单独招聘专业人员,故障排查耗时久较低,提供内置运维工具(如自动备份、故障告警),无需大量专业人员投入扩容成本隐性收费多,扩容时需额外支付高额手续费,且扩容过程繁琐,影响业务扩容规则透明,无隐性收费,支持弹性扩容,不影响业务正常运行长期总成本远高于预期,低价初期节省的成本,会被后续隐性成本抵消,甚至翻倍可控,初期投入合理,后续无额外隐性支出,长期性价比更高误区危害:短期看似节省了成本,长期来看,运维人力投入、故障损失、扩容费用等隐性成本会不断累积,甚至可能因为低价产品的稳定性差,导致业务中断,造成更大的经济损失。正确做法:选购时,不要只看初期报价,要计算“长期总成本”——将初期采购、运维、扩容、备份、故障处理等所有可能产生的费用都纳入考量,优先选择“报价透明、隐性成本低”的产品,结合自身业务规模,选择性价比最优的方案,而非单纯最便宜的方案。误区二:盲目追求“高配置”,资源浪费严重很多企业认为“配置越高,性能越好,越能支撑业务”,盲目选购高CPU、大内存、高存储的云数据库,却忽略了自身业务的实际需求——大部分中小企业的业务场景,根本用不到高端配置,高配置带来的不仅是高额成本,还有资源的严重浪费。对比维度误区选择(盲目高配置)正确选择(适配业务配置)配置规格CPU、内存、存储均选最高档,远超业务实际需求根据业务并发量、数据量,选择刚好适配的配置,预留10%-20%扩容空间资源利用率极低,通常不足30%,大量CPU、内存资源闲置合理,资源利用率维持在60%-80%,既不浪费,也不影响性能成本支出高额,高配置导致每月费用翻倍,且闲置资源无法抵扣成本合理,配置适配业务,每月成本可控,无闲置资源浪费业务适配性配置冗余,反而可能因为配置过高导致资源调度复杂,影响部分业务响应速度配置精准适配业务,响应速度、稳定性都能满足需求,无冗余负担误区危害:高额的配置费用会给企业带来不必要的资金压力,闲置的资源无法发挥价值,相当于“花高价买了用不上的东西”;同时,过高的配置可能导致系统调度复杂,反而影响业务的正常运行。正确做法:先梳理自身业务需求——统计日常并发量、数据存储量、业务响应速度要求,结合未来1-2年的业务增长预期,选择“适配当前、预留空间”的配置。例如,初创公司的小型应用,无需选择高端配置,基础配置即可满足需求;随着业务增长,再通过弹性扩容逐步提升配置,避免一次性投入过高。误区三:忽视“数据一致性”,适配场景选错云数据库有不同的存储引擎和架构,不同类型的数据库,在数据一致性、并发处理、读写性能上有很大差异。很多企业选购时,不了解自身业务的“数据一致性需求”,盲目选择热门类型,导致数据错乱、业务异常。业务场景数据一致性需求误区选择正确选择电商交易、金融支付强一致性(必须保证数据准确,无错乱)弱一致性数据库强一致性数据库内容存储、日志分析弱一致性(允许短暂数据不一致,不影响核心业务)强一致性数据库弱一致性数据库企业ERP、客户管理系统中强一致性(核心数据一致,非核心数据可容忍短暂不一致)极端强/弱一致性数据库中强一致性数据库比如,电商交易、金融支付等场景,需要强数据一致性(即同一数据在不同节点的读取结果一致),而部分企业却选择了弱一致性的数据库;反之,内容存储、日志分析等场景,对一致性要求不高,却选择了强一致性数据库,导致性能浪费。正确做法:先明确自身业务的“数据一致性需求”,再选择对应的云数据库类型。核心原则:核心业务(交易、支付、核心数据管理)优先选择强一致性数据库;非核心业务(日志、内容存储)可选择弱一致性数据库,平衡性能和成本。误区四:不重视“备份与容灾”,埋下安全隐患数据是企业的核心资产,一旦数据丢失、损坏,可能导致业务中断、企业倒闭。但很多企业选购云数据库时,只关注存储和性能,忽视了备份与容灾能力,甚至认为“云数据库不会出问题”,埋下巨大安全隐患。很多低价云数据库,不提供自动备份功能,或备份频率低、备份存储时间短;部分数据库虽然提供备份,但容灾能力薄弱,一旦发生机房故障、自然灾害,数据无法快速恢复,导致业务长时间中断。对比维度误区选择(忽视备份容灾)正确选择(重视备份容灾)备份功能无自动备份,需手动备份,或备份频率低(每周1次),备份存储时间短(7天以内)支持自动备份(每日至少1次),备份存储时间可自定义(建议90天以上),支持手动备份补充容灾能力单节点部署,无容灾机制,机房故障时数据丢失、业务中断多节点部署,支持跨区域容灾,机房故障时可快速切换节点,数据不丢失、业务不中断恢复能力恢复流程繁琐,耗时久(数小时甚至数天),且可能出现数据丢失支持一键恢复,恢复速度快(分钟级),可恢复到任意备份时间点,数据无丢失安全隐患极高,数据丢失、损坏后无法恢复,可能导致业务瘫痪极低,多重备份+容灾机制,最大限度保障数据安全和业务连续性误区危害:一旦发生数据丢失(如误操作、黑客攻击、机房故障),无法快速恢复,导致业务中断,核心数据丢失,给企业带来不可挽回的损失;部分行业(如金融、医疗)还可能因数据丢失不符合合规要求,面临处罚。正确做法:选购时,将备份与容灾能力作为核心考量因素之一,重点关注3点:① 是否支持自动备份,备份频率和存储时间是否可自定义;② 是否支持多节点部署和跨区域容灾;③ 恢复流程是否简单、恢复速度是否快捷。同时,定期测试备份恢复功能,确保出现问题时能正常使用。误区五:忽略“兼容性”,导致数据迁移困难很多企业选购云数据库时,只关注当前业务的适配性,忽略了数据库的兼容性——包括与现有系统、应用程序的兼容性,以及数据迁移的便捷性。后续随着业务发展,需要升级、迁移数据库时,才发现兼容性不足,导致迁移困难、成本高昂,甚至影响业务正常运行。常见的兼容性问题:数据库语法不兼容(现有应用程序无法适配新数据库语法)、接口不兼容(无法与现有系统对接)、数据格式不兼容(迁移时数据错乱、丢失)。对比维度误区选择(忽略兼容性)正确选择(重视兼容性)与现有系统兼容性不兼容现有应用程序、系统接口,需大规模修改代码才能适配兼容现有应用程序和系统接口,无需大规模修改代码,可快速对接数据迁移便捷性无迁移工具,迁移流程繁琐,需手动处理数据,易出现数据错乱、丢失提供内置迁移工具,支持一键迁移,迁移过程简单,数据无丢失、无错乱后续升级兼容性升级后与现有系统、应用程序不兼容,需重新适配,成本高昂支持平滑升级,升级后不影响现有系统和应用程序,兼容性稳定迁移成本极高,需投入大量人力、时间修改代码、处理数据,甚至影响业务中断较低,无需大规模修改代码,迁移效率高,不影响业务正常运行误区危害:后期需要迁移、升级数据库时,会面临“迁移困难、成本高昂、数据丢失”等问题,甚至需要暂停业务进行迁移,影响企业正常运营;若兼容性问题无法解决,可能需要重新选购数据库,造成双重成本浪费。正确做法:选购前,梳理现有系统、应用程序的技术架构,确认云数据库的兼容性——包括语法、接口、数据格式等;同时,询问厂商是否提供迁移工具、迁移服务,以及迁移过程中的技术支持,优先选择“兼容性强、迁移便捷”的产品。误区六:过度依赖“厂商服务”,忽视自身运维能力很多企业认为,选购云数据库后,所有问题都可以依赖厂商的服务,自身无需投入运维人员,忽视了自身运维能力的建设。但实际上,厂商的服务主要集中在数据库本身的稳定性(如故障修复、版本升级),而企业的业务数据、应用适配、日常运维(如数据监控、权限管理),仍需要自身运维人员负责。部分企业过度依赖厂商服务,一旦出现业务层面的问题(如数据异常、应用适配问题),无法及时排查解决,导致业务中断;同时,若自身运维能力不足,也无法充分发挥云数据库的性能,甚至可能因操作不当,导致数据安全隐患。对比维度误区选择(过度依赖厂商服务)正确选择(平衡厂商服务与自身运维)自身运维投入无专业运维人员,所有问题都依赖厂商,响应速度慢配备1-2名专业运维人员,负责日常运维、数据监控、问题排查厂商服务依赖度100%依赖,即使是简单的日常运维问题,也需要联系厂商解决合理依赖,数据库本身的故障、升级依赖厂商,日常运维、业务适配自主解决问题响应速度慢,需等待厂商反馈,可能导致业务长时间中断快,日常问题自主解决,重大故障联系厂商,响应及时,减少业务中断时间数据库利用率低,因自身运维能力不足,无法充分发挥数据库性能,资源浪费高,运维人员熟悉数据库特性,可根据业务需求优化配置,充分发挥性能误区危害:过度依赖厂商服务,会导致问题响应不及时,影响业务连续性;同时,自身运维能力不足,无法及时发现数据异常、优化配置,不仅会浪费资源,还可能埋下数据安全隐患;若厂商服务中断,企业将陷入无法运维的困境。正确做法:选购云数据库时,既要关注厂商的服务能力(如故障响应速度、技术支持水平),也要重视自身运维能力的建设——配备专业运维人员,或对现有人员进行培训,掌握云数据库的日常运维、问题排查技巧;同时,选择“运维门槛低、提供完善运维工具”的云数据库,降低自身运维压力。最后:选购核心总结+企业避坑建议以上6大误区,本质上都是“需求与选择脱节”——企业没有明确自身业务需求、数据特性、成本预算,盲目跟风、凭感觉选购,最终导致踩坑。云数据库选购没有统一的标准,核心是“适配自身”,记住以下3点,可避开90%的坑:1. 先明确需求,再选择产品:梳理自身业务的并发量、数据量、数据一致性需求、备份容灾需求,结合成本预算,划定选购范围,不盲目追求高端、低价、热门。2. 兼顾短期成本与长期价值:不要只看初期采购成本,要计算长期总成本,重视隐性成本、兼容性、可扩展性,避免后期迁移、升级、运维带来的额外负担。3. 平衡厂商服务与自身运维:不过度依赖厂商服务,也不忽视自身运维能力建设,选择运维门槛低、服务完善的产品,确保业务稳定运行。对于企业而言,云数据库的选购不是“一次性决策”,而是需要结合业务发展动态调整。初期可选择适配当前业务的产品,随着业务增长,逐步优化配置、升级产品;同时,定期复盘数据库的使用情况,及时发现问题、调整方案,才能让云数据库真正成为支撑业务发展的核心力量。
  • [问题求助] 关于gaussdb(集中式版)当中视图的分类
    开发指南(集中式)当中,对adm、db、my类型视图有说明,未说明pg、gs类型的视图。gs_*类型的视图与其他4中类型的视图有何区别?gs类型视图的用途是啥?pg_*类型的视图,是和原生pg保持一致的吗?还是有所改动?GS_STAT_ALL_PARTITIONS视图当中的n_tup_hot_upd字段,描述为热更新行数(比如没有更新所需的单独索引)。不太理解,什么是热更新?
  • [问题求助] 关于GaussDB当中分区表的索引的理解
    gaussdb当中,分区表的索引有global和local两种。当指定为global或使用默认值时,这个索引是否就是普通索引,未进行索引层面的分区?之所以有这种疑问,是由于Oracle数据库中,分区表的索引,分成了global index,global partitioned index。想知道gaussdb是否也如此?gaussdb是不是不支持索引的全局hash分区,即global hash partitioned index?当指定为local时,索引的分区是不是和表的分区一一对应?包括分区键、分区类型?
  • [问题求助] 自动统计信息收集的阈值
    通过文档了解到统计信息自动收集由autovacuum线程来做,阈值是从上一次autoanalyze后表元组的变化数量 > autovacuum_analyze_threshold +autovacuum_analyze_scale_factor * reltuples 。autovacuum_analyze_threshold、autovacuum_analyze_scale_factor由参数控制reltuples是pg_class中的字段值。请问自从上一次autoanalyze后表元组的变化数量是存在什么地方的,已了解到pg_stat_all_tables中的n_tup_ins、n_tup_upd、n_tup_del并不会在做完analyze后重置。
  • [问题求助] GaussDB ADM_TAB_PARTITIONS视图的num_rows字段咨询
    ADM_TAB_PARTITIONS视图的num_rows字段,记录的行数是来自统计信息吗?还是真实的行数?
  • [技术干货] 事务隔离级别核心概念
    一、事务隔离级别核心概念事务隔离级别(Transaction Isolation Level)是数据库用来解决并发事务冲突的规则,核心解决三类问题:  脏读:读取到其他事务未提交的数据  不可重复读:同一事务内多次读取同一数据,结果不一致  幻读:同一事务内多次执行同一查询,结果集行数不一致二、数据库四大隔离级别隔离级别脏读不可重复读幻读说明READ UNCOMMITTED(读未提交)✅✅✅最低级别,允许读取未提交的数据,性能最高但数据最不可靠READ COMMITTED(读已提交)❌✅✅OpenGauss/MySQL 默认级别,只能读取已提交的数据,解决脏读REPEATABLE READ(可重复读)❌❌✅同一事务内多次读取数据一致,解决不可重复读(InnoDB 可解决幻读)SERIALIZABLE(串行化)❌❌❌最高级别,事务串行执行,完全解决并发问题,但性能最差(锁表级别)三、 隔离级别注意事项  SERIALIZABLE 级别:仅适用于数据一致性要求极高的场景,普通业务不建议使用,会导致并发性能大幅下降;  默认级别 READ COMMITTED:满足大部分场景,既能避免脏读,又能保证并发性能;  隔离级别与锁:级别越高,数据库加的锁越多(行锁→表锁),需在 “一致性” 和 “性能” 之间平衡。
  • [吐槽&反馈] GaussDB是否有计划搭建一个类似于Oracle MOS的问题发布网站?
    目前GaussDB,遇到问题大部分都要找原厂,但是原厂资源有限,响应速度不够快。社区知名度也不高,是否有计划,推出一个专门用于问题处理的网站?或者说论坛版块?
  • [问题求助] HCIA(GaussDB for Mysql)
    有人考过HCIA(GaussDB for Mysql),想了解一下
  • [技术交流] 源代码:大批量SQL代码语法转换简单实例:ORACLE START WITH CONNECT 语法改写
    ### 背景:在不同数据库迁移的项目中,往往会遇到SQL语法不兼容的情况。### 问题:如果存在大量代码需要改写的情况,靠人工处理会很耗时,且容易出错。能不能通过工具实现代码语法的大批量自动转换?### 方案:可以使用开源代码解析器 ZGLanguage 对SQL代码进行大批量自动转换### 案例演示:# 假设 ORACLE START WITH CONNECT 语法代码( start_with_connect.sql ):SELECT * FROM tree START WITH id = 1 CONNECT BY NOCYCLE PRIOR id = parentid ;# 配置转换规则可以将以上代码直接转换成如下代码(改写成with recursive语法):with recursive wr_tree as ( SELECT id, parentid, 1 as level from tree where id = 1 union SELECT tree.id, tree.parentid, level + 1 from tree, wr_tree where tree.parentid = wr_tree.id ) SELECT * from wr_tree order by id ;# 转换规则( STATR_WITH_CONNECT_SQL_REPLACE.syn )如下所示:__DEF_FUZZY__ Y __DEF_DEBUG__ N __DEF_CASE_SENSITIVE__ N __DEF_LINE_COMMENT__ -- __DEF_LINES_COMMENT__ /* */ __DEF_STR__ __IF_KW__ <1,100> [1,1]ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz [0,100]ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_ __DEF_PATH__ __START_WITH_CONNECT__ 1 : sel @ %__IF_KW__ | select : cc @ | * : frm @ | from : srctab @ | __NAME__ : sta @ %__IF_KW__ | start : wth @ %__IF_KW__ | with : swp @ | __NAME__ : dy1 @ | = : int @ | __INT__ : str @ + __STRING__ : cnn @ %__IF_KW__ | connect : by @ %__IF_KW__ | by : ncy @ %__IF_KW__ CAN_SKIP | nocycle : prr1 @ %__IF_KW__ CAN_SKIP | prior : col1 @ | __NAME__ : dy @ | = : col2 @ | __NAME__ : end @ | ; ----------------------------------------------------------------------- 1 : sel @ | with : sel @ | recursive : sel @ | wr_ : srctab @ \ __NAME__ : sel @ STRING | as : sel @ | __\n__ : sel @ | ( : sel @ | __\n__ : sel @ | select : col1 @ / __NAME__ : col2 @ \ , : col2 @ / __NAME__ : sel @ STRING \ , 1 as level from : srctab @ / __NAME__ : sta @ / where : swp @ / __NAME__ : dy1 @ / = : int @ / __INT__ : str @ / __STRING__ : sel @ | __\n__ : sel @ | union : sel @ | __\n__ : sel @ | select : srctab @ / __NAME__ : srctab @ \ . : col1 @ \ __NAME__ : col2 @ \ , : srctab @ / __NAME__ : srctab @ \ . : col2 @ \ __NAME__ : sel @ STRING \ , level + 1 from : srctab @ / __NAME__ : srctab @ \ , : sel @ / wr_ : srctab @ \ __NAME__ : sta @ / where : srctab @ / __NAME__ : srctab @ \ . : col2 @ \ __NAME__ : dy1 @ / = : sel @ / wr_ : srctab @ \ __NAME__ : srctab @ \ . : col1 @ \ __NAME__ : sel @ | __\n__ : sel @ STRING | ) : sel @ | __\n__ : sel @ | select : sel @ | * : sel @ STRING | from : sel @ | wr_ : srctab @ \ __NAME__ : sel @ / order : sel @ / by : col1 @ / __NAME__ : end @ | ; __DEF_STR__ __NAME__ <1,100> [1,1]ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_?? [0,100]ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_?? [NO] create insert update delete truncate drop merge table select inner left join on from where group order partition by having union all with as set between and or like in is not null case when then pivot lateral view __DEF_STR__ __INT__ <1,100> [1,100]0123456789 __DEF_SUB_PATH__ __STRING__ 1 : x1 | ' : x2 | __ANY__ : x3 | '    
  • [问题求助] query_id,unique_query_id,debug_query_id三者的含义及区别
    在gaussdb中,很多视图都带有query_id,unique_query_id,debug_query_id三个字段。query_id描述为查询语句的ID,unique_query_id描述为归一化SQL id,debug_query_id描述为唯一SQL id。官方文档的描述看不懂,请解释一下3个字段的含义。三个字段有什么区别,有什么联系?分别适用于什么场景?
  • [案例共创] 【案例共创】基于华为开发者空间-云开发环境(容器)使用VS Code版CodeArts代码智能体构建个性化学习计划应用
    案例介绍CodeArts代码智能体是基于智能生成、智能问答两大核心能力构建起一套全方位、多层次的智能开发体系。在智能生成方面,它能够依据开发者输入的需求描述,准确且高效地生成高质量代码;本案例基于华为开发者空间 - 云开发环境(容器)与 VS Code 版 CodeArts 代码智能体,快速构建个性化学习计划应用。该应用旨在解决传统学习计划千人一面、缺乏动态调整机制、无法适配个人学习节奏与目标的核心痛点,帮助用户高效制定并执行学习方案。一、概述1.1 案例介绍华为开发者空间,是为全球开发者打造的专属开发者空间,致力于为每位开发者提供一台云主机、一套开发工具和云上存储空间,汇聚昇腾、鸿蒙、鲲鹏、GaussDB、欧拉等华为各项根技术的开发工具资源,并提供配套案例指导开发者从开发编码到应用调测,基于华为根技术生态高效便捷的知识学习、技术体验、应用创新。CodeArts代码智能体是基于智能生成、智能问答两大核心能力构建起一套全方位、多层次的智能开发体系。在智能生成方面,它能够依据开发者输入的需求描述,准确且高效地生成高质量代码;智能问答功能则如同开发者身边的专属技术顾问。GaussDB:华为自主创新研发的分布式关系型数据库。该产品支持分布式事务,同城跨AZ部署,数据0丢失,支持1000+的扩展能力,PB级海量存储。同时拥有云上高可用,高可靠,高安全,弹性伸缩,一键部署,快速备份恢复,监控告警等关键能力,能为企业提供功能全面,稳定可靠,扩展性强,性能优越的企业级数据库服务。本案例基于华为开发者空间 - 云开发环境(容器)与 VS Code 版 CodeArts 代码智能体,快速构建个性化学习计划应用。该应用旨在解决传统学习计划千人一面、缺乏动态调整机制、无法适配个人学习节奏与目标的核心痛点,帮助用户高效制定并执行学习方案。1.2 适用对象在校学生职场技能提升人群在线教育机构高校学生个人开发者与技术爱好者1.3 案例时间本案例总时长预计120分钟。1.4 案例流程说明:用户通过 VS Code 远程连接云开发环境,并安装 CodeArts 代码智能体插件。在 VS Code 中开启 CodeArts 代码智能体的 “智能体模式”,通过 Prompt 指令引导构建个性化学习计划应用的核心功能。实现用户画像构建、学习目标设定、智能计划生成、进度跟踪等功能模块。迭代代码,使用gaussdb数据库。运行应用并测试不同场景下功能,CodeArts 代码智能体。1.5 资源总览本案例预计花费1.85元。资源名称规格单价(元)时长(分钟)云开发环境(容器)鲲鹏通用计算增强型 kc1 2vCPUs 4G HCE免费120CodeArts服务免费体验版免费120VS Code免费下载免费120gaussdb按需1.8560二、环境和资源准备2.1 安装插件打开VS Code,点击下图图标,搜索Huawei Developer Space,点击Install,安装插件。2.2 登录安装完成后,点击Huawei Developer Space插件图标,点击登录。确认打开外部网站。点击确认授权。显示登录成功后,返回VS Code中,允许打开此URL,至此VS Code端工作准备就绪。2.3 创建云开发环境(容器)在CLOUD DEV ENV(CONTAINER)页签,点击创建云开发环境,创建云开发环境。输入云开发环境名称:banjin(名称可以自拟),然后回车。注:必填项,可包含数字、字母、下划线,不能以数字开头,长度不超过15个字符。容器镜像选择All in One,然后回车。注:必填项,根据其预置工具不同,公共模板包含All In One、Go、Java、Python、Node等云开发环境(容器)模板,开发者可根据实际情况进行选择。选择规格,云开发环境(容器)提供了四个配置规格,分别为2vCPUs 4Gib、4vCPUs 8Gib、8vCPUs 16Gib、16vCPUs 32Gib。配置环境变量,若无则直接回车。注:选填项,多个键值对之间使用英文分号分隔,如:key1=value1;key2=value2;变量名称只能由字母、数字和下划线组成,且只能以字母或下划线开头,变量名称与变量值长度不能超过128个字符;最多可添加50个环境变量。2.4 远程连接云开发环境(容器)回到VS Code端,我们可以看到刚才开设的容器服务器。将鼠标置于其上,可以看到出现运行的按钮,点击开始运行启动容器环境开机成功后,点击在当前窗口链接,连接远程开发环境(容器)。此时会提示安装远程的拓展,我们点击安装即可。安装完成后,会弹出平台操作系统选择,我们选择Linux。连接成功后,如下图所示。执行命令测试一下,可以确认已经连接成功了。2.5 安装CodeArts代码智能体点击Extensions图标,搜索CodeArts Doer for Coding,选择在该容器环境中安装。【注意】此处的工作空间已经切换,即使本地安装了CodeArts Doer,此处也不会显示,选择ssh仍然选择在容器环境中安装。安装完成之后,我们点击左侧如图所示的图标,可以看到登陆界面,点击选择华为云账号登录。此时CodeArts代码智能体还不能直接使用,需要进行登录,点击华为账号登录,弹出窗口提示:是否打开外部网站,点打开。浏览器自动打开“批准登录”确认页面。若此时未登录账号,则跳转华为账号登录。若账号已登录,则选中并点登录。注:若为首次使用CodeArts代码智能体,会进入开通页面。需要勾选**“我已阅读并同意”后,单击“立即开通”**,等待套餐开通完成。至此,全部环境准备工作完成。2.6 配置智能体模式在CodeArts代码智能体对话框下侧点Agent模式,在弹出的菜单最后侧点设置按钮。在设置界面,点“自动批准”右侧的已启用。进入授权所有自动化操作界面,分别勾选读取文件和目录、编辑文件、执行命令、更新代办、执行task工具、使用浏览器。2.7 gaussdb数据库准备在开发者空间页面打开云数据库GAUSSDB,点击立即前往点击购买数据库实例选择购买数据库实例选项,本次案例选择按需的最小实例、集中式、单副本、通用型4c16g点击购买实例点击登录实例创建数据库三、基于CodeArts 代码智能体构建个性化学习计划应用3.1 需求分析与架构设计传统学习计划存在明显痛点:模板化内容无法匹配个人基础、学习目标模糊且缺乏拆解、计划执行过程中没有动态调整机制、学习进度难以直观跟踪。因此,本应用旨在构建个性化学习计划一站式平台:用户输入个人基础信息、学习目标、每日可投入时长等内容,系统通过智能算法生成定制化学习计划;支持按学科 / 技能拆分学习任务,设置阶段性里程碑;实时跟踪学习进度,根据完成情况自动调整后续计划;提供学习资源推荐、进度可视化报表等功能。系统架构设计,核心模块包括:用户模块:负责用户注册、登录、个人信息管理画像模块:构建用户学习基础、目标、时间等维度画像计划生成模块:基于用户画像智能生成学习计划与任务拆分进度跟踪模块:记录任务完成情况,支持手动打卡与自动统计资源推荐模块:根据学习计划匹配对应的课程、资料等资源可视化模块:以图表形式展示学习进度与完成率3.2 代码构建在 CodeArts 智能体模式下,输入以下 Prompt 指令,引导智能体完成应用开发:设计并开发一个"个性化学习计划应用",该应用需实现以下完整功能流程:1. 用户端:支持注册登录,填写个人基础(学历/当前技能水平)、学习目标(如考研/考公/技能考证)、每日可投入时长、学习偏好(如碎片化/整段时间学习);2. 智能计划生成:根据用户画像,自动拆分总目标为阶段性里程碑(按月/周拆分),再拆解为每日学习任务,明确任务内容、时长、优先级;3. 进度跟踪:支持用户手动打卡任务完成情况,系统自动统计每日/每周完成率,当连续3天未完成任务时,自动调整计划难度;4. 资源推荐:根据学习任务匹配对应的免费学习资源(如B站课程链接、电子书地址),支持用户手动添加资源;5. 可视化报表:以柱状图/折线图展示学习进度、完成率,支持导出PDF格式学习报告;6. 技术要求:使用python,确保界面简洁易用此时可以看到,智能体开始自动构建任务,生成开发方案、编写代码。在生成完项目代码后,CodeArts 智能体会对代码功能进行测试,测试中发现的问题会自我修复等待智能体完成需求分析与任务拆分,最终生成的项目架构如下:learning_plan_app/├── main_ui.py # 主界面(28KB)├── database.py # 数据库管理(18KB)├── plan_generator.py # 智能计划生成(13KB)├── progress_tracker.py # 进度跟踪(5.5KB)├── resource_manager.py # 资源管理(9.0KB)├── report_generator.py # 报表生成(13KB)├── run.py # 启动文件├── test_app.py # 测试脚本├── requirements.txt # 依赖列表├── README.md # 项目说明├── PROJECT_OVERVIEW.md # 项目概览├── USER_GUIDE.md # 使用指南├── SUMMARY.md # 项目总结├── start.sh / start.bat # 启动脚本├── data/ # 数据目录├── reports/ # 报告输出└── resources/ # 资源目录3.3.测试生成的代码打开TERMINAL窗口,进入项目目录先安装依赖pip install -r requirements.txt 运行调试代码python main_app.py生成的第一次代码进行运行,遇到了异常进行修复,关联上下文选择terminal,让CodeArts 智能体使用其他方式来实现3.4 优化迭代默认生成项目方案使用的时sqlite3,为了便于管理我们使用gaussdbCodeArts 智能体,帮我们修改为使用 gaussdb:帮我把数据库使用gaussdb来实现等待生成完成后检查项目文件可以看到已经成成gaussdb对应信息了修改数据库配置使用第二步创建的gaussdb数据,修改数据库配置信息,填写数据库ip、端口、用户、密码3.5 启动测试验证至此所有优化完成,运行优化后的代码 [root@b2f383fbe96e4f899ec5318ba02b6d4e personalized_learning_app]# python3 run_web.py正在启动个性化学习计划应用(Web版本)...============================================================ Web 界面已启动!============================================================访问地址: 本地: http://localhost:5000 远程: http://0.0.0.0:5000按 Ctrl+C 停止服务器============================================================ * Serving Flask app 'web_ui' * Debug mode: onWARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Running on all addresses (0.0.0.0) * Running on http://127.0.0.1:5000 * Running on http://172.10.56.231:5000Press CTRL+C to quit * Restarting with watchdog (inotify)正在启动个性化学习计划应用(Web版本)...============================================================ Web 界面已启动!============================================================访问地址: 本地: http://localhost:5000 远程: http://0.0.0.0:5000 点击在浏览器中打开,访问启动的个性化学习应用我们先来注册并登录设置个人信息创建学习计划测试打卡功能,进行今天的打卡学习资源推荐查看数据表信息功能测试完成,功能测试都正常当所有测试结束后,进行资源清理,如后续继续使用可酌情忽略至此案例基于华为开发者空间+CodeArts Doer代码智能体构建个性化学习计划应用全部完成四、一点心得          AI 编码工具并不能一步到位生成完美可用的应用,需要开发者通过精准的 Prompt 指令引导,结合实际需求不断迭代优化。这个 “开发者与智能体结对编程” 的过程,不仅能高效完成应用开发,更能让开发者聚焦于需求设计与功能优化,这也是未来开发模式的重要方向。 我正在参加【案例共创】【第9期】基于开发者空间-云开发环境(容器)+ CodeArts代码智能体完成应用开发/调试实践cid:link_0
  • [问题求助] GaussDB轻量化部署形态,集中式部署场景,通过管理平台(TPOPS)创建容灾关系无法选择实例
     通过TPOPS管理平台安装了两个实例集群,集群模式是2+2,即A区域两个主节点集群B区域两个备节点集群(不考虑单点故障和业务中断影响。),但是创建容灾关系不显示实例。请帮助解答,谢谢。 
  • [问题求助] 关于checkpoint周期的疑问
    目前我设置的参数:checkpoint_segments=1024checkpoint_timeout=15min是否可以理解为当wal日志个数超过1024个或距离上次checkpoint时间超过15min,才会发起checkpoint。在达到这两个条件之一期间还有其他机制触发checkpoint吗?
  • [知识分享] 源代码:大批量SQL代码语法转换实战:PIVOT函数改写(案例2)
    ### 背景:在不同数据库迁移的项目中,往往会遇到SQL语法不兼容的情况。比如有的数据库支持PIVOT函数,有的不支持。遇到这种情况,就必须对PIVOT函数进行改写。### 问题:如果存在大量代码需要改写的情况,靠人工处理会很耗时,且容易出错。能不能通过工具实现代码语法的大批量自动转换?### 方案:可以使用开源代码解析器 ZGLanguage 对SQL代码进行大批量自动转换### 案例演示:# 存在 SQL PIVOT函数 如下所示:SELECT * FROM table2222 PIVOT ( SUM(sales) AS ss1, SUM(cogs) AS sc FOR (yr, qtr) IN ( (2001, 'Q1'), (2001, 'Q2'), (2001, 'Q3'), (2001, 'Q4') ) ) tmp ;# 使用开源软件 ZGLanguage 转换规则,执行转换,可得到结果:SELECT * FROM ( select ###,###,### SUM(case when yr=2001 and qtr='Q1' then sales else null end ) AS "2001_Q1_ss1", SUM(case when yr=2001 and qtr='Q2' then sales else null end ) AS "2001_Q2_ss1", SUM(case when yr=2001 and qtr='Q3' then sales else null end ) AS "2001_Q3_ss1", SUM(case when yr=2001 and qtr='Q4' then sales else null end ) AS "2001_Q4_ss1", SUM(case when yr=2001 and qtr='Q1' then cogs else null end ) AS "2001_Q1_sc", SUM(case when yr=2001 and qtr='Q2' then cogs else null end ) AS "2001_Q2_sc", SUM(case when yr=2001 and qtr='Q3' then cogs else null end ) AS "2001_Q3_sc", SUM(case when yr=2001 and qtr='Q4' then cogs else null end ) AS "2001_Q4_sc" from table2222 where (yr, qtr) IN ( (2001, 'Q1') , (2001, 'Q2') , (2001, 'Q3') , (2001, 'Q4') ) group by ###,###,### ) tmp ;# 转换规则如下所示 :__DEF_FUZZY__ Y __DEF_DEBUG__ N __DEF_CASE_SENSITIVE__ N __DEF_LINE_COMMENT__ -- __DEF_LINES_COMMENT__ /* */ __DEF_STR__ __IF_KW__ <1,100> [1,1]ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz [0,100]ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_ __DEF_PATH__ __FROM_PIVOT_2_1__ 1 : frm @ %__IF_KW__ | from : tab @ | __TABLE_NAME__ : ssl @ + __SUB_SELECT__ : pvt @ | pivot : x1 @ | ( N : fun @ | __NAME__ __//__ sum .... : fs @ | ( : col1 @ | __NAME__ : fe @ | ) : as1 @ %__IF_KW__ CAN_SKIP | as : colas @ | __NAME__ e : dh1 @ | , 1 : for2 @ %__IF_KW__ | for : y1 @ | __COLS_4_FOR__ : in2 @ | in : y5 @ | ( N : y3 @ | __VALUE_4_IN__ e : dh7 @ | , 1 : y6 @ | ) : x2 @ | ) ------------------------------------------------------------------ 1 : frm @ | from : tab @ | __TABLE_NAME__ : ssl @ | __SUB_SELECT__ : pvt @ | pivot : x1 @ | ( N : fun @ | __NAME__ : fs @ | ( : col1 @ | __NAME__ : fe @ | ) : as1 @ | as : colas @ | __NAME__ e : dh1 @ | , 1 : for2 @ | for : y1 @ | __COLS_4_FOR__ : in2 @ | in : y5 @ | ( N : y3 @ | __\b__ : y1 @ | __COLS_4_FOR__ : y3 @ | __VALUE_4_IN__ e : dh7 @ | , 1 : y6 @ | ) 1 : for2 @ | where : y1 @ | __COLS_4_FOR__ : in2 @ | in : y5 @ | ( N : y3 @ | __VALUE_4_IN__ e : dh7 @ | , 1 : y6 @ | ) : x2 @ | ) __DEF_PATH__ __FROM_PIVOT_2_2__ 1 : frm @ %__IF_KW__ | from : tab @ | __TABLE_NAME__ : ssl @ + __SUB_SELECT__ : pvt @ | pivot : x1 @ | ( N : fun @ | __NAME__ : fs @ | ( : col1 @ | __NAME__ : fe @ | ) : as1 @ %__IF_KW__ CAN_SKIP | as : colas @ | __NAME__ e : dh1 @ | , 1 : for2 @ %__IF_KW__ | for : y1 @ | __COLS_4_FOR__ : in2 @ | in : y5 @ | ( N : y3 @ | __COLS_VALUES__ e : dh7 @ | , 1 : y6 @ | ) 1 : where @ | where : y11 @ | __COLS_4_FOR__ : in21 @ | in : y51 @ | ( N : y31 @ | __VALUE_4_IN__ e : dh71 @ | , 1 : y61 @ | ) : x2 @ | ) ------------------------------------------------------------------ 1 : frm @ | from : tab @ | __TABLE_NAME__ : ssl @ | __SUB_SELECT__ : pvt @ | pivot : x1 @ | ( N : fun @ | __NAME__ : fs @ | ( : col1 @ | __NAME__ : fe @ | ) : as1 @ | as : colas @ | __NAME__ * : y3 @ | __COLS_VALUES__ e : y3 @ | , 1 : where @ | where : y11 @ | __COLS_4_FOR__ : in21 @ | in : y51 @ | ( N : y31 @ | __VALUE_4_IN__ e : dh71 @ | , 1 : y61 @ | ) : x2 @ | ) __DEF_PATH__ __FROM_PIVOT_2_3__ 1 : frm @ %__IF_KW__ | from : tab @ | __TABLE_NAME__ : ssl @ + __SUB_SELECT__ : pvt @ | pivot : x1 @ | ( N : fun @ | __NAME__ : fs @ | ( : col1 @ | __NAME__ : fe @ | ) : as1 @ %__IF_KW__ CAN_SKIP | as : colas @ | __NAME__ : cw @ | __CASE_WHEN__ : as2 @ | as : y2 @ | __VALUE_2_COL__ e : y3 @ | , 1 : where @ | where : y11 @ | __COLS_4_FOR__ : in21 @ | in : y51 @ | ( N : y31 @ | __VALUE_4_IN__ e : dh71 @ | , 1 : y61 @ | ) : x2 @ | ) -------------------------------------------------------------- 1 : frm @ | from : x1 @ | ( : x1 @ STRING | select ###,###,### N : fun @ | __NAME__ : fs @ | ( : cw @ | __CASE_WHEN__ : col1 @ | __NAME__ : col1 @ STRING | else null end : fe @ | ) : as1 @ | as : y2 @ | __VALUE_2_COL__ : colas @ \ __NAME__ : colas @ \ " e : y3 @ | , 1 : pvt @ | from : tab @ | __TABLE_NAME__ : ssl @ | __SUB_SELECT__ 1 : where @ | where : y11 @ | __COLS_4_FOR__ : in21 @ | in : y51 @ | ( N : y31 @ | __VALUE_4_IN__ e : dh71 @ | , 1 : y61 @ | ) : x1 @ STRING | group by ###,###,### : x2 @ | ) __DEF_SUB_PATH__ __VALUE_2_COL__ N : x1 @ | __INT__ + : x2 @ | ' : x3 @ | __ANY__ : x4 @ | ' ------------------------------------------------------------------ 1 : x1 @ | " : x3 @ | " N : x1 @ \ __INT__ : x3 @ \ __ANY__ : x1 @ \ _ : x3 @ \ _ __DEF_SUB_PATH__ __CASE_WHEN__ N : x1 @ | __NAME__ : x2 @ | = : x3 @ | __INT__ : x4 @ + __STRING__ e : x5 @ | and ------------------------------------------------------------------ 1 : x1 @ STRING | case when N : x1 @ | __NAME__ : x2 @ | = : x3 @ | __INT__ : x4 @ | __STRING__ e : x5 @ | and 1 : x1 @ | then __DEF_SUB_PATH__ __COLS_VALUES__ 1 : x1 @ | ( N : x2 @ | __NAME__ e : x3 @ | , 1 : x4 @ | ) : y1 @ | ( N : y2 @ | __INT__ : y3 @ + __STRING__ e : y4 @ | , 1 : y5 @ | ) ---------------------------------------------------------------------- N : x2 @ | __NAME__ : x2 @ / = : y2 @ / __INT__ : y3 @ / __STRING__ e : x2 @ | and 1 : x2 @ | as N : y2 @ | __INT__ : y3 @ | __STRING__ __DEF_SUB_PATH__ __COLS_4_FOR__ 1 : x1 @ | ( N : x2 @ | __NAME__ e : x3 @ | , 1 : x4 @ | ) __DEF_SUB_PATH__ __VALUE_4_IN__ 1 : x1 @ | ( N : x2 @ | __INT__ : x3 @ + __STRING__ e : x4 @ | , 1 : x5 @ | ) __DEF_SUB_PATH__ __TABLE_NAME__ 1 : srctab @ | __NAME__ + : schema @ | __NAME__ : pp @ | . : srctab2 @ | __NAME__ __DEF_SUB_PATH__ __SUB_SELECT__ 1 : x1 @ | __SUB__ __DEF_PATH__ __SUB__ 1 : x1 @ | ( N : x2 @ | __ALL_STR__ : x3 @ + __SUB__ 1 : x4 @ | ) __DEF_STR__ __ALL_STR__ <1,20000> [1,20000]ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789`~!@#$%^&*-_+={}[]\|:;'"<,>.?/ __DEF_STR__ __NAME__ <1,100> [1,1]ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_?? [0,100]ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_?? [NO] create insert update delete truncate drop merge table select inner left join on from where group order partition by having union all with as set between and or like in is not null case when then pivot lateral view __DEF_STR__ __FLOAT__ <1,100> [1,50]0123456789 [1,1]. [1,50]0123456789 __DEF_STR__ __INT__ <1,100> [1,100]0123456789 __DEF_SUB_PATH__ __STRING__ 1 : x1 | ' : x2 | __ANY__ : x3 | ' ### 转换规则详细说明:以上PIVOT函数的转换规则比较复杂,不能一次性转换完毕,这里分成3次转换完成:ZGLanguage -e PIVOT_UNPIVOT_SQL_REPLACE.syn -r pivot_unpivot.code -o 1_mid_result.zgl ZGLanguage -e PIVOT_UNPIVOT_SQL_REPLACE.syn -r 1_mid_result.zgl -o 2_mid_result.zgl ZGLanguage -e PIVOT_UNPIVOT_SQL_REPLACE.syn -r 2_mid_result.zgl -o result.zgl # 第1次转换规则 “__FROM_PIVOT_2_1__” 对源代码进行转换,  (A) 值“(yr, qtr)” 和 枚举值 “Q1,Q2,Q3,Q4” 的一一映射关系  (B) 新增:where结构(由 FOR 结构转换得到)  得到如下结果:SELECT * FROM table2222 PIVOT ( SUM ( sales ) AS ss1 , SUM ( cogs ) AS sc FOR (yr, qtr) IN ( (yr, qtr) (2001, 'Q1') , (yr, qtr) (2001, 'Q2') , (yr, qtr) (2001, 'Q3') , (yr, qtr) (2001, 'Q4') ) where (yr, qtr) IN ( (2001, 'Q1') , (2001, 'Q2') , (2001, 'Q3') , (2001, 'Q4') ) ) tmp ;# 第2次转换规则 “__FROM_PIVOT_2_2__” 对 “__FROM_PIVOT_2_1__” 的转换结果(以上)再次进行转换。   完成:  (A) 聚合函数“SUM字段” 和 “(yr, qtr)字段” 的笛卡尔积映射  (B) 提取枚举值准备生成新的字段别名  得到如下结果:SELECT * FROM table2222 PIVOT ( SUM(sales) AS ss1 yr = 2001 and qtr = 'Q1' as 2001 'Q1' , SUM(sales) AS ss1 yr = 2001 and qtr = 'Q2' as 2001 'Q2' , SUM(sales) AS ss1 yr = 2001 and qtr = 'Q3' as 2001 'Q3' , SUM(sales) AS ss1 yr = 2001 and qtr = 'Q4' as 2001 'Q4' , SUM(cogs) AS sc yr = 2001 and qtr = 'Q1' as 2001 'Q1' , SUM(cogs) AS sc yr = 2001 and qtr = 'Q2' as 2001 'Q2' , SUM(cogs) AS sc yr = 2001 and qtr = 'Q3' as 2001 'Q3' , SUM(cogs) AS sc yr = 2001 and qtr = 'Q4' as 2001 'Q4' where (yr, qtr) IN ( (2001, 'Q1') , (2001, 'Q2') , (2001, 'Q3') , (2001, 'Q4') ) ) tmp ;# 第3次转换规则 “__FROM_PIVOT_2_3__” 对 “__FROM_PIVOT_2_2__” 的转换结果(以上)再次进行转换。   完成:  (A) 对SUM开头的字段内容进行新增、位移、合并等操作,形成语法正确的字段逻辑  (B) 剔除PIVOT关键字,移动表名到 where 语句上方  (C) 拼接新的字段名称  (D) 新增待人工补充部分: select ###,###,###   group by ###,###,###  得到最终结果:SELECT * FROM ( select ###,###,### SUM(case when yr=2001 and qtr='Q1' then sales else null end) AS "2001_Q1_ss1", SUM(case when yr=2001 and qtr='Q2' then sales else null end) AS "2001_Q2_ss1", SUM(case when yr=2001 and qtr='Q3' then sales else null end) AS "2001_Q3_ss1", SUM(case when yr=2001 and qtr='Q4' then sales else null end) AS "2001_Q4_ss1", SUM(case when yr=2001 and qtr='Q1' then cogs else null end) AS "2001_Q1_sc", SUM(case when yr=2001 and qtr='Q2' then cogs else null end) AS "2001_Q2_sc", SUM(case when yr=2001 and qtr='Q3' then cogs else null end) AS "2001_Q3_sc", SUM(case when yr=2001 and qtr='Q4' then cogs else null end) AS "2001_Q4_sc" from table2222 where (yr, qtr) IN ( (2001, 'Q1') , (2001, 'Q2') , (2001, 'Q3') , (2001, 'Q4') ) group by ###,###,### ) tmp ; ### 新增待补充部分 ###,###,### 说明:1、通过简单的配置,不能直接转换成完全可用的SQL代码,有些代码部分依然需要人工补充2、需要人工补充的部分,已经通过 ###,###,### 明显地标注出来3、通过工具已经完成了大部分的转换工作,可以极大减轻人工参与的工作量,规避人工修改失误的风险源代码下载: cid:link_0