皮皮网
皮皮网
大话私服源码修改

【网站新闻源码】【照片共享源码】【wcs自动源码】postgresql源码修改

时间:2024-12-01 00:40:12 分类:百科 编辑:extundelete源码编译
1.PostgreSQL-源码学习笔记(5)-索引
2.pgAdmin4 - 搞定源码架构
3.PostgreSQL源码学习笔记(6)-查询编译
4.使用Sequelize快速构建PostgreSQL数据的源码CRUD操作详解
5.PostgreSQL · 源码分析 · 回放分析(一)
6.PostgreSQL内核Trigger的一生

postgresql源码修改

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索引提供了更大的灵活性,支持用户自定义索引方法。GiST适用于通用搜索,而GIN专为复合值索引设计,支持全文搜索。它们在创建时需要实现特定的访问方法和函数。

       尽管索引维护有成本,但总体上,它们对提高查询速度的价值不可忽视。了解并有效利用索引是照片共享源码数据库优化的重要环节。

pgAdmin4 - 搞定源码架构

       pgAdmin4是一个强大的开源工具,专为PostgreSQL数据库管理而设计,它是pgAdmin3的现代化升级,遵循开放源码协议,免费且适用于商业用途。作为基于Python的Web应用程序,pgAdmin4支持两种部署模式:web浏览器访问的web模式和独立运行的桌面模式。

       pgAdmin4的4.版本提供了详尽的功能图谱和系统架构,它是一个由Python编写的程序,源代码可以下载并深入了解其设计。源码结构清晰,核心组件在pgadmin包中,包含了Jinja引擎使用的HTML模板和全局静态文件,如图像、JavaScript和CSS,这些在__init__.py构造函数中初始化,负责设置日志和身份验证,以及动态加载其他模块。

       pgAdmin4的功能扩展是通过模块实现的,这些模块作为Python类实例,继承自Web/pgadmin/utils.py中的PgAdminModule类,它是一个基于Flask的Blueprint。为了被pgAdmin4识别为有效模块,需要创建一个Python包,并遵循特定规则,如为模块定义template和static目录,避免名称冲突。

       总的来说,pgAdmin4的源码架构设计巧妙,模块化使得功能扩展既灵活又有序,无论是开发人员还是数据库管理员,都能方便地管理和操作PostgreSQL数据库。

PostgreSQL源码学习笔记(6)-查询编译

       查询模块是数据库与用户进行交互的模块,允许用户使用结构化查询语言(SQL)或其它高级语言在高层次上表达查询任务,并将用户的查询命令转化成数据库上的操作序列并执行。查询处理分为查询编译与查询执行两个阶段:

       当PostgreSQL的后台进程Postgres接收到查询命令后,首先传递到查询分析模块,进行词法,语法与语义分析。用户的查询命令,如SELECT,CREATE TABLE等,会被构建为原始解析树,然后交给查询重写模块。查询重写模块根据解析树及参数执行解析分析及规则重写,得到查询树,最后输入计划模块得到计划树。

       整个查询编译的函数调用流程包括查询分析、查询重写与计划生成三个阶段。wcs自动源码查询分析涉及词法分析、语法分析与语义分析,分别由Lex与Yacc工具完成。词法分析识别输入的SQL命令中的模式,语法分析找出这些模式的组合,形成解析树。出于与用户交互的考虑,语义分析与重写放在另一个函数处理,以避免在输入语句时立即执行事务操作。Lex与Yacc是词法与语法分析工具,分别通过正则表达式解析与语法结构定义,生成用于分析的C语言代码。

       查询分析由pg_parse_query函数与pg_analyze_and_rewrite函数完成。pg_parse_query处理词法与语法分析,而语义分析与重写在pg_analyze_and_rewrite函数中进行。语义分析需要访问数据库系统表,以检查命令中的表或字段是否存在,以及聚合函数的适用性。

       查询重写核心在于规则系统,存储在pg_rewrite系统表中。规则系统由一系列重写规则组成,包括创建规则、删除规则以及利用规则进行查询重写三个操作。规则系统提供定义、删除规则以及利用规则优化查询的功能。PG中实现多种查询优化策略,包括谓语下滑、WHERE语句合并等,通过动态规划与遗传算法选择代价最小的执行方案。

       查询规划的总体过程包括预处理、生成路径和生成计划三个阶段。预处理阶段消除冗余条件、减少递归层数与简化路径生成。提升子链接与子查询是预处理中的关键步骤,通过将子查询提升至与父查询相同的优化等级,提高查询效率。提升子链接与子查询的函数包括pull_up_sublinks与pull_up_subqueries。

       在路径生成阶段,优化器检查MIN/MAX聚集函数的存在与索引条件,生成通过索引扫描获得最大值或最小值的路径。表达式预处理由preprocess_expression函数完成,包括目标链表、WHERE语句、HAVING谓语等的处理。HAVING子句的提升或保留取决于是否包含聚集条件。删除冗余信息以优化路径生成。

       生成路径的入口函数query_planner负责找到从一组基本表到最终连接表的最高效路径。路径生成算法包括动态规划与遗传算法,分别解决路径选择与状态传递问题。xfire源码解析路径生成流程涉及make_one_rel函数,最终生成最优路径并转换为执行计划。

       在得到最优路径后,优化器根据路径生成对应的执行计划。创建计划的入口函数create_plan提供顺序扫描、采样扫描、索引扫描与TID扫描等计划生成。整理计划树函数set_plan_references负责最后的细节调整,优化执行器执行效率。代价估算考虑磁盘I/O与CPU时间,根据统计信息与查询条件估计路径代价。

       查询编译与规划是数据库性能的关键环节。PostgreSQL通过高效的查询分析、重写与规划,生成最优执行计划,显著提高查询执行效率。动态规划与遗传算法等优化策略的应用,确保了查询处理的高效与灵活性。

