PostgreSQL通过pg_upgrade进行大版本升级

9.3中文文档:http://58.58.27.50:8079/doc/html/9.3.1_zh/pgupgrade.html

9.4英文文档:http://www.postgresql.org/docs/9.4/static/pgupgrade.html



Postgresql自身有两种大版本升级(比如从pg9.2到pg9.4,可以跨一个或多个大版本)的方法

1.通过pg_upgrede升级.(该方法对数据量较大时,速度更快)

2.先从老版本执行pg_dump,再到新版本执行pg_restore.(该方法在数据量较大时,速度较慢)

本文主要介绍使用pg_upgrade的方法、步骤以及相关的注意事项。

一、使用pg_upgrade升级的各步要求

1.移动旧的数据集簇目录(可选的)

如果使用的是基于版本的安装目录,比如:/opt/Postgresql/9.1(一般是图形化安装包安装生成目录),那就不需要移动旧的数据库集簇目录,因为图形化安装包都是使用基于版本的安装目录的。

如果使用的不是基于版本的安装目录,比如:/usr/local/pgsql(一般是源码编译安装生成的目录),那最好移动这个数据库集簇的安装目录,否则的话会干扰新数据库的安装。一旦关闭了当前Postgresql的服务,那么重命名漆安装目录就会很安全。假设旧的安装目录为:/usr/local/pgsql,可以通过以下命令来重命名该目录:

mv/usr/local/pgsql/usr/local/pgsql.old

2.源码安装一个新版本

用兼容旧数据库集簇的configure 选项,来构建新的Postgresql。在开始升级之前,pg_upgrade 将会检查pg_controldata 来确保所有的设置都兼容。

3.安装新的Postgresql二进制文件

安装新服务器的二进制可执行文件支持文件

用源码安装时,如果你想要在自定义目录安装新服务器,可以使用prefix变量:

gmakeprefix=/usr/local/pgsql.newinstall

4.安装pg_upgrade和pg_upgrade_support

在新Postgresql的安装中,安装 pg_upgrade 二进制文件 and pg_upgrade_support库文件

5.初始化新的Postgresql集簇

通过initdb初始化新的集簇,并且,要用兼容旧数据库实例的initdb选项。很多预构建安装会自动完成这一部。不需要启动新的数据库实例。

6.安装自定义的共享对象文件

安装所有旧数据库集簇用到的自定义共享对象文件(或者是DLL文件)到新的数据库集簇中,例如 pgcrypto.so,无论他们来自 contrib 或者其它的源。 不需要安装一类模式的定义, 例如pgcrypto.sql,因为这些也会从旧数据库实例中升级。还有,所有旧数据库集簇中自定义的全文本搜索文件(dictionary,synonym,thesaurus,stop words) 必须拷贝到新的数据库集簇中。

7.调整认证

pg_upgrade会数次连到新、旧数据库实例,所以可以修改pg_hba.conf的认证设置成trust或者是peer,或者,也可以使用md5的认证方式同时使用~/.pgpass密码文件 (参考Section 31.15).

8.停止新旧数据库

要确保新、旧数据库都停止服务,在linux下:

pg_ctl-D/opt/Postgresql/8.4stoppg_ctl-D/opt/Postgresql/9.0stop

或者在windows下,使用相应的服务名称:

NETSTOPpostgresql-8.4NETSTOPpostgresql-9.0


NETSTOPpgsql-8.3(Postgresql8.3以及更早的版本使用了像这样的,有所不同的服务名称)

9.运行pg_upgrade

总是执行新数据库的pg_upgrade二进制执行文件,而不是旧数据库的。

pg_upgrade需要指定新旧数据库实例的数据目录和可执行的 (bin) 目录。 当然你还可以指定用户和端口,以及指定是否使用数据硬链接代替使用数据复制(认方式)。

如果使用链接模式,升级将会非常快(没有文件拷贝)并且占用更少的硬盘,但是你不能再访问你的旧数据库当你升级完成启动新的数据库实例。 链接模式还需要新旧数据库 数据目录使用相同的文件系统。(表空间和pg_xlog可以在不同的文件系统。) 参考pg_upgrade --help查看完整的帮助选项列表。

10.还原pg_hba.conf配置

