人大金仓数据库异地备份 docker

人大金仓数据库异地备份

单机数据库节点和 REPO 备份服务器节点。备份服务器是一个单独的物理设备,相对独立,具有较高 的冗余度,备份不会随着数据库节点故障而失效。

目录层级介绍

./kingbase_back
    ├──────data 数据库安装完成后挂载出来的文件,备份文件存放位置
    ├──────back
               ├───ksql_backup
                         ├─────dbback.sh  备份脚本
               ├───ksql_restore
                         ├─────db_restore.sh 还原脚本
    ├──────images     
                ├────镜像文件              
    ├──────db_install_server.sh 安装脚本  执行脚本后会将back文件夹复制到data目录     
    ├──────docker-compose.yml
1 环境准备
1.1 数据库备份环境准备

REPO 节点(备份服务器,需要安装docker及docker-compose)的搭建采用docker方式安装 KingbaseES 软件。

上传【kingbase_back】至服务器【/usr/local/run/】目录下,进入【kingbase_back】目录
在这里插入图片描述

# 授权
chmod +x *.sh
# 安装备份容器
./db_install_server.sh

在这里插入图片描述
在这里插入图片描述

db_install_server.sh文件内容

#!/bin/bash

# 设定变量
Path="/usr/local"

#容器中参数
DB_USER="postgres"
DB_PORT="54321"
DB_NAME="kingbase"

# 设置错误处理
set -e
set -u  

# 装载数据库镜像
echo "-----装载数据库镜像..."
docker load < "images/kingbase_v008r006c008b0014_single_arm_v1.tar"

cd "$Path/kingbase_back"
# 安装服务
echo "-----安装服务开始..."

docker-compose  up -d

sleep 5

# 移动备份脚本
cp -r ./back/ ./data 

# 授权可执行权限
find ./data/back -type f -name "*.sh" -exec chmod +x {} \;

# 重启数据库
echo "-----数据库重启中..."
docker restart kingbase_back

# 脚本结束

exit 0

docker-compose.yml 文件内容

version: '3'
services:
  kingbase:
    image: kingbase_v008r006c008b0014_single_arm:v1
    container_name: kingbase_back
    restart: unless-stopped
    privileged: true
    
    volumes:
      - ./data:/home/kingbase/userdata/
      - /etc/localtime:/etc/localtime:ro
    environment:
      # 是否需要配置大小写敏感(yes(默认 大小写不敏感)/no 大小写敏感)
      - ENABLE_CI=no
      # 进入容器后是否启动数据库(yes(默认 启动数据库)/ no(不启动数据库))
      - NEED_START=yes
      - DB_USER=postgres
      - DB_PASSWORD=run@1234
      # 数据库模式: 支持oracle/pg/mysql
      - DB_MODE=pg
    command: /bin/bash
1.2 数据库备份还原免密设置

该操作旨在为数据库备份还原时免除用户手动输入密码

在 KingbaseES 中使用密码配置工具 sys_encpwd 来设置口令密文。将用户的密码以密文形式存在.encpwd 文件中。

# 添加免密信息
docker exec kingbase_back /bin/bash -c "sys_encpwd -H 192.168.0.76 -P 5432 -D ods -U postgres -W run@1234"

# 查看已添加的信息
docker exec kingbase_back /bin/bash -c "cat ~/.encpwd"

参数说明:

-H, --hostname=
主机地址,允许单主机地址匹配和全匹配,全匹配时使用 * 指定
-P, --portnum=
端口号,仅允许单端口匹配
-D, --database=
数据库名,允许单数据库匹配和全匹配,全匹配时使用 * 指定
-U, --user=
用户名,仅允许单用户匹配
-W, --password=
用户对应的密码,仅允许单用户匹配

注意: 当前四个参数输入与原文件中的某一条记录完全相同时,会修改该条记录相应的密码,否则生成一条新的记 录。

2 数据库备份
2.1 修改 备份脚本

进入数据库安装路径下的【data/back/ksql_backup】目录,修改数据库还原脚本中的

修改数据库还原脚本中对应的数据库连接及备份的目标模式

dbback.sh脚本中内容

