Skip to the content.

Homebrew自动更新PostgreSQL问题处理

今天想安装其他的库, 导致homebrew自动更新其他的工具包, 致使postgres出问题

本次小事故收获是, 遇到问题先冷静面对, 看别人的帖子不要无脑复制粘贴

写在前面

Homebrew锁定不想更新的包

brew update 一次更新所有的包是非常方便。但有时候会担自动升级不希望更新的包。数据库就属于这一类,尤其是 PostgreSQL 跨 minor 版本升级都要迁移数据库的。

这时可用 brew pin 去锁定这个包,然后 brew update 就会略过它了。

brew list | grep postgresql # 查看你的应用版本 

brew list --pinned  # 查看pin列表

brew pin postgresql@13 # 固定版本

brew unpin postgresql@13 # 取消固定

问题描述

homebrew升级后的提示

==> Upgrading postgresql
  13.4 -> 14.0

==> Pouring postgresql-14.0.big_sur.bottle.tar.gz
==> Caveats
To migrate existing data from a previous major version of PostgreSQL run:
  brew postgresql-upgrade-database

This formula has created a default database cluster with:
  initdb --locale=C -E UTF-8 /usr/local/var/postgres
...

之前也遇到过类似的问题, 因为我已经备份了相关的数据库, 所以我就放任不管了

启动postgres报错

waiting for server to start... FATAL: database files are incompatible with server
[58146] DETAIL: The data directory was initialized by PostgreSQL version 9.6, which is not compatible with this version
10.0.
 stop waiting
pg_ctl: could not start server
Examine the log output.

如果你也是这样的问题,那么可以继续往下看了.

解决方案

因为版本不一样, 这里不建议你复制我的代码, 建议手敲.

brew tap caskroom/versions # 或者 brew tap homebrew/cask-versions

# 此处是旧版本
# 如果你的版本不是 13 请执行 $brew search postgresql 选择对应的版本
brew install postgresql@13

初始化14.0数据库(即brew更新后的数据库)

initdb /usr/local/var/postgres10.0 -E utf8

执行 pg_upgrade, 建议手敲

pg_upgrade -d /usr/local/var/postgres \
           -D /usr/local/var/postgres14.0 \
           -b /usr/local/Cellar/postgresql@13/13.4/bin \
           -B /usr/local/Cellar/postgresql/14.0/bin \
           -v

在一大堆的 ok 过后, 看到 Upgrade Complete 就说明安装成功了.

重新加载服务

/usr/local/bin/pg_ctl -D /usr/local/var/postgres14.0 start

如果显示server started则表示成功

参考链接