pg_upgrade官網介紹:https://www.postgresql.org/docs/10/pgupgrade.html
1.查看老版本數據庫編譯參數值並記錄
select name,setting,unit from pg_catalog.pg_settings where context='internal'
或者在postgres用戶下執行如下命令
$ pg_config
重點關注一下四個參數,block_size,segment_size,wal_block_size,wal_segment_size
2.上傳新版本PG源碼並安裝(本例使用PG12演示)
# tar vxf postgresql-12beta1.tar.gz # cd postgresql-12beta1 # ./configure --prefix=/usr/local/pgsql-12.0 --with-wal-blocksize=8 --with-segsize=1 --with-blocksize=8 # make -j 10 # make install # export PATH=$PATH:/usr/local/pgsql-12.0/bin # cd contrib # make all # make install
注意,在編譯的時候,一定要保證參數的值和舊版本數據庫的值相同,否則后續無法升級
3.初始化新版本數據庫
新版本數據庫和舊版本數據庫的PGDATA必須在同一個文件系統(目錄)內才可以使用--link(硬鏈接)
$ cd /usr/local/pgsql-12.0/bin/ $ ./initdb --wal-segsize=16 -D /pgdata01/data/
pg12中編譯時沒有wal_segment_size參數,可以在初始化時指定
4.檢查是否可以升級
$ cd /tmp $ mkdir upgrade_log $ cd upgrade_log
# 使用link硬鏈接方式的檢查
$ /usr/local/pgsql-12.0/bin/pg_upgrade -c -- link -b /postgresql/pgsql/database/bin -B /usr/local/pgsql-12.0/bin -d /postgresql/pgsql/body/etc -D /pgdata01/data
# 使用copy方式的檢查 $ /usr/local/pgsql-12.0/bin/pg_upgrade -c -b /postgresql/pgsql/database/bin -B /usr/local/pgsql-12.0/bin -d /postgresql/pgsql/body/etc -D /pgdata01/data
5.檢查失敗,解決失敗問題,檢查成功,可以跳過本步驟
本例檢查失敗,因為舊版本數據庫安裝了一個插件
可以卸載插件或者在新版本數據庫上面安裝插件
卸載插件:
psql drop extension pg_proctab; \c db01 drop extension pg_proctab; \c db02 drop extension pg_proctab; \c db03 drop extension pg_proctab;
因為postgres,db01,db02,db03,db04數據庫都安裝有插件,因此都卸載掉
新版本數據庫安裝插件
上傳插件 # unzip pg_proctab-0.0.7.zip # cd pg_proctab-0.0.7 # export PATH=$PATH:/usr/local/pgsql-12.0/bin/ # make # make install
安裝完畢后,再次檢查,看是否通過
其他異常請根據檢查提示解決
6.開始升級
關閉舊版本數據庫
升級有一下兩種方式:
copy方式升級
$ /usr/local/pgsql-12.0/bin/pg_upgrade -b /postgresql/pgsql/database/bin -B /usr/local/pgsql-12.0/bin -d /postgresql/pgsql/body/etc -D /pgdata01/data
優點:
copy方式是在舊版本數據庫表空間同目錄下新建一個新版本數據庫的目錄並將數據文件復制過來,因此在數據庫升級后,如果新舊版本數據庫的端口號不一樣的話,可以同時開啟
缺點:
對於大數據量數據庫需要的升級時間較長,且舊版本數據庫數據文件所在目錄剩余容量至少和現有使用量相同,占據空間
link方式升級
$ /usr/local/pgsql-12.0/bin/pg_upgrade --link -b /postgresql/pgsql/database/bin -B /usr/local/pgsql-12.0/bin -d /postgresql/pgsql/body/etc -D /pgdata01/data
優點:
link方式是在舊版本數據庫表空間目錄下新建一個目錄,並在里面新建一個硬鏈接直接指向舊版本數據庫的數據文件,升級迅速且不占用空間
缺點:
因為舊版本數據庫和新版本數據庫由於硬鏈接,因此使用的實際是同一個文件,因此無法同時開啟新舊版本數據庫
查看是否是硬鏈接可以進入新版本數據庫數據文件所在目錄執行ll命令
$ cd /data/tbs/PG_10_201707211/16384 $ ll
結果:
-rw-------. 2 postgres postgres 32768 Jun 26 09:09 16391 -rw-------. 2 postgres postgres 0 Jun 26 09:01 16394 從結果里面可以看到,每一個數據文件2個目錄指向它,硬鏈接
7.修改環境變量
# su - postgres $ vi .bash_profile export PGHOME=/usr/local/pgsql export PGDATA=/pgdata01/data export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/pgsql/lib export PATH=$PATH:$PGHOME/bin
8.修改postgresql.conf和pg_hba.conf文件
9.創建擴展
10.掃尾等