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

五分钟完成PolarDB替换postgresql

前提:内网项目,无互联网环境,当前操作系统:Centos7.6

1.离线安装docker(如果已有docker可跳过)
(1)将docker的压缩包传入服务器,并解压

tar -zxvf docker-18.06.3-ce.tgz

(2)将解压内容复制到/usr/bin/下

cp docker/* /usr/bin/

(3)创建docker服务

vi /etc/systemd/system/docker.service

输入以下内容

[Unit]

Description=Docker Application Container Engine

Documentation=https://docs.docker.com

After=network-online.target firewalld.service

Wants=network-online.target

[Service]

Type=notify

ExecStart=/usr/bin/dockerd

ExecReload=/bin/kill -s HUP $MAINPID

TimeoutSec=0

RestartSec=2

ExecStartPost=/usr/sbin/iptables -P FORWARD ACCEPT

Restart=always

TimeoutStartSec=0

LimitNOFILE=infinity

LimitNPROC=infinity

LimitCORE=infinity

Delegate=yes

KillMode=process

StartLimitBurst=3

StartLimitInterval=60s

[Install]

WantedBy=multi-user.target

(4)保存后依次执行以下命令

systemctl daemon-reload

systemctl start docker

systemctl enable docker

systemctl status docker

2.运行PolarDB容器
(1)将打包好的镜像传入服务器,并引入

docker load < polardb.tar

(2)执行docker run命令

docker run -d \

  --cap-add=SYS_PTRACE \

  --privileged=true \

  --restart=always \

  --name polardb_container \

  --env POLARDB_PORT=5432 \

  --env POLARDB_USER=postgres \

  --env POLARDB_PASSWORD=postgres \

  -p 5432:5432 \

  polardb/polardb_pg_local_instance:11.9.20.0

3.设置数据库定时备份,以及测试恢复数据库功能
(1)新建存放备份内容的文件夹

mkdir -p /polar_backup/backup

mkdir -p /polar_backup/backup_log

(2)编写备份脚本

vi /polar_backup/db_backup.sh

输入以下内容

#!/bin/bash
# === 配置部分 ===
CONTAINER_NAME="polardb_container"              # 容器名称
DB_NAME="postgres"                                 # 数据库名称
DB_USER="postgres"                               # 数据库用户名
BACKUP_DIR="/polar_backup/backup"                  # 宿主机备份目录
RETENTION_DAYS=30                                # 保留天数
# === 生成备份文件名 ===
TIMESTAMP=$(date +"%Y%m%d_%H%M")
BACKUP_FILE="${DB_NAME}_${TIMESTAMP}.backup"
CONTAINER_PATH="/tmp/${BACKUP_FILE}"
# === 创建宿主机备份目录(如不存在) ===
mkdir -p "$BACKUP_DIR"
# === 执行数据库备份 ===
echo "Starting backup of database '${DB_NAME}' from container '${CONTAINER_NAME}'..."
docker exec "$CONTAINER_NAME" mkdir -p /var/polardb_backup
docker exec "$CONTAINER_NAME" pg_dump -U "$DB_USER" -F c -b -v -f "$CONTAINER_PATH" "$DB_NAME"
if [ $? -ne 0 ]; then
  echo "❌ Backup failed."
  exit 1
fi
# === 拷贝备份文件到宿主机 ===
docker cp "${CONTAINER_NAME}:${CONTAINER_PATH}" "${BACKUP_DIR}/${BACKUP_FILE}"
if [ $? -eq 0 ]; then
  echo "✅ Backup successful: ${BACKUP_DIR}/${BACKUP_FILE}"
else
  echo "❌ Failed to copy backup file to host."
  exit 1
fi
# === 清理超过指定天数的旧备份 ===
echo "     Cleaning up backups older than ${RETENTION_DAYS} days..."
find "$BACKUP_DIR" -name "${DB_NAME}_*.backup" -type f -mtime +${RETENTION_DAYS} -exec rm -f {} \;
echo "✅ Cleanup complete."

(3)给脚本赋权

chmod +x /polar_backup/db_backup.sh

可以执行sh  /polar_backup/db_backup.sh 测试一下脚本

(4)设置每日定时

执行命令 crontab -e

在里面输入
0 2 * * * /polar_backup/db_backup.sh >> /polar_backup/backup_log/backup_log.txt 2>&1

意思是每天凌晨两点执行,备份的日志保存到polar_backup下的backup_log中

(5)恢复备份内容脚本

vi /polar_backup/db_restore.sh

输入以下内容

#!/bin/bash
# === Config===
CONTAINER_NAME="polardb_container"
DB_NAME="postgres"
DB_USER="postgres"
BACKUP_DIR="/polar_backup/backup"
BACKUP_FILE="$1"
if [ -z "$BACKUP_FILE" ]; then
  echo "please input your backup file name:for example"
  echo "   ./restore_yczhdb.sh yczhdb_20250519_1414.backup"
  exit 1
fi
HOST_BACKUP_PATH="${BACKUP_DIR}/${BACKUP_FILE}"
CONTAINER_BACKUP_PATH="/tmp/${BACKUP_FILE}"
# === check file is exist===
if [ ! -f "$HOST_BACKUP_PATH" ]; then
  echo "cannot find file:$HOST_BACKUP_PATH"
  exit 1
fi
# === copy to docker ===
echo "copy to docker..."
docker cp "$HOST_BACKUP_PATH" "${CONTAINER_NAME}:${CONTAINER_BACKUP_PATH}"
echo "restore db ${DB_NAME}..."
docker exec -i "$CONTAINER_NAME" pg_restore -U "$DB_USER" -d "$DB_NAME" --clean --verbose "$CONTAINER_BACKUP_PATH"
if [ $? -eq 0 ]; then
  echo "database ${DB_NAME} restore from ${BACKUP_FILE} successfly"
else
  echo "restore fail"
  exit 1
fi

给脚本赋权 chmod +x /polar_backup/db_restore.sh

需要恢复时,执行命令sh /polar_backup/db_restore.sh postgres_20250519_1435.backup即可

后续有空再写每个操作的详细说明,以及需要用的文件

http://www.xdnf.cn/news/7258.html

相关文章:

  • codeup添加流水线docker自动化部署
  • 初识MySQL · 索引
  • Text2SQL在Spark NLP中的实现与应用:将自然语言问题转换为SQL查询的技术解析
  • spring中的EnvironmentPostProcessor接口详解
  • 小乌龟git中的推送账户、作者账户信息修改
  • C#:多线程
  • 关于百度地图JSAPI自定义标注的图标显示不完整的问题(其实只是因为图片尺寸问题)
  • 2025.5.19总结
  • 使用 Qt QGraphicsView/QGraphicsScene 绘制色轮
  • k8s集成环境中pod运行的容器退出码141故障解决方案及排查方向,其他退出码也可以参考此篇
  • Linux内核深入学习(4)——内核常见的数据结构2——红黑树
  • 多模态大语言模型arxiv论文略读(八十三)
  • 云原生时代的系统可观测性:理念变革与实践体系
  • SpringCloud——EureKa
  • DeerFlow安装配置及使用案例
  • 黑马程序员C++2024新版笔记 第三章 数组
  • 一、内存调优
  • elasticsearch之记录es7.17升级8.17 springboot2.7.0 程序改造坑
  • Spring Boot与Kafka集成实践:从入门到实战
  • LLM最后怎么输出值 解码语言模型:从权重到概率的奥秘
  • 理解硬链接和软链接:原理与实践
  • 教学网站1:《软件工程》精品课程教学网站的设计与实现(摘要和目录)
  • PLC双人舞:profinet转ethernet ip网关奏响施耐德与AB的协奏曲
  • MYSQL笔记
  • virtual下Ubuntu24.04版本上配置网络与外网和宿主机之间互通
  • iOS 蓝牙开发中的 BT 与 BLE
  • 2025毕业论文与答辩资料精选汇总
  • 32、跨平台咒语—— React Native初探
  • 已知6、7、8月月平均气温和标准差,求夏季季平均温度与标准差
  • 算法题(150):拼数