#!/bin/bash
# 设置变量
# 数据库安装目录容器内路径(无需修改)
kdb_home="/home/kingbase/install/kingbase/bin"
# 容器内备份文件路径(无需修改)
kdbback_dest="/home/kingbase/userdata" 
# 用户名
kdb_user="postgres" 
# 目标端口号
kdb_port="5432"
# 目标ip
kdb_host="192.168.0.76" 
# 目标数据库
database="ods" 
# 目标模式 
schemas=("alm" "alm_yjb" "auth" "base" "config" "ctf" "dqa" "iface" "map" "monitor" "postfix" "sms" "smts" "twznbb" "xxljob" "public")
# 指定保留备份文件的天数
keep_time="7" 

# 备份模式
for schema in "${schemas[@]}"; do
    # 创建模式目录(容器内)
    schema_dir_container="${kdbback_dest}/${database}/${schema}" 
    docker exec kingbase_back mkdir -p "${schema_dir_container}"
	
	log_file="${kdbback_dest}/${database}/sh_log.txt"
	docker exec kingbase_back touch "${log_file}"

    # 备份文件路径(容器内)
	dump_file="${schema_dir_container}/${database}_${schema}_$(date '+%Y%m%d%H%M')"
    # 执行备份命令    
	 docker exec kingbase_back /bin/bash -c "cd ${kdb_home} && ./sys_dump -p ${kdb_port} -U ${kdb_user} -w -h ${kdb_host} -f ${dump_file} -n ${schema} ${database} && echo '模式${schema}备份成功: $(date '+%Y%m%d%H%M%S')' >> ${log_file} || echo '模式${schema}备份失败: $(date '+%Y%m%d%H%M%S')' >> ${log_file}"

	
	# 压缩文件路径(容器内)
    compressed_file="${dump_file}.gz"
    
    # 执行压缩命令
    docker exec kingbase_back gzip "${dump_file}" && echo '模式${schema}压缩成功: $(date '+%Y%m%d%H%M%S')' >> ${log_file} || echo '模式${schema}压缩失败: $(date '+%Y%m%d%H%M%S')' >> ${log_file}
	
done

docker exec kingbase_back find "${kdb_home}" -type f -name "*.gz" -mtime "+${keep_time}" -exec rm -f {} \;


2.3设置定时备份任务

使用linux中的Crontab 工具定时执行数据库备份脚本。
在这里插入图片描述

使用 crontab -e 创建定时任务

crontab -l 查看设置的定时任务

00 01 * * * /usr/local/kingbase_back/data/back/ksql_backup/dbback.sh
3 数据库还原

还原前需要清空并删除表

将备份文件复制到还原脚本所在文件路径使用【gzip -dk】解压文件 并更改解压文件属组
在这里插入图片描述

# 解压备份文件
gzip -dk ods_config_202407121057.gz
# 更改授权文件属组
chown -R 1000:1000 ods_auth_202407121057 ods_config_202407121057

修改还原脚本

在这里插入图片描述
db_restore.sh文件内容

#!/bin/bash
# 设置变量
# 数据库安装目录(无需修改)
kdb_home="/home/kingbase/install/kingbase/bin"
# 指定要还原的备份文件存放路径(无需修改)
backup_path="/home/kingbase/userdata/back/ksql_restore/" 

# 数据库用户名
kdb_user="postgres"
# 数据库端口号
kdb_port="5432"
# 数据库主机IP
kdb_host="192.168.0.74" 
# 还原的数据库名称
database="ods" 
# 指定要还原的备份文件名
backup_files=("ods_auth_202407121057" "ods_config_202407121057" )


# 执行还原操作
#"${kdb_home}/bin/ksql" -U "${kdb_user}" -w -h "${kdb_host}" -p "${kdb_port}" -d "${database}" -f "${backup_path}""${backup_file}"

for backup_file in "${backup_files[@]}"; do
  echo "开始还原文件: ${backup_path}${backup_file}"

  # 执行还原操作
  docker exec kingbase_back /bin/bash -c "cd ${kdb_home} && ksql -U ${kdb_user} -w -h ${kdb_host} -p ${kdb_port} -d ${database} -f ${backup_path}${backup_file}">> restore_log_$(date '+%Y%m%d').txt 2>&1



  if [ $? -ne 0 ]; then

    echo "还原文件 ${backup_path}${backup_file} 失败"

  else

    echo "还原文件 ${backup_path}${backup_file} 成功"

  fi
done

执行./db_restore.sh还原

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值