文章结构如下:

Postgresql是一个非常活跃的社区开源项目,更新速度很快,每一次版本的更新都会积极的修复旧版本的BUG,性能上也会有不同幅度的提升。10之前的版本由三部分组成,10开始只有两部分数字组成。

1. 小版本升级

Postgresql每次的小版本升级不会改变内部的存储格式,也不会改变数据目录,并且总是向上兼容同一主版本,9.6.2与9.6.1总是兼容的。升级小版本只需要安装新的可执行文件,并且重启数据库实例。

① 备份

可以进行数据库备份pg_dump备份

② 关闭数据库服务器

pg_ctl stop -D /pgsql/pg_data/

cd /usr/local/

mv pgsql/ pgsqlbak

把postgresql9.6.8 上传到目录/usr/local/src并解压

mkdir -p /usr/local/pgsql

cd /usr/local/src/postgresql

./configure --with-ossp-uuid --prefix=/usr/local/pgsql

gmake world

gmake install-world

③ 安装完后,直接启动数据库

pg_ctl start -D /pgsql/pg_data/

启动后,数据查询成功。

2. 大版本升级

大版本可以用pg_dumpall 和pg_upgrade进行升级,主要是将pg_upgrade升级。

pg_upgrade(以前称为pg_migrator)允许将存储在PostgreSQL数据文件中的数据升级到更高版本的PostgreSQL主版本,而不需要主要版本升级所需的数据转储/重载,例如从8.4.7升级到PostgreSQL的当前主要版本。次要版本升级不需要,例如从9.0.1到9.0.4。

主要的PostgreSQL版本会定期添加新功能,这些功能通常会改变系统表的布局,但内部数据存储格式很少会发生变化。pg_upgrade通过创建新的系统表并简单地重用旧的用户数据文件来使用此事实来执行快速升级。如果未来的主要版本以一种使旧数据格式不可读的方式更改数据存储格式,则pg_upgrade将无法用于此类升级。(社区将试图避免这种情况。)

pg_upgrade尽力确保旧的和新的集群是二进制兼容的,例如通过检查兼容的编译时设置,包括32/64位二进制文​​件。重要的是,任何外部模块也是二进制兼容的,尽管pg_upgrade无法检查。

pg_upgrade支持从8.4.X及更高版本升级到PostgreSQL的当前主要版本。

有一些外部扩展要求在升级之前先升级旧版本的外部扩展,例如GIS。

一.使用upgrade 普通模式升级

1) 安装新版的PG并初始化数据目录

把新版本的包上传到/usr/local/src目录 root 执行以下命令

mkdir -p /usr/local/pgsql10

cd /usr/local/src/

tar -zxvf postgresql-10.8.tar.gz

./configure --with-ossp-uuid --prefix=/usr/local/pgsql10

gmake world

gmake install-world

mkdir -p /pgsql/pg_data10

mkdir -p /pgsql/pg_archive10

mkdir -p /pgsql/pg_log10

chown -R postgres:postgres /pgsql/pg_data10

su - postgres

export PGHOME=/usr/local/pgsql10

export PGDATA=/pgsql/pg_data10

初始化后不能启动新的库。

/usr/local/pgsql10/bin/initdb -D $PGDATA -E UTF-8 --locale=C -U postgres -W

查看安装的目录:

2) 停止旧版本的数据库

pg_ctl stop -D /pgsql/pg_data/ -m fast

3) 检查兼容性

为了避免数据库升级失败造成的长时间宕机,升级之前都做兼容性检查。

检查语句:

/usr/local/pgsql10/bin/pg_upgrade -b /usr/local/pgsql/bin/ -B /usr/local/pgsql10/bin/ -d /pgsql/pg_data/ -D /pgsql/pg_data10/ -k -c

可以查看已经通过兼容性测试。

值得注意的是pg10跟之前的版本hash 索引结构不一样,升级之后需要重建hash索引。

4) 使用PG_UPGRADE普通模式升级

