首页 > 数据库 > > Mac 下手动编译安装 timescaledb 插件
出于开发需要,最近要在MacBook上安装 PostgreSQL 数据库。机型为 Intel 2020款 mbp13,系统为最新的 Big Sur。一般Mac上安装 PostgreSQL,默认推荐用 brew install postgresql 就可以了,但是安装过程中遇到了很多坑。花了好几个小时算是都蹚了一遍…… 这里做一个记录以防不时之需。
为了安装 timescaledb 插件 (非常强大的时序数据处理插件),timescaledb 的官网推荐使用 brew 方式安装,那么直接执行 brew install timescaledb。 这个时候,brew 会安装 timescaledb 需要的依赖,由于 postgresql 目前在brew上的版本为 13,而插件目前最高只支持到 12,所以 brew 实际上会安装一个 postgres@12 的版本。之后 brew 会下载 timescaledb 的源码并自动进行编译安装。
不过问题就出在这个自动安装上。插件会提示安装报错,类似下面这样:
Last 15 lines from /Users/MrZ/Library/Logs/Homebrew/timescaledb/02.build:
make[2]: *** [src/CMakeFiles/timescaledb.dir/func_cache.c.o] Error 1
1 error generated.这个时候,可以到安装界面中指定的链接 这个 issue,通过建立一个软链接来解决(稍后会看看这个坑是怎么挖的……)。当时这个 issue 里面使用的是 postgresql 12.5,由于前几天好巧不巧 PostgreSQL 突然更新了一波,所以变成了 12.6,原来的命令当然不好使了,不过可以很容易想到把原来有效命令里面的 12.5 换成 12.6 不就行了?可是这样操作了之后仍然报错,而且错误和上面的不一样,于是坑就从这里开始了……
这里先谈一下问题是如何解决的,然后再谈一下可能造成的原因是什么。
主要解决问题的思路就是手动编译 timescaledb 的内容,编译完成后指定安装位置即可。基本步骤如下:
~/Desktop/timescaledbbootstrap 文件,官网要求执行 ./bootstrap 就行,但是经过反复测试,如果开发环境搭建的不是特别好的话,建议执行 ./bootstrap -DREGRESS_CHECKS=OFF -DUSE_OPENSSL=0 -DLINTER=OFF,这样编译的检查相对宽松,比较容易通过build 文件夹,并且命令行会提示你进入这个文件夹开始编译make 开始编译。期间可能会遇到 openssl/ssl.h-文件找不到的情况brew install openssl,不出意外安装的应该是 1.1 版。然后到 /usr/local/Cellar/openssl@1.1/1.1.1j/include文件夹下找到 openssl 文件夹/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/make 编译应该可以通过了make 执行完之后,执行 make install DESTDIR=<path>,手动指定postgresql@12 的安装路径postgis插件的话,通过 brew 安装,会同时安装 postgres 13 版本,并且这个版本无法用于 PostgreSQL 12. 这里可以下载一个叫 Postgres.app 的 app。这个 app 其实是一个打包好的、带GUI的、某个特定版本的 PostgreSQL,可以理解为 macOS 下的 navicat 之类的东西。由于是一个打包集合,所以运行它可以启动一个 PostgreSQL 实例,并且可以在这个实例基础上添加插件initdb 命令,初始化一个数据库之后,对应文件夹下面会生成一系列文件,包括 postgresql.conf 这个设置文件。所以,最好运行一下 timescaledb-tools 命令,对这个 conf 配置文件做一些修改(当然你够牛,手动改配置文件也行,但我想这样你应该不会看我这篇文章了)。timescaledb-tools 会自动查找配置文件的位置,如果不对的,可以用 -conf-path 来强制指定配置文件的位置,例如 timescaldb-tools -conf-path ~/Documents/postgres/postgresql.conf虽然安装成功了,但是中间真的踩了不少坑,现在就用自己有限的一点水平来试着分析一下到底这些坑都是怎么挖出来的……
brew install timescaledb 会失败?因为插件会尝试从 `/usr/local/Cellar/postgresql@12/12.6/include/server` 下寻找能够支持编译的相关 c 库(当然插件的编译需要很多库,postgres 的库只是其中一个)。但是因为某些原因,现在这些支持库其实在 这个文件夹的子文件夹里面,所以插件根本找不到对应的支持库,编译就中止了。所以需要上面的命令创建一个软链接,把对应的子文件夹映射到插件查询的文件夹下面就好了
2. 那为什么 12.6 之后,修改路径也不行了?
具体原因不是很明确,看错误信息变成了:
[ 66%] Building C object src/CMakeFiles/timescaledb.dir/subspace_store.c.o
/Users/taf2/work/timescaledb/src/subspace_store.c:119:18: error: Access to field 'storage' results in a dereference of a null pointer (loaded from variable 'last') [clang-analyzer-core.NullDereference,-warnings-as-errors]
last->storage = subspace_store_internal_node_create(i == (hc->num_slices - 1));
^也就是说并非插件找不到相关支持库,而是编译到 66% 时候出现了其他问题。不是学 C 的,所以不清楚,但是看起来是某个域的访问没有得到预期的结果导致的。
到这里,既然 brew 库里的版本不能正常编译,那么唯一的办法就是自己下载源码手动编译了,所以才有了后来的事情。
3. 官方说明提到,直接运行 ./bootstrap 文件就好,为什么后面加那么一大串参数?
因为可能是本机的开发环境配置不是很到位,直接运行这个命令无法创建必须的编译文件。好在它会提醒你可以通过加一些参数,以增加编译后软件的稳定性和安全性风险为代价 ,放宽编译的检查。此外还查了很多网页,总之最后就是上面需要的参数了
4. 终于创建了 ./build 文件夹,但是进去执行 make 命令的时候,提示 openssl/ssl.h -文件找不到?
这是最让我崩溃的一个坑,也就是这个坑花了我好几个小时…… 一开始尝试将 brew 安装的 openssl 加入到系统环境中,此外还执行了 brew info openssl@1.1 来查看一些建议,此外还尝试 copy openssl 文件夹到这个 C 文件所在的文件夹下面等等,然而均以失败告终。
最后还是在大家最不齿的 CSDN 上找到的解决方案 …… 原因很简单,就是因为 macOS 从 10.11 之后不再使用 openssl 了……不用了……改为了 LibreSSL。当插件需要调用 openssl 的相关库的时候,那当然找不到文件了。但这里奇怪的是,即使指定了 brew 安装的 openssl 到系统环境,编译仍然不能识别。如果指定 openssl 是无效的方法,那么指定 PostgreSQL 的路径也应该无效才对,这里就不清楚背后的具体原因了。
总之,从 CSDN 上看,编译插件的时候,至少在这个案例当中,其实调用的是 Xcode 内的工具(通过 xcode-select --install 安装的)。所以,我们把通过 brew 下载的 openssl 文件夹,copy 到 Xcode.app 内的某个特殊文件夹,即 /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/ 下就可以了
5. make install 指定错了路径,怎么办?
make install 命令其实会把编译好的文件打包扔到指定路径下,里面的文件其实都是经过编译的了。用win 来类比的话,就是已经生成了一堆 .exe, .dll 文件了,这个时候即使路径没有指定对,只要把生成的 xxx/usr 文件夹下面的所有内容,按照对应关系,copy到 /usr 目录下就可以了
其实没啥好说的,只能说通过一遍遍蹚坑,对手动编译安装一些组件有了进一步的了解。同时对类Unix系统下的这些“软件”的常见路径,也有了一些了解(例如 bin, opt, Cellar, lib, include, var, etc, share 等)
最后期待下相关开发者尽快修复因底层依赖升级导致的各种编译问题……
来源 https://zhuanlan.zhihu.com/p/352713363
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69999831/viewspace-3127909/ ,如需转载,请注明出处,否则将追究法律责任。