postgresql 内核开发之系统参数增加(下)

PostgreSQL内核开发——添加内核函数 在PostgreSQL内核的学习过程中,可以尝试向内核中添加一些函数,扩展PostgreSQL的功能。同时可以增加自己对PG内核的理解。这里我们以简单的添加一个helloworld函数为例,分析一下这个过程中涉及到的相关源码。 阅读详情

上篇介绍了怎么加一个常规参数,同时也留下了一个问题,如何加一个奇葩参数设置功能,使任意一个session设置参数值,全局所有连接立即生效。
如何实现呢?我们来分析下。
如果要使当前session生效,直接设置即可,它能直接读写当前进程的参数值。那其它的session呢?首先我们明确一个问题,数据库一旦正常运行起来后,所有的动作都是在事务中进行的,如果一个连接session在等待任务中,其它连接session的一些语句动作是无法直接影响到处于等待连接的session的。但是不同连接session肯定是有相互影响的,比方说A session建个表,B session读写这个表,肯定是可以的,任何session中事务只要提交那么就对全局都可见,这是数据库的基础,比方说是在StartTransaction()函数中的AtStart_Cache()函数会根据主进程的消息判断本地Cache是否需要更新。也就是说可以延迟点间接的更新到当前数据库的最新状态。一开始也是想以这样的方式去实现参数生效功能,后来看了下pg_reload_conf()函数恍然大悟,何必这么麻烦,直接用postgres进程间信号即可,因为postgres已经有通知所有session重新读参数功能了,要做的就只要把参数写进去通知大家重读参数文件就可以了。
那么现在的问题就转化成了如何写参数了,遗憾的是没有发现内核有对postgresql.conf文件参数的写相关功能,postgresql.conf 文件是从 postgresql.conf.sample COPY过来的,并不是动态生成的。不过postgresql.conf有include_if_exists 用法,如果存在某个参数文件就追加到后面,那么我们就可以增加一个新的参数文件,里面就写我们在设置的参数值。
以函数方式实现,在date.c的增加相关代码:

extern char    *ConfigFileName;
extern bool     oracle_style;
extern FILE * AllocateFile(const char *name, const char *mode);
Datum swap_oracle_mode(PG_FUNCTION_ARGS)
{
    char conf_path[512] = { 0 };
    int pos = 0;
    int count = 1;
    char *tmpFile = ConfigFileName;
    FILE *fp;

    if (NULL == ConfigFileName)
    {
        ereport(ERROR,
            (errcode(ERRCODE_CONFIG_FILE_ERROR),
            errmsg("can't open the config file")));
    }

    while ('\0' != *tmpFile)        //找到参数文件路径
    {
        if (*tmpFile == '\\' || *tmpFile == '/')
        {
            pos = count;
        }
        count++;
        tmpFile++;
    }

    if (pos + strlen("oracle.conf") > sizeof(conf_path))    
    {
        elog(ERROR, "can't create the oracle.conf file");
    }

    memcpy(conf_path, ConfigFileName, pos);
    memcpy(conf_path + pos, "oracle.conf", strlen("oracle.conf"));  //生成新路径名字

    fp = AllocateFile(conf_path, "w+");                 
    if (NULL == fp)
    {
        ereport(ERROR,
            (errcode(ERRCODE_CONFIG_FILE_ERROR),
            errmsg("can't open the config file")));
        return;
    }
    else
    {
        if (oracle_style)                       //在新参数文件中写入参数命令
        {
            fprintf(fp, "oracle_style = off\n");
        }
        else
        {
            fprintf(fp, "oracle_style = on\n");
        }

        if (FreeFile(fp))
        {
            elog(ERROR,"can't write oracle.conf file ");
            return;
        }

        if (kill(PostmasterPid, SIGHUP))    /*****通知其它进程重读参数****/
        {
            ereport(WARNING,
                (errmsg("failed to send signal to postmaster: %m")));
        }
    }

    PG_RETURN_BOOL(true);
}

在pg_proc.h中增加函数注册

