一、自带的OID的相关脚本
在PostgreSQL的安装包的src/include/catalog目录下,有着两个脚本,unused_oids和 duplicate_oids。通过这两个可执行脚本,可以查看当前源码包配置里的符合要求的OID。unused_oids可以查看若根据当前源码包初始化产生的数据库,在系统表中未被使用的OID,duplicate_oids可以找到在系统表重复定义的OID。
当我们执行unused_oids脚本的时候,就会出现类似如下的显示, 可以获取到这个PostgreSQL 尚未使用的 OID 列表。 假设当你想创建一个系统信息函数 的时候,你需要生成不会产生任何冲突的 OID 。这个时候使用这个脚本是很方便的,官方推荐的范围是8000到9999,如果增加的补丁占用的OID相互冲突了,那么可能就会产生相关问题,此时另一个脚本duplicate_oids的意义也就出现了。
对于每个具有任何手动创建的初始数据(有些没有)的目录都有一个相应的.dat文件,其中包含其以可编辑格式的初始数据 。这些.dat文件里都包含 Perl 数据结构文字 。这些文字被求值以生成内存中的数据结构。当用上边的方法获取了可使用的OID后,就可以在此类.dat文件里定义函数初始数据的格式以及其OID了。
二、测试
如下我们做个测试
通过上边脚本我们已经能够看到111这个OID是没有被使用的。
而我们查询原本数据库里的pg_backend_pid 函数,其对应的OID为2026 ,我们接下来对此系统内置函数的OID进行修改。
直接查看src/include/catalog下的pg_proc.dat里。数据库里的系统表里关于pg_backend_pid 的OID和其是能对应上的。
此时我们修改此条记录,将2026修改为111。并且保存退出。
重新编译,并且initdb到一个新的路径。启动数据库
[xmaster@mogdb-kernel-0005 postgresql-14.1]$ ./configure --prefix=/home/xmaster/pg_oids [xmaster@mogdb-kernel-0005 postgresql-14.1]$ make -j 24 [xmaster@mogdb-kernel-0005 postgresql-14.1]$ make install -j 24 [xmaster@mogdb-kernel-0005 postgresql-14.1]$ cd /home/xmaster/pg_oids/bin [xmaster@mogdb-kernel-0005 bin]$ ./initdb -D /data/ysl_oids/data 修改完端口后,启动数据库 [xmaster@mogdb-kernel-0005 bin]$ pg_ctl start -D /data/ysl_oids/data/
此时,pg_backend_pid 这个函数的OID已经被改成了我定义的111。
然后再查看我初始化使用的安装包的里的unused_oids脚本,发现2026已经成为未被使用的状态,而111已经从这个结果里消失了。因为pg_proc.dat文件里我进行了修改。
此篇虽然是修改了已经内置的函数的OID,但是同样的,想创建新内置函数的时候,声明并定义新增函数后,也可以用这个方式给函数分配对应的OID。