文章結構如下:
Postgresql是一個非常活躍的社區開源項目,更新速度很快,每一次版本的更新都會積極的修復舊版本的BUG,性能上也會有不同幅度的提升。10之前的版本由三部分組成,10開始只有兩部分數字組成。
1. 小版本升級
Postgresql每次的小版本升級不會改變內部的存儲格式,也不會改變數據目錄,並且總是向上兼容同一主版本,9.6.2與9.6.1總是兼容的。升級小版本只需要安裝新的可執行文件,並且重啟數據庫實例。
① 備份
可以進行數據庫備份pg_dump備份
② 關閉數據庫服務器
pg_ctl stop -D /pgsql/pg_data/
cd /usr/local/
mv pgsql/ pgsqlbak
把postgresql9.6.8 上傳到目錄/usr/local/src並解壓
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/
啟動后,數據查詢成功。
2. 大版本升級
大版本可以用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。
一.使用upgrade 普通模式升級
1) 安裝新版的PG並初始化數據目錄
把新版本的包上傳到/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
查看安裝的目錄:
2) 停止舊版本的數據庫
pg_ctl stop -D /pgsql/pg_data/ -m fast
3) 檢查兼容性
為了避免數據庫升級失敗造成的長時間宕機,升級之前都做兼容性檢查。
檢查語句:
/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索引。
4) 使用PG_UPGRADE普通模式升級
/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 參數
開啟后,檢查數據庫是否正常運行以及有無報錯。
二.使用upgrade link模式升級
同樣的也是前期准備工作一樣,初始化數據庫:
把新版本的包上傳到/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
初始化后不能啟動新的庫。
1) 了解舊版本有那些extension以及表空間
2) 檢查兼容性
檢查語句:
/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
3) 使用PG_UPGRADE link模式升級
如果使用了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的舊版本