DATA(insert OID = 9995 (swap_oracle_mode   PGNSP PGUID 12 1 0 0 0 f f f f t f s r 0 0 16 "" _null_ _null_ _null_ _null_ _null_ swap_oracle_mode _null_ _null_ _null_));

执行swap_oracle_mode()函数刚修改oracle_style 参数值,覆写到新参数文件 oracle.conf,通知其它连接重读参数,当然别忘了在postgresql.conf中加上一句:

include_if_exists = 'oracle.conf'

小功告成,看看效果,session 1执行参数修改函数,session 2在session 1修改函数前后分别查oracle_style参数值。

postgres=#  ---session 1;
postgres=# show oracle_style;
 oracle_style
--------------
 on
(1 row)


postgres=# select swap_oracle_mode();
 swap_oracle_mode
------------------
 t
(1 row)


postgres=#  show oracle_style;
 oracle_style
--------------
 off
(1 row)

postgres=# ---session 2;
postgres=# show oracle_style;
 oracle_style
--------------
 on
(1 row)


postgres=# show oracle_style;       --session 1 swap_oracle_mode()执行前
 oracle_style                                
--------------
 on
(1 row)


postgres=#  show oracle_style;  --session 2 swap_oracle_mode()执行后
 oracle_style
--------------
 off
(1 row)
postgreSQL内核分析1 1前言一直都想写关于PostgreSQL实现原理方面的文章,由于这是一个工作量巨大的工作,平时还要工作谋生,很难抽出时间 来写,希望能够坚持下来。PostgreSQL作为历史最悠久的开源数据库 管理系统 ,有关它的详细信息可以到http://www.postgresql.org/ 去查阅,这里不再赘述。在MySQL被Oracle 抓在手中以后,MySQL变得前途未卜,在这种情况下,PostgreS 阅读详情

相关推荐

PostgreSQL 在内核增加一个配置参数

1. 在配置文件增加你需要的参数 例如我增加一个参数,配置文件:data/postgresql.conf, data目录怎么来的,可以参考《第5课 PostgreSQL 编译源代码进行开发》 2. 修改源代码 src/backend/utils/misc/guc.c,在这个文件中,针对不同的数据类型(bool,int, double,string)实现了4个init*函数和4个数据结构数组: ...

椟夜 780

PostgreSQL内核开发过程介绍(三)-用户自定义基本类型

postgresql

数据库耕耘者 1257

大牛总结的PostgreSQL开发指南

本指南目的在于经验总结, 帮助PostgreSQL使用者快速入门,在开发及管理过程中有章可循:命名规范Column设计 Constraints 设计Index 设计关于NULL开发相关规范 管理相关规范

数据库内核研发学习之路(二)postgres编译安装

安装编译postgres并初始化postgres数据库

xiangxiao的博客 1011

PostgreSQL数据库内核分析 完整版

《PostgreSQL数据库内核分析》彭智勇 完整版44M

LaTeX小白必看:5分钟搞定GB/T 7714-2005参考文献格式(Texmaker+BibTeX实战)

本文为LaTeX初学者提供了使用Texmaker编辑器和BibTeX工具链,快速实现GB/T 7714-2005参考文献格式的实战指南。文章详细解析了从获取gbt7714-2005.bst样式文件、编写.bib数据库到四步编译流程的核心步骤,并附有常见问题解决方案,帮助用户高效、准确地完成学术论文的参考文献排版。

weixin_29295541的博客 338

PG数据库内核分析学习笔记_MultiXact日志管理器

PG数据库内核分析学习笔记_MultiXact日志管理器 MultiXact日志是PG系统用来记录组合事务ID的一种日志. 由于PG采用了多版本并发控制, 因此同一个元组相关的事务ID可能有多个, 为了在加锁(行共享锁)的时候统一操作, PG将与该元组相关联的多个事务ID组合起来用一个MultiXactID代替来管理.同CLOG, SubTrans日志一样, MultiXact日志也是利用SLRU...

liuhhaiffeng的专栏 1776

动态博弈、威胁与承诺(博弈论入门学习笔记四)