使用Sequelize快速构建PostgreSQL数据的CRUD操作详解

       之前写过一个专栏《布道API》来介绍API的REST风格及推荐实践,今天开始来构建一个管理系统的API服务,首先需要处理的就是数据存储,本文将结合实际开发总结在NodeJS下使用Sequelize快速构建PostgreSQL数据的CRUD操作。

       项目源代码:github.com/QuintionTang/pretender-service

Sequelize

       Sequelize是一个基于promise的Node.jsORM工具,它具有强大的事务支持、关联关系、预读和延迟加载、读取复制等功能,支持的数据库包括:PostgreSQL、MySQL、MariaDB、SQLite和MSSQL。

       Sequelize类是引用sequlize模块后获取一个顶级对象,通过它来创建sequlize实例,也可以通过该对象来获取模内其它对象的引用,如:Utils工具类、Transaction事务类等。创建实例后,可以通过实例来创建或定义Model(模型)、执行查询、同步数据库结构等操作。

       官方网站:docs.sequelizejs.com/

添加和配置

       在安装模块之前,首先安装开发工具Sequelize-CLI

sudonpminstall-gsequelize-cli

       接下来在项目目录下安装数据存储相关的模块。

npminstallsequelize--savenpminstallpgpg-hstore--save

       现在在项目根目录下创建文件.sequelizerc,代码如下:

constpath=require('path');module.exports={ "config":path.resolve('./config','db.json'),"models-path":path.resolve('./models'),'seeders-path':path.resolve('./seeders'),'migrations-path':path.resolve('./migrations')};

       该文件将告诉Sequelize初始化,以生成config、models到特定目录。接下来,输入命令初始化Sequelize。

sequelizeinit

       该命令将创建config/db.json,商业源码授权models/index.js,migrations和seeders目录和文件。命令执行完毕之后打开并编辑config/db.json来配置数据库连接信息。

{ "development":{ "username":"dbusername","password":"dbpassword","database":"crayon-admin","host":".0.0.1","dialect":"postgres","options":{ "operatorsAliases":false},"logging":false},"test":{ "username":"dbusername","password":"dbpassword","database":"crayon-admin","host":".0.0.1","dialect":"postgres"},"production":{ "username":"dbusername","password":"dbpassword","database":"crayon-admin","host":".0.0.1","dialect":"postgres"}}

       目录说明:

       migrations:所有迁移文件,通过sequelizedb:migrate创建相应数据表

       seeders:种子文件,即初始化需要插入到数据库中的数据,运行sequelizedb:seed:all

创建Models和Migrations

       使用CLI工具Sequelize-CLI创建administrators表

