postgresql9.5.0升級至10.3

超人帶你飛發表於2018-05-17
一、  環境資訊
Linux發行版本:CentOS release 6.7 (Final)
舊pg資料庫版本:9.5.0
舊版本bin目錄:/usr/local/pgsql/bin
舊版本data目錄:/alidata1/data
舊版本WAL block si
ze大小:8192
舊版本埠:5432

外掛資訊:pg_stat_statements V1.3 on schema basisdata

二、  安裝pg10.3版本

1、下載原始碼檔案至伺服器

2、解碼

tar jxvf postgresql-10.0.tar.bz2 

3、編譯(設定安裝目錄和安裝選項)

cd postgresql-10.0
./configure --prefix=/usr/local/pgsql10 --with-pgport=5432 --with-wal-blocksize=8
若提示安裝失敗,原因是缺少GCCreadlinezlib,先檢視本機是否安裝,然後再根據情況自行安裝
rpm -qa | grep gcc
yum search gcc
yum install gcc

readlinezlib安裝方式相同

4、安裝

gmake world
gmake install -world

5、建立data資料夾

mkdir /usr/local/pgsql/data

6、建立postgres使用者和密碼

adduser postgres
passwd postgres

7、修改data目錄許可權,將其賦給postgres

chown -R postgres:postgres /usr/local/pgsql10/data/
chmod -R 700 /usr/local/pgsql10/data/

8、設定環境變數

修改系統環境變數檔案
# vim /etc/profile
新增環境變數
LD_LIBRARY_PATH=/usr/local/pgsql10/lib --是psql命令可用
export  LD_LIBRARY_PATH
PGDATA=/usr/local/pgsql10/data
export  PGDATA
PATH=$PATH:/usr/local/pgsql10/bin --pg_ctl命令可用
export  PATH --使自己定義的變數生效,類似於全域性變數

儲存後,讀取profile檔案

# source profile

9、切換至postgres賬號,初始化資料庫

su - postgres
/usr/local/pgsql10/bin/initdb -E UTF8 -D /usr/local/pgsql10/data --locale=en_US.UTF-8 -U postgres -W

10、開啟postgres服務

/usr/local/pgsql10/bin/pg_ctl start
/usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data >logfile 2>&1 &

三、  升級

1、  新版本初始化成功以後,安裝pg_upgrade外掛

cd contrib 
gamke 
gmake install
2、  修改配置檔案postgresql.conf和pg_hba.conf
2.1、修改pg_hba.conf
因為升級需要多次連線新老叢集資料庫例項, 所以修改為使用本地trust認證
2.2、修改postgresql.conf
將老版本的postgresql.conf檔案拷貝至新版本的相應目錄下,然後修改新版本的埠為5434(與編譯時已經指定的埠相同)

3、  停老庫

/usr/local/pgsql95/bin/pg_ctl stop

4、  建立upgrade資料夾,並賦權

su - root   
cd /usr/local/pgsql10
mkdir upgrade  
chown postgres:postgres upgrade   
su - postgres 
cd /usr/local/pgsql10/upgrade
5、  修改profile檔案,LD_LIBRARY_PATH指向新庫
cd /etc
vim profile
LD_LIBRARY_PATH=/usr/local/pgsql95/lib
export LD_LIBRARY_PATH

6、  檢驗更新

/usr/local/pgsql10/bin/pg_upgrade -c -b /usr/local/pgsql95/bin -B /usr/local/pgsql10/bin -d /usr/local/pgsql95/data -D /usr/local/pgsql10/data -p 5432 -P 5434 -U postgres

解決完上述問題後,重新檢驗,出現如下結果



說明新老資料庫相容,可以進行升級

7、  升級

升級有兩種方式

一是:預設的通過拷貝資料檔案到新的data目錄下,速度較慢,但原庫可用

二是:建立硬連結,速度較快,但原庫不可用,新增--link命令即可執行

由於資料量較大,本次測試是採用硬連結的方式
/usr/local/pgsql10/bin/pg_upgrade --link -b /usr/local/pgsql95/bin -B /usr/local/pgsql10/bin -d /usr/local/pgsql95/data -D /usr/local/pgsql10/data -p 5432 -P 5434
四、  遇到的問題:

1、  有三張表的欄位不合法:

biuse.temp_xcm_0402;
biuse.temp_xcm_0402_2;
biuse.temp_xcm_0402_3;

解決方案:刪除這三張表



2、  生產環境安裝了pg_stat_statements外掛

由於生產環境安裝了pg_stat_statements外掛,而在升級的時候,新版本並未安裝該外掛,所以報錯
解決方案:
1、  在升級的時候,在新版本原始碼包的該目錄下,需要make & make install相應的外掛,具體目錄如下postgresql-10.0/contrib/pg_stat_statements

2、  然後修改老版本的配置檔案postgresql.conf,將pg_stat_statements對應到元件暫時註釋掉,然後再將老版本的配置檔案拷貝到10.3版本對應的目錄下,才能啟動。




3、  存在以pg_開頭的使用者

10.0版本開始是不支援以pg_開頭的使用者的,因為這是系統的預設使用者

解決方案:收回該使用者的所有許可權,並刪除該使用者

revoke all on schema public from pg_rd;
drop role pg_rd;


升級檢測成功,可以進行升級


4、  wal-blocksize問題,由於該引數新老版本對不上,導致檢驗失敗,解決方法是刪除資料庫,然後重新編譯,並在編譯是指定wal-blocksize的大小,然後重新檢驗

5、  locale引數對不上,解決方案是刪除data目錄,重新初始化,並修改locale引數的指定值


相關文章