如果你修改pg_hba.conf修改的设置. 还有可能需要去调整其它的配置文件去和旧的数据库 实例相匹配,例如:postgresql.conf.

11.升级后的处理

如果有升级后续操作需要执行,pg_upgrade会在完成后发布出警告信息。 同时它会生成必须由管理员运行的脚本文件。 脚本会连到需要执行升级后续操作的新旧数据库。 脚本可以用下面命令执行:

psql--usernamepostgres--filescript.sqlpostgres

脚本可以任意顺序执行,执行完后可以被删除

Caution:通常情况下在重建脚本运行结束之前不允许访问被引用的表;这样做可能会出现 意想不到的错误结果或者是性能不佳 。不引用的表可以被立限访问。

12.统计因为优化统计结果不会被pg_upgrade传递, 你需要指定去运行命令去在升级 完成后生成一些新的信息。你可能需要设置连接参数去匹配新的数据库实例。



二、举例进行pg_upgrade升级(pg9.3升级到9.4)

0.环境介绍

设备:一个centos6.3 32bit虚拟机

数据库PG9.3,端口5432,安装目录:/opt/Postgresql/9.3/

数据库PG9.4 ,端口5434,源码编译安装目录:/opt/pgsql944/

1.下载linux源码安装包

到官网下载pg9.4.4的源码安装包:postgresql-9.4.4.tar.gz

2.解压、编译、安装PG9.4

su-root

解压

tarjxvfpostgresql-9.4.4.tar.gz

编译

cdpostgresql-9.4.4
./configure--prefix=/opt/pgsql944--with-pgport=5434

安装

gmakeworld
gmakeinstall-world

安装pg_upgrade客户端程序

cdcontrib
gamke
gmakeinstall


注意:编译安装过程中提示缺包错误的处理思路:http://www.linuxidc.com/Linux/2012-02/53982.htm,如:

1.报错

configure:error:readlinelibrarynotfound
Ifyouhavereadlinealreadyinstalled,seeconfig.logfordetailsonthe
failure.
Itispossiblethecompilerisntlookingintheproperdirectory.
Use--without-readlinetodisablereadlinesupport.

2.首先查找readline包

[root@HK81-107postgresql-9.0.0]#rpm-qa|grepreadline
readline-5.1-3.el5

说明系统已经安装了 readline包。

‍‍3.通过 yum 搜索相关的readline 包‍‍

[root@HK81-107postgresql-9.0.0]#yumsearchreadline
lftp.i386:Asophisticatedfiletransferprogram
lftp.i386:Asophisticatedfiletransferprogram
PHP-readline.i386:StandardPHPmoduleprovidesreadlinelibrarysupport
lftp.i386:Asophisticatedfiletransferprogram
readline.i386:Alibraryforeditingtypedcommandlines.
compat-readline43.i386:Thereadline4.3libraryforcompatibilitywitholdersoftware.
readline-devel.i386:Filesneededtodevelopprogramswhichusethereadlinelibrary.
readline.i386:Alibraryforeditingtypedcommandlines.

根据提示,有一个包引起了我的注意 "readline-devel",猜想可能与这个包有关。
4安装 readline-devel 包

[root@HK81-107postgresql-9.0.0]#yum-yinstall-yreadline-devel

5.继续进行原来的操作即可


3.初始化一个

在安装目录下创建一个data目录

cd/opt/pgsql944
mkdirdata2

新建系统用户postgres(并创建home目录),并添加密码:

useradd-mpostgres
passwdpostgres

将data目录授权给postgres

chownpostgresdata2

切换到postgres用户

su-postgres

来到bin目录下

cd..
cdbin

初始化数据库,注意locale的设置要与原数据库的设置兼容,一般用C即可兼容大部分.

