Docker環(huán)境實現(xiàn)PostgreSQL自動備份的流程步驟
安裝
Ubuntu安裝Docker環(huán)境
如果您尚未在 Ubuntu 系統(tǒng)中安裝 Docker,可以按照以下步驟進行安裝:
更新系統(tǒng)的包列表:
sudo apt-get update
安裝 Docker 相關(guān)的依賴包:
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
添加 Docker 的官方 GPG 密鑰:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/docker.gpg
添加 Docker 的官方軟件源:
sudo add-apt-repository "deb [arch=$(dpkg --print-architecture signed-by=/etc/apt/trusted.gpg.d/docker.gpg)] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
更新包列表并安裝 Docker:
sudo apt-get update sudo apt-get install -y docker-ce docker-ce-cli containerd.io
啟動 Docker 服務并設置開機自啟:
sudo systemctl start docker sudo systemctl enable docker
安裝PostgreSQL
在 Docker 中安裝 pg_rman,首先需要拉取 PostgreSQL 的 Docker 鏡像。可以使用以下命令從 Docker Hub 上拉取官方的 PostgreSQL 鏡像:
docker pull postgres
創(chuàng)建 PostgreSQL 容器 接下來,創(chuàng)建一個名為 "my-postgres" 的 PostgreSQL 容器,并設置一個用戶名和密碼供連接使用。可以使用以下命令:
docker run -d --name my-postgres -e POSTGRES_USER=myuser -e POSTGRES_PASSWORD=mypassword postgres
其中,myuser
和 mypassword
分別是要設置的用戶名和密碼,您可以根據(jù)需要進行修改。
進入 PostgreSQL 容器 運行以下命令以進入 PostgreSQL 容器的 shell:
docker exec -it my-postgres bash
安裝和配置pg_rman
容器內(nèi)安裝git
如果在容器內(nèi)沒有git
命令,您可以通過以下步驟安裝它:
1.在容器內(nèi)執(zhí)行以下命令更新包管理工具:
apt-get update
2.使用以下命令安裝git
:
apt-get install -y git
這將安裝git
工具,使您能夠下載pg_rman源代碼并進行后續(xù)編譯和安裝步驟。完成安裝后,您可以按照之前的步驟繼續(xù)進行pg_rman的安裝。
容器內(nèi)安裝pg_rman
在 PostgreSQL 容器的 shell 中,可以使用以下命令安裝 pg_rman 的依賴項,并編譯安裝 pg_rman:
1.安裝編譯工具和依賴項:
apt-get update apt-get install -y git build-essential libpq-dev libssl-dev
2.克隆 pg_rman 倉庫:
git clone https://github.com/ossc-db/pg_rman.git
3.進入 pg_rman 目錄:
cd pg_rman
4.編譯并安裝 pg_rman:
make make install
配置PostgreSQL
安裝完 pg_rman 后,需要在 PostgreSQL 中配置 pg_rman 進行備份和恢復操作??梢栽?PostgreSQL 容器的 shell 中使用以下命令編輯 PostgreSQL 的配置文件:
1.編輯 PostgreSQL 的配置文件 postgresql.conf:
vi /var/lib/postgresql/data/postgresql.conf
2.在容器內(nèi)創(chuàng)建用于存儲備份文件的目錄
mkdir -p /var/lib/postgresql/pg_rman_backup
3.在配置文件中添加以下內(nèi)容,啟用 pg_rman:
# 啟用 pg_rman 插件 shared_preload_libraries = 'pg_rman' # 指定 pg_rman 的備份目錄 pg_rman.backup_path = '/var/lib/postgresql/pg_rman_backup'
4.保存并退出配置文件。
5.在容器內(nèi)重啟 PostgreSQL 服務,使配置生效:
service postgresql restart
使用 pg_rman 進行備份和恢復, 現(xiàn)在,可以在 Docker 容器中使用 pg_rman 進行 PostgreSQL 數(shù)據(jù)庫的備份和恢復操作了。以下是一些常用的 pg_rman 命令示例:
測試
創(chuàng)建全量備份
pg_rman backup -B /var/lib/postgresql/pg_rman_backup -b my_backup
創(chuàng)建增量備份
pg_rman backup -B /var/lib/postgresql/pg_rman_backup -b my_backup --incremental
恢復備份
pg_rman restore -B /var/lib/postgresql/pg_rman_backup -i my_backup
參數(shù)的解釋:
pg_rman
:這是運行pg_rman
工具的命令。backup
:這是你要執(zhí)行的操作,本例中是備份操作。-B /var/lib/postgresql/pg_rman_backup
:這是-B
選項后跟一個目錄路徑。它指定備份將存儲在的目錄,本例中備份將放在目錄/var/lib/postgresql/pg_rman_backup
中。-b my_backup
:這是-b
選項后跟一個標簽或標識備份的名稱。在這里,備份標簽設置為 "my_backup"。這個標簽可以幫助你標識和管理不同的備份。- 這些參數(shù)用于告訴
pg_rman
在哪里存儲備份,并為備份提供一個易于識別的標簽。通常,你會包括其他選項和參數(shù),以指定有關(guān) PostgreSQL 數(shù)據(jù)庫和備份配置的詳細信息。
配置 pg_rman
1.在PostgreSQL容器內(nèi)創(chuàng)建配置文件
touch /var/lib/pgsql/data/pg_rman.conf
2.編輯配置文件
使用文本編輯器(例如vi
或nano
)編輯配置文件,添加以下內(nèi)容,根據(jù)您的需求進行配置:
BACKUP_PATH = '/var/lib/postgresql/pg_rman_backup' BACKUP_MODE = FULL LOG_DIR = '/var/log/pg_rman'
在上述配置中,將/var/lib/postgresql/pg_rman_backup
替換為您希望存儲備份的實際目錄路徑,/var/log/pg_rman
是pg_rman備份日志的目錄。這些路徑指的是PostgreSQL容器內(nèi)的文件和目錄路徑,前提需提前創(chuàng)建對應文件夾
1. 映射備份路徑到主機路徑: 假設您希望將容器內(nèi)的備份路徑 /var/lib/postgresql/pg_rman_backup
映射到主機上的 /host/backup
目錄,可以在運行容器時使用 -v
參數(shù):
-v /host/backup:/var/lib/postgresql/pg_rman_backup
這樣,備份文件將在容器內(nèi)的 /var/lib/postgresql/pg_rman_backup
目錄創(chuàng)建,但也將在主機上的 /host/backup
目錄中可見。
2. 映射日志路徑到主機路徑: 假設您希望將容器內(nèi)的日志路徑 /var/log/pg_rman
映射到主機上的 /host/log
目錄,可以在運行容器時使用 -v
參數(shù):
-v /host/log:/var/log/pg_rman
這樣,pg_rman備份日志將在容器內(nèi)的 /var/log/pg_rman
目錄創(chuàng)建,但也將在主機上的 /host/log
目錄中可見。
通過這種方式,您可以輕松在容器內(nèi)和主機之間共享備份文件和備份日志。確保在命令中替換路徑為您希望使用的實際路徑。
3.重啟 PostgreSQL 容器(可根據(jù)實際情況添加容器數(shù)據(jù)卷)
docker restart my_postgres
這將使 pg_rman 配置生效。
配置PostgreSQL步驟可忽略此步驟
對于在 PostgreSQL 容器內(nèi)啟用 pg_rman 擴展的步驟,這取決于您的 PostgreSQL 數(shù)據(jù)庫配置和需求。下面我將進一步解釋這個步驟的情況:
1.在 Docker 中啟動一個 PostgreSQL 容器??梢允褂靡韵旅顒?chuàng)建一個基于 PostgreSQL 的 Docker 容器:
docker run -d --name my_postgres -p 5432:5432 -e POSTGRES_USER=myuser -e POSTGRES_PASSWORD=mypassword postgres
其中,my_postgres
是容器名稱,myuser
和 mypassword
是 PostgreSQL 的用戶名和密碼。
2.進入 PostgreSQL 容器的 Shell:
docker exec -it my_postgres psql -U myuser
其中,myuser
是之前設置的 PostgreSQL 用戶名。
3.在 PostgreSQL 容器中安裝 pg_rman 擴展:
如果您希望在 PostgreSQL 容器內(nèi)使用 pg_rman
擴展來執(zhí)行備份和還原操作,并且您的 PostgreSQL 數(shù)據(jù)庫尚未啟用 pg_rman
擴展,那么您需要在 PostgreSQL 容器內(nèi)執(zhí)行以下 SQL 命令來啟用擴展:
CREATE EXTENSION pg_rman;
這將在 PostgreSQL 中安裝 pg_rman 擴展。
- 這通常用于在數(shù)據(jù)庫級別啟用
pg_rman
擴展,以便您可以在 PostgreSQL 數(shù)據(jù)庫內(nèi)直接運行pg_rman
命令。
- 這通常用于在數(shù)據(jù)庫級別啟用
在 PostgreSQL 容器內(nèi)不需要啟用 pg_rman 擴展(沒有此步驟):
- 如果您的 PostgreSQL 容器已經(jīng)在創(chuàng)建時包含了
pg_rman
擴展,或者您的 PostgreSQL 數(shù)據(jù)庫中已經(jīng)啟用了pg_rman
擴展,那么您不需要再次在容器內(nèi)啟用它。 - 這可能是因為您使用的 PostgreSQL 容器映像已經(jīng)包含
pg_rman
擴展,或者您在容器外部的 PostgreSQL 數(shù)據(jù)庫中已經(jīng)進行了配置。
- 如果您的 PostgreSQL 容器已經(jīng)在創(chuàng)建時包含了
1.創(chuàng)建 pg_rman 的備份目錄
mkdir /pg_rman_backup
這將在容器外創(chuàng)建一個用于存儲備份的目錄。
2.在 PostgreSQL 容器中配置 pg_rman
ALTER SYSTEM SET pg_rman.config_file_directory = '/pg_rman_backup';
這將設置 pg_rman 的配置文件目錄為之前創(chuàng)建的備份目錄。
3.重啟 PostgreSQL 容器
docker restart my_postgres
這將使 pg_rman 配置生效。
設置定時備份
1.創(chuàng)建一個名為 pg_rman_backup.sh 的腳本文件,并將其放置在備份目錄中,例如 /pg_rman_backup。
2.編輯 pg_rman_backup.sh 腳本,設置備份的參數(shù)和選項。例如,以下是一個示例腳本:
#!/bin/bash # 定義備份目錄和文件名 BACKUP_DIR="/pg_rman_backup" BACKUP_FILE="backup_%Y%m%d_%H%M%S" # 獲取當前日期和時間 CURRENT_DATE=$(date "+%Y-%m-%d") CURRENT_TIME=$(date "+%H:%M:%S") # 判斷當前日期是周日還是周一到周六 if [ "$(date +%u)" == "7" ]; then # 如果是周日,則執(zhí)行全量備份 echo "[$CURRENT_DATE $CURRENT_TIME] Performing full backup..." pg_rman backup --backup-path=$BACKUP_DIR --backup-mode=full --backup-name-format=$BACKUP_FILE else # 如果是周一到周六,則執(zhí)行增量備份 echo "[$CURRENT_DATE $CURRENT_TIME] Performing incremental backup..." pg_rman backup --backup-path=$BACKUP_DIR --backup-mode=incremental --backup-name-format=$BACKUP_FILE fi
3.設置定時任務,使用 cron 在容器內(nèi)設置每周日凌晨1點執(zhí)行全量備份,每周一到周六凌晨1點執(zhí)行增量備份。例如,以下是一個 cron 配置示例:
# 進入 PostgreSQL 容器 docker exec -it my_postgres bash # 編輯 crontab 配置文件 crontab -e # 在 crontab 配置文件中添加以下定時任務 0 1 * * 7 /pg_rman_backup/pg_rman_backup.sh # 每周日凌晨1點執(zhí)行全量備份 0 1 * * 1-6 /pg_rman_backup/pg_rman_backup.sh # 每周一到周六凌晨1點執(zhí)行增量備份
這將在每周日凌晨1點執(zhí)行全量備份,每周一到周六凌晨1點執(zhí)行增量備份,根據(jù)您的需求進行定時備份。請注意,crontab 的時間設置根據(jù)您的系統(tǒng)時區(qū)而定,以上示例假設您的系統(tǒng)時區(qū)為 UTC。如果您的系統(tǒng)時區(qū)不同,需要根據(jù)實際情況進行調(diào)整。
停止定時任務
1.打開終端或 SSH 連接到你的服務器。
2.運行以下命令來編輯你的 crontab 配置文件:
crontab -e
在編輯模式下,找到你之前添加的定時任務行,將這些行刪除或注釋掉。你可以在行前面添加 #
符號,這樣它們將被視為注釋而不再執(zhí)行:
# 0 1 * * 7 /pg_rman_backup/pg_rman_backup.sh # 0 1 * * 1-6 /pg_rman_backup/pg_rman_backup.sh
保存并退出編輯器。
這將停止之前設置的定時任務。 Crontab 將不再執(zhí)行這些任務。
請注意,你需要使用具有適當權(quán)限的用戶運行 crontab -e
來編輯 crontab 配置文件。如果你使用了 root
用戶來設置這些任務,你應該以 root
用戶身份運行上述命令。
刪除備份
在 Docker 環(huán)境下,要刪除 pg_rman 創(chuàng)建的備份文件,可以通過以下步驟進行:
進入運行 PostgreSQL 容器的主機。
在主機上定位到 pg_rman 備份文件的存儲路徑。這通常在容器內(nèi)的某個掛載目錄中,可以通過掛載選項 -v
或 --volume
在啟動容器時指定的。例如,如果在啟動容器時使用了以下命令:
docker run -v /my/backup/folder:/var/lib/postgresql/pg_rman_backup postgres
那么備份文件將會存儲在主機上的 /my/backup/folder
目錄中。
在主機上使用命令行或文件管理工具,刪除不再需要的備份文件。例如,可以使用 rm
命令刪除文件,例如:
rm /my/backup/folder/my_backup
注意,刪除備份文件時要謹慎,確保您只刪除不再需要的備份文件,并且不會影響到正在使用的數(shù)據(jù)庫的完整性和可用性。
此外,您也可以在運行 PostgreSQL 容器時通過 -e 或 --env 參數(shù)設置 pg_rman.backup_path 參數(shù),將備份文件存儲到容器內(nèi)的其他目錄,并在容器內(nèi)使用相應的權(quán)限刪除備份文件。例如,可以使用以下命令啟動容器,并將備份文件存儲到 /my/backup/folder 目錄:
docker run -e pg_rman.backup_path=/my/backup/folder postgres
然后在容器內(nèi)使用相應的權(quán)限刪除備份文件。請注意,這種方法需要在容器內(nèi)具有足夠的權(quán)限來刪除文件,并且需要小心以避免意外刪除重要數(shù)據(jù)。
pg_rman如何知道postgres的數(shù)據(jù)文件位置
pg_rman 通過連接到 PostgreSQL 數(shù)據(jù)庫來獲取數(shù)據(jù)文件的位置,因為 PostgreSQL 維護了有關(guān)數(shù)據(jù)文件的元數(shù)據(jù)信息。您無需手動指定數(shù)據(jù)文件位置,pg_rman 會自動檢測數(shù)據(jù)庫中的數(shù)據(jù)目錄。
通常,pg_rman 會查看 PostgreSQL 數(shù)據(jù)目錄,并從數(shù)據(jù)庫的元數(shù)據(jù)中了解數(shù)據(jù)文件的位置。這包括主要數(shù)據(jù)目錄、表空間、以及其他相關(guān)信息。然后,pg_rman 使用這些信息來備份和還原數(shù)據(jù)庫。
在 PostgreSQL 中,數(shù)據(jù)文件通常存儲在數(shù)據(jù)庫數(shù)據(jù)目錄下的 base
目錄中。pg_rman 會查找這些數(shù)據(jù)文件,以確保備份包含所有必要的數(shù)據(jù)。
雖然大多數(shù)情況下 pg_rman 可以自動識別數(shù)據(jù)文件的位置,但在某些特殊情況下,您可能需要手動指定數(shù)據(jù)文件的位置,特別是在您的數(shù)據(jù)庫配置與標準設置不同的情況下。要手動指定數(shù)據(jù)文件位置,您可以在 pg_rman 的配置文件中使用 DATABASE_PATH
參數(shù)來定義數(shù)據(jù)庫的數(shù)據(jù)目錄路徑。例如:
DATABASE_PATH = '/path/to/postgresql/data'
將 /path/to/postgresql/data 替換為您 PostgreSQL 數(shù)據(jù)目錄的實際路徑。
總之,pg_rman 通常能夠自動檢測 PostgreSQL 數(shù)據(jù)文件的位置,但您也可以在需要時手動指定它們。這樣,pg_rman 就能正確備份和還原數(shù)據(jù)庫。
以上就是Docker環(huán)境實現(xiàn)PostgreSQL自動備份的流程步驟的詳細內(nèi)容,更多關(guān)于Docker PostgreSQL自動備份的資料請關(guān)注腳本之家其它相關(guān)文章!
- PostgreSQL Docker部署+SpringBoot集成方式
- 從Docker容器中備份整個PostgreSQL的操作步驟
- Docker安裝PostgreSQL數(shù)據(jù)庫的詳細步驟
- 使用docker compose啟動postgresql的示例代碼
- 在docker上部署postgreSQL主從的超詳細步驟
- Docker修改Postgresql密碼的方法詳解
- Docker如何安裝PostgreSQL
- 如何使用Dockerfile創(chuàng)建PostgreSQL數(shù)據(jù)庫
- docker容器中登陸并操作postgresql的實現(xiàn)
- 一步步教你用docker部署postgreSQL數(shù)據(jù)庫
- Docker部署postgresql的方法實現(xiàn)
相關(guān)文章
PostgreSql 導入導出sql文件格式的表數(shù)據(jù)實例
這篇文章主要介紹了PostgreSql 導入導出sql文件格式的表數(shù)據(jù)實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01postgresql數(shù)據(jù)庫導出和導入及常用的數(shù)據(jù)庫管理工具
數(shù)據(jù)庫的導入導出是最常用的功能之一,而PostgreSQL提供的對應工具為pg_dump和pg_restore。pg_dump是用于備份PostgreSQL數(shù)據(jù)庫的工具,下面這篇文章主要給大家介紹了關(guān)于postgresql數(shù)據(jù)庫導出和導入及常用的數(shù)據(jù)庫管理工具使用的相關(guān)資料,需要的朋友可以參考下2023-04-04PostgreSQL 實現(xiàn)定時job執(zhí)行(pgAgent)
這篇文章主要介紹了PostgreSQL 實現(xiàn)定時job執(zhí)行(pgAgent),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01postgresql 實現(xiàn)字符串分割字段轉(zhuǎn)列表查詢
這篇文章主要介紹了postgresql 實現(xiàn)字符串分割字段轉(zhuǎn)列表查詢,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02