自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

PostgreSQL跨版本升級常用方案

數(shù)據(jù)庫 PostgreSQL
對于企業(yè)而言,將數(shù)據(jù)庫系統(tǒng)升級到新版本通??梢垣@得更好的性能、更多的功能、最新的安全補丁和錯誤修復等。因此,本文就來介紹一下 PostgreSQL 數(shù)據(jù)庫版本升級的三種常用方案。

對于企業(yè)而言,將數(shù)據(jù)庫系統(tǒng)升級到新版本通??梢垣@得更好的性能、更多的功能、最新的安全補丁和錯誤修復等。因此,本文就來介紹一下 PostgreSQL 數(shù)據(jù)庫版本升級的三種常用方案。

升級方案概述

PostgreSQL 版本號由主要版本和次要版本組成。例如,PostgreSQL 12.4 中的 12 是主要版本,4 是次要版本;PostgreSQL 10.0 之前的版本由 3 個數(shù)字組成,例如 9.6.19,其中 9.6 是主要版本,19 是次要版本。

發(fā)布次要版本是不會改變內(nèi)存的存儲格式,因此總是和相同的主要版本兼容。例如,PostgreSQL 12.4 和 PostgreSQL 12.0 以及后續(xù)的 PostgreSQL 12.x 兼容。對于這些兼容版本的升級非常簡單,只需要關(guān)閉數(shù)據(jù)庫服務,安裝替換二進制的可執(zhí)行文件,重新啟動服務即可。

接下來,我們主要討論 PostgreSQL 的跨版本升級問題,例如從 PostgreSQL 12.x 升級到 PostgreSQL 13.y。主要版本的升級可能會修改內(nèi)部數(shù)據(jù)的存儲格式,因此需要執(zhí)行額外的操作。常用的跨版本升級方法和適用場景如下:

升級方法

適用場景

停機時間

邏輯備份與還原

中小型數(shù)據(jù)庫,例如小于 100 GB
支持跨平臺數(shù)據(jù)遷移

取決于數(shù)據(jù)庫的大小

pg_upgrade 工具

大中型數(shù)據(jù)庫,例如大于 100 GB
本機就地升級

幾分鐘

邏輯復制

大中型數(shù)據(jù)庫,例如大于 100 GB
跨平臺支持

幾秒鐘

??如果使用廠商提供的 PostgreSQL 定制版本,也可能通過他們提供的工具實現(xiàn)版本升級,具體參考相關(guān)文檔。

注意事項:升級主要版本通過會導致用戶可見的不兼容性,因此應用程序可能需要進行相應的修改。具體的變化可以參考發(fā)行說明,尤其是“Migration”部分的內(nèi)容;如果跨多個主要版本進行升級,需要閱讀每個中間版本的發(fā)行說明。

通過邏輯備份與還原進行升級

傳統(tǒng)的跨版本升級方法利用 pg_dump/pg_dumpall 邏輯備份導出數(shù)據(jù)庫,然后在新版本中通過 pg_restore 進行還原。導出舊版本數(shù)據(jù)庫時推薦使用新版本的 pg_dump/pg_dumpall 工具,可以利用最新的并行導出和還原功能,同時可以減少數(shù)據(jù)庫膨脹問題。

邏輯備份與還原非常簡單但速度比較慢,停機時間取決于數(shù)據(jù)庫的大小,因此適合中小型數(shù)據(jù)庫的升級。

下面我們介紹這種升級方法的具體操作,假如當前 PostgreSQL 軟件的安裝目錄位于 /usr/local/pgsql,同時數(shù)據(jù)目錄位于 /usr/local/pgsql/data,我們在同一臺服務器上進行升級。

執(zhí)行邏輯備份之前停止應用程序,確保沒有數(shù)據(jù)更新,因為備份開始后的更新不會被導出。如有必要,可以修改 /usr/local/pgsql/data/pg_hba.conf 文件禁止其他人訪問數(shù)據(jù)庫。

然后備份數(shù)據(jù)庫:

pg_dumpall > outputfile

如果已經(jīng)安裝了新版本的 PostgreSQL,可以使用新版本的 pg_dumpall 命令備份舊版本數(shù)據(jù)庫。

停止舊版本的后臺服務:

pg_ctl stop

或者通過其他方式停止后臺服務。

如果安裝目錄沒有包含特定版本標識,可以將目錄改名,必要時可以再修改回來。可以使用類似以下的命令重命名目錄:

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

安裝新版本 PostgreSQL 軟件,假如安裝目錄仍然是 /usr/local/pgsql。

初始化一個新的數(shù)據(jù)庫集群,需要使用數(shù)據(jù)庫專用用戶(通常是 postgres;如果是升級版本,應該已經(jīng)存在該用戶)執(zhí)行操作:

