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

五分钟完成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.dtcms.com/a/199719.html

相关文章:

  • paddle ocr本地化部署进行文字识别
  • 基于Elasticsearch的搜索引擎简介
  • 为 Windows 和 Ubuntu 中设定代理服务器的详细方法
  • 区块链blog2_中心化与效率
  • 解决软件连接RabbitMQ突发System.IO.IOException: 无法从传输连接中读取数据: 远程主机强迫关闭了一个现有的连接异常
  • VR 互动实训的显著优势​
  • 一文了解VR拍摄制作
  • 江协科技EXTI外部中断hal库实现
  • HarmonyOS开发样式布局
  • Ubuntu ping网络没有问题,但是浏览器无法访问到网络
  • 从零开始训练一个CLIP
  • Tare使用MCP|Win11安装UV
  • Milvus 从 v2.4.12 升级到 v2.5.11 的实施方案
  • FART 自动化脱壳框架简介与脱壳点的选择
  • 【Linux】守护进程
  • 人工智能100问☞第27问:神经网络与贝叶斯网络的关系?
  • 【Spring Boot后端组件】SpringMVC介绍及使用
  • 数据库管理工具(Navicate,DBeaver,HeidiSQL等)
  • 解决 MySQL 错误 1356 (HY000)
  • uniapp-商城-62-后台 商品列表(分类展示商品的布局)
  • uniapp自用辅助类小记
  • 我的食物信使女友
  • 如何git clone下来自定义文件名
  • 部署java项目
  • kafka 问与答
  • 应对WEEE 2025:猎板PCB的区块链追溯与高温基材创新
  • 基于小波包神经网络和D-S理论的滚动轴承故障诊断方法
  • sqli-labs第九关—‘时间盲注
  • 文件夹如何打包成jar包
  • Go语言数组的定义与操作 - 《Go语言实战指南》