PgSQL · 内核开发 · 如何管理你的 PostgreSQL 插件

一.背景

我们都知道 PostgreSQL 提供了丰富数据库内核编程的接口,允许开发者以插件的形式把功能融入数据库内核。

PostgreSQL 提供了一个插件管理模块,用于管理用户创建的插件。

本文给大家介绍 PostgreSQL 插件管理模块,帮助大家管理自己的插件。

二.PostgreSQL的插件内容

通常一个 PostgreSQL 内核插件包括下面的部分

  • 1. 包含功能的逻辑的动态库,即 so 文件。
  • 2. 描述插件信息的的控制文件,即 control 文件。
  • 3. 一组文件用于创建、更新和删除插件,这是一组按照版本命名的 SQL 文本文件。

如果缺少了上述部分,或版本号不正确,插件的管理功能会异常。

三.插件的管理

我们使用 create extension, drop extension alter extension 管理指定的插件。

1.插件的创建

例如 postgres_fdw 的创建

create extension postgres_fdw;
drop extension postgres_fdw;

我们可以选择把插件创建到指定的模式中。

2.插件的管理视图

这是最简单的部分,创建插件后,我们可以通过插件管理视图看到一些细节信息

select * from pg_extension ;
   extname    | extowner | extnamespace | extrelocatable | extversion | extconfig | extcondition
--------------+----------+--------------+----------------+------------+-----------+--------------
 postgres_fdw |       10 |         2200 | t              | 1.0        |           | 

可以看到,postgres_fdw 的 owner, 存在的 schema 和插件的小版本。

3.插件的删除

插件的内容可以是任何的数据库对象,例如:函数、操作符等等。

这些对象可能被其他的对象引用,例如我们在 postgres_fdw 创建了基于 postgres_fdw 的外部表。

当我们要删除 postgres_fdw 时,需要加上 cascade 子句,把相关对象一并删除。

drop extension postgres_fdw cascade;

这么做带来的问题是,所有依赖这个插件的对象都会被删除。再次使用需要重建。

4.插件的更新

有时候,我们需要做插件的 BUGFIX ,或定制一些功能。这就用到了插件更新功能。

  • 首先,我们需要升级插件的小版本

修改控制文件 .control, 增加一个小版本,如果当前版本是 1.1,则文件中版本号修改成 1.2

  • 添加新版本的的 DDL SQL 文件

添加新版本的 DDL SQL 文件 *–1.2.sql, 用于从零创建该插件。

该 SQL 文件应该包括该插件的所有对象的 DDL。

  • 添加用户老版本升级到新版本的 DDL SQL 文件

创建 *1.1–1.2.sql,用于从版本 1.1 升级到 1.2

该 SQL 文件只包含 1.2 版本中新创建的对象。用户的升级操作会调用该 SQL 文件,从而避免了完全重新创建。

  • 修改源码添加新的功能,编译并安装到指定目录。
  • 使用 SQL 升级小版本
alter extension postgres_fdw update;

如果成功更新,我们能从视图中看到对应的小版本号被更新了。

postgres=# select * from pg_extension ;
   extname    | extowner | extnamespace | extrelocatable | extversion | extconfig | extcondition
--------------+----------+--------------+----------------+------------+-----------+--------------
postgres_fdw |       10 |         2200 | t              | 1.2        |           |
(2 rows)

使用 PostgreSQL 的插件管理功能,用户很容开发和维护需要的插件。

其他

有几点需要特别提醒,这是在开发和管理插件时,经常碰到的问题,需要多加注意

  • 插件是通过动态库形式引入到内核中。和内核在同一个进程中运行,且没有内存保护,影响内核的稳定性。开发中需要特别注意内存的使用。不要造成内存泄露或越界写。建议使用 PostgreSQL 的内存管理机制,插件中也能使用。
  • 内核中被标记成 PGDLLIMPORT 的全局变量都能在插件中直接使用,这些通常是一些 GUC 参数。
  • 内核中非 static 的函数也能在插件中使用,只需要先 extern 它们。
  • 我们可以实现 _PG_init 用于实现一些初始化工作,该函数在连接建立后只会被执行一次。
  • 我们可以在 _PG_init 中使用函数 DefineCustom*Variable 定义对应插件相关的 GUC 参数,他们可以用于开启和关闭该插件的一些功能。
  • 插件的参数需要以插件名开头且加上点,例如 oss_fdw.enable_parallel_read。

参考

  1. PostgreSQL 插件的创建
  2. PostgreSQL 插件的删除
  3. PostgreSQL 插件的修改/升级
时间: 2024-12-03 15:44:27

PgSQL · 内核开发 · 如何管理你的 PostgreSQL 插件的相关文章

PgSQL · 内核开发 · 利用一致性快照迁移你的数据

一.背景 众所周知 PostgreSQL 的物理复制以稳定可靠著称,目前经成为默认的高可用方案.但较少有人关注到,PostgreSQL 的逻辑复制经过几个大版本迭代,已异常的强大.它结合了很多黑科技,本文就一一介绍给大家. 二. MVCC 和 snapshot 大家都知道,PostgreSQL 使用 MVCC 和 WAL 两项技术实现 ACID 特性. MVCC 即多版本并发控制,简单的说,是数据库中的同一份有效数据,会同时保留多个修改版:用 snapshot 即快照,来定义一个事务能看到哪些版

一天学会PostgreSQL应用开发与管理 - 8 PostgreSQL 管理

本章大纲 一.权限体系 1 逻辑结构 2 权限体系 3 schema使用 , 特别注意 4 用户 5 public 6 如何查看和解读一个对象的当前权限状态 二.索引介绍 1 索引有什么用? 2 索引的类型 3 索引合并扫描 4 表膨胀检查 5 检查膨胀 6 索引维护 三.系统配置 1 存储.文件系统规划 2 网络规划 3 CPU评估 4 内核配置 5 资源限制 6 防火墙配置 四.数据库初始化 1 initdb 介绍 2 postgresql.conf参数配置 3 pg_hba.conf数据库

DB Solo 4.2.2发布 数据库开发和管理工具

DB Solo 是一个强大的数据库开发和管理工具,用于http://www.aliyun.com/zixun/aggregation/7155.html">开发人员和DBA.它有一个直观的用户界面,允许你去查看和管理数据库对象,以及执行 ad-hoc 查询.支持Oracle.MySQL.Sybase.DB2.Solid.PostgreSQL.MS SQL Server,以及支持大多数主要的操作系统和DBMS产品.它的查看和管理对象功能包括:图解.表格.索引.视图,表格空间.用户管理.角色.

ZLG致远电子Linux内核开发工具介绍

众所周知,Linux内核是使用make命令来配置并编译的,那必然少不了Makefile.如此复杂.庞大的内核源码绝不可能使用一个或几个Makefile文件来完成配置编译,而是需要一套同样复杂.庞大,且为Linux内核定制的Makefile系统. 尽管她是一个复杂的系统,但对绝大部分内核开发者来说只需要知道如何使用,而无需了解其中的细节.她对绝大部分内核开发者基本上是透明的,隐藏了大部分实现细节,有效地降低了开发者的负担,能使其能专注于内核开发,而不至于花费时间和精力在编译过程上. 1.1 Lin

为什么 Linux 内核开发仍然使用电子邮件

在日新月异的今天,Linux内核开发项目仍然依赖于古老的电子邮件和邮件列表.稳定内核维护者Greg Kroah-Hartman 指出,电子邮件仍然是管理如内核这样庞大项目的最佳方法.去年,Greg一个人就接受了9,781个补丁,而整个项目平均每小时接受8个补丁.他尝试过替代方法,但在对比之后认为电子邮件仍然是最好的方法. Greg试用过GitHub后认为它比较适合小的项目,对于大的项目并不好:它的pull request 讨论只向特定人开放,它需要网络访问,而开发者由于种种原因在工作时候未必能访

DB Solo 4.2发布 数据库开发和管理工具

DB Solo是一个强大的数据库开发和管理工具,用于http://www.aliyun.com/zixun/aggregation/7155.html">开发人员和DBA.它有一个直观的用户界面,允许你去查看和管理数据库对象,以及执行 ad-hoc 查询.支持Oracle.MySQL.Sybase.DB2.Solid.PostgreSQL.MS SQL Server,以及支持大多数主要的操作系统和DBMS产品.它的查看和管理对象功能包括:图解.表格.索引.视图,表格空间.用户管理.角色.远

C#进行Visio二次开发之管理下拉列表

每个Shape有很多属性,这里我是指自定义属性,每个属性都对应一种类型,就像我们在SqlServer创建一个字段的时候,需要指定其类型一样.Visio的属性类型有以下几种: 值 说明 自动常量 0 字符串.此为默认值. visPropTypeString 1 固定列表.在"形状数据"对话框的下拉组合框中显示列表项.在 Format 单元格中指定列表项.用户只能从该列表中选择一项. visPropTypeListFix 2 数字.包括日期.时间.持续时间和货币值,以及标量.尺寸和角度.在

RapidWebDev框架 - 快速开发产品管理示例程序

首先,我们按照以往的思路,先将上一章中的t_product进行一定的扩展,如下图: 开发产品管理示例程序-net快速开发框架">在这里,我增加了一张T_PRODUCT_CATEGORY表,用于存放产品分类信息,分类为树型结构,另外增加了一个T_WAREHOUSE表,用于存放仓库信信息,然后在T_PRODUCT增加了相应的外键和一些扩展字段.有了数据表,就开始分别对分类和仓库建了对应的管理代码(CRUD, UI等),然后在产品页面对其调用.为了节约篇幅,这里就不贴这些代码了,反正是一大堆.

Linux内核开发工具介绍

进行嵌入式Linux产品开发,往往需要对内核进行裁剪和定制,以满足嵌入式产品的功能和性能需求.本文介绍几种阅读Linux内核源码的工具和方法. 这里所说的"Linux内核开发"仅仅是指嵌入式Linux产品开发中内核和驱动相关开发工作,与Linux所领导的内核开发团队的内核开发有很大不同. 俗话说"工欲善其事,必先利其器",面对几百兆的Linux内核代码,要阅读.查看或者搜索其中的代码,大部分初次接触到Linux内核代码的开发人员,都有无从下手的感觉.下面推荐几个源码