- 博客(227)
- 资源 (8)
- 收藏
- 关注
原创 关于 opengauss 的 psycopg2 库
但是公网的psycopg2只支持md5加密,需要opengauss端做相应的配置,而opengauss官网提供源码的psycopg2,只支持md5和sha256两种加密的。python2和python3都可以使用pip install psycopg2或pip install psycopg2-binary下载。经过测试和实验,opengauss官网提供源码的psycopg2,只适用于python3以上,基于python2编译和使用均有问题。还要注意,服务端配置完重启后,创建的用户,连接才有效。
2025-03-03 16:45:11
125
原创 OpenGauss MySQL兼容库迁移
我的方案是,对mysqldump出的脚本进行处理,首先要明确,mysqldump导出的不是一个二进制文件,而是一个SQL脚本,而且可以通过命令行参数控制mysqldump只导出表定义,或者只导出插入数据的INSERT语句,首先只导出表定义,然后提取和删除表定义中的索引、UNIQUE约束的外键约束,表定义中只有列定义和主键定义,这些OG的MySQL兼容模式足以应对,建表时几乎不会出错,如果出错再具体问题具体分析。尝试过直接导入OG 5.0.0的MySQL兼容模式,有不少错误,这些也是迁移工作的重点。
2025-02-18 17:32:59
690
原创 RPM包的制作
rpm其实就是一个压缩包,包含了软件目录下的各种文件和目录,也包括了一些脚本,这些脚本是安装软件的时候执行的,所以在安装rpm包的时候,有时候会看到,不仅仅是把软件复制到了安装目录下,还会创建一些用户,注册服务等等,这些都是执行了rpm中的脚本,而rpm中的脚本就是shell脚本。rpm安装的时候也可以指定非默认目录,但是这样做的前提是,制作rpm时要能relocate,但是我发现,这也有它的局限性,例如rpm安装后的脚本不能获得改变后的安装目录,无法做相应设置,因此可以先不考虑这个特性。
2025-01-08 16:29:43
1043
原创 ccache是个啥玩意?
这个缓存不同于make时对于维修改的源文件不编译这种加快编译速度的方法。而是即使执行了make clean或者cmake删除了构建中间文件,仍然可以使用缓存。可以参考这篇文章,写的很好,很易懂,尤其是前半部分,3分钟阅读时间。这个编译缓存,可以缓存预处理和parse的结果。ccache是需要安装的。
2024-10-28 16:30:40
304
原创 公司 Oracle 数据库迁移(数据泵)
4、对于表空间、用户名在迁移时改变的情况,要事先创建表空间和用户,新的表空间应该比源表空间更大,同样,应该创建新用户和赋予相应权限,因为新用户的默认表空间和权限,随着新的表空间而改变,主动创建新用户,数据泵导入时发现新用户已经存在了,便不会创建了,会继续执行下去。从源数据库19c,迁移到目的机器的19c数据库,两台数据库机器可以登录其操作系统,两台机器之间可以scp传文件,目的机器已经安装好,已经建好表空间,用户(以及空表),目的机器上建的表空间和原机器的表空间名称不同,目的机器上的用户名也有变化。
2024-09-12 00:07:24
325
原创 k8s 删除资源时卡住
有时在k8s中用kubectl删除资源时卡住,用--force选项也没有用,网上看是和finalizer有关,具体原理在这篇文章讲的很好:简单的做法参照这个命令:
2024-08-28 16:05:47
186
原创 新 C++ using 和 typename 关键字
typename关键字,用于放在模板类的抽象类型前面,表示这是个类型,我的理解它用来修饰一些字符串,告诉编译器,这个字符串使一个类型名,而不是变量名,注意using、typename都是在编译时生效和检查的关键字,影响的是编译过程。using关键字,网上有许多说法,什么引入命名空间之类,这些说法的问题是,理解起来比较困难,易于理解的说法是,它可以定义一种别名,一般用来定义某种类型的别名,并且使当前命名空间可以使用。在编译时,会检查模板和传给它的类是否一致,如果不一致,那么运行时肯定会出错。
2024-08-23 14:33:16
380
原创 向量数据库中的PQ(Procduct Quantization)
b) 向量数据库中的所有向量,切分后的第一个段(32维度的向量),都取出来,做kmeans,计算它们的中心点,至于这些向量要分成几个区域,就由量化设计者决定了,例如,我决定分为256个区域,那么向量数据库中所有向量都拿出第一个段(32维度的向量),做kmeans,计算出256个中心点后,然后再把所有向量的第一段,分配给这256个区域,怎么分呢?b)数据库中存储着每个段的256个中心点,目标向量的每个段,要计算这个32维向量与每个中心点的距离,即每个段会得到256个距离,这些距离要保存下来。
2024-08-22 20:55:27
858
1
原创 不同版本gcc、g++的默认支持的std C++标准
我主要是用C++的代码:gcc编译器有个__cplusplus宏,这个宏是个字符串,这个字符串值与它正在使用的的C++标准是有联系的,但是仅仅从字符串比较难看出gcc编译所使用的C++标准,而且当编译时指定-std=选项时,这个宏就会改变,表示当前编译所使用的C++标准,一个版本gcc一般会支持多种C++标准,但是有个默认标准,就是不使用-std选项时__cplusplus宏的值。例如,g++-9可以支持c++98到c++14,g++-11可以支持c++98到c++14。
2024-08-22 17:21:01
2594
原创 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
1730
1
原创 PostgreSQL 的 generic xlog 模块代码解读
在PG源码中,为自定义WAL提供了比较底层的API和编程规范,当用户想要自定义的数据,也具备PG内建数据的种种好处时(例如,故障和恢复,流复制),用户可以使用这套API和编程规范,向WAL buffer中插入自定义的日志记录,恢复时,再提取自己的数据,并觉得如何恢复。这个编程规范背后有个理论知识,为了事务的一致性(单个事务的原子性和并发事务的隔离性),在shared buffer pool里的page(或者任何其它类型的存储)落盘前,要先将修改信息构造成一个WAL记录并落盘。
2024-07-17 17:36:04
1006
原创 kind kubernetes(k8s虚拟环境)使用本地docker的镜像
k8s虽然使用docker下载镜像,但是存储在docker image里的镜像是不能被k8s使用的,但是kind不同,可以使用下面的方法,让kind-k8s加载docker image里的镜像。可以用这个kind命令加载docker image里的镜像,到kind-k8s环境里,这样k8s就不会到网上下载镜像了。
2024-07-11 11:39:34
1186
1
原创 docker pull 报错:missing signature key,docker版本问题
这两篇文章讲的很好,我照着做,在我的CentOS7.9上成功安装了26.1.4。
2024-07-11 10:47:31
667
原创 如何部署本地dockers镜像源
最近许多公网的docker镜像源不能用了,只有用翻墙的办法去外网下载镜像,docker save导出镜像包,docker load在本地导入,docker push到本地部署的镜像服务器,然后Kubernetes就可以使用本地镜像服务器里的镜像了。这里有个关键步骤,就是搭建本地docker镜像服务器了,鉴于容器部署的便捷性,我们使用容器部署docker镜像服务器。
2024-07-11 10:40:12
1413
原创 pgvector移植到opengauss的线程安全问题
将 pgvector 插件移植到 opengauss 时,有个问题要注意,就是插件里用的所有函数,必须是线程安全的,否则并发查询时就会出问题,这是postgresql插件所不需要考虑的,但是从postgresql插件向opengauss移植,要考虑这个问题,这次pgvector里就遇到了,一测并发,就有识别向量格式的错误,就是因为strtok()不是线程安全的,换成strtok_r()就解决了。
2024-07-05 10:41:07
128
原创 PostgreSQL 和 OpenGauss 远程访问
要从另一台机器访问PostgreSQL或OpenGauss服务器,除了配置 pg_hba.conf ,还有必须配置的一个参数,就是。
2024-06-26 09:13:01
134
原创 Helm是个啥
Helm提供了和yum类似的创建应用包的工具,对应yum的打包操作,Helm的“应用程序包”成Chart,Chart打包后可以上传到远程的repository,需要在k8s上安装应用时,就从repository下载Chart。Helm就相当于把kubernetes集群,看作一个Linux系统,执行Helm命令来下载安装“应用”,而这个“应用”是包括各种k8s资源的集群。yum是Linux的应用程序包管理器,可以下载应用程序,有时候还可以配置操作系统让下载的引用程序在后台启动,例如docker等。
2024-06-17 17:46:41
330
原创 NAT是工作在IP层的软件
但是NAT会参考端口号,这个端口号其实是IP层以上的TCP层的,用这个端口号和内网IP做对应,建立表,这个端口号可以是客户端端口号,也可以是服务端端口号,总是是可以用来唯一区别内网IP的,这种信息当然是越多越好,但是这种信息必须是IP或TCP协议报文包里中固有的字段,不能是新增创造的,因为这是公网服务器发来的数据包,不能保证包含自定义字段,只能用TCP、IP协议中固有的字段来识别,至于用哪些字段,实际上没有定式。但是要注意的是,它不关心发给内网的那台机器上发给哪个应用,即IP层以上的信息不会更改。
2024-05-27 17:21:48
223
原创 pgvector 索引的混合查询
当 where 的条件查询出的记录多到一定程度时(估计selectivity不同了),优化器便会选择另一个执行计划,如下图,会先按照向量索引查询出最近的若干向量,然后再对这些最邻近向量所在行,按其它字段进行条件过滤,这种情况使用了向量索引。在上面的查询中,返回的最邻近向量数只有一个,没有达到5个的需求,在不改变执行计划的前提下,可以增大where的查询范围,即按照向量索引查询后,过滤条件放宽一些,或许可以得到更多结果,然后再用limit选取头几条。可以看到,这里并没有使用pgvector所特有的向量索引。
2024-05-17 14:59:51
449
原创 通过TID查询记录
PostgreSQL的rowid是TID,包括这条记录在表中的页号和页内偏移(item pointer索引),用形如(0,35)的格式给出,在PG中,可以直接用TID查询出记录,例如:其中 ctid 就是指这一条记录的 tid,也可以在查询时显示ctid:
2024-05-17 14:03:02
192
原创 什么是 RAG,大模型微调,向量数据库的应用场景
这一招被实践证明还挺好用,解决了不少问题,这就是所谓的提示词工程(prompt engineering),这个过程有个需求,就是要根据问题文本,查找出和这个问题相关的背景知识文本,很自然的想到,这个查询可以去搜索引擎上查,但是有的公司的数据是私有的,搜索引擎是差不到的,那么其实就要求公司内部建立这么个搜索引擎,这是一个思路,实际上使用和搜索引擎差不多的一个东西,就是向量数据库,把背景知识(小明的妈妈。” 是我们想问大模型的问题,“小明的妈妈有三个孩子,老大叫小军,老二叫小米,老三叫小明。
2024-05-13 17:01:19
643
原创 学习科学可以提高人的思维
熵、封闭系统、耗散系统、线性、非线性、这些思维模型都是在学习物理学、化学、生物学这些科学过程中学到的,这些思维模型也可以用于其它领域,例如社会、经济、人生。
2024-05-13 11:40:27
169
原创 缠中说禅相关链接
基金理财入门基础知识20问丨全文-『白云居』 (baiyunju.cc) 人生感悟格言丨什么是顶级的思维?-『白云居』 (baiyunju.cc) 《缠中说禅108课|原文完整版》目录-『白云居』 (baiyunju.cc)缠论108课完整版丨缠中说禅教你炒股票丨缠论原文全部文章丨缠论在线阅读-『白云居』-第6页 (baiyunju.cc)有趣的图文 | 有趣的影音 | 有趣的自然 | 有趣的世间 -『白云居』-第2页 (baiyunju.cc) 有趣的图文 | 有趣的影音 | 有趣的自然 | 有趣的世间
2024-05-13 10:35:26
252
原创 召回率、精确率
这篇文章写的很好,我收藏记录一下,所谓召回率就是查全率,就是不漏掉本该是正样本(所要结果)的能力,所谓精确率就是输出的正样本是真的正样本。 通俗解释机器学习中的召回率、精确率、准确率 - 知乎 (zhihu.com)
2024-05-13 09:13:04
132
原创 冗余编码提高通讯可靠性
原来一百年前的人也考虑过这个问题,这个想法有香浓的理论支撑,通过对信息进行冗余编码,即传输更多的信息,原信息装载于这个冗余的信息中,传输这个冗余的信息要传输更多的数据量,但是,这样可以对抗信道中的噪声带来的信号失真,这样既是有些信号失真、有些数据丢失,最终仍能正确的传输想要传输的那部分信息。这个通讯的历史很有意思,要抽时间研究一下!
2024-05-11 17:55:26
249
原创 PG的事务ID回卷逻辑
PG的处理方法,简单的说,就是在事务ID还没用完以前,把数据库中所有的tuple处理一遍,将以前的事务(不活跃的事务)修改的(包括插入)tuple中的事务ID改为2(或设置infomask),表示这个tuple对于以后的事务(不管是多少的事务ID)都是可见的,即freeze。按照上面代码的算法,对于任何事物ID,例如100,如果另一个事务ID比它大,但是没有超过这个事务ID后的半圆,例如2^31+100,就认为是在它的后面,那么事务100的tuple,对事务2^31+100就是可见的。
2024-05-10 15:14:26
596
原创 PG 一个用户连接的后端进程 crash,其它后端进程也退出
从这个角度看PG的多进程模型,的隔离程度并不是那么高,但是相对于线程,还是有一定隔离性的,例如,虽然用户连接后台进程都退出了,但是其它后台进程没有退出,用户重新连接即可,而线程模型,整个数据库服务器端都退出了,所有服务不可用,用户无法重新连接。经过实验,PostgreSQL有多个用户连接时, 当有一个用户的后台进程CRASH,一般段错误之类的原因退出时,其它用户的后台进程也会退出,这是postmaster通知它们这么做的。
2024-05-09 17:36:54
190
原创 以系统方式看世界,就是以不同角度看世界
我们在学习一个复杂系统的时候,会把它分成若干小系统,单独研究一个小系统的时候,会尽量不去想它与其它系统的联系和作用,把一个大系统分解成若干小系统的思维,其实也是从不同角度看一个大系统,例如人体的免疫系统,如果只看免疫系统的工作,不考虑运动、神经、消化系统,就是从免疫系统的角度看人体,但是其实各子系统之间是有联系和交互的(否则这些子系统就没有价值了)。有了一定生活经验的人,会知道许多看似是一个整体事物,其实是由若干个小系统组织而成,例如一个汽车,一台电脑,一个人体,一个国家,一门语言。
2024-04-23 09:40:50
200
原创 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
218
原创 自主创新就是要先接受自己不完美的解决方案并寻求完善
自主创新就是要接受自己的不足,接受自己的无能为力,并且承担代价,然后逐渐改进,逐渐寻找突破,这也是所谓的工程思维,今天看PG代码时,从README说明里看到许多他们对PG解决一个问题时不足的讨论,他们也承认是有不完美的,但是在一定场景下不会出大问题,问题是,如果不接受这个不完美的解决方案,就被问题卡住,无法前进。当我们自己发明创造解决方案时,也会遇到不完美的解决方案问题,就觉得我们的不行,不如别人的,有时干脆就放弃了,觉得白努力。这其实就是不明白要接受自己的不完美,并持续改进下去。
2024-04-18 17:48:33
196
原创 valgrind 是个啥?
m->msg开始sizeof (struct rawmsg)大小的内存,标记为未定义(初始化)的内存,如果没有这个宏,memcheck仿真cpu会认为这块内存是已经被初始化的,因为前面调用了memset,而memcheck仿真cpu会监视memset,这个宏在需要重用一块内存时使用。当然,不可能真的为进程地址空间的每个字节,分配记录其属性的bitmap,因为这些bitmap本身也占用地址空间的字节,memcheck只记录被客户程序触及到的进程地址空间字节的属性,未触及到的字节的属性,应该有办法压缩表示。
2024-04-09 11:21:44
1026
原创 编写 PG extension 时,work_mem 和 maintenance_work_mem的作用
从PG内核编程的角度看,其实backend进程在做上述操作时,也可以不参考这两个参数,而是直接按需分配内存,但是这样,有可能单个backend进程占用的内存太大,把整个计算机的内存都占满了,所以DBA要对每个backend进程占用的内存的上限,做一个限制,当达到这个限制,就采取其它策略,或执行失败,就像单个进程的out of memory。这两个参数在官网都有描述,都是一个backend进程在做工作时,需要用到的内存的参考,也都是给每个backend自己用做参考的,不是全局的。
2024-04-08 15:46:43
561
原创 PG 的 Extension 是个啥?
以前,对于编写PG的Extension一直有一种神秘感,虽然知道PG的Extension,除了SQL脚本创建一堆PG对象外,最难以捉摸的就是so库了,但是对于这个so库到底可以做到哪些,还是不明朗,到底这个扩展能让PG扩展成什么样?是想把PG改成什么样都可以吗?在执行 CREATE EXTENSION XXX 时,PG会先加载so文件,然后执行sql脚本,加载到内存的so文件就是PG内核的一部分了,其中(so)的代码基本上就可以调用PG内核的任何接口函数,使用PG内核提供的基础设施了。
2024-04-07 17:20:58
351
原创 pg_config.h
与pg_congfig.h对应的,还有一个pg_config_manual.h,这个不是configure生成的,一般用于developer调试,里面也可以设置一些编译后不可变的或默认的内核配置。既然是编译时设置,通过修改configure,也可以将git commit的版本号加进去,这样数据库运行时可以查到可执行文件对应的代码版本。这个头文件是编译PG时configure生成的,configure命令行中的设置,可以反映到这个文件中的宏定义。一般用于一些编译后不可变或者默认的PG内核配置。
2024-04-07 16:53:29
216
原创 PG 中的 MAXALIGN 及对齐分配内存(MemoryContextAllocAligned)
它的实现原理也颇为简单,简单地说就是分配略大于 size + alignto 的一块内存,这样,无论返回的地址是否按照 alignto对齐,在这块内存中总能找到alignto对齐的地址,而且这个对齐地址其后面,可用内存一定大于需要的内存size。有时内存地址的对齐,需要大于MAXALIGN,这时可以用 BUFFERALIGN,它返回最接近输入数字(大于)且能整除32的数。在PG源码中,MAXALIGN这个宏,返回最接近输入数字(大于)且能整除8的数,仅此而已。“CPU访问对齐的地址性能更高”
2024-04-07 16:39:12
390
原创 C++ 内存分配时地址对齐
如果希望在堆中分配的内存时,返回地址按照特定长度对齐,可以使用 aligned_alloc。因此在C++中,有时会希望在堆或栈中分配内存时,返回的地址能按照特定的长度对齐。如果数据地址的对齐与CPU相兼容,那么CPU读写内存时性能会更高。// 输出的地址总是按照4096对齐。
2024-04-07 14:23:08
369
原创 在 PostgreSQL Extension 中使用 MemoryContext
MemoryContext可以理解成是一种类,整个backend进程,以它为节点连城一个树型结构,没个模块的内存分配创建一个MemoryContext,挂到backend的树中,然后这个模块所以需要的内存都在这个MemoryContext里分配,当这个模块的生命周期结束,就销毁这个MemoryContext,在其中分配的内存也全部被释放,如果这个MemoryContext由子树,子树所管理的内存也一起释放。
2024-04-07 13:52:25
237
POI数据集PostGIS数据集
2020-09-25
PG两阶段锁和LWLock
2023-05-24
TA创建的收藏夹 TA关注的收藏夹
TA关注的人