./initdb-D../data2--locale=C-Upostgres
Thefilesbelongingtothisdatabasesystemwillbeownedbyuser"postgres".
Thisusermustalsoowntheserverprocess.
Thedatabaseclusterwillbeinitializedwithlocale"en_US.UTF-8".
Thedefaultdatabaseencodinghasaccordinglybeensetto"UTF8".
Thedefaulttextsearchconfigurationwillbesetto"english".
Datapagechecksumsaredisabled.fixingpermissionsonexistingdirectory../data3...ok
creatingsubdirectories...ok
selectingdefaultmax_connections...100
selectingdefaultshared_buffers...128MB
selectingdynamicsharedmemoryimplementation...posix
creatingconfigurationfiles...ok
creatingtemplate1databasein../data3/base/1...ok
initializingpg_authid...ok
initializingdependencies...ok
creatingsystemviews...ok
loadingsystemobjects'descriptions...ok
creatingcollations...ok
creatingconversions...ok
creatingdictionaries...ok
settingprivilegesonbuilt-inobjects...ok
creatinginformationschema...ok
loadingPL/pgsqlserver-sidelanguage...ok
vacuumingdatabasetemplate1...ok
copyingtemplate1totemplate0...ok
copyingtemplate1topostgres...ok
syncingdatatodisk...ok
WARNING:enabling"trust"authenticationforlocalconnections
Youcanchangethisbyeditingpg_hba.conforusingtheoption-A,or--auth-localand--auth-host,thenexttimeyouruninitdb.
Success.YoucanNowstartthedatabaseserverusing:
./postgres-D../data2
or./pg_ctl-D../data2-llogfilestart

此时新的PG9.4已安装成功,可以尝试启动服务并登陆。

4.配置两个库的pg_hba.conf文件,使得postgres是受信任的.

#"local"isforUnixdomainsocketconnectionsonly
localallpostgrestrust


5.将两个库都停止服务

分别执行

/opt/Postgresql/9.3/bin/pg_ctlstop-D../data
/opt/pgsql944/bin/pg_ctlstop-D../data2


6.执行pg_upgrade

6.1 首先创建一个用户执行升级的目录(postgres有权的)

执行pg_upgrade,会在当前目录生成日志,所以该命令执行时的当前目录,必须是postgres有权限的目录(可以用root创建一个目录,授权给postgres之后,到那个目录下去执行,最好不要去data目录下,因为升级过程汇总data目录下的文件可能会被改变),否则无法写日志,导致命令执行失败。

cannotwritetologfilepg_upgrade_internal.logFailure,exiting

所以我们先创建目录如下:

su-rootcd/opt/pg944mkdirupgradechownpostgressu-postgrescd/opt/pg944/upgrade

6.2进行pg_upgrade检查

首先进行使用-c命令进行检查(可以通过pg_upgrade --help查看相关命令选项的含义):

/opt/pgsql944/bin/pg_upgrade -c -b /opt/Postgresql/9.3/bin -B /opt/pgsql944/bin -d /opt/Postgresql/9.3/data -D /opt/pgsql944/data -p 5432 -P 5434

/opt/pgsql944/bin/pg_upgrade-c-b/opt/Postgresql/9.3/bin-B/opt/pgsql944/bin-d/opt/Postgresql/9.3/data-D/opt/pgsql944/data2-p5432-P5434
PerformingConsistencyChecks
-----------------------------
Checkingclusterversionsok
Checkingdatabaseuserisasuperuserok
Checkingdatabaseconnectionsettingsok
Checkingforpreparedtransactionsok
Checkingforreg*systemOIDuserdatatypesok
Checkingforcontrib/isnwithbigint-passingmismatchok
Checkingforinvalid"line"usercolumnsok
Checkingforpresenceofrequiredlibrariesok
Checkingdatabaseuserisasuperuserok
Checkingforpreparedtransactionsok
*Clustersarecompatible*


6.3进行pg_upgrade升级

pg_upgrade有两种升级方式,一个是缺省的通过拷贝数据文件到新的data目录下,一个是创建硬链接。拷贝的方式升级较慢,但是原库还可用;硬链接的方式升级较快,但是原库不可用。

缺省拷贝方式升级的命令:(链接方式升级的命令只需要添加--link)

/opt/pgsql944/bin/pg_upgrade-b/opt/Postgresql/9.3/bin-B/opt/pgsql944/bin-d/opt/Postgresql/9.3/data-D/opt/pgsql944/data-p5432-P5434
PerformingConsistencyChecks
-----------------------------
Checkingclusterversionsok
Checkingdatabaseuserisasuperuserok
Checkingdatabaseconnectionsettingsok
Checkingforpreparedtransactionsok
Checkingforreg*systemOIDuserdatatypesok
Checkingforcontrib/isnwithbigint-passingmismatchok
Checkingforinvalid"line"usercolumnsok
Creatingdumpofglobalobjectsok
Creatingdumpofdatabaseschemasok
Checkingforpresenceofrequiredlibrariesok
Checkingdatabaseuserisasuperuserok
Checkingforpreparedtransactionsok
Ifpg_upgradefailsafterthispoint,youmustre-initdbthenewclusterbeforecontinuing.

