• [问题求助] ECPG连接高斯数据库,测试环境正常访问,生产环境报-402无法连接数据库
    ECPG连接高斯数据库,测试环境正常访问,生产环境报-402无法连接数据库(ecpg需要头文件,库文件从数据库服务器/lib,/liclude获取,ecpg编译/链接均无问题))。生产环境telnet高斯数据库端口正常,gsql访问高斯数据库正常,ecpg 用户名/密码/数据库正确,数据库服务器未发现用户密码错等日志,测试和生产高斯数据库版本一致,建库脚本一致,麻烦大佬帮忙分析分析,可能是哪方面的问题,在此谢过了。
  • [数据库使用] extra_float_digits导致的double类型模糊匹配错误
    问题背景:select * from schema.tablename where  double::text like '%114.0061705';查询结果为空,但实际有符合条件的数据。根因:double类型的数值,在进行模糊查询时,由于extra_float_digits导致精度不一致,结果集出现误差。 extra_float_digits参数说明:调整浮点值显示的数据位数,浮点类型包括float4、float8 以及几何数据类型。参数值加在标准的数据位数上(FLT_DIG或DBL_DIG中合适的)。参数类型:USERSET取值范围:整型,-15~3说明:设置为3,表示包括部分有效的数据位。对转储需要精确恢复的浮点数据尤其有用。设置为负数,表示摒弃不需要的数据位。默认值:0 通过JDBC进行连接DWS时,需要注意。连接参数第三方工具通过JDBC连接时,JDBC向DWS发起连接请求,会默认添加以下配置参数,详见JDBC代码ConnectionFactoryImpl类的实现。params = { { "user", user }, { "database", database }, { "client_encoding", "UTF8" }, { "DateStyle", "ISO" }, { "extra_float_digits", "3" }, { "TimeZone", createPostgresTimeZone() }, };这些参数可能会导致JDBC客户端的行为与gsql客户端的行为不一致,例如,Date数据显示方式、浮点数精度表示、timezone显示。如果实际期望和这些配置不符,建议在java连接设置代码中显式设定这些参数。通过JDBC连接数据库时,会设置extra_float_digits=3,DWS中设置为extra_float_digits=0,可能会造成同一条数据在JDBC显示和gsql显示的精度不同。对于精度敏感的场景,建议使用numeric类型。
  • [问题求助] 数据迁移
    目前我想做迁移的实验,需要在Oracle和MySQL创建大量的表,索引等对象,有什么方式可以模拟真实的生产环境吗
  • [技术干货] 大数据干货合集(2025年9月)
    锁相关视图cid:link_1锁相关参数介绍cid:link_2自动处理单点死锁cid:link_3分布式死锁cid:link_4pooler连接池详解cid:link_5postgres工作线程cid:link_6Pooler 连接池复用流程cid:link_7Pooler 连接清理cid:link_8Stream 线程cid:link_0idleRing的作用cid:link_9数据结构设计cid:link_10Stream 线程状态转移DFA设计cid:link_11单个Stream线程执行流程cid:link_12通过表象看Stream线程池逻辑cid:link_13建立多用户场景https://bbs.huaweicloud.com/forum/thread-0243194537401613171-1-1.html
  • [技术干货] 建立多用户场景
    Create user ***;(建立多用户) 分别执行带Stream算子的查询;(参考场景一示例) 查询结束,查pgxc_thread_wait_status看DN节点:预期Stream线程状态为wait thread cond。且多user之间Stream线程可以复用。 例:用户一执行完查询,视图中显示共有四个Stream线程在线程池,用户二执行同样查询返回正确结果,视图中的Stream线程个数不变,且线程号也是一致的,则说明复用。 集群基础行为场景——线程清理场景 调整guc 参数 max_stream_pool 的值,观测是否生效;预期:当设置max_stream_pool 小于当前 idle 线程个数,支持线程个数实时减少;当设置max_stream_pool大于当前idle线程个数,将由业务驱动线程个数的增加,但是不会超过max_stream_pool。 执行 clean connection(ALL force),查看 Stream 线程是否被清理;预期:该database 的Stream线程被完全清理。 执行drop database命令,查看Stream线程是否被清理;预期:该database的Stream 线程被完全清理。 
  • [技术干货] 通过表象看Stream线程池逻辑
    max_stream_pool:设置 Stream线程池能够容纳Stream线程的最大个数。该参数8.1.2 及以上版本支持。默认值为65535。设置为-1表示不开启Stream线程池。该参数支持reload更新,更新规则:设置max_stream_pool小于当前可用线程个数,支持线程个数实时减少;当设置max_stream_pool大于当前idle线程个数,将由业务驱动线程个数的增加。wait stream task:空闲的Stream线程; wait node:等待其他DN的数据,需要关注对端状态; flush data:发送数据给其他DN时因为对端buffer满而阻塞; wait cmd:DN上空闲的postgres线程,等待CN的下一个query; none:未定义状态,极有可能是阻塞原因; synchronize quit:同步退出状态,自身任务已完成,在等待同一个query的其他线程一起退出。Create database ***;(建立多库) 分别执行带Stream算子的查询; 查询结束,查pgxc_thread_wait_status看DN节点:预期Stream线程状态为wait thread cond。且多database之间Stream线程不复用。 例:create table test_01(c1 int, c2 int)with(orientation=column) distribute by hash(c1); insert into test_01 select generate_series(1,100), generate_series(1,100);analyze test_01; select * from test_01 a, test_01 b, test_01 c, test_01 d, test_01 e, test_01 f where a.c2 =b.c2 and c.c2 = d.c2 and e.c2=f.c2 limit 100;
  • [技术干货] 单个Stream线程执行流程
    Stream 线程初始化仅初始化一次,执行完query之后,便将连接归还到连接池里,循环执行上图中黄色部分的语句,如果有异常则线程退出,连接销毁,slot 归还至emptyRing;如果正常执行结束,将连接中内容清理,避免下个连接误用,并将slot归还至idleRing 等待下个连接复用。 那么Stream线程复用时如何保持参数的一致性呢,对应上图中的set GUC params阶段。父线程保存自己的guc_variables在syncGucVariables中,syncGucVariables是需要传递给 Stream 的结构用以保证父子线程 guc 参数的一致。然后父线程在初始化StreamProducer 时将 syncGucVariables 保存在该结构中传递。Stream 线程根据StreamProducer 初始化自己的 syncGucVariables 变量,首先 reset 所有的 guc 变量,然后根据syncGucVariables修正自己的variables。 STREAM_SLOT_EXIT:idleRing(idle 线程超时)、emptyRing(初始化或者FATAL); STREAM_SLOT_IDLE:idleRing STREAM_SLOT_HOLD:运行空间(从无锁队列中取出)、idleRing(idle线程超时或中断); STREAM_SLOT_RUN:运行空间。 根据各状态所处的位置情况,从idleRing中取出的slot可能有三种状态:EXIT、IDLE、HOLD。当取出IDLE状态的slot,说明线程可复用;当取出EXIT状态的slot,说明线程已退出,此时需要将slot转存到emptyRing;当取出HOLD状态,说明线程正在被使用,此时需要放回idleRing。 
  • [技术干货] Stream 线程状态转移DFA设计
    每一个记录线程信息的结构ThreadSlot中都保存了线程当前的状态status,记录线程状态的目的是为了保障线程执行过程的有序控制,也可以通过状态的互斥避免threadSlot 不会被两个线程同时使用。 Stream 线程状态转移用确定性有限状态机(DFA,definite automata)表征,共包含 4 个状态:STREAM_SLOT_EXIT 、 STREAM_SLOT_IDLE 、STREAM_SLOT_HOLD和STREAM_SLOT_RUN状态。其物理含义如下: STREAM_SLOT_EXIT:线程退出状态,表示线程未被创建或线程已退出; STREAM_SLOT_IDLE:线程可复用状态,表示线程在idleRing中,可以被复用; STREAM_SLOT_HOLD:线程临时独占状态,表示线程在做进入下一个状态的准备工作; STREAM_SLOT_RUN:线程运行状态,表示线程正在执行任务。与状态对应的,是 slot 所处的位置,slot 所处的位置有三处,分别是 idleRing、emptyRing和运行空间,slot从无锁队列中拿出,运行时所处的位置,我们称之为运行空间。
  • [技术干货] 数据结构设计
    定义结构体ThreadSlot保存线程池中每一个线程的信息,包含:线程状态、线程号、线程对应的database oid、线程执行所需的信息StreamProducer,StreamProducer是父线程向子线程传递的唯一结构、线程唤醒所需的锁和条件变量。 定义结构体 StreamThreadPool 表征线程池,其中 size 表示线程池中拟预留的ThreadSlot 个数,ThreadSlot被保存在threadSlots数组中;无锁队列emptyRing用来保存未创建线程ThreadSlot,对应地,idleRing 用来保存空闲的已创建Stream线程的ThreadSlot。定义结构体StreamPool,由 于 Stream线程的初始化信息和database是强相关的,如果不保留 database 相关的信息,那么线程初始化的时间代价仍然较高,所以线程池中的线程复用时,需要满足database信息匹配,所以一个emptyRing 和一个database相匹配,保存在链表PoolListHead中。 
  • [技术干货] idleRing的作用
    Stream 线程池为了高效管理线程的出/入池操作,采用无锁队列实现。定义结构体ThreadSlot 保存线程池中每一个线程的信息,包含:线程状态、线程号、线程对应的database oid、线程执行所需的信息StreamProducer、线程唤醒所需的锁和条件变量。 当线程还未被创建时,初始化一定数量的ThreadSlot数量以预留Stream线程,这些ThreadSlot 被保存在数组threadSlots中 。当 Stream线程执行完毕,需要将Stream线程放置到表征可复用线程的无锁队列,称之为 idleRing;当线程因为超时、异常等原因不再复用,需要退出时,将Stream线程对应的ThreadSlot放置到表征未创建线程的无锁队列,称之为emptyRing。 idleRing 的作用是为了快速获取并复用线程池中的线程,emptyRing的作用是快速获取一个未被使用的ThreadSlot结构,以创建一个新的Stream线程。由于Stream线程的初始化信息和database是强相关的,如果不保留database相关的信息,那么线程初始化的时间代价仍然较高,所以线程池中的线程复用时,需要满足 database 信息匹配。对于设计线程池而言,每一个database都应该对应一个idleRing。 
  • [技术干货] Stream 线程
    Stream 线程是临时线程,随query启动和退出,负责Stream算子的执行,Stream线程初始化和退出都会争抢锁等进程级资源,在 Stream 线程个数无法进一步优化的场景下,需要设计有效方案以减少 Stream 线程初始化和退出的时间代价,将进程初始化耗时稳定在ms级,保障数据库的确定性时延查询。Stream 线程池的核心思想是等 Stream线程执行完计划任务,保留必要且可复用的线程信息,将线程放入线程池中。 线程池中的线程执行过程如上图所示,其具体步骤为: 步骤一:线程信息初始化; 步骤二:线程待唤醒后轻量级初始化(query级初始化); 步骤三:线程任务执行; 步骤四:线程清理; 返回步骤二:继续等待下条query执行。 在返回步骤二时,当线程等待超时、超出线程池容量(最大Stream线程个数)、异常时线程已不可用,需要销毁。 其中步骤一中在线程初始化时,需要执行的操作有:线程创建、创建相关内存上下文、信号处理函数注册、内存追踪信息初始化、初始化GUC选项等操作; 步骤二中在线程轻量级/查询级初始化时,需要执行的操作有恢复GUC参数、初始化BackendParams、重置GUC参数等操作。
  • [技术干货] Pooler 连接清理
    清理Session持有的连接 cache_connection,是否使用pooler连接池缓存连接,默认开; session_timeout,客户端连接空闲超时后报错退出归还连接; enable_force_reuse_connections,事务结束后强制归还连接; conn_recycle_timeout(8.2.1), CN 空闲session超时后归还连接。pg_clean_free_conn视图/函数,清理1/4的空闲连接池连接,CM定期调用;CLEAN CONNECTION 语法,清理对应DB或user的所有空闲连接 clean connection to all for database postgres to USER user1。GaussDB(DWS)分布式架构的Stream 算子作为SQL join操作时频繁发生的执行算子,共存在三种模式:Gather、Redistribute、Broadcast,分别负责CN节点GATHER数据,DN节点REDISTRIBUTE和BROACAST数据。大集群高并发场景下,Stream算子过多可能会导致通信的性能瓶颈,引起性能劣化(2000个stream同时启动,进程初始化耗时从ms级劣化到s级),因此需要尽可能减少Stream算子。但是在某些现场环境下,存在数据倾斜、join查询不包含必要分布键等客观情况,Stream算子无法有效减少,为多表join 场景下的查询时延保障带来挑战。因此 GaussDB(DWS)对于线程初始化->线程任务执行->线程退出执行的流程方面做了stream线程池优化,减少了线程初始化与线程退出所带来的开销。
  • [技术干货] Pooler 连接池复用流程
    对于每起一个线程 session(即连接),都会有一个 PoolAgent 与之对应,即从DatabasePool->NodePool->pool取出来的连接。 cnDef、dnDef:初始化时从pgxc_node中拿到,即cn定义、端口、ip (session级别)dnConn、cnConn:从 databasePools->nodePools-> pool拿真正对应的连接 (query级别)dnHandles、cnHandles:从dnConn、cnConn里边dop出来使用,确保两者是一一对应的状态,当query结束时,只需要close handles就行,cnConn不需要close Pooler 连接池具体的复用流程如下: 1) session 需要连接时,通过DB+USER为key找到正确的pooler连接池,优先从中取走现有连接,如果连接池中没有连接的话,则新建连接; 2) query结束后,CN的postgres线程并不会归还连接,连接可以用于当前session的下一个查询; 3) session结束后,CN的postgres线程会将连接还到对应的pooler,连接对应的DN上的postgres线程并不会退出,处于ReadCommand中,等待复用后CN新的postgres线程发起任务。
  • [技术干货] postgres工作线程
    CN的pooler连接池中会保存与其他CN/DN的连接,每一个连接在对端会对应一个postgres工作线程。 postgres 工作线程是带状态属性的,如database,所以可以认为pooler连接池中的连接也是带属性的。不同属性间的连接是不能复用的,按不同属性切分为pool A/B/C 等连接池。每个连接池中会存有连接往不同节点的空闲连接的数组,提供接口给外部使用或放入连接。 CN上的postgres工作线程在需要连接其他节点时,会创建一个本地agent,尝试从pooler 连接池取跟本线程相同属性的空闲连接,pooler如果没有空闲连接,就会新建一个连接。连接交给 agent 后,可以视为线程私有。在线程退出时,agent 才会将连接还给pooler。 DatabasePool 用于存储空闲连接,根据database,user_name,pgoptions 三者来确定如果通过三者查找到了,那么就取其中对应的nodePools,找不到则新加nodePools 中对应的数据结构为 PGXCNodePool,用于存储本节点与其他每个cn/dn 的连接。
  • [技术干货] pooler连接池详解
    GaussDB(DWS)为MPP型分布式数据库,使用Shared Nothing架构,数据分散存储在各个DN节点,而CN不存储数据,CN作为接收查询的入口,生成的计划会尽量下推到 DN 并行执行以提升性能,此过程中会产生大量的建连操作,使得通信开销变得很大。因此在大数据时代,集群规模越来越大,业务并发越来越高,数据库集群各节点间的通信压力也越来越大。GaussDB(DWS)集群通信技术,在大规模集群中可以承载高并发业务,能够实现高性能分布式通信系统。客户端向CN的监听端口发起连接; CN postmaster主线程accept连接,创建postgres线程并将连接交给此线程处理; 客户端下发query到CN; CN的postgres线程将查询计划下发给其他 CN/DN,查询结果沿原路径返回到客户端; 客户端查询结束,关闭连接; CN上对应的postgres线程销毁退出。CN与DN建连立流程,和客户端与CN建连立流程基本相同。因此为了减少CN与DN建立连接,以及DN进程中postgres线程创建、销毁的开销,CN端实现了Pooler连接池。
总条数:1518 到第
上滑加载中