/usr/local/pgsql10/bin/pg_upgrade -b /usr/local/pgsql/bin/ -B /usr/local/pgsql10/bin/ -d /pgsql/pg_data -D /pgsql/pg_data10/

图片中提示,如果升级失败,必须重新初始化新的数据库才能够继续进行升级,本次实验中升级成功。

修改postgresql.conf,pg_hba.conf 参数

开启后,检查数据库是否正常运行以及有无报错。

二.使用upgrade link模式升级

同样的也是前期准备工作一样,初始化数据库:

把新版本的包上传到/usr/local/src目录 root 执行以下命令

mkdir -p /usr/local/pgsql10

cd /usr/local/src/

tar -zxvf postgresql-10.8.tar.gz

./configure --with-ossp-uuid --prefix=/usr/local/pgsql10

gmake world

gmake install-world

mkdir -p /pgsql/pg_data10

mkdir -p /pgsql/pg_archive10

mkdir -p /pgsql/pg_log10

chown -R postgres:postgres /pgsql/pg_data10

su - postgres

export PGHOME=/usr/local/pgsql10

export PGDATA=/pgsql/pg_data10

/usr/local/pgsql10/bin/initdb -D $PGDATA -E UTF-8 --locale=C -U postgres -W

初始化后不能启动新的库。

1) 了解旧版本有那些extension以及表空间

2) 检查兼容性

检查语句:

/usr/local/pgsql10/bin/pg_upgrade -b /usr/local/pgsql/bin/ -B /usr/local/pgsql10/bin/ -d /pgsql/pg_data/ -D /pgsql/pg_data10/ -k -c

3) 使用PG_UPGRADE link模式升级

如果使用了hash 索引,需要重建索引升级完成后(升级的过程中,索引会变为不可用)

关闭旧的数据库:

/usr/local/pgsql/bin/pg_ctl stop -D /pgsql/pg_data -m fast

/usr/local/pgsql10/bin/pg_upgrade -b /usr/local/pgsql/bin -B /usr/local/pgsql10/bin -d /pgsql/pg_data/ -D /pgsql/pg_data10/ -k

其中提示,如果想用旧版本,需要把/pgsql/pg_data/global/pg_control.old命名为/pgsql/pg_data/global/pg_control

例如测试:

mv /pgsql/pg_data/global/pg_control.old /pgsql/pg_data/global/pg_control

/usr/local/pgsql/bin/pg_ctl start -D /pgsql/pg_data

还是可以启动使用以前的数据库。

由于本次是使用新的版本:

mv /pgsql/pg_data/global/pg_control /pgsql/pg_data/global/pg_control.old

启动新的实例。(新的实例端口为5433)

pg_ctl start -D /pgsql/pg_data10/

手动收集统计信息:

/usr/local/pgsql10/bin/vacuumdb -a --analyze-in-stages -h127.0.0.1 -p5433

9版本新的库升级成功,并且开启后,旧的仍然能够通过修改pg_control.old后启动。

貌似10的旧版本