0 动态博弈 动态博弈:行动有先后顺序,不同的参与人在不同时点行动,先行动者的选择影响后行动者的选择空间,后行动者可以观察到先行动者做了什么选择。例如下棋、消费者和商家讨价还价、谈婚论嫁、企业之间的价格战等等。 因此,为了做出最优的行动选择,每个参与人都应该思考:如果我如此选择,对方将如何应对?如果我是他,我将会如何行动?给定他的应对,什么是我的最优选择? 动态博弈中的战略:在博弈开始之前就...

stepho的博客 1万+

PG内核解读-第2节PostgreSQL体系结构

本文整理自阿里云数据库开源社区Maintainer于巍(花名漠雪),在PostgreSQL数据库内核解读系列的分享。本篇内容主要分为三个部分:1. PostgreSQL系统表2. PostgreSQL初始化、启动、查询流程3. PostgreSQL辅助进程。

于巍,花名漠雪,移动云数据库技术委员会主任,海山数据库研发负责人,PG中文社区常委,PG中文社区海外联络人。15年数据库内核研发经验,4年美国、以色列等海外研发经历,华为GaussDB、阿里云PolarDB、移动云He3DB等核心架构 533

告别报错!Win10下Autodock Vina 1.2.3保姆级安装与避坑指南

本文提供了Win10系统下Autodock Vina 1.2.3的完整安装与实战指南,涵盖环境配置、分子文件预处理、对接参数优化及结果分析等关键步骤。通过详细的避坑技巧和优化方案,帮助用户高效完成分子对接任务,特别适合生物信息学研究人员和药物发现领域的初学者。

weixin_29969209的博客 407

(数字图像处理MATLAB+Python)第五章图像增强-第一节:图像增强概述和基于灰度级变换的图像增强

图像增强(Image Enhancement):指不考虑图像降质原因,利用各种数学方法和变换手段,增强图像中人们感兴趣部分或提高有用的图像特征的清晰度。从图像质量来看,图像增强提高了图像的可懂度,改善了图像的视觉效果例如在现实场景中,针对那些对比度较差、视觉效果不好的图像,我们就可以利用图像增强改善视觉质量图像增强可分为如下几种基于灰度级变换的图像增强基于直方图修正的图像增强基于照度反射模型的图像增强基于模糊技术的图像增强基于伪彩色处理的图像增强其他图像增强方法分段线性灰度级变换。

快乐江湖的博客 3335

postgresql 内核开发之系统参数增加(上)

postgres数据库内部提供了大量的系统参数做各种管理、控制、调优等无处不在无孔不入无所不用其及的精细功能调整,毫不客气的说,一个DBA对参数的理解程度往往决定了这个DBA的水平。那么我们如何增加一个自己的参数呢?其实很简单。

postgres20的博客 1318

UDF学习(二)基础数据类型与常见宏

thread_loop_c (t,d) 必须与begin_c_loop (c,t)同时使用,但begin_c_loop (c,t)不一定与thread_loop_c (t,d)同时使用。同理thread_loop_f(t,d)必须与begin_f_loop (c,t)同时使用,但begin_f_loop (c,t)不一定与thread_loop_f(t,d)同时使用。begin_c_loop (c,t) 在计算域内对网格单元进行循环。c_face_loop (c,t)遍历网格单元上的所有网格面。

weixin_44386973的博客 857

给 PostgreSQL 内核源码增加参数

最近一个工作,需要给PG增加一个参数,作为删除输入字符串中 \0 的开关,研究了一下怎么给内核增加参数。 其实如果不深究PG内核参数的整个体系架构,增加参数一点也不难,下面记录一下之前的工作(写给自己看,细节不再详述): 1. 在你自己维护的PG模块的c文件里增加一个全局变量,这个变量就是用来存储参数值的。 例如,我在postgres.c里增加了变量: /* GUC variable for removing '\0' in bind text string*/ bool bind_t...

howard_shooter的博客 1345

OpenClaw零基础教程:30分钟搭建你的第一个AI自动化助手

别再看那些满是代码、专业术语的教程了,那些都是给程序员看的。这篇教程,我把所有步骤拆到了极致,你跟着点鼠标就行,点错了都没关系,大不了重装一遍,5分钟的事。

