
gbase8s
文章平均质量分 56
学习
gbase_lmax
这个作者很懒,什么都没留下…
展开
-
gbase8s存储学习一 rootdbs存储结构以及寻址分析
该空闲链表页的数量可能因数据块内部的碎片化程度而有所不同(可能存在多个这样的页),它包含指向未使用区段(extents)的结构体。先找到表空间的TBLspace 根据extent 以及 table 的partnum 信息找到 表的TBLspace,再根据rowid/ifx_fow_id定为到数据所在page 以及slot。系统中的每个表空间都有一个特殊页来描述,这种特殊类型的页称作分区页(TBLspace )。该表空间为数据库的根空间,主要存储数据库的一些系统元数据(系统表),以及数据库的保留页。原创 2025-04-23 23:36:21 · 924 阅读 · 0 评论 -
gbase8s触发器使用
相比oracle 在for each row 触发时 是没有 before 或者after 修饰,也就是说在gbase8s中for each row没有触发前后的说法,仍然可以通过一些用例简单测试下触发时机。在实际使用中可同时存在before、after、以及for each row 触发器,顺序必须为。before after 因为是语句级触发器,没有 new值 old值的说法。for each row 为行级触发器,即每一行都会触发触发列表的操作。同样,当需要处理逻辑时,仍然需要调用存储过程来实现。原创 2025-04-22 18:51:45 · 348 阅读 · 0 评论 -
gbase8s cdc协议解析
000000C8 4字节 cdc记录号 代表 具体的操作,存储于cdc 系统库下的syscdcrectypes 表 主要包括插入、删除、修改、事务开始、事务提交、truncate等等。000000C9 4字节 cdc记录号 c9 对应为超时 CDC_REC_TIMEOUT ,即没有新的数据变化。先进行CDC_REC_TABSCHEM 操作,该操作主要返回了一些信息,比如 捕获列的信息,数据类型为变长或者固定长度等。c8对应的操作为CDC_REC_TABSCHEM 描述信息。原创 2025-03-23 20:30:19 · 680 阅读 · 0 评论 -
从微信复制代码的坑
这个地方应该是中文的空格,因为命令都是使用微信发送的,可能不小心将尾部的空格也复制了,知道原因后处理起来就非常简单了,去掉尾部空格后,一切正常。近期,在协助客户调试odbc 时 所有的配置均已完成,数据库也一切正常,使用 isql 测试连接的时候报错库文件找不到。sqlhosts 文件是gbase数据库的监听配置文件,依赖与GBASEDBTSQLHOSTS环境变量。神奇的是我们查看LD_LIBRARY_PATH 时一切正常。与之前的库文件问题一样,此时终于意识到是环境变量出了问题。在进行连接时仍然报错。原创 2025-03-22 15:01:40 · 101 阅读 · 0 评论 -
gbase8s rss集群通信流程
如果主服务器发生故障,那么备用服务器可以接管,直到主服务器恢复运行为止。基于逻辑日志的复制技术,需要传输大量的逻辑日志,数据库需启用日志模式。最大允许主节点发送64个log buffers 后返回ack。如下线程主要作用为解析主机发送的逻辑日志然后在备机重做。RSS是一种将数据从主服务器复制到备服务器的方法。实例级别的复制 (所有启用日志记录功能的数据库)RSS 节点不能提升为主节点,只能提升为标准节点。RSS 节点不能提升为HDR备节点。DRAUTO 必须使用CM切换。HDR备节点可降级为RSS节点。原创 2025-03-10 11:40:01 · 375 阅读 · 0 评论 -
gbase8s hdr(hac)集群通信流程
xtrace 是用来追踪在线运行ids的工具,这个工具可以打印代码中已经插针的日志,使用时会先初始化一个环形队列,将用来记录日志信息。1 向备机发送DR_MSG_PING 消息,每隔DR_TIMEOUT s 一次(有的版本固定1s)检查是否收到 主节点 每隔DR_TIMEOUT s 的DR_MSG_PING 消息。主要函数 smx_send_from_recv_thread()主要函数 dr_idx_send_thread()主要函数 dr_idx_recv_thread()原创 2025-03-08 16:47:18 · 700 阅读 · 0 评论 -
gbase8s数据库检测非法字符
在实际项目中,数据库有可能会出现非法字符,其原因有多种,如下提供一种非法字符的检测方法,仅供参考。原创 2025-03-06 20:39:54 · 216 阅读 · 0 评论 -
gbase8s数据库获取随机数方法
/ 取低31位作为结果,避免符号位影响。在早期的数据库版本中,没有获取随机数的函数,为此,提供如下几种方式,仅供测试参考,具体使用请联系gbase8s官方技术支持。--将结果映射到[0,100]区间。--简单的线性同余生成器(LCG)的变种。--XORSHIFT算法。原创 2024-11-11 22:26:14 · 540 阅读 · 0 评论 -
gbase8s用户管理
第二种方式每创建一个用户都必须映射到代理用户上,而第三种以模版用户为基础,因为模版用户指定了代理用户,所以每次创建内部用户时无需指定代理用户,此时的create user的语法更有普遍性。3 操作用户作为内部用户的代理用户,根据代理用户创建模版用户,以模版用户作为基础创建内部用户。如果不创建模版用户直接创建内部用户,并且不映射到代理用户时,服务器将返回错误。2.5 创建内部用户(将user02映射到user_agent用户上)2 操作用户作为内部用户的代理用户,根据代理用户直接创建内部用户。原创 2024-10-15 15:23:20 · 486 阅读 · 0 评论 -
gbase8s 锁监控与解锁
t1表上有意向独占锁,rowid为0 代表为表锁,type IX 为意向独占锁 owner 44 表示session id 为44。t1表中有行锁,rowid 268代表被锁的行 type X 为独占锁 owner 44 表示session id 为44。信息可知 tblsnum 为 600617 的表上存在意向独占锁 行上有独占锁,并且行操作为 delete (D)rowid 为 10c 十进制为268 与 sql查看的结果一致。该事务未提交,此时会在表上和行上分别有意向独占锁与独占锁。原创 2024-10-10 16:27:16 · 464 阅读 · 0 评论 -
gbase8s的事务、并发控制、锁机制、隔离级别
这种隔离级别能确保所有的记录都是提交到数据库的,因而能避免读取到脏数据,能确保所有读取到的记录都是已提交的,当一个进程读完记录后,其它进程就可以修改。不仅可以看到提交的记录,也可以保证看到的记录不会被更新,其它进程不能更新或删除你锁看到的记录,当移动到下一行时,锁才会释放,记录就可以进行修改。:多个用户可以读取相同的记录,如果一个对象上没有排他锁,则共享锁可以加在该对象上,它可以防止其他事务更新数据,但同时,其他事务可以读取该数据,多个事务可以在同一个对象上加多个共享锁。表需要设置为行级锁,不能是页级锁。原创 2024-10-10 11:43:49 · 1055 阅读 · 0 评论 -
gbase8s数据库XADATASOURCE/两阶段提交简单案例
【代码】gbase8s数据库XADATASOURCE/两阶段提交简单案例。原创 2024-10-09 13:30:15 · 134 阅读 · 0 评论 -
gbase8s数据库基于标签访问控制简单案例
ARRAY 标签组件的特点为权限从左到右一次降低,即使用权限高的标签可以访问低权限标签的资源。在使用 root 或者test 用户是可以访问c2列,其他用户则报错。更多关于标签访问控制请参考gbase8s语法手册。6 创建测试表,对 c2列 添加标签。1 授予DBSECADM权限。2 创建安全标签组件。信息存储于如下系统表。信息存储于如下系统表。信息存储于如下系统表。原创 2024-10-08 21:41:14 · 244 阅读 · 0 评论 -
gbase8s数据库实现黑白名单的几种方案
实际效果为 162 与163 机器的 root 用户可以连接数据库,其他ip 或者非root用户不能连接,从 root切换成 wangyx用户时不需要输入密码。1)在部分环境中由于DNS反向解析策略很有可能将实际IP解析成bogon,需要额外关注下。2)若 sysdbopen 未知异常会导致数据库无法连接,最简单的处理方案为。2、使用数据库 TRUSTED CONTEXT 机制。更多语法以及配置细节可参考gbase8s语法手册。4 某些高版本中支持在参数中直接配置黑白名单。3 利用数据库现有机制实现。原创 2024-10-08 21:32:03 · 328 阅读 · 0 评论 -
gbase8s数据库常见的索引扫描方式
5 自动索引扫描(Auto-index scan):自动索引扫描特性允许数据库服务器在一个或多个字段上自动创建临时索引,数据库服务器通过这个临时索引读取相应的数据。6 多路径扫描 (skip-scan):当数据表上有多个查询字段时,优化器有可能会选择多路径扫描,即同时扫描多字段上的索引 在对所有扫描命中的rowID 取交集。3 键值扫描(Key-only index scan):如果读取的相关数据包含在索引节点中,数据库服务器就只需读取索引,不需要再去读取相应的数据页。多路径扫描 常发生在多个查询条件时。原创 2024-09-21 22:53:21 · 510 阅读 · 0 评论 -
gbase8s存储过程一些隐藏的错误写法
当游标处于最后一条记录时满足 sqlcode!=100 ,然后还会再次进入 while 循环中 ,导致最后一条数据会重复一次,因为是先return 再退出循环,所以需要在 return 前就退出循环。比如应该返回 1,2,3,4,5 实际返回 1,2,3,4,5,5。在某项目现场使用存储过程返回结果集时最后一条数据会重复一次。问题出现在while 循环中。原创 2024-09-19 23:47:42 · 359 阅读 · 0 评论 -
gbase8s早期版本CLOB 等值比较问题
但是在进行等值查询时 select * from zz where clob_to_str(c1) = 'aaaaaaa';具体逻辑为 先获取到 CLOB类型的数据长度 ,再将 CLOB类型转换为 varchar。近期在某现场使用早期的gbase8s项目中遇到了 需要等值比较clob 的问题。为满足对于LOB类型数据的操作,gbase8s提供了 多组处理LOB类型的函数。直接查询 clob_to_str(c1) 时 又显示 'aaaaaaa'一 使用 gbase8s提供的擦除函数将末尾回车擦除。原创 2024-09-19 23:30:44 · 285 阅读 · 0 评论 -
spring-session-jdbc 适配gbase8s
其中 this.createSessionAttributeQuery 是异常的sql,那么这个类是在什么时候被初始化的饿呢,观察发现此类为 spring bean 管理。只是一个简单的insert语句,后使用jdbc 验证 ,当绑定变量 包含 blob 类型是需要做一个显示的类转换才可以,此为早期数据库版本问题,后期均已处理。近期,在某现场使用spring-session-jdbc 2.3.1 RELEASE版本时出现数据转换错误(Data conversion error)as blob)即可。原创 2024-09-12 13:29:41 · 699 阅读 · 0 评论 -
druid连接gbase8s数据库报错空指针
原因在获取数据库类型(dbTypeName)时不支持gbase8s数据库,导致获取类型为null,然后在createPhysicalConnection 中构建数据库连接时直接使用dbTypeName.equals做判断,导致此处空指针,异常传递到上层最终报错空指针。1 在com.alibaba.druid.util.JdbcUtils的getDriverClassName方法中加入gbase8s支持。3 在com.alibaba.druid枚举类 DbType 中加入gbase8s支持。原创 2024-09-09 22:51:37 · 530 阅读 · 0 评论 -
mybatis与gbase8s plsql适配问题二
Caused by: java.sql.SQLException: 不明确的 java.sql.Type,请使用 IfxRegisterOutParameter()。原因为 oracle 中的游标类型为 cursor(-10) gbase8s 中游标类型为IFX_TYPE_CURSOR(2100)在CallableStatementHandler.registerOutputParameters。plsql中out参数为cursor时报错。解决方案,在类型为cursor 单独处理。原创 2024-09-07 14:08:12 · 458 阅读 · 0 评论 -
mybatis与gbase8s plsql适配问题一
其中在最终调用到gbasedbt.jdbc 下的 getResultSet 方法时,当resultset为空时 会直接throw Exception ,将异常传递给上层,导致最终空指针错误。在使用 mybatis 调用 gbase8s oracle模式下创建的plsql时 ,出现空指针的报错。2 在getResultSet 的上一层 主动 try catch 异常。1 使用<update> 标签去调用plsql。原创 2024-09-03 15:50:37 · 564 阅读 · 0 评论 -
mybatis 适配gbase8s中批量插入问题
其原因为在使用 foreach 标签做数据插入时,本质是将集合中的数据拼接成一个大sql,如果sql中使用了#{},则超出 32765 报错主机变量不足,oracle 的上限为65535,mysql中 当整体 sql长度超出范围后一样会报错。使用ExecutorType.BATCH 时 只做一次PREPARE,多次 SQ_BIND,并且返回结果也是批量一起返回,而不使用批量插入则每一条数据都需要先PREPARE,SQ_BIND,返回结果。1减少一次传入集合的数量,保证整体sql 绑定变量不超过32765。原创 2024-08-29 15:32:06 · 486 阅读 · 0 评论 -
hibernate 适配gbase8s 在使用boolean 时报错could not execute query
查看生成的sql发现 将boolean 类型 true 替换成了1 即 where c1=true 解析成了 c1=1。跟踪代码发现在语法解析类SqlGeneratorBase进行了替换动作。具体原因为在hibernate 方言中默认转换规则如下。解决方案,在具体方言实现中重写此方法。原创 2024-08-21 14:31:38 · 490 阅读 · 0 评论 -
mybatis /mybatis-plus适配gbase8s 问题:报错Unknown object type
在 mybatis /mybatis-plus与 gbase8s数据库适配过程中,出现Unknown object type报错。报错原因为在发生 setParameters时 如果 对象或者属性为null时,产生上述错误。在没有配置JdbctypeForNull时 默认的类型为OTHER类型,导致报错类型不支持。原创 2024-08-21 10:36:27 · 418 阅读 · 0 评论 -
gbase8s在数据迁移过程中数据膨胀问题
如果启用了 MAX_FILL_DATA_PAGES,服务器将 在最近修改的页面中添加一个新行,其中包含现有行(如果添加) 该行至少留出 10% 的页面空间,以便将来扩展 页面中的所有行。如果未设置 MAX_FILL_DATA_PAGES,则仅当页面上有足够的空间时,服务器才会添加该行以允许新行增长到其最大长度。如果将 MAX_FILL_DATA_PAGES 配置参数设为 1,数据库服务器将可向具有可变长度行的表中每个页面插入更多行。当MAX_FILL_DATA_PAGES=1 时。原创 2024-08-20 13:52:24 · 252 阅读 · 0 评论 -
gbase8s索引介绍一
B-树B树(B-tree)是一种树状数据结构,是,能够用来存储排序后的数据。这种数据结构能够让查找数据、循序存取、插入数据及删除的动作,都在对数时间内完成。B-树有如下性质每一个节点最多有 m 个子节点每一个非叶子节点(除根节点)最少有 ⌈m/2⌉ 个子节点,⌈m/2⌉表示向上取整。如果根节点不是叶子节点,那么它至少有两个子节点有 k 个子节点的非叶子节点拥有 k − 1 个键所有的叶子节点都在同一层限制。原创 2024-08-18 16:39:07 · 687 阅读 · 0 评论 -
springboot data jpa 适配 gbase8s 报错could not prepare statement
在hibernate 默认的方言中配置为true ,即在空元素时 生成 in () sql语句,改为false 时 生成 in (null) 语法 ,在gbase 数据库中 不支持前者 ,导致 报错 201 语法错误。根据绑定变量的结构发现 selentity.total 为List 集合 ,在集合元素为0 时产生如下异常。在绑定变量为集合的场景下,需要从方言中判断 在集合元素为0 的时候,拼接sql时 时候将空集合替换为null。在适配过程中,发现部分sql报错 201 语法错误。原创 2024-08-18 15:08:47 · 430 阅读 · 0 评论 -
gbase8s数据库设置开机自启的两种常见方式
数据库用户 gbasedbt。原创 2024-06-27 15:03:08 · 438 阅读 · 0 评论 -
gbase8s递归
在迁移的过程中要仔细的对比二者结果集差异,包括是否存在递归循环,有时需要稍微调整下,connect by 与 with as 并不是完全等效。在从oracle迁移至gbase8s时 ,oracle 的with as 递归并不支持,可以修改为其他写法,例如。而在gbase8s中只支持第一种。oracle下的递归为。原创 2024-06-11 20:04:36 · 565 阅读 · 0 评论 -
gbase8s数据库启动异常
根据52a24801 查找看是否有使用此共享内存的残留进程。在实际场景中偶尔会遇到数据库启动异常且后台无任何错误日志。kill 掉之后再次启动,数据库启动成功。排查发现 系统中存在大量的僵尸进程。则对应的key 为52a24801。计算出数据库对应的共享内存段起始。可以猜测数据库启动异常与此有关。启动异常退出,后台无错误日志。原创 2024-05-25 16:13:21 · 311 阅读 · 1 评论 -
hibernate 方言包加载流程
在VersionInsensitiveMapper中内置了常见数据库以及方言映射。2 获取数据库连接信息,如 版本,服务名,方言信息等。4 在使用国产数据库时一般都会单独实现自己的方言。3 加载方言信息,如未配置则走默认内置。原创 2024-05-22 17:41:38 · 290 阅读 · 1 评论 -
gbase8s 浮点数与日期时间存储
DECIMAL(p,s) NUMERIC(p,s) (p +3)/2 个字节(如果小数位是偶数)或 (p + 4)/2 个字节(如果小数位是奇数)向上取整。FLOAT (DOUBLE PRECISION) 8 字节 双精度浮点数 精度为16位。c (未知) 0/1/2 标识整数部分所占字节,为0 时 整数位0,其余则为小数部分。符号位(1)+指数和偏移(2-12)+尾数(13-64)DECIMAL(p,s) 存储与DECIMAL(p)类似。DECIMAL(p) 1 + p/2 个字节向上取整。原创 2024-05-22 17:19:18 · 1042 阅读 · 1 评论 -
gbase8s数据库寻址过程分析
rowid是一个4字节编码,前3个字节是逻辑页号,第4个字节是slot号,rowid为257,转16进制为0x101,那么逻辑页号就是0x000001,slot号就是0x01,rowid为258,转16进制为0x102,那么逻辑页号就是0x000001,slot号就是0x02,所以rowid为0x101,0x102对应的物理页号就是 2526592 + 8=2526600。前四字节为逻辑偏移 ,之后两字节为表空间编号 ,然后再四字节为物理位置。257,258 转换为16进制为0x101 ,0x102。原创 2024-05-21 11:09:35 · 437 阅读 · 0 评论 -
gbase8s数据库软件rpm包制作
rpm -ivh GBase8s_test-8.8-1.el7.centos.x86_64.rpm 进行数据库安装。构建结束后在/root/rpmbuild/RPMS/x86_64下生成数据库rpm安装包。将数据库安装包与init_gbase.sh上传至此目录下。rpmbuild构建rpm包。原创 2024-05-17 13:49:54 · 168 阅读 · 0 评论 -
gbase8s docker镜像制作
略。原创 2024-05-15 18:23:15 · 530 阅读 · 0 评论 -
GBase8s Enterprise Replication(企业级复制) 数据冲突处理
因其独特的复制技术,在某些场景下存在数据同步冲突的可能性,虽然也提供了一些冲突的解决方案,其本质上已经对数据精准度做了让步。在实际经验中,更推荐将连接锁定在一个节点上。然而,在运行过程中,不可避免的会发生数据库/服务器故障导致数据库发生切换,在现有机制下,不能保证连接锁定在一个节点,此时可以借用keepalived 非抢占模式的机制,使用虚拟IP锁定连接。keepalived 原理在本文不做具体介绍,如下提供了一种参考性的实现逻辑。2 在各个节点安装keepalived组件。0 gbase 复制集群正常。原创 2024-05-12 20:46:19 · 278 阅读 · 0 评论