当前位置: 首页 > news >正文

postgresql 数据库备份、重新构建容器

一、数据库备份

方法一:使用 pg_dumpall(推荐备份整个集群)

# 进入当前运行的容器备份
docker exec -it your_db_container_name pg_dumpall -U postgres > full_backup_$(date +%Y%m%d_%H%M%S).sql# 或者使用环境变量中的用户名
docker exec -it your_db_container_name pg_dumpall -U ${POSTGRES_USER:-postgres} > full_backup_$(date +%Y%m%d_%H%M%S).sql

方法二:备份特定数据库

# 备份 dify 数据库
docker exec -it your_db_container_name pg_dump -U ${POSTGRES_USER:-postgres} -d ${POSTGRES_DB:-dify} > dify_backup_$(date +%Y%m%d_%H%M%S).sql

方法三:使用 volume 直接备份数据文件(快速但需要停机)

# 停止容器
docker stop your_db_container_name# 备份数据目录
tar -czvf postgres_data_backup_$(date +%Y%m%d_%H%M%S).tar.gz ./volumes/db/data/# 重新启动容器
docker start your_db_container_name

验证备份文件

# 检查备份文件是否有效
head -n 10 full_backup_*.sql
# 应该看到 PostgreSQL 的版本信息和 SQL 语句

二、重新构建容器

1.停止并删除旧容器

docker stop your_db_container_name
docker rm your_db_container_name

2.创建 docker-compose.yml 文件

version: '3.8'services:db:image: postgres:15-alpinecontainer_name: postgres_dbrestart: alwaysenvironment:POSTGRES_USER: ${POSTGRES_USER:-postgres}POSTGRES_PASSWORD: ${POSTGRES_DB_PASSWORD:-密码}POSTGRES_DB: ${POSTGRES_DB:-dify}PGDATA: /var/lib/postgresql/data/pgdata ###必须是挂载的数据卷目录POSTGRES_MAX_CONNECTIONS: ${POSTGRES_MAX_CONNECTIONS:-100}POSTGRES_SHARED_BUFFERS: ${POSTGRES_SHARED_BUFFERS:-128MB}POSTGRES_WORK_MEM: ${POSTGRES_WORK_MEM:-4MB}POSTGRES_MAINTENANCE_WORK_MEM: ${POSTGRES_MAINTENANCE_WORK_MEM:-64MB}POSTGRES_EFFECTIVE_CACHE_SIZE: ${POSTGRES_EFFECTIVE_CACHE_SIZE:-4096MB}command: >postgres -c max_connections=$${POSTGRES_MAX_CONNECTIONS:-100}-c shared_buffers=$${POSTGRES_SHARED_BUFFERS:-128MB}-c work_mem=$${POSTGRES_WORK_MEM:-4MB}-c maintenance_work_mem=$${POSTGRES_MAINTENANCE_WORK_MEM:-64MB}-c effective_cache_size=$${POSTGRES_EFFECTIVE_CACHE_SIZE:-4096MB}volumes:- ./volumes/db/data:/var/lib/postgresql/data  ###挂载的数据卷ports:- "5432:5432"healthcheck:test: [ "CMD", "pg_isready", "-h", "localhost", "-U", "$${POSTGRES_USER:-postgres}", "-d", "$${POSTGRES_DB:-dify}" ]interval: 10stimeout: 5sretries: 5user: "999:999"  # 使用 postgres 用户ID运行,增强安全性

3.创建.env文件

POSTGRES_USER=postgres
POSTGRES_DB_PASSWORD=your_strong_password_here
POSTGRES_DB=dify
POSTGRES_MAX_CONNECTIONS=100
POSTGRES_SHARED_BUFFERS=128MB
POSTGRES_WORK_MEM=4MB
POSTGRES_MAINTENANCE_WORK_MEM=64MB
POSTGRES_EFFECTIVE_CACHE_SIZE=4096MB

4.启动容器

方法一:

# 使用 docker-compose
docker-compose up -d db

方法二:

# 或者直接使用 docker run
docker run -d \--name postgres_db \-e POSTGRES_USER=postgres \-e POSTGRES_PASSWORD=your_strong_password \-e POSTGRES_DB=dify \-e PGDATA=/var/lib/postgresql/data/pgdata \-v ./volumes/db/data:/var/lib/postgresql/data \-p 5432:5432 \--restart always \postgres:15-alpine \postgres -c 'max_connections=100' \-c 'shared_buffers=128MB' \-c 'work_mem=4MB' \-c 'maintenance_work_mem=64MB' \-c 'effective_cache_size=4096MB'