PerformingUpgrade
------------------
Analyzingallrowsinthenewclusterok
Freezingallrowsonthenewclusterok
Deletingfilesfromnewpg_clogok
copyingoldpg_clogtonewserverok
SettingnexttransactionIDandepochfornewclusterok
Deletingfilesfromnewpg_multixact/offsetsok
copyingoldpg_multixact/offsetstonewserverok
Deletingfilesfromnewpg_multixact/membersok
copyingoldpg_multixact/memberstonewserverok
SettingnextmultixactIDandoffsetfornewclusterok
Resettingwalarchivesok
Settingfrozenxidandminmxidcountersinnewclusterok
Restoringglobalobjectsinthenewclusterok
Addingsupportfunctionstonewclusterok
Restoringdatabaseschemasinthenewclusterok
Creatingnewly-requiredTOASTtablesok
Removingsupportfunctionsfromnewclusterok
copyinguserrelationfilesok
SettingnextOIDfornewclusterok
Syncdatadirectorytodiskok
Creatingscripttoanalyzenewclusterok
Creatingscripttodeleteoldclusterok
UpgradeComplete
----------------
Optimizerstatisticsarenottransferredbypg_upgrade
so,onceyoustartthenewserver,considerrunning:analyze_new_cluster.sh
Runningthisscriptwilldeletetheoldcluster'sdatafiles:delete_old_cluster.sh


6.4启动PG9.4

启动PG9.4并查看数据库内容,能看到升级成功,数据已经从pg9.3移植到9.4.

-bash-4.1$./pg_ctlstart-D../data2
-bash-4.1$./psqlpsql
(9.4.4)
Type"help"forhelp.
postgres=#showport;
port
------
5432
(1row)
postgres=#selectversion();
version-----------------------------------------------------------------------------------------------------Postgresql9.4.4oni686-pc-linux-gnu,compiledbygcc(GCC)4.4.720120313(RedHat4.4.7-11),32-bit(1row)
postgres=#\l
listofdatabases
Name|Owner|Encoding|Collate|Ctype|Accessprivileges----------+----------+----------+-------------+-------------+-----------------------
postgres|postgres|UTF8|en_US.UTF-8|en_US.UTF-8|
template0|postgres|UTF8|en_US.UTF-8|en_US.UTF-8|=c/postgres+|postgres=CTc/postgres
template1|postgres|UTF8|en_US.UTF-8|en_US.UTF-8|postgres=CTc/postgres+|=c/postgres
(3rows)
postgres=#\d
listofrelationsSchema|Name|Type|Owner
--------+------+-------+----------
public|lyy|table|postgres
(1row)
postgres=#select*fromlyy;
id|name
----+------
1|lily
2|lucy
(2rows)


7.pg_upgrade之后的操作

7.1根据情况执行pg_upgrade生成的脚本文件

Optimizerstatisticsarenottransferredbypg_upgradeso,considerrunning:analyze_new_cluster.shRunningthisscriptwilldeletetheoldcluster'sdatafiles:delete_old_cluster.sh

7.2配置pg9.4的pg_hba.conf

配置pg9.4的pg_hba.conf为应用实际需要的情况。

7.3配置pg9.4的postgresql.conf

配置pg9.4的postgresql.conf,使其还原pg9.3中的设置,或者做其他实用的配置。


8.面向实际应用

本案例仅作pg_upgrade的执行示例,实际应用中请自行做相应的调整。

相关文章

项目需要,有个数据需要导入,拿到手一开始以为是mysql,结果...
本文小编为大家详细介绍“怎么查看PostgreSQL数据库中所有表...
错误现象问题原因这是在远程连接时pg_hba.conf文件没有配置正...
因本地资源有限,在公共测试环境搭建了PGsql环境,从数据库本...
wamp 环境 这个提示就是说你的版本低于10了。 先打印ph...
psycopg2.OperationalError: SSL SYSCALL error: EOF detect...