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
@H_902_502@6.1 首先创建一个用户执行升级的目录(postgres有权的)
执行pg_upgrade,会在当前目录生成日志,所以该命令执行时的当前目录,必须是postgres有权限的目录(可以用root创建一个目录,授权给postgres之后,到那个目录下去执行,最好不要去data目录下,因为升级过程汇总data目录下的文件可能会被改变),否则无法写日志,导致命令执行失败。
cannotwritetologfilepg_upgrade_internal.logFailure,exiting
所以我们先创建目录如下:
su-rootcd/opt/pg944mkdirupgradechownpostgressu-postgrescd/opt/pg944/upgrade@H_902_502@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*
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
启动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之后的操作
@H_902_502@7.1根据情况执行pg_upgrade生成的脚本文件:
Optimizerstatisticsarenottransferredbypg_upgradeso,considerrunning:analyze_new_cluster.shRunningthisscriptwilldeletetheoldcluster'sdatafiles:delete_old_cluster.sh@H_902_502@7.2配置pg9.4的pg_hba.conf
配置pg9.4的pg_hba.conf为应用实际需要的情况。
@H_902_502@7.3配置pg9.4的postgresql.conf配置pg9.4的postgresql.conf,使其还原pg9.3中的设置,或者做其他实用的配置。
8.面向实际应用
本案例仅作pg_upgrade的执行示例,实际应用中请自行做相应的调整。
原文链接:https://www.f2er.com/postgresql/195004.html