相同数据空间内的 postgres 主要升级(9.5.x 到 9.6.x)
Posted
技术标签:
【中文标题】相同数据空间内的 postgres 主要升级(9.5.x 到 9.6.x)【英文标题】:postgres major upgrade (9.5.x to 9.6.x) within same data space 【发布时间】:2017-11-03 21:08:02 【问题描述】:我正在尝试将我的 postgres 安装从 9.5.7 升级到 9.6.5 我的 postgres 数据库生产实例有多个数据库,到目前为止消耗了 ~700 GB 空间。pg_upgrade 需要 2 个不同的目录用于新旧数据目录。
pg_upgrade -b oldbindir -B newbindir -d olddatadir -D newdatadir
它需要一个新目录来执行 pg_upgrade,因为我能够在我的 local/stage 数据库中运行上述命令与 prod 相比,我的数据库很小,我在本地观察到以下情况
sudo du -sh /var/lib/pgsql/data-9.5
64G /var/lib/pgsql/data-9.5
sudo du -sh /var/lib/pgsql/data-9.6
60G /var/lib/pgsql/data-9.6
并且我有足够的可用数据空间在我的本地/阶段执行临时 pg_upgrade 过程,并且我在那里成功地完成了。
在生产过程中,我只有 ~300 GB 可用空间。
但是在成功升级后,我们将删除 /var/lib/pgsql/data-9.5 目录。 有没有办法进行就地数据升级,以便临时 pg_upgrade 过程不需要相同数量的额外空间?
【问题讨论】:
使用--link
进行就地升级
何不去购买外置 1TB 硬盘 - 它们只需 50 英镑。没多少钱
【参考方案1】:
Run pg_upgrade
/usr/lib/postgresql/9.6/bin/pg_upgrade
-b /usr/lib/postgresql/9.5/bin/
-B /usr/lib/postgresql/9.6/bin/
-d /var/lib/pgsql/data-9.5/
-D /var/lib/pgsql/data/
--link --check
Performing Consistency Checks
-----------------------------
Checking cluster versions ok
Checking database user is the install user ok
Checking database connection settings ok
Checking for prepared transactions ok
Checking for reg* system OID user data types ok
Checking for contrib/isn with bigint-passing mismatch ok
Checking for roles starting with 'pg_' ok
Checking for presence of required libraries ok
Checking database user is the install user ok
Checking for prepared transactions ok
Clusters are compatible
始终运行新服务器的 pg_upgrade 二进制文件,而不是旧服务器。 pg_upgrade 需要指定新旧集群的数据和可执行(bin)目录。您还可以指定用户和端口值,以及是否希望数据链接而不是复制(默认)。
如果您使用 link 模式,升级会更快(没有文件复制)并且使用更少的磁盘空间,但您会升级后启动新集群后将无法访问旧集群。链接模式还要求新旧集群数据目录在同一个文件系统中。 (表空间和 pg_xlog 可以位于不同的文件系统上。)请参阅 pg_upgrade --help
以获取完整的选项列表。
感谢 postgres 社区综合性的documentation,毕竟这对我找到解决方案有很大帮助。
【讨论】:
以上是关于相同数据空间内的 postgres 主要升级(9.5.x 到 9.6.x)的主要内容,如果未能解决你的问题,请参考以下文章
postgres 从 9.5 升级到 11 将连接更改为嵌套循环,使其非常慢
用docker部署postgres 10 + postgis 2.4.1
升级到版本 11 后 Postgres 查询产生高磁盘 IO
在较旧的 Postgres (9.4) 上使用 Django 3+