/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data

將舊版本配置文件 pg_hba.conf 和 postgresql.conf 等中的改動在對應的新配置文件中再次進行修改。

使用數(shù)據(jù)庫專用用戶啟動新版本的后臺服務:

/usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data

最后,利用新版本的 psql 命令還原數(shù)據(jù):

/usr/local/pgsql/bin/psql -d postgres -f outputfile

為了減少停機時間,可以將新版本的 PostgreSQL 安裝到另一個目錄(例如 /usr/local/pgsql-13),同時使用不同的端口啟動服務。然后同時執(zhí)行數(shù)據(jù)庫的導出和導入:

pg_dumpall -p 5432| psql -d postgres -p 5433

執(zhí)行以上操作時,新舊版本的后臺服務同時運行,新版本使用 5433 端口,舊版本使用 5432 端口。

利用 pg_upgrade 工具進行升級

pg_upgrade 工具可以支持 PostgreSQL 跨版本的就地升級,不需要執(zhí)行導出和導入操作。pg_upgrade 可以支持 PostgreSQL 8.4.X 到最新版本的升級,包括快照版本和測試版本。

pg_upgrade 提供了升級前的兼容性檢查(-c 或者 --check 選項)功能, 可以發(fā)現(xiàn)插件、數(shù)據(jù)類型不兼容等問題。如果指定了 --link 選項,新版本服務可以直接使用原有的數(shù)據(jù)庫文件而不需要執(zhí)行復制,通??梢栽趲追昼妰?nèi)完成升級操作。

下面我們介紹這種升級方法的具體操作,假如當前 PostgreSQL 軟件的安裝目錄位于 /usr/pgsql-12/,同時數(shù)據(jù)目錄位于 /var/lib/pgsql/12/data/,我們將其升級為 PostgreSQL 13。

確定沒有客戶端訪問之后備份數(shù)據(jù)庫,然后停止舊版本的后臺服務。例如 CentOS 可以執(zhí)行以下命令:

sudo systemctl stop postgresql-12
sudo systemctl disable postgresql-12

安裝新版本的 PostgreSQL 軟件。例如 PostgreSQL 13.0,安裝目錄位于 /usr/pgsql-13/。

初始化新版本的數(shù)據(jù)庫集群。數(shù)據(jù)目錄設置為 /var/lib/pgsql/13/data/。

如果舊版本中安裝了擴展模塊,在新版本中也需要安裝相應的共享對象文件或者 DLL 文件。但是不要執(zhí)行CREATE EXTENSION命令,因為會從舊數(shù)據(jù)庫中進行升級。另外,如果使用了任何自定義的全文搜索文件(字典、同義詞、詞庫、停用詞),也需要復制到新的數(shù)據(jù)庫集群目錄中。

停止新版本的后臺服務。例如 CentOS 可以執(zhí)行以下命令:

sudo systemctl stop postgresql-13

通過 pg_upgrade 執(zhí)行升級操作,使用數(shù)據(jù)庫專用用戶(通常是 postgres)執(zhí)行以下操作:

/usr/pgsql-13/bin/pg_upgrade \
  --old-datadir /var/lib/pgsql/12/data/ \
  --new-datadir /var/lib/pgsql/13/data/ \
  --old-bindir /usr/pgsql-12/bin/ \
  --new-bindir /usr/pgsql-13/bin/ \
  --check

其中 --check 表示執(zhí)行升級檢查,而不會真的執(zhí)行升級操作。通過檢查之后,可以去掉該參數(shù)執(zhí)行升級:

/usr/pgsql-13/bin/pg_upgrade \
  --old-datadir /var/lib/pgsql/12/data/ \
  --new-datadir /var/lib/pgsql/13/data/ \
  --old-bindir /usr/pgsql-12/bin/ \
  --new-bindir /usr/pgsql-13/bin/ \
  --link

其中 --link 表示將新版本的數(shù)據(jù)目錄硬鏈接到舊版本的數(shù)據(jù)目錄,而不會復制一份新的數(shù)據(jù)文件,可以快速進行升級。

將舊版本配置文件 pg_hba.conf 和 postgresql.conf 等中的改動在對應的新配置文件中再次進行修改。

啟動新版本的后臺服務。例如 CentOS 可以執(zhí)行以下命令:

sudo systemctl start postgresql-13
sudo systemctl enable postgresql-13

連接服務器查看數(shù)據(jù)庫的版本信息:

SELECT version();
version                                                                                                |
-------------------------------------------------------------------------------------------------------|
PostgreSQL 13.0on x86_64-pc-linux-gnu, compiled by gcc (GCC)4.8.520150623(Red Hat 4.8.5-39),64-bit|