2601_94871597的博客 98

060、模型蒸馏:把扩散模型压进单步的魔法

《端侧文生图模型蒸馏实战:从32步到1步的优化之道》摘要:针对边缘设备部署难题,本文分享了扩散模型蒸馏的核心经验。通过重构损失函数(感知损失+对抗训练+KL散度)、优化采样轨迹截取策略和改造学生模型架构,成功将Stable Diffusion压缩至单步推理。关键发现包括:小批量训练更有效、标签平滑保障生成多样性、双模型策略平衡质量与速度。在Cortex-A53芯片上实现300ms内生成,内存占用控制在200MB以下。特别强调工业部署需权衡压缩率与稳定性,建议保留迭代模式开关以适配不同场景需求。

2601_95651806的博客 150

PostgreSQL与操作系统(OS)内核相关的几个参数

一、概述 PostgreSQL在postgresql.conf里面的配置参数有几个是和OS的内核参数紧密相关的,通常默认值是偏小的,但设置过大也会造成Postgres的启动失败。  二、测试 1.测试环境 DB: postgres 9.1.3(之后版本这几个参数并未变动) OS: CentOS 6.2 / Redhat(Ubuntu、Debian等linux系统也是一样) 2.内核参数

竹林听雨 1716

企业级OpenClaw部署实战:10个关键配置让你从“养虾“到“精通“

OpenClaw(社区昵称"小龙虾")作为2026年开源社区最活跃的AI Agent项目,凭借其多Agent协同架构和企业级安全隔离能力,已成为中大型企业的首选AI基础设施。本文基于真实企业部署经验,系统梳理了企业级OpenClaw部署的10个关键配置:用户ID消息隔离、群组ID消息隔离、多机器人配置、无限量Agent创建、机器人与Agent关联、Agent间调度、权限配置、Hooks任务、多模型切换及一键备份迁移。

program哲学 931

调整Linux内核参数来优化PostgreSQL

目录 文档用途 详细信息 文档用途 为了使PostgreSQL数据库获得最佳性能,需要正确定义操作系统参数。如果操作系统内核参数配置不当,可能会导致数据库服务器性能下降。因此,必须根据数据库服务器及其工作负载配置这些参数。本文将介绍一些可能影响数据库服务器性能的重要内核参数以及如何调整这些参数来提升性能。 注:本文所有命令及参数设置均针对Linux操作系统。 详细信息 1.SHMMA...

HighGO 968

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

贝叶斯统计 [韦来生编]

贝叶斯(Bayes)统计是近几十年来迅速发展起来的数理统计的一个重要分支。贝叶斯方法与经典统计方法的主要不同之处是进行统计推断时除了利用样本信息外,还要利用参数的先验信息,因此可以提高统计推断或统计决策的效果。它在经济、金融、生物、医学、自然科学和社会科学等许多领域具有广泛的应用。贝叶斯方法的研究已渗透到了统计学的几乎所有领域。作者在给中国科学技术大学概率论与数理统计专业本科生开设的“数理统计”课程中有一章专门讲授“贝叶斯方法和统计决策理论”,近十年来也给中国科学技术大学概率统计专业研究生开设过几次“贝叶斯分析”课。本书是在对过去讲稿的内容作了适当的增减和调整的基础上完成的。  本书共分六章。第1章是绪论,介绍了贝叶斯统计的若干基本概念,同时对必要的数理统计的基础知识有重点地作了回顾。第二章介绍了确定先验分布的若干可供选择的方法。第三章介绍了几类常见统计模型参数的后验分布的主要结果和计算方法。第四章和第五章分别介绍了“贝叶斯统计推断”和“贝叶斯统计决策”的内容。第六章介绍了贝叶斯统计计算的若干方法,包括蒙特卡洛方法和马尔可夫链蒙特卡洛(MCMC)方法以及相关统计软件的简介。本书的每一章附右大量的例题和习题,书末附有常用的几个表格和部分习题解答供读者查用。  大约可在54学时内讲授本书的第1章至第六章的主要内容,教师可根据学时需要选讲本书第1章至第六章的部分内容。书中标“*”号的章节可略去不讲,留给读者作为阅读材料。第六章例题中的R代码和部分例题的数据文件等可从作者个人主页下载。  作者在编写本书的过程中参考了J.O.Berger教授的《统计决策论及贝叶斯分析》和茆诗松教授编写的《贝叶斯统计》等书中的一些内容,以及《贝叶斯分析》一书中由张伟平博士编写的有关贝叶斯统计计算的一些内容。在此表示衷心感谢。  本书编写准备过程中,中国科学技术大学统计与金融系的几个研究生帮助完成了本书部分中文的录入和排版,作者对他们的辛勤工作表示真诚的感谢。高等教育出版社为本书的出版给予了大力支持。在此一并致谢。