sequelizemodel:create--nameadministrators--attributesid:integer,add_time:integer,last_login:integer,username:string,email:string,login_ip:string

       执行后会生成两个文件

       /src/migrations/-create-administrators.js:创建数据表脚本,用于数据库初始化。

"usestrict";module.exports={ up:async(queryInterface,Sequelize)=>{ awaitqueryInterface.createTable("administrators",{ id:{ allowNull:false,autoIncrement:true,primaryKey:true,type:Sequelize.INTEGER,},add_time:{ type:Sequelize.INTEGER,},last_login:{ type:Sequelize.INTEGER,},username:{ type:Sequelize.STRING,},password:{ type:Sequelize.STRING,},email:{ type:Sequelize.STRING,},login_ip:{ type:Sequelize.STRING,},});},down:async(queryInterface,Sequelize)=>{ awaitqueryInterface.dropTable("administrators");},};

       /src/models/administrators.js:生成的model文件

"usestrict";const{ Model}=require("sequelize");module.exports=(sequelize,DataTypes)=>{ classadministratorsextendsModel{ }administrators.init({ id:{ type:DataTypes.INTEGER,autoIncrement:true,primaryKey:true,},add_time:DataTypes.INTEGER,last_login:DataTypes.INTEGER,username:DataTypes.STRING,password:DataTypes.STRING,email:DataTypes.STRING,login_ip:DataTypes.STRING,},{ sequelize,indexes:[{ unique:true,fields:["id"],},],freezeTableName:true,timestamps:false,//是否自动添加时间戳createAt,updateAtmodelName:"administrators",});returnadministrators;};

       现在执行命令:

sequelizedb:migrate

       执行成功后将在连接的数据库中创建数据表:administrators。

创建seed

       seed用于初始化插入数据,如管理员,在系统运行前需要创建一个默认账号,这些默认账号信息就写在seed文件中。

       创建seed命令如下:

sequelizeseed:create--nameadministrator

       执行成功后将会在seeders文件夹中创建文件,修改代码如下:

npminstallsequelize--savenpminstallpgpg-hstore--save0

       现在将seed中的数据插入到数据库中,执行一下命令:

npminstallsequelize--savenpminstallpgpg-hstore--save1创建Services

       创建文件夹services,文件夹中代码封装与model交互的方法,包括所有CRUD(创建,读取,更新和删除)操作,创建administrators.js,实现的逻辑为获取账号信息、更新账号信息,代码如下:

npminstallsequelize--savenpminstallpgpg-hstore--save2创建Controllers

       上面创建的services文件用于控制器,在控制器文件夹中创建一个名为administrators.js的文件,代码如下:

npminstallsequelize--savenpminstallpgpg-hstore--save3创建Routers

       在文件夹routers中创建文件administrators.js文件,代码如下:

npminstallsequelize--savenpminstallpgpg-hstore--save4创建入口

       现在来为服务创建接口,项目根目录下创建文件app.js,代码如下:

npminstallsequelize--savenpminstallpgpg-hstore--save5

       现在执行命令nodeapp.js启动服务,将看到终端效果如下:

       至此,完成一个基本的API登录服务,还有待完善,后续在迭代中完善。文章涉及的代码在GitHub上。

作者:天行无忌

PostgreSQL · 源码分析 · 回放分析(一)

       在数据库运行中,可能遇到非预期问题,如断电、崩溃。这些情况可能导致数据异常或丢失,影响业务。为了在数据库重启时恢复到崩溃前状态,确保数据一致性和完整性,我们引入了WAL(Write-Ahead Logging)机制。WAL记录数据库事务执行过程,当数据库崩溃时,利用这些记录恢复至崩溃前状态。

       WAL通过REDO和UNDO日志实现崩溃恢复。REDO允许对数据进行修改,UNDO则撤销修改。REDO/UNDO日志结合了这两种功能。除了WAL,还有Shadow Pagging、WBL等技术,但WAL是主要方法。

       数据库内部,日志管理器记录事务操作,缓冲区管理器负责数据存储。当崩溃发生,恢复管理器读取事务状态,回放已提交数据,回滚中断事务,恢复数据库一致性。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

PostgreSQL基于源码安装和入门教程

       PostgreSQL 源码安装入门教程

       本文将引导您在openEuler . LTS-SP3系统上基于源码安装并配置PostgreSQL ,包括操作系统环境设置、网络配置、软件包安装、用户和数据盘创建,以及数据库的初始化、启动和管理。

       1.1 操作系统环境

       安装openEuler后,确保系统安装了bc命令(若缺失,后续会安装)。

       1.2 网络配置

       通过Nmcli配置网络,首先检查并设置网络接口ens的IP地址,无论是自动获取还是静态配置。

       1.3 更新系统与工具安装

       更新软件包并安装bc、vim、tmux和tar等工具,以支持后续操作。

       1.4 用户与数据盘创建

       创建postgres用户和用户组,以及可能的专用数据盘,如NVMe SSD,用于提高性能。

       2. 安装与配置

       2.1 下载与解压

       以root权限下载并解压PostgreSQL 的源代码压缩包。

       2.2 安装与初始化

       按照指导进行编译和安装,初始化数据库并设置启动参数。

       2.3 启动与管理

       启动数据库,登录并创建必要用户、数据库和表空间。

       3. 开机自动启动

       3.1 init.d环境

       使用start-scripts中的脚本配置init.d,确保PostgreSQL在系统启动时自动运行。

       3.2 systemd环境

       为PostgreSQL创建systemd服务文件,确保启动和管理的自动化。

       4. psql操作示例

       展示如何使用psql进行数据库操作,包括创建数据库、模式、表和数据插入等。

       5. 远程连接

       讲解如何配置防火墙以允许远程连接。

       通过以上步骤,您将掌握PostgreSQL 的源码安装和基本管理,准备好进行数据管理和应用程序开发。

如何在Linux下调试PostgreSQL

        由于工作关系,需要调试postgreSQL源码,恰好同事写了这样一个文档,贴出来共享。在Linux下面调试Postgres,需要进行如下几个步骤

       ç”±äºŽå·¥ä½œå…³ç³»ï¼Œéœ€è¦è°ƒè¯•postgreSQL源码,,恰好同事写了这样一个文档,贴出来共享。

       åœ¨Linux下面调试Postgres,需要进行如下几个步骤:

       1. 安装Linux操作系统

       æ³¨æ„æŠŠgdb、Emacs或DDD这些开发工具都安装上。如果是在虚拟机上安装,依然需要设置Linux系统的网络环境;另外需要设置文件共享,方便windows下面的postgreSQL源码能在Linux下面访问到。

       2. 安装PostgreSQL

       useradd postgre

       ï¼ˆè‡ªåŠ¨å»ºç«‹ postgre 组;设计人员为了安全考虑,PostgreSQL 不能以root 用户运行,所以必须建立对应的用户和组。)

       è§£åŽ‹åˆ° /usr/local/src

       tar xvfz postgresql-8.4.tar.gz

       cd postgresql-8.4

       ./configure --prefix=/usr/local/pgsql --enable-debug --enable-assert --without-readline --without-zlib

       make

       make install

       chown -R postgre.postgre /usr/local/pgsql

       3. 设置Postgres环境变量(非必须)

       vi ~postgre/.bash_profile

       æ·»åŠ ï¼š

       PGLIB=/usr/local/pgsql/lib

       PGDATA=$HOME/data

       PATH=$PATH:/usr/local/pgsql/bin

       MANPATH=$MANPATH:/usr/local/pgsql/man

       export PGLIB PGDATA PATH MANPATH

       4. 建立数据库

       ä»¥ postgres 用户登录:

       su postgre

       å»ºç«‹æ•°æ®åº“目录:

       mkdir data

       å¯åŠ¨æ•°æ®åº“引擎:

       initdb _D “数据库目录”

       ä¹‹åŽå¯ä»¥æ ¹æ®æç¤ºï¼Œé€šè¿‡psql进入数据库

       5. 构造PostgreSQL调试环境

       å…ˆ psql template1进去,然后

       select pg_backend_pid();

       èŽ·å¾—id,就是gdb后面用到的数字

       gdb /usr/local/pgsql/bin/postgres (pid的数字)

       å¦‚果只使用gdb,全部是命令行界面;而Emac、DDD分别是彩色、黑白用户交互式图形界面。

       6. 使用gdb进行调试

本文地址:http://0553.net.cn/news/26a600893965.html

copyright © 2016 powered by 皮皮网   sitemap