收集統(tǒng)計信息。pg_upgrade 不會生成新版本數(shù)據(jù)庫的統(tǒng)計信息,但是會創(chuàng)建一個腳本文件,執(zhí)行該文件:

./analyze_new_cluster.sh

如果確認升級成功,可以選擇刪除或者保留舊的數(shù)據(jù)庫軟件和集群。pg_upgrade 同樣提供了一個刪除舊數(shù)據(jù)庫集群的腳本:

./delete_old_cluster.sh

然后可以刪除舊版本的 PostgreSQL 軟件,例如 CentOS 可以執(zhí)行以下命令:

yum remove postgresql12*

如果想要回退到舊版本的數(shù)據(jù)庫,可以分為不同的情況:

1. 如果只運行了 --check 選項命令,表示沒有真正執(zhí)行升級,重新啟動服務即可;

2. 如果升級時沒有使用 --link 選項,舊版本的數(shù)據(jù)庫集群沒有任何修改,重新啟動服務即可;

3. 如果升級時使用了 --link 選項,數(shù)據(jù)庫文件可能已經(jīng)被新版本的集群使用:

 3.1. 如果 pg_upgrade 在鏈接操作之前終止,舊版本的數(shù)據(jù)庫集群沒有任何修改,重新啟動服務即可;

 3.2. 如果沒有啟動過新版本的后臺服務,舊版本的數(shù)據(jù)庫集群沒有修改,但是鏈接過程已經(jīng)將 $PGDATA/global/pg_control 文件重命名為 $PGDATA/global/pg_control.old;此時需要將該文件名中的 .old 后綴去掉,然后重新啟動服務即可;

 3.3. 如果已經(jīng)啟動了新版本的數(shù)據(jù)庫集群,已經(jīng)修改了數(shù)據(jù)庫文件,再啟動舊版本的服務可能導致數(shù)據(jù)損壞;此時需要通過備份文件還原舊版本的數(shù)據(jù)庫。

關(guān)于 pg_upgrade 的詳細使用和升級注意事項,例如流復制結(jié)構(gòu)和日志傳輸復制結(jié)構(gòu)中備用節(jié)點的升級,可以參考官方文檔。

使用邏輯復制功能進行升級

PostgreSQL 邏輯復制支持跨版本之間的數(shù)據(jù)復制,而且支持不同平臺之間的復制,因此也可以用于實現(xiàn)版本升級。我們可以安裝一個新版本的數(shù)據(jù)庫作為復制的從節(jié)點,當數(shù)據(jù)已經(jīng)同步時執(zhí)行一次主從切換,然后關(guān)閉舊版本的主節(jié)點。主從切換的升級方法通常只需要幾秒鐘就能完成,利用第三方高可用組件甚至可以實現(xiàn)零停機時間升級。

PostgreSQL 10 開始提供了內(nèi)置的邏輯復制功能,或者也可以使用 pglogical、Slony、Londiste 以及 Bucardo 等邏輯復雜工具。

關(guān)于 PostgreSQL 邏輯復制結(jié)構(gòu)的創(chuàng)建和主從切換,可以參考官方文檔。

總結(jié)

PostgreSQL 小版本升級只需要替換二進制文件即可,跨版本升級的方案主要有三種:通過 pg_dump/pg_dumpall 邏輯備份與還原進行升級,利用 pg_upgrade 工具進行升級,使用邏輯復制功能進行升級。了解它們的優(yōu)缺點和適用場景可以幫助我們選擇最佳的升級方式。

責任編輯:華軒 來源: SQL編程思想
相關(guān)推薦

2018-12-12 15:50:13

2020-12-11 10:40:13

PostgreSQL數(shù)據(jù)庫GitLab

2021-07-15 16:58:45

數(shù)據(jù)庫RDS Postgre阿里云

2020-10-15 14:05:30

PostgreSQL升級開發(fā)

2014-01-02 09:57:56

PostgreSQL命令

2024-05-22 19:10:18

跨域Web開發(fā)

2020-09-17 13:33:39

開發(fā)

2014-04-08 09:49:27

PostgreSQL雙緩沖

2017-06-08 09:40:43

PostgreSQLdblink跨庫查詢

2021-05-27 05:22:28

前端引擎平臺

2009-10-22 17:48:32

linux gcc版本

2014-08-19 10:36:02

AngularCORS

2021-02-06 07:04:24

Linux運維Linux系統(tǒng)

2018-09-07 10:23:46

云備份混合云存儲

2009-07-03 08:42:37

查詢監(jiān)控工具PostgreSQL

2014-10-15 10:56:43

CiscoUCSfirmware

2018-01-26 08:39:03

2024-05-16 12:51:15

WinForms線程UI

2025-02-10 07:05:00

WinFormUI線程

2012-05-09 10:08:41

跨機房
點贊
收藏

51CTO技術(shù)棧公眾號