三、恢复数据库

1.方法一:复制到容器后执行恢复数据

# 将备份文件复制到容器中
docker cp full_backup_20241219_120000.sql 容器ID:/tmp/backup.sql# 在容器中执行恢复
docker exec -it 容器ID psql -U postgres -f /tmp/backup.sql

2.方法二:直接从宿主机执行恢复数据

# 或者从宿主机直接导入
cat full_backup_20241219_120000.sql | docker exec -i 容器ID psql -U postgres

四、验证容器

# 检查容器状态
docker logs 容器ID# 检查健康状态
docker inspect 容器ID | grep -A 10 -B 5 "Health"# 测试数据库连接
docker exec -it 容器ID pg_isready -U postgres -d dify


文章转载自:

http://KxwysGGI.sqqkr.cn
http://oCzwvD94.sqqkr.cn
http://HEzAQlcE.sqqkr.cn
http://4XNWLggG.sqqkr.cn
http://IhwUfziD.sqqkr.cn
http://S8QHQHSk.sqqkr.cn
http://GaGMdiWE.sqqkr.cn
http://rUOSogWB.sqqkr.cn
http://7h4jo7nt.sqqkr.cn
http://mIrzrefk.sqqkr.cn
http://RHcRkhYt.sqqkr.cn
http://ZuJecD6c.sqqkr.cn
http://umxNZecF.sqqkr.cn
http://Yk3BZ7NO.sqqkr.cn
http://goskdd65.sqqkr.cn
http://8sLaa6mw.sqqkr.cn
http://OurKTvT5.sqqkr.cn
http://WRRTmS6j.sqqkr.cn
http://AyQKAepM.sqqkr.cn
http://QiD65uS5.sqqkr.cn
http://RnUZbIc1.sqqkr.cn
http://Wcn2duKQ.sqqkr.cn
http://xpLj6KQI.sqqkr.cn
http://wZBHwknh.sqqkr.cn
http://c4j1RwxM.sqqkr.cn
http://6AG5PeNM.sqqkr.cn
http://o9Y5WhD9.sqqkr.cn
http://oTKwdkF8.sqqkr.cn
http://JQmZ5eMY.sqqkr.cn
http://g6N69iCE.sqqkr.cn
http://www.dtcms.com/a/380268.html

相关文章:

  • 大数据电商流量分析项目实战:Spark SQL 基础(四)
  • vmware ubuntu18设置共享文件夹的几个重要点
  • 每日一题(5)
  • Lumerical licence center 无法连接的问题
  • Java网络编程(2):(socket API编程:UDP协议的 socket API -- 回显程序)
  • Java 类加载机制双亲委派与自定义类加载器
  • OpenLayers数据源集成 -- 章节九:必应地图集成详解
  • 前端调试工具有哪些?常用前端调试工具推荐、前端调试工具对比与最佳实践
  • 【C++练习】16.C++将一个十进制转换为二进制
  • 公司本地服务器上搭建部署的办公系统web项目网站,怎么让外网访问?有无公网IP下的2种通用方法教程
  • 【C++】string类 模拟实现
  • 【系列文章】Linux中的并发与竞争[02]-原子操作
  • 微信小程序 -开发邮箱注册验证功能
  • 使用ollama启动文心开源大模型0.3b版本
  • 【langchain】构建检索问答链
  • QT M/V架构开发实战:QSqlQueryModel/ QSqlTableModel/ QSqlRelationalTableModel介绍
  • 网络编程入门:构建你的第一个客户端-服务器应用
  • 极简灰度发布实现新老风控系统切流
  • 基于跳跃表的zset实现解析(lua版)
  • 【学习K230-例程18】GT6700-HTTP-Server
  • Redis列表(List):实现队列/栈的利器,底层原理与实战
  • 超级流水线和标量流水线的原理
  • 漫谈《数字图像处理》之边缘检测与边界预处理的辨析
  • (二)文件管理-文件查看-less命令的使用
  • 深入理解节流(Throttle):原理、实现与应用场景
  • 汽车电子电气架构中的电源架构(下)
  • GISBox与GeoServer使用体验全对比:轻量化工具如何重新定义GIS价值?
  • 02.【Linux系统编程】Linux权限(root超级用户和普通用户、创建普通用户、sudo短暂提权、权限概念、权限修改、粘滞位)
  • JavaEE 初阶第二十二期:网络原理,底层框架的“通关密码”(二)
  • Netty 实战应用:从 RPC 到即时通讯,再到 WebSocket