PostgreSQL数据库内核(二):增加controlfile参数

新增guc参数pg_test_parameter,支持从initdb和pg_ctl命令中传递/覆盖参数,使用场景是TDE透明加密指定算法或者某些定制化需求。

叶子叶来 688

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

PostgreSQL 内核开发与数据共享教程

PostgreSQL 内核开发与数据共享教程 1. 项目介绍 本项目旨在为开发者提供一个深入了解 PostgreSQL 内核开发和数据共享的教程。通过本教程,开发者可以学习如何进行 PostgreSQL 内核的定制开发,以及如何在多个 PostgreSQL 实例之间实现高效的数据共享。 项目链接:https://github.com/TsinghuaLucky912/PostgreSQL-kern...

gitblog_00653的博客 949

PostgreSQL数据库内核(一):增加系统表pg_test_catalog

使用PostgreSQL14.5源码版本编译,操作系统CentOS,本地windos系统+CLion代码工具,首先下载。以上就完成了增加系统表流程,这里系统表并没有一些逻辑交互,如果涉及复杂的逻辑交互需要修改backend里面的代码或者调用;

叶子叶来 1849

PG内核解读-第1节PostgreSQL系统概述

本课程主要面向PostgreSQL DBA、高校学生、内核开发爱好者。解决PostgreSQL DBA遇到的问题,希望用户可以通过查看代码深入了解PG原理。让没有接触过数据库内核的同学,了解内核基本原理、代码实现,可以完成简单功能开发,大家一起共同学习、共同成长。本系列的章节设置,参照彭智勇老师的《PostgreSQL数据库内核分析》,内容互补。每章节先介绍架构、原理、使用,再介绍代码。

于巍,花名漠雪,移动云数据库技术委员会主任,海山数据库研发负责人,PG中文社区常委,PG中文社区海外联络人。15年数据库内核研发经验,4年美国、以色列等海外研发经历,华为GaussDB、阿里云PolarDB、移动云He3DB等核心架构 490

PostgreSQL调优1:PostgreSQL系统参数

默认的PostgreSQL配置参数并不是针对某种负载优化过的。默认值主要是确保PostgreSQL可以在任何环境下都能运行起来,因此默认配置使用了最少的资源。根据数据库的负载来对数据库进行调优,是DBA或是开发的主要职责。 有时虽然可以使用索引,但是SQL却使用了全表扫描,或是执行了开销比较的join或是聚集操作,这种情况下,就算是数据库是调优过了,数据库的性能也不会好。这种情况下,在写SQL的时候就需要格外的小心。数据的参数调优依然是非常重要的。以下是7个最可能影响...

zxw986的专栏 3746

postgresql修炼之道_PostgreSQL内核开发学习资料

我自2011年便开始进行PostgreSQL内核开发岗,在公司内也算是时间比较久了,带了一些新人入门,总结了一些不同阶段需要学习的资料。我将PostgreSQL内核知识划分为3层:数据库基础对象,内容最多,比如系统表、表、系统函数、语法、前端工具、通讯协议等等;进程运行过程;数据库核心内容,存储、事务以及查询处理器。根据内核知识层级,我将PostgreSQL内核开发工程师的知识水平划分为5个级别,...

weixin_39667080的博客 428
上一篇: postgresql 内核开发之系统参数增加(上)
下一篇: postgresql 10 分区探密
postgres20
博客等级 码龄10年 100粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值