Postgresql 大小版本升级的更多相关文章

  1. 使用pg_upgrade工具为PostgreSQL进行版本升级

    公司的测试环境和生产环境都是9.2.4版本,而开发环境是9.0.18版本. PS: 不知道公司里的其它同事,是如何做数据库迁移的,利用第三方可视化工具备份数据库,然后恢复到其它高版本的环境?反正我没成 ...

  2. PostgreSQL 数据库升级

    PostgreSQL软件版本升级后,需要使用pg_upgrade迁移旧版本的数据库,具体的操作参数可以参考官方文档,在此记录一下操作过程中出现的细节问题: 新版本软件在initdb的时候要保证loca ...

  3. Windows版 PostgreSQL 利用 pg_upgrade 进行大版升级操作

    最近 PostgreSQL 15 版本正式发布了,新版本的各种特性和好处本文就不展开介绍了,主要介绍一下 Windows 环境下 PostgreSQL 大版本升级的方法,我们现在的几个数据库都是运行在 ...

  4. Zabbix 6.0:原生高可用(HA)方案部署

    Blog:博客园 个人 本部署文档适用于CentOS 8.X/RHEL 8.X/Anolis OS 8.X/AlmaLinux 8.X/Rockey Linux 8.X. 原生的HA方案终于来了 相比 ...

  5. PostgreSQL 磁盘使用大小监控

    表大小信息 postgres=# SELECT *, pg_size_pretty(total_bytes) AS totalpostgres-# , pg_size_pretty(index_byt ...

  6. postgresql基本操作:查看数据库、索引、表、表空间大小

    一.简介 PostgreSQL 提供了多个系统管理函数来查看表,索引,表空间及数据库的大小,下面详细介绍一下. 二.数据库对象尺寸函数 函数名 返回类型 描述 pg_column_size(any) ...

  7. postgresql查看数据库占用的物理存储空间大小

    1.手动查看: 查看数据库postgres的oid postgres=# SELECT oid from pg_database where datname='postgres'; oid------ ...

  8. PostgreSQL 查看单表大小

    1. 在数据库中查单个表 select pg_size_pretty(pg_relation_size('table_name')); 2. 查出并按大小排序 SELECT table_schema ...

  9. PostgreSQL查看表大小的命令

    SELECT table_name, pg_size_pretty(table_size) AS table_size, pg_size_pretty(indexes_size) AS indexes ...

随机推荐

  1. Java多线程深入理解

    在java中要想实现多线程,有两种手段,一种是继续Thread类,另外一种是实现Runable接口. 对于直接继承Thread的类来说,代码大致框架是: ? 1 2 3 4 5 6 7 8 9 10 ...

  2. 微信小程序设置全局变量

    为了提高程序的可用性我们在做项目的时候一定要设置全局变量 微信小程序里面有个app.js,我们可以在这个里面设置全局变量, globalData:{ userInfo:null, test:" ...

  3. C++之多继承与虚继承

    1. 多继承 1.1 多继承概念 一个类有多个直接基类的继承关系称为多继承 多继承声明语法 class 派生类名 : 访问控制 基类名1, 访问控制 基类名2, ... { 数据成员和成员函数声明 } ...

  4. openerp学习笔记 搜索视图(自己创建的、自己的、本部门的、本部门及下属部门的、今日的、日期从,日期至、多条件模糊搜索、or、and)

    自己创建的: domain="[('create_uid','=',uid)]" 自己的: domain="[('employee_id','=','#kl_user_e ...

  5. 吐血整理,一文读懂中国金融衍生品市场的前世今生和未来[z]

    [z]https://www.gfedu.cn/cfrm/content_22687.shtml 从定义上来说,金融衍生工具(derivativesecurity)是在货币.债券.股票等传统金融工具的 ...

  6. vue-router懒加载

    require.ensure(dependencies:String [],callback:function(require),errorCallback:function(error),chunk ...

  7. JavaScript面向对象当中的几个概念

    JS面向对象过程中的几个概念 前言 面向对象描述的是一种代码组织解构的形式,一种在软件中对真实世界中问题领域的建模方法. 下面将从理论层面来介绍下面向对象编程中一些常见的概念. 对象 所谓对象,本质上 ...

  8. PHP 生成器 yield理解

    如果是做Python或者其他语言的小伙伴,对于生成器应该不陌生.但很多PHP开发者或许都不知道生成器这个功能,可能是因为生成器是PHP 5.5.0才引入的功能,也可以是生成器作用不是很明显.但是,生成 ...

  9. css中元素定位

    在html中网页可以看成一个立体的空间,一个完整的页面是由很多个页面堆积形成的,如下图所示 CSS中Position属性有四个可选值,它们分别是:static.absolute.fixed.relat ...

  10. Unity中的动画系统和Timeline(2) 按钮动画和2D精灵动画

    按钮动画 1 创建按钮后,按钮的Button组件中,Transition我们平时用的时Tint,这次选择Animation 选择Auto Generate Animation,创建一个按钮动画 2 后 ...