目錄
- PostgreSQL簡介
- 業務場景
- 數據庫維護
- docker-compose配置
- 備份腳本
- 更新表結構腳本
PostgreSQL簡介
- PostgreSQL是一種開源的關系型數據庫管理系統,它是一個功能強大、高度可定制化和支持復雜應用的數據庫。它支持廣泛的數據類型,包括數值、文字、二進制、地理空間等多種類型,同時還擁有高級數據建模和表連接等功能。PostgreSQL是使用ANSI SQL標準的一種數據庫,也支持JSON、XML等多種數據格式。
- PostgreSQL 是一個功能強大、可靠性高、豐富性強的數據庫管理系統,廣泛應用于大型企業和各類應用程序。
- 在開源界,PostgreSQL得到了廣泛的認可和支持,并且在全球范圍內有著龐大的社區和開發者團隊。它是一種成熟的數據庫技術,也是當今最具活力和發展潛力的開源數據庫之一。
業務場景
- 我們有一小部分客戶,項目涉及路口較少,本身對平臺的需求較少,對平臺并發量也沒啥要求
- 另一方面,也是比較重要的原因,他們沒有買新服務器的預算,只會提供給我們一臺比較老的windows server服務器,用來部署平臺
- 為了部署和運維方便,我們會將所有微服務和中間件,使用docker部署,使用docker-compose統一管理配置文件
- 在windows機器上安裝virtualBox,在里面安裝CentOS7虛擬機,在虛擬機里部署平臺(數據庫也使用了docker部署)
- 客戶是內網環境,后續更新部署時,主要是整理好部署包和更新腳本,當地維保配合更新。這時出現了一個問題,有時候需要修改表結構,當地維保人員不會操作(其實他們主要是使用平臺幫客戶干活,不是專業運維)
- 現在需要在原有的程序更新腳本里,把數據庫結構更新過程放進去,使維保人員只需要執行一個腳本即可完成更新
- 對于一個生產環境,數據庫的備份策略是必要的,至少要做到每天備份一次。由于我們只有業務數據存儲在PostgreSQL,整體數據量不大,所以采用全量備份
數據庫維護
docker-compose配置
- 首先放一下我們的PostgreSQL的docker-compose配置
# 數據庫服務 postgresql: image: postgres:14.2 container_name: postgres ports: - 5432:5432 volumes: - ./volumes/postgresql/:/var/lib/postgresql/data/ - /etc/localtime:/etc/localtime environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=xxxxxxxx - POSTGRES_HOST_AUTH_METHOD=md5 - TZ=Asia/Shanghai restart: always
- 主要是需要把PostgreSQL數據庫存放數據的data目錄映射出來,其他都是通用配置,用戶名、密碼、密碼訪問、時區等
- 數據目錄映射出來,也方便做數據的全量備份與恢復。
備份腳本
- 可以使用定時任務,在每天凌晨直接對映射出來的文件夾,進行壓縮備份到其他目錄
- 下面是備份腳本pg-backup.sh,只保留10天的備份,循環刪除最早的一天
#!/bin/bash echo "======== start backup pg data ========" # pg 數據目錄 pgdata=/home/signal/instance/volumes target=/home/bak/pgbak if [ ! -d $target ];then mkdir -p $target else echo "文件夾已經存在" fi # 當前日期 curDay=$(date "+%Y-%m-%d") echo ${curDay} # 保留文件數 ReservedNum=10 # 去pg 數據目錄,按日期壓縮到備份文件夾 cd $pgdata tar -zcvf $target/postgresql-$curDay.tgz postgresql # 刪除多余天數的壓縮文件 #*.tgz表示篩選文件類型,去掉則針對整個目錄的文件 cd $target FileNum=$(ls -l ./*.tgz |grep ^- |wc -l) while(( FileNum > $ReservedNum)) do OldFile=$(ls -rt ./*.tgz| head -1) rm -f $OldFile let "FileNum--" done echo "======== bakup pg data end ========"
- 然后將腳本加入服務器定時執行即可,可以直接使用
crontab
更新表結構腳本
- docker是可以執行sh腳本的,使用
docker exec 容器name/id /bin/sh -c "命令"
即可 - 在原有的程序更新腳本里,加入數據庫更新命令即可,具體命令如下:
echo "更新postgresql表結構" docker exec postgres /bin/sh -c "sh /var/lib/postgresql/data/db_update.sh"
- 其中
/var/lib/postgresql/data/db_update.sh
是數據庫更新腳本,使用psql
命令執行SQL文件,具體如下:
#!/bin/bash # 以postgres用戶 執行此腳本 更新數據庫 echo 'update database' psql -d core -U postgres -f /var/lib/postgresql/data/core_update.sql sleep 1s echo 'create update end' exit
- 其中
/var/lib/postgresql/data/core_update.sql
為具體的SQL文件 - 由于
/var/lib/postgresql/data
文件夾已經映射出來了,更新部署程序時,順便更新core_update.sql
即可