文章结构以下:sql
Postgresql是一个很是活跃的社区开源项目,更新速度很快,每一次版本的更新都会积极的修复旧版本的BUG,性能上也会有不一样幅度的提高。10以前的版本由三部分组成,10开始只有两部分数字组成。数据库
Postgresql每次的小版本升级不会改变内部的存储格式,也不会改变数据目录,而且老是向上兼容同一主版本,9.6.2与9.6.1老是兼容的。升级小版本只须要安装新的可执行文件,而且重启数据库实例。服务器
① 备份布局
能够进行数据库备份pg_dump备份post
② 关闭数据库服务器性能
pg_ctl stop -D /pgsql/pg_data/测试
cd /usr/local/ui
mv pgsql/ pgsqlbakspa
把postgresql9.6.8 上传到目录/usr/local/src并解压3d
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/
启动后,数据查询成功。
大版本能够用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。
把新版本的包上传到/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
查看安装的目录:
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 -c
能够查看已经经过兼容性测试。
值得注意的是pg10跟以前的版本hash 索引结构不同,升级以后须要重建hash索引。
/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 参数
开启后,检查数据库是否正常运行以及有无报错。
一样的也是前期准备工做同样,初始化数据库:
把新版本的包上传到/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
初始化后不能启动新的库。
检查语句:
/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
若是使用了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的旧版本