![](https://img-blog.csdnimg.cn/2019092715111047.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
OpenGauss
文章平均质量分 64
Opengauss研究和工作笔记
howard_shooter
交流微信:17625988619
展开
-
pgvector 向量索引源码解读
下面就来解读一下pgvector-0.6.0的代码,代码来自简单说一下PG extension的知识,一般来说一个编译好的extension包括control文件、一个sql文件,一个so文件,在PG命令行输入create extension xxx 时,数据会找相应的control文件,加载so文件,然后执行sql文件,可能细节上这一描述有点误差,但这是我理解pgvector插件的一个最简单的模型,而且是有效的,这里我不想深究extension的机制。原创 2024-07-24 09:21:49 · 936 阅读 · 0 评论 -
PostgreSQL 的 generic xlog 模块代码解读
在PG源码中,为自定义WAL提供了比较底层的API和编程规范,当用户想要自定义的数据,也具备PG内建数据的种种好处时(例如,故障和恢复,流复制),用户可以使用这套API和编程规范,向WAL buffer中插入自定义的日志记录,恢复时,再提取自己的数据,并觉得如何恢复。这个编程规范背后有个理论知识,为了事务的一致性(单个事务的原子性和并发事务的隔离性),在shared buffer pool里的page(或者任何其它类型的存储)落盘前,要先将修改信息构造成一个WAL记录并落盘。原创 2024-07-17 17:36:04 · 803 阅读 · 0 评论 -
pgvector 索引的混合查询
当 where 的条件查询出的记录多到一定程度时(估计selectivity不同了),优化器便会选择另一个执行计划,如下图,会先按照向量索引查询出最近的若干向量,然后再对这些最邻近向量所在行,按其它字段进行条件过滤,这种情况使用了向量索引。在上面的查询中,返回的最邻近向量数只有一个,没有达到5个的需求,在不改变执行计划的前提下,可以增大where的查询范围,即按照向量索引查询后,过滤条件放宽一些,或许可以得到更多结果,然后再用limit选取头几条。可以看到,这里并没有使用pgvector所特有的向量索引。原创 2024-05-17 14:59:51 · 257 阅读 · 0 评论 -
opengauss pending启动转主备代码分析
在这些信号处理函数中启动线程(walreceiver、walwriter、walsender等),启动线程调用initialize_util_thread() ,可以在postmaster.cpp中搜initialize_util_thread,查看启动线程的位置。而在 pending 状态启动时,就已经调用了与各种 wal record 对应的 resource manager 的redo函数了,也就是说如果有问题,在pending启动时就会有问题。原创 2024-04-22 17:50:39 · 158 阅读 · 0 评论 -
Makefile的override
将的很好,简单的说,如果在Makefile中有override CPPFLAGS +=-fPIC,无论用户在 make CPPFLAGS=XXX 这里怎样设置,最终编译时都会把-fPIC加到CPPFLAGES里,一般用于添加通用的选项。简单的理解就是编译时要加 -fPIC,告诉编译器生成Position Independent Code,试过。可以成功编译,不过看到其它的解决方案是在Makefile中加。原创 2024-03-25 16:26:30 · 275 阅读 · 0 评论 -
Opengauss到Oracle增量同步, 使用debezium
zookeeper和kafka都是java程序,注意配置一下java运行环境,我使用的是Java HotSpot 1.8,只要配置好JAVA_HOME和PATH两个环境变量即可,JAVA_HOME指向JDK解压后的目录,启动脚本会优先到JAVA_HOME里去找Java运行环境。kafka的配置文件是config/server.properties,设置log.dirs,这是kafka存消息数据的目录,会占用较大磁盘,9092,kafka和zookeeper,客户端和kafka直接都是通过网络读写数据的。原创 2023-11-15 14:55:49 · 518 阅读 · 0 评论 -
OpenGauss MOT 实现技术研究
第二阶段:对事务读记录集合进行校验——事务运行中,读取的记录包含TID(OpenGauss中是一个全局唯一的64位无符号整数),是这条记录的状态标志,所谓校验,就是比较每条记录的TID和此时的全局内存中,对应记录的TID是否相同,如果不同,说明在这个事务运行过程中,其它事务修改了并提交了这条记录,则本事务终止,如果相同,说明整个事务执行过程到第一阶段为止,没有其它事务修改这条记录,则进入第三阶段。因此,就将写集合修改到全局内存对应的记录,当然还要写redo日志,然后释放锁,commit命令返回。原创 2023-06-07 11:43:06 · 643 阅读 · 0 评论 -
opengauss的pull-request
这样就创建了一个pull-request,之后经过评审,如果需要修改,每当提交并从push到我的仓库的my-feature时,在这个pull-request中,都会显示在“提交”中。然后就打开下面的页面,源分支选我的仓库的my-feature,目标分支选opengauss的master分支,表示请求将我的仓库的my-feature上的修改合入,opengauss公共仓库的master分支,这个过程有点像rebase。这个我自己的仓库,包含了源仓库的所有分支,也可以同步源仓库的修改。原创 2023-05-17 15:30:34 · 188 阅读 · 0 评论 -
opengauss 的回归测试
它执行的测试流程是:安装、初始化、启动数据库实例,用gsql/psql连接,跑测试脚本,比较测试结果(调用smartmatch.pl),这是工作全部是pg_regress做的。其实这是个批处理文件,告诉pg_regress去调用sql目录下的哪些sql文件,这些sql文件就是测试用例,例如,test: create_schema表示pg_regress会调用sql目录下的create_schema.sql,# 号表示注释,从名称来看,pg_regress可以并行执行脚本。原创 2023-05-17 12:07:01 · 641 阅读 · 0 评论 -
使OpenGauss支持Python3存储过程
OpenGauss是可以支持以Python2、3编写存储过程的,但是这个功能默认不开启,想要这个功能要自己编译源码,目前这部分源码感觉不够成熟,还有一些问题,但也勉强能用。原创 2023-05-04 17:40:26 · 583 阅读 · 0 评论 -
opengauss 上mysql_fdw的编译、安装和使用
然后在build_dir/libmariadb目录下生成了libmariadb.so,将它复制到opengauss/lib目录下,上面的操作,在每个节点上都要这么作。其中libmariadb.so可以在复制到安装包里,安装分发时就有了。原创 2023-04-28 16:24:53 · 876 阅读 · 0 评论 -
opengauss编译和使用oracle_fdw
有趣的是,即使oracle侧的表没有定义主键,opengauss侧定义的外表也要求至少一个列有options(key 'true')属性,否则是没法进行update和delete操作的,而且即使opengauss测试定义了key列,oracle侧这个列有重复也不能update和delete,所以,最好oracle侧的表定义了主键。这条件语句,创建了一个名为fdw_test01的外部表,它的列名和类型定义,应该与远程oracle表一一对应或兼容(其实列名甚至列数不同也可以,不过最好不要这样做)。原创 2023-04-27 17:05:48 · 737 阅读 · 0 评论 -
OpenGauss内核中的线程系统和内存系统(MemoryContext)
在opengauss的程序运行中,MemoryContextDelete和MemoryContextReset会频繁的调用,以释放MemoryContext所管理的内存,并不需要pfree来释放MemoryContext中分配的内存,不过代码中,也有调用pfree的。opengauss的线程对应postgres的进程,opengauss的线程创建后,函数也经历了一遍完整的进程初始化流程,包括应用guc参数、t_thrd结构体的初始化。AllocBlockData和它所连着的内存,是用malloc分配的。原创 2023-03-22 17:31:04 · 561 阅读 · 0 评论 -
编译Cloudbeaver 和 连接 OpenGauss
4、到cloudbeaver/deploy/下执行build.sh,经过漫长的编译构建,这个过程会下载很多依赖包,保证你的mvn使用国内源,我用的是 https://repo.nju.edu.cn。这是在编译一个插件 org.jkiss.dbeaver.net.ssh.sshj 时报的错,我不太懂Java,cloudbeaver的代码也不太熟,不过之前编译dbeaver时知道,dbeaver/plugins/目录下是插件,是可选的,如果解决不了这个插件的编译错误,试一试不编译这个插件,也许不会有什么影响。原创 2022-09-26 17:47:20 · 3773 阅读 · 4 评论 -
Opengauss数据脱敏
2、创建策略,指定对哪些标签里的字段应用哪些脱敏函数,且指定在什么条件下,执行或不执行脱敏策略。2、根据用户名、客户端IP、客户端程序名来过滤是否对这个查询应用脱敏。1、资源标签组织要对哪些表的哪些字段做修改(脱敏)3、怎样脱敏,对字段数据有多种屏蔽和扰乱的函数可用。1、创建资源标签,指定哪些表的哪些字段要脱敏。简单地说脱敏就是修改原字段的值。原创 2022-09-23 15:27:50 · 506 阅读 · 0 评论 -
cmake的CMakeCache.txt (编译dbt5 for pg遇到的坑)
CMakeCache.txt 是执行cmake CMakeList.txt生成的缓存文件,一些CMakeList.txt中定义的变量会缓存在里面,例如pg_config的路径,如果由于某些原因,其中的变量需要改变,例如opengauss的pg_config路径换为postgresql的pg_config路径。那就需要删除CMakeCache.txt重新生成。...原创 2022-08-11 11:57:19 · 1416 阅读 · 0 评论 -
Opengauss的TPCE测试
原版本的测试程序有个问题,就是对于线程的管理。假如有100个客户端(DriverMain)连接到BH,BH会为每个客户端创建一个线程和到ME的连接(和到数据库的连接),ME接收到BH的连接后(ME只能接收来自BH的连接),在ME中会为这个连接创建一个线程,等待来自这个连接的SendtoMarket,也就是客户端100个线程在BH中生成了100个线程,在ME中生成了100个线程,这还没什么。它们都可以解决ME创建太多线程的的问题,经过多次测试,出乎意料的是,方案1和方案2的性能差不多,而方案3的性能最差。..原创 2022-08-10 15:59:28 · 2275 阅读 · 19 评论 -
PGPLSQL中的:=和=
PGPLSQL中,赋值符号可以用=或=,两者等价,但是=也用于IF中等值判断,所以为了便于区别,赋值可以只用=原创 2022-07-21 14:26:33 · 1293 阅读 · 0 评论 -
PG、OpenGauss函数中有OUT则忽略 RETURNS SETOF record AS $$
如果创建PG函数,返回过个值,可以在参数列表的OUT里声明,也可以不声明,而在调用时指定返回记录的列定义。原创 2022-07-21 11:41:02 · 487 阅读 · 0 评论 -
PG 的数组下标是从1开始的
PG的数组下标是从1开始,不是从0开始,数组相关的操作broker_name[1]='hello1';broker_name=array_append(broker_name,'hello');原创 2022-07-21 11:24:53 · 244 阅读 · 0 评论 -
如何阅读计算机技术论文
最近通过阅读masstree、silo论文,总结出一些阅读论文的心得:1、要想读懂这些论文,有时候要去了解相关背景知识,例如,为了解决B-Tree并发访问问题,学术工业界这些年的努力,提出过哪些理论尝试?并发控制算法提出过哪些方案?如果对这些行业、技术的历史或背景知识完全不了解,阅读起来就很困难。2、要找重点,或者说找重点话题,选择一个切入点,这个切入点可以是这篇论文讨论的某个方法技术,也可以是我个人心中的某个问题,想在这个论文中找到答案,一次为出发点,以寻找答案解决谜题的方法,去读论文,同时到网上查阅概念原创 2022-06-20 09:35:38 · 365 阅读 · 0 评论 -
OpenGauss的内存优化表MOT
你所提出的问题,是你理解事物的角度。用问问题的方式理解事物,是很好的方法。提出一个好的问题,即选择一个好的角度,对于理解事物是非常重要的。而为了提出好的问题,必须先学习调查。最近在研究OpenGauss的MOT的原理,其中事务的并发控制参考了silo,而索引参考了masstree。silo主要是关于事务的OCC的算法。相关论文:http://people.csail.mit.edu/stephentu/papers/silo.pdfMOT中,表就是一个大的masstree,事务在访问记录.原创 2022-05-19 10:10:50 · 736 阅读 · 0 评论 -
OpenGauss 在存储过程、函数中,MOT表JOIN磁盘表
根据官网文档,MOT表是不支持JOIN磁盘表的,在gsql下执行也会报错,但是偶然发现,在pgplsql语句块里(包括存储过程和函数),MOT表可以JOIN磁盘表,不知这是个有用的功能还是个bug,复现操作如下:create table emp1(empno int primary key,ename varchar(10),job varchar(9),deptno numeric(2));INSERT INTO emp1 VALUES (1,'SMITH','CLERK',20);IN.原创 2022-05-12 17:32:51 · 256 阅读 · 0 评论 -
OpenGauss 创建 函数 和 存储过程
创建函数:CREATE OR REPLACE FUNCTION func1() RETURNS integer AS $total$ --注意返回值的格式declare total integer; BEGIN SELECT count(*) into total FROM emp1mot e1m join emp1 e1 on e1.mgr = e1m.mgr; RETURN total; END; $total$ LANGUAGE plpgsql; ...原创 2022-05-12 17:29:47 · 2246 阅读 · 0 评论 -
OpenGauss配置FDW外部表
假设IP为172.32.148.154的OpenGauss机器连接IP为172.32.148.155的机器,查询155中的表public.emp,155的端口号为31001,数据库名postgres,用户postgres/Postgres123:在154机器上执行:CREATE EXTENSION postgres_fdw;CREATE SERVER foreign_server FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host '172.32.14原创 2022-05-12 10:49:56 · 419 阅读 · 0 评论 -
OpenGauss MOT的Repeatable Read隔离级别
看了一下OpenGauss的文档,截止目前,支持Read Committed和Repeatable Read隔离级别。MOT不支持MVCC,它的多版本控制原理,简单说,是把要读写的数据从全局内存复制到为连接分配的局部内存,insert或update先在局部内存做,commit时再复制到全局内存,此时做有效性检查,如冲突就取消整个事务。对MOT的乐观并发控制(OCC)原理做如下猜测:Read Committed级别时,本事务读取A,如果其它事务修改A提交后,本事务再次读取A,是从全局内存读取,与第原创 2022-05-12 10:43:10 · 253 阅读 · 0 评论 -
在 BC Linux 上编译 opengauss(包括yum源配置)
BC Linux是个啥?BC Linux(Big Cloud Linux)是中移动基于OpenEuler做的操作系统,我司运行在鲲鹏ARM服务器上的BC Linux是基于OpenEuler 20.12。在编译opengauss的时候,脚本要读取 /etc/openEuler-release 而 BC Linux没有这个文件。所以创建文件并写入内容:echo "openEuler release 20.12" > /etc/openEuler-release在 BC Linux 上编原创 2022-04-12 17:23:44 · 1979 阅读 · 0 评论