我们公司基于postgres开发了一款数据库产品,不用说我们对OSS的源码做了改动,并且也集成和自己编写了一些插件。因此,当postgresql和相关插件升级时,我们也需要将升级反应到自己的产品中去,这是背景。

这次的问题是在我们升级postgresql的插件orafce(3.2.0-->3.6.0)时发生的。按照往常惯例我们将该插件升级后,组织源码进行编译,OK编译通过。

然而,在我们进行测试时,程序在initdb时就报错停止了。报错如下:

[postgres@localhost data]$ initdb -D `pwd`
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.The database cluster will be initialized with locale "en_US.UTF-8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english". (15541)Data page checksums are disabled. (18153)fixing permissions on existing directory /data ... ok (15516)
creating subdirectories ... ok (15516)
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting dynamic shared memory implementation ... posix
creating configuration files ... ok (15516)
creating template1 database in /data/base/1 ... ok (15516)
initializing pg_authid ... ok (15516)
initializing dependencies ... ok (15516)
creating information schema ... FATAL: relation "information_schema.columns" does not exist (10414)
......
(以下省略)

众人费解。只是升级了插件,怎么会导致无法创建initdb呢?

我注意到报错中的这行:

creating information schema ... FATAL: relation "information_schema.columns" does not exist (10414)

似乎挺熟悉?我看看了orafce最新的升级文件。发现在文件中有以下SQL文:

-- Oracle system views
create view oracle.user_tab_columns asselect table_name,column_name,data_type,coalesce(character_maximum_length, numeric_precision) AS data_length,numeric_precision AS data_precision,numeric_scale AS data_scale,is_nullable AS nullable,ordinal_position AS column_id,is_updatable AS data_upgraded,table_schemafrom information_schema.columns;

似乎对上了,真的是升级惹的祸?不应该啊,社区应该没这么蠢啊,再说只是个插件,怎么会影响postgres呢?这个时候还没导入插件呢,怎么会存在这个错误?

困惑。

因为我们产品中的postgresql的代码也有我们自己添加的代码,为了确定错误来源,我先取了一份postgresql的source,在contrib目录下放入最新的orafce代码。然后make world。

在运行initdb命令:

(以上省略)
copying template1 to postgres ... ok (15516)
syncing data to disk ... ok (15516)WARNING: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the option -A, or
--auth-local and --auth-host, the next time you run initdb.Success. You can now start the database server using:pg_ctl -D /data -l logfile start

成功了!说明不是OSS的问题。

很好,那么就是我们的修正代码的问题了。然而initdb这一块代码不是我们team维护的,我不知道我们的产品修改了什么。好的,老老实实看看差分代码吧。

结果差分代码一看,initdb.c文件我们就修改了两行代码,看了看,也只是改善性代码,和本次的问题毫无关系。费解。。。。

好吧,既然是initdb出了问题,我看看initdb的代码,理理思路吧。跑过去看看抛出出错信息的代码。再加上自己的整理。大概搞清楚了原因。

具体是什么原因先卖个关子。我们先看看postgresql在initdb时会执行哪些操作(缩进代表调用关系):

main确保stdout和stderr的缓冲行为与交互式使用中的行为相匹配设置特定于应用程序的区域设置和服务目录process command-line optionssync_only模式密码与服务器认证相关setup_pgdata()设置pgdata环境setup_bin_paths()获取postgres命令的路径,判断是否与initdb版本匹配set_info_version()提取信息模式所需的版本号setup_data_file_paths() check初始化脚本和配置文件模板setup_locale_encoding()设置编码方式setup_text_search()根据encoding设置text search方式do_sync模式initialize_data_directorycreate_data_directory()创建数据库目录pgdatacreate_xlog_or_symlink()创建pgdata下的pg_xlog目录创建其他子目录创建并配置postgresql.conf文件bootstrap_template1()调用postgres在Bootstrap模式下创建模板数据库template1(以下的配置均针对模板数据库template1)setup_auth()设置template1的密码表setup_depend()建立系统表pg_depend,该表描述了数据库对象之间的依赖关系setup_sysviews()运行脚本system_views.sql创建系统视图★setup_description()创建系统表pg_description和pg_shdescriptionsetup_collation()创建系统表pg_collation,该表描述了可用的排序规则,其本质是从一个SQL名字到操作系统locale分类的映射setup_conversion()运行脚本conversion_create.sql创建系统表pg_conversion,该表描述编码转换过程setup_dictionary()运行脚本snowball_create.sql创建一些额外的目录setup_privileges()为postgres内置的一些object设置默认权限setup_schema()运行脚本information_schema.sql创建模式information_schema★load_plpgsql()加载plpgsql服务端编程语言vacuum_db()清理template1make_template0()根据做好的template1,拷贝复制一份作为template0make_postgres()根据做好的template1,拷贝复制一份作为postgres告诉用户initdb执行结束

以上就是initdb的执行过程。很清晰也很简单。其中最重要的是initialize_data_directory()函数。正是该函数一步步地建立起了数据库的基本元素。因此,出问题的地方就在这个函数"内部"。

聪明的朋友可能看出来了,我在上面打了两处"★"。是的,没有错,正是这两块代码的问题,哦不,确切的说是sql的问题。

下面来说。

我们可爱的开发人员在system_views.sql中加入了以下两行(询问发现是客户希望使用orafce功能,但又不想手动创建,想"透明"地使用):

CREATE EXTENSION orafce;
SET search_path TO DEFAULT;

我们知道orafce的初始化引用了 information_schema.columns这个视图,而这个视图在information_schema.sql中被创建。

而由上面的initdb执行过程可以看到:system_views.sql的执行顺序在information_schema.sql之前,也是就说:
我们在初始化 orafce的时候,information_schema.columns还不存在,因此,会在执行system_views.sql时,报以上错误。

知道了原因就很好改了,只要保证加入的那两行sql代码在创建information_schema之后即可~

以上

转载于:https://www.cnblogs.com/flying-tiger/p/8385208.html

postgres的initdb解析——从一次插件升级失败说起相关推荐

  1. wireshark协议解析器原理与插件编写

    工作原理 每个解析器解码自己的协议部分, 然后把封装协议的解码传递给后续协议. 因此它可能总是从一个Frame解析器开始, Frame解析器解析捕获文件自己的数据包细节(如:时间戳), 将数据交给一个 ...

  2. 解析 | K8S之网络插件exec

    K8S支持3种类型的网络插件. 今天继续介绍下另一种插件exec K8S网络插件支持exec.CNI.kubenet 3种类型.插件满足K8S网络插件接口即可. type NetworkPlugin ...

  3. postgres 源码解析25 缓冲池管理器-3

      本文讲解缓冲块的选择策略BufferAlloc,同时该函数也是替换策略的核心函数, 知识回顾: postgres源码解析 缓冲池管理–1 postgres源码解析 缓冲池管理–2 总结<执行 ...

  4. postgres源码解析42 btree索引文件的创建--2

    本文将从btbuild函数作为入口从源码角度进行讲解btree文件的创建流程,执行SQL对应为CREATE TABLE wp_shy(id int primary key, name carchar( ...

  5. taskctl命令行类(sh、exe、python新增scp)插件升级扩展

    转载自:http://www.taskctl.com/forum/detail_129.html 上次写了一个帖子 TASKCTL中不使用代理,通过ssh免密连接执行远程脚本配置(SSH插件扩展)ht ...

  6. 王者荣耀s22服务器未响应是什么意思,王者荣耀s22资源包升级失败 s22解析包出现问题解决方法...

    王者荣耀s22资源包升级失败怎么解决?相信大家都知道王者荣耀S22破晓版本在今日14日正式推出,一时间大量玩家去更新游戏,不过有一小部分玩家出现了更新问题,那就是资源包升级错误,关于这个问题,官方也给 ...

  7. vmwear导出OVF模板解析(解决ovf导入服务器失败问题,虚拟机版本等)

    vmwear导出OVF模板解析(解决ovf导入服务器失败问题,虚拟机版本等) 参考文章: (1)vmwear导出OVF模板解析(解决ovf导入服务器失败问题,虚拟机版本等) (2)https://ww ...

  8. Sublime Text 无法使用Package Control或插件安装失败的解决方法

    Sublime Text用了一年多了,公司搬家最近突然发现Package Control无法安装新插件了,虽然不影响原有功能的使用,还是要解决它.由于本人用Windows系统,只讨论Windosw下的 ...

  9. Sublime Text 无法使用Package Control或插件安装失败的解决方法【转】

    Sublime Text用了一年多了,公司搬家最近突然发现Package Control无法安装新插件了,虽然不影响原有功能的使用,还是要解决它.由于本人用Windows系统,只讨论Windosw下的 ...

最新文章

  1. ubuntu下使用Eclipse下搭建c开发环境
  2. AutoLayout框架之序言
  3. IHttpHandler 介绍演示(from 张子阳)
  4. 深度学习笔记第二门课 改善深层神经网络 第一周:深度学习的实践层面
  5. java安装cab破损,WCELOAD无法安装压缩的CAB文件
  6. eclipse 关闭时progress information弹框_Spring开发环境搭建(Eclipse)
  7. 前端学习(2477):封装数据接口
  8. c++ const限定符
  9. 操作系统原理与实践-2操作系统的引导
  10. 移动开发:给安卓软件开发初学者简单的教程
  11. 判断IMEI或MEID是否合法
  12. Android花屏分析,Unity游戏在手机上运行时的花屏现象
  13. 安卓平台病毒猖獗 日感染15000台
  14. mate20pro换鸿蒙系统,鸿蒙2.0下载
  15. 开发Windows物流管理系统——(一)前期准备
  16. DNT tools 工具简介
  17. java 数字转英文_一个java的问题 讲输入的阿拉伯数字转换成英文
  18. hashcat的使用及相关
  19. 怎么做浪漫表白二维码?给喜欢的人制作一个二维码
  20. 他一年开发19款!款款口碑爆棚

热门文章

  1. 前端动画优化及性能检测
  2. 网络推广外包专员浅析如何在网络推广外包中获得相关关键词?
  3. 网站优化中导致关键词排名不稳定的原因有哪些?
  4. html css右下角三角形,html – 框内的CSS中的三角形
  5. php计划任务每天12点执行一次,php定时执行计划任务之直接在php中执行
  6. 服务器发消息给所有人,我需要服务器向所有客户端(Python、sockets)发送消息...
  7. python绘制中国加油_软件开发|使用 Python 为你的油箱加油
  8. python爬虫成果_Python爬虫(小练习)
  9. 开发日记-20190605 关键词 读书笔记《鸟哥的Linux私房菜-基础学习篇》
  10. 开发日记-20190427