1.PgSQL何为 PostgreSQL?
2.PostgreSQL-源码学习笔记(5)-索引
3.GnuPG命令行
4.PostgreSQL · 源码分析 · 回放分析(一)
5.PostgreSQL内核Trigger的系统一生
6.pg集群搭建几种方式
PgSQL何为 PostgreSQL?
PostgreSQL 是一种开放源码的关系型数据库管理系统。最初,源码它是系统从伯克利的代码继承而来。 它具备广泛支持 SQL 标准的源码能力,以及许多现代特性,系统如复杂查询、源码潮流计算源码外键、系统触发器、源码视图、系统事务完整性、源码多版本并发控制等。系统 PostgreSQL 通过增加新的源码数据类型、函数、系统操作符、源码聚集函数、系统索引方法、过程语言等,具有高度的可扩展性。 许可证的灵活性使得 PostgreSQL 可以免费用于各种目的,无论是私用、商用还是学术研究。任何人都可以自由使用、修改和分发 PostgreSQL,无须付费。 通过这些特性,PostgreSQL 成为一个功能强大、灵活性高、支持多种应用场景的数据库系统。 它不仅支持 SQL 标准,还提供了许多额外的功能,使得开发者能够根据特定需求进行定制和扩展。 此外,PostgreSQL 的开放源码特性使得它成为自由软件的代表之一,任何人都可以对其进行修改和定制,满足不同场景的需求。 因此,PostgreSQL 是一种灵活、强大且高度可定制的关系型数据库管理系统,适用于各种应用场景,尤其在需要高度定制化和灵活性的场景中表现突出。 总的来说,PostgreSQL 的开放源码特性、广泛支持 SQL 标准、丰富特性以及高度可扩展性,使得它成为一种功能强大、群组php源码灵活性高且适用范围广泛的数据库系统。扩展资料
PostgreSQL是以加州大学伯克利分校计算机系开发的 POSTGRES 版本 4.2 为基础的对象关系型数据库管理系统(ORDBMS)。POSTGRES 领先的许多概念只是在非常迟的时候才出现在商业数据库中。PostgreSQL-源码学习笔记(5)-索引
索引是数据库中的关键结构,它加速了查询速度,尽管会增加内存和维护成本,但效益通常显著。在PG中,索引类型丰富多样,包括B-Tree、Hash、GIST、SP-GIST、GIN和BGIN。所有索引本质上都是独立的数据结构,与数据表并存。
查询时,没有索引会导致全表扫描,效率低下。创建索引可以快速定位满足条件的元组,显著提升查询性能。PG中的索引操作函数,如pg_am中的注册,为上层模块提供了一致的接口,这些函数封装在IndexAmRoutine和IndexScanDesc中。
B-Tree索引采用Lehman和Yao的算法,每个非根节点有兄弟指针,页面包含"high key",用于快速扫描。PG的B-Tree构建和维护流程涉及BTBuildState、spool、元页信息等结构,包括创建、插入、扫描等操作。
哈希索引在硬盘上实现,支持故障恢复。它的页面结构复杂,包括元页、桶页、溢出页和位图页。插入和扫描索引元组时,需要动态管理元页缓存以提高效率。
GiST和GIN索引提供了更大的extjs江湖源码灵活性,支持用户自定义索引方法。GiST适用于通用搜索,而GIN专为复合值索引设计,支持全文搜索。它们在创建时需要实现特定的访问方法和函数。
尽管索引维护有成本,但总体上,它们对提高查询速度的价值不可忽视。了解并有效利用索引是数据库优化的重要环节。
GnuPG命令行
GnuPG (Gnu Privacy Guard) 是一个自由且开源的加密工具,版本为1.4.1。它由Free Software Foundation提供,且完全无任何保证。这个程序支持公钥加密,如RSA、RSA-E、RSA-S、ELG-E和DSA,以及对称加密算法,如3DES、CAST5、BLOWFISH、AES、AES、AES和TWOFISH。散列算法包括MD5、SHA1、RIPEMD、SHA、SHA和SHA。同时,它还支持压缩功能,如不压缩、ZIP、ZLIB和BZIP2。 在命令行操作中,gpg的基本语法是gpg [选项] [文件名],其默认行为根据输入数据自动决定。一些主要的命令和选项包括:-s, --sign [文件名]:用于生成一个文件的签名。
--clearsign [文件名]:生成一个明文签名的文件。
-b, --detach-sign:创建可分离的签名。
-e, --encrypt:加密数据。
-c, --symmetric:仅使用对称加密。
-d,oa论坛源码 --decrypt:解密数据(默认)。
--verify:验证签名。
--list-keys:列出密钥。
--export:导出密钥。
--import:导入或合并密钥。
范例中,如要为Bob签名并加密文件,可以使用命令:`-se -r Bob [file]`。对于密钥管理,你可以通过`--edit-key`进行编辑,`save`保存并退出,`help`查看帮助信息,以及`fpr`、`list`等选项来查看和操作密钥信息。扩展资料
GnuPG(GNU Privacy Guard或GPG)是一个以GNU通用公共许可证释出的开放源码用于加密或签名的软件,可用来取代PGP。大多数gpg软件仅支持命令行方式,一般人较难掌握。由于gpg软件开放源代码,很难隐藏后门,因此比pgp等商业软件安全。PostgreSQL · 源码分析 · 回放分析(一)
在数据库运行中,可能遇到非预期问题,如断电、崩溃。这些情况可能导致数据异常或丢失,影响业务。为了在数据库重启时恢复到崩溃前状态,确保数据一致性和完整性,我们引入了WAL(Write-Ahead Logging)机制。WAL记录数据库事务执行过程,当数据库崩溃时,利用这些记录恢复至崩溃前状态。
WAL通过REDO和UNDO日志实现崩溃恢复。REDO允许对数据进行修改,UNDO则撤销修改。REDO/UNDO日志结合了这两种功能。除了WAL,还有Shadow Pagging、WBL等技术,但WAL是主要方法。
数据库内部,日志管理器记录事务操作,缓冲区管理器负责数据存储。当崩溃发生,jym链接源码恢复管理器读取事务状态,回放已提交数据,回滚中断事务,恢复数据库一致性。ARIES算法是日志记录和恢复处理的重要方法。
长时间运行后崩溃,可能需要数小时甚至数天进行恢复。检查点技术在此帮助,将脏数据刷入磁盘,记录检查点位置,确保恢复从相对较新状态开始,同时清理旧日志文件。WAL不仅用于崩溃恢复,还支持复制、主备同步、时间点还原等功能。
在记录日志时,WAL只在缓冲区中记录,直到事务提交时等待磁盘写入。LSN(日志序列号)用于管理,只在共享缓冲区中检查。XLog是事务日志,WAL是持久化日志。
崩溃恢复中,checkpointer持续做检查点,加快数据页面更新,提高重启恢复速度。在回放时,数据页面不断向前更新,直至达到特定LSN。
了解WAL格式和包含信息有助于理解日志内容。PG社区正在实现Zheap特性,改进日志格式。WAL文件存储在pg_wal目录下,大小为1GB,与时间线和LSN紧密关联。事务日志与WAL段文件相关联,根据特定LSN可识别文件名和位置。
使用pg_waldump工具可以查看日志内容,理解一次操作记录。日志类型包括Standby、Heap、Transaction等,对应不同资源管理器。PostgreSQL 包含种资源管理器类型,涉及堆元组、索引、序列号操作。
标准记录流程包括:读取数据页面到frame、记录WAL、进行事务提交。插入数据流程生成WAL,复杂修改如索引分裂需要记录多个WAL。
崩溃恢复流程从控制文件中获取检查点位置,严格串行回放至崩溃前状态。redo回放流程与记录代码高度一致。在部分写问题上,FullPageWrite(FPW)策略记录完整数据页面,防止损坏。WAL错误导致部分丢失不影响恢复,数据库会告知失败。磁盘静默错误和内存错误需通过冗余校验解决。
本文总结了数据库崩溃恢复原理,以及PostgreSQL日志记录和崩溃恢复实现。深入理解原理可提高数据库管理效率。下文将详细描述热备恢复和按时间点还原(PITR)方法。
PostgreSQL内核Trigger的一生
本文简要介绍 PostgreSQL 数据库的 Trigger 从创建、存储、触发、执行、修改到删除的过程,贯穿 Trigger 的一生。
文中引用的函数、结构体来源于 PG 源码,分支为 REL__STABLE,对应的 commit id 如下。此外还引用了 PG 官方文档。
触发器简介
Trigger 即触发器,它可以在特定事件发生时,对数据库中的对象执行特定操作:
根据触发事件的不同,PG 的触发器分为两类:
不同数据库中触发器的分类有所不同,比如 Oracle 分为 DML Trigger 和 System Trigger,SQL Server 分为 DML Trigger、DDL Trigger 和 Login Trigger,不论其如何划分,多数都可以与 PG 的触发器对应上。
创建触发器语法
首先介绍创建触发器的 SQL 和 PLpgSQL 语法。
Trigger
根据 PG 官方文档,创建 Trigger 的语法如下:
下面以表 t1、t2 为例创建一个简单的触发器示例。表的定义如下:
触发器定义如下,是表 t1 上的行级触发器,对 t1 进行 INSERT 之后会触发,并执行 insert_into_t2 函数,将插入到 t1 的数据也插入到 t2。
insert_into_t2 函数定义如下,其中引用了上下文信息 NEW,表示插入到 t1 的数据,并将其插入到 t2。
Event Trigger
创建 Event Trigger 的语法如下,相比 Trigger 的语法要简单很多
以下是 PG 官方文档中的一个简单示例,该 Event Trigger 可以在任何 DDL 语句执行之前触发,并抛出异常,禁止执行任何 DDL 语句。
创建流程
简单介绍创建触发器时 PG 内核中的函数调用流程。
Trigger
CREATE TRIGGER 命令都属于 DDL 语句,所以会进入 DDL 的处理流程,关键的调用路径为: ProcessUtilitySlow-->CreateTrigger-->CreateTriggerFiringOn,CreateTriggerFiringOn 函数代码超过 行,因此只介绍其中的关键步骤:
Event Trigger
CREATE EVENT TRIGGER 的关键调用路径为: standard_ProcessUtility-->CreateEventTrigger,该函数流程相对简单很多:
触发器的存储
用户创建的触发器必须持久化到数据库中,具体的存储位置是触发器相关的系统表中。
Trigger
Trigger 存储在 pg_trigger 系统表中,表中的关键字段如下,包含触发器所在的表、触发器名、触发器调用的函数、是否可推迟等属性。总之,通过 CREATE TRIGGER 创建触发器时指定的任何信息都会存储到系统表中。
pg_trigger 系统表的各个字段在内存中用Trigger 结构体表示,定义如下,可见其成员变量与 pg_trigger 的属性是一一对应的。
在内存中的 relcache(表缓存)中也同样保存有 Trigger 的信息:
Event Trigger
Event Trigger 存储在 pg_event_trigger 系统表中,关键字段如下,包含触发器名、调用的函数等信息。与 Trigger 不同的是,这里并不包含触发器所在的表,因为 Event Trigger 不属于任何一个表。
触发过程
触发器会在特定事件场景下被触发,它识别这些事件的方式也很简单,就是在对应事件的代码处调用触发器函数。
Trigger
对于普通的触发器,触发时机是 INSERT、UPDATE、DELETE 等操作之前或者之后,所以在 PG 的执行器阶段触发,多数在 ProcessQuery-->ExecutorRun-->ExecModifyTable 函数中
我们将执行触发操作的函数称为“触发器的执行函数”,各类触发器的执行函数命名格式比较统一,在此列举几种:
以ExecBRInsertTriggers 为例说明触发过程:
Event Trigger
事件触发器支持的事件仅有 ddl_command_start、ddl_command_end、table_rewrite 和 sql_drop 这四类,分别对应四个执行函数,其触发时机说明如下:
以 EventTriggerDDLCommandStart 为例说明触发过程:
调用功能函数
用户在创建触发器的 EXECUTE { FUNCTION | PROCEDURE } function_name 语句中指定了该触发器要执行的功能函数。在触发器被触发后,会执行该函数。
Trigger
在执行器阶段触发时,ResultRelInfo 结构体中存有表上的各项信息,其中就包括表上的触发器、函数等,所以直接从中就可以拿到触发器信息。关键结构体为 ResultRelInfo、TriggerDesc、Trigger,其嵌套关系如下:
将ResultRelInfo 中获取的 Trigger 结构体的全部内容都填充到 TriggerData 结构体,ExecCallTriggerFunc 函数再从 TriggerData 中获取函数 oid,并执行该函数。
TriggerData 结构体定义如下,其中除了 Trigger 以外还保存了各种执行上下文信息,heap 表信息等,与函数的执行有关。
TriggerData 最终会保存到PLpgSQL_execstate 中,这是 PLpgSQL 执行过程中的一个重要结构体:
触发器的功能函数执行的方法与普通的 PLpgSQL 函数、存储过程执行方法是类似的,关键调用路径是: ExecCallTriggerFunc-->plpgsql_call_handler-->plpgsql_exec_trigger-->exec_toplevel_block-->exec_stmt_block-->…………
Event Trigger
对于事件触发器,在触发阶段的EventTriggerCommonSetup 函数中,通过 EventCacheLookup 从缓存中查找触发器功能函数,然后在 EventTriggerInvoke 中根据触发器函数的 oid 进行调用。
EventTriggerCommonSetup 中还会填充 EventTriggerData 结构体,其中保存了调用过程中的一些关键信息:
与普通触发器的 TriggerData 结构一样,EventTriggerData 结构体也会保存到PLpgSQL_execstate 中,在 PLpgSQL 执行过程中使用:
事件触发器的功能函数实际执行步骤与普通触发器也基本相同,关键调用路径为: ExecCallTriggerFunc-->plpgsql_call_handler-->plpgsql_exec_event_trigger-->exec_toplevel_block-->exec_stmt_block-->…………
修改触发器
使用 ALTER 语句修改触发器的定义
Trigger
根据 PG 官方文档,ALTER TRIGGER 的语法如下:
仅支持重命名和修改依赖的插件。
重命名触发器的关键调用流程为:standard_ProcessUtility-->ExecRenameStmt-->renametrig,基本原理也是读取 pg_trigger 系统表的信息,修改以后写回系统表。
修改触发器依赖插件的关键调用流程为:standard_ProcessUtility-->ExecAlterObjectDependsStmt,会修改 pg_depend 系统表。
Event Trigger
根据 PG 官方文档,ALTER EVENT TRIGGER 语法为:
支持对事件触发器进行重命名、禁用、启用、修改 owner 的操作。
ALTER TRIGGER 的关键函数是AlterEventTrigger,其内容较为简单:
删除触发器
使用 DROP 语句删除触发器
Trigger
PG 文档中 DROP TRIGGER 语法如下:
删除触发器的关键函数是RemoveTriggerById,调用流程如下: ProcessUtilitySlow-->ExecDropStmt-->RemoveObjects-->performMultipleDeletions-->deleteObjectsInList-->deleteOneObject-->doDeletion-->RemoveTriggerById
RemoveTriggerById 函数流程:
Event Trigger
PG 文档中 DROP EVENT TRIGGER 语法如下:
删除事件触发器的关键函数是DropObjectById,这是一个公用的函数,可以删除多种类型的对象。
调用流程如下: ProcessUtilitySlow-->ExecDropStmt-->RemoveObjects-->performMultipleDeletions-->deleteObjectsInList-->deleteOneObject-->doDeletion-->DropObjectById
pg集群搭建几种方式
两种。根据查询CSDN博客官网显示:
1、Pgpool:位于应用程序和PG服务端之间,可以搭建在已经存在的任意版本的PG主从结构上。
2、PostgresXL:在PG源代码的基础上增加新功能实现,将PG的SQL解析层的工作和数据存取层的工作分离到不同的两种节点上搭建。
PostgreSQL 命令行工具 - pgcli
pgcli,一个专为PostgreSQL设计的命令行工具,以其语法高亮和自动输入提示功能引人注目。同时,它与MySQL的类似命令行工具mycli共享相似特性。
在配置环境中,centos位系统和PostgreSQL9.4数据库的部署是基础。接下来的安装流程涉及以下几个关键步骤:
首先,确保PostgreSQL已成功安装,参考指南可实现源码编译安装或利用安装包图形化安装。
其次,安装Python,为后续使用pgcli提供环境支持。可通过相关文档进行安装。
紧接着,安装Python-pip工具,用于处理依赖库的安装。尝试使用yum安装后,若未找到可用包,可指定具体地址进行安装,确保成功。
安装pgcli时,作为root用户运行pip/pip3 install pgcli可能会遇到“pg_config executable not found”的错误。解决此问题,需将PostgreSQL的bin目录添加至环境变量PATH中。
然而,在尝试使用pgcli连接PostgreSQL执行查询时,可能遇到“ImportError: libpq.so.5: cannot open shared object file: No such file or directory”的错误。为了解决这一问题,使用正确的路径运行pgcli。
在成功配置并使用pgcli后,可以直观地看到其对SQL语句的语法高亮显示,以及在输入时的自动提示功能。即使在简单的测试环境下,此功能反应迅速,但在复杂场景下的表现有待进一步测试和验证。
总而言之,通过遵循上述步骤,可以轻松地在PostgreSQL系统中集成和使用pgcli工具,提升数据库操作的效率与体验。
在Linux(centos)中使用源码安装pgRouting
在Linux(centos)环境下使用源码安装pgRouting前,请先确保已阅读并安装了PostgreSQL和PostGIS。
本文将介绍如何安装pgRouting 2.6.3版本,其源码包可从以下地址下载:
github.com/pgRouting/pg...
一、解压pgRouting源码包
将下载的源码包pgrouting-2.6.3.tar.gz复制到/usr/local/src目录,并执行解压操作:
解压完成后,将生成一个名为pgrouting-2.6.3的目录。
二、配置PostgreSQL环境变量
编辑/etc/profile文件,添加以下内容:
保存并退出,然后使profile配置文件立即生效:
三、编译源代码
进入pgrouting-2.6.3目录,创建build新文件夹,并进入该文件夹:
使用cmake指令编译源代码,指定pgRouting安装路径为/usr/local/pgrouting-2.6.3:
执行make编译源代码,然后使用make install安装pgrouting-2.6.3:
为避免pgrouting找不到CGAL动态库,将CGAL动态库路径添加到ld.so.conf文件中:
编辑/etc/ld.so.conf,添加路径:
使ld.so.conf文件立即生效:
至此,pgrouting-2.6.3已成功安装。
四、测试安装
切换到postgres用户,启动PostgreSQL数据库(若未启动则启动),进入psql:
连接test数据库(可创建任意名称的数据库),创建pgrouting插件:
查看test数据库中现有的所有插件,可以发现已成功安装了postgis和pgrouting插件。