侧边栏壁纸
博主头像
CYC的个人博客博主等级

学习使人进步

  • 累计撰写 107 篇文章
  • 累计创建 13 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

阿里OceanBase备份与恢复

Administrator
2025-10-16 / 0 评论 / 0 点赞 / 11 阅读 / 4198 字

阿里OceanBase备份与恢复

backup.sh,备份脚本

#!/bin/bash
 
# 配置参数
OB_USER="root"
OB_PASS="Hb11111111!"
OB_HOST="192.168.1.110"
OB_PORT="3306"
OB_TENANT="easygashbst"
BACKUP_DIR="/data/nfs/backup/"
DATE=$(date +%Y%m%d)
LOG_FILE="$BACKUP_DIR$DATE/backup_$DATE.log"
Status='';

# 创建备份目录(如果不存在)
mkdir -p $BACKUP_DIR$DATE
# 执行备份命令
#obclient -h 192.168.1.110 -P 3306 -u root@easygashbst -pHb11111111! -e SELECT `STATUS` FROM DBA_OB_ARCHIVELOG
#执行备份命令, 这里需要根据具体需求调整命令,先停止归档日志在修改归档日志路径
wait

while true
do
Status=$(obclient -h $OB_HOST -P $OB_PORT -u $OB_USER@$OB_TENANT -p$OB_PASS -o oceanbase -e "SELECT STATUS FROM DBA_OB_ARCHIVELOG" |sed '1d')

if [ "$Status" = "STOP" ];
then
  echo "日志归档停止状态"
  echo "即将执行开始执行备份"
rm -rf $BACKUP_DIR$DATE/*
# 创建备份目录(如果不存在)
mkdir -p $BACKUP_DIR$DATE/archive
mkdir -p $BACKUP_DIR$DATE/data
chmod -R 777 $BACKUP_DIR

obclient -h $OB_HOST -P $OB_PORT -u $OB_USER@$OB_TENANT -p$OB_PASS <<EOF
ALTER SYSTEM SET LOG_ARCHIVE_DEST='LOCATION=file://$BACKUP_DIR$DATE/archive';
ALTER SYSTEM ARCHIVELOG;
EOF
echo "等待进程"
sleep 30

Status=$(obclient -h $OB_HOST -P $OB_PORT -u $OB_USER@$OB_TENANT -p$OB_PASS -o oceanbase -e "SELECT STATUS FROM DBA_OB_ARCHIVELOG" |sed '1d') 
if [ "$Status" = "DOING" ];
then 
echo "开始执行备份" 
obclient -h $OB_HOST -P $OB_PORT -u $OB_USER@$OB_TENANT -p$OB_PASS <<EOF
ALTER SYSTEM SET DATA_BACKUP_DEST='file://$BACKUP_DIR$DATE/data';
ALTER SYSTEM BACKUP DATABASE;
EOF
fi
break;
else

echo "关闭归档日志" 
obclient -h $OB_HOST -P $OB_PORT -u $OB_USER@$OB_TENANT -p$OB_PASS <<EOF
ALTER SYSTEM noARCHIVELOG;
EOF
echo "等待进程"
sleep 30

rm -rf $BACKUP_DIR$DATE/*
mkdir -p $BACKUP_DIR$DATE/archive
mkdir -p $BACKUP_DIR$DATE/data
chmod -R 777 $BACKUP_DIR

Status=$(obclient -h $OB_HOST -P $OB_PORT -u $OB_USER@$OB_TENANT -p$OB_PASS -o oceanbase -e "SELECT STATUS FROM DBA_OB_ARCHIVELOG" |sed '1d')
if [ "$Status" = "STOP" ];
then
echo "日志归档停止状态"
echo "即将执行开始执行备份"
obclient -h $OB_HOST -P $OB_PORT -u $OB_USER@$OB_TENANT -p$OB_PASS <<EOF
ALTER SYSTEM SET LOG_ARCHIVE_DEST='LOCATION=file://$BACKUP_DIR$DATE/archive';
ALTER SYSTEM ARCHIVELOG;
EOF
echo "等待进程"
sleep 30
fi

Status=$(obclient -h $OB_HOST -P $OB_PORT -u $OB_USER@$OB_TENANT -p$OB_PASS -o oceanbase -e "SELECT STATUS FROM DBA_OB_ARCHIVELOG" |sed '1d') 
if [ "$Status" = "DOING" ];
then 
echo "开始执行备份" 
obclient -h $OB_HOST -P $OB_PORT -u $OB_USER@$OB_TENANT -p$OB_PASS <<EOF
ALTER SYSTEM SET DATA_BACKUP_DEST='file://$BACKUP_DIR$DATE/data';
ALTER SYSTEM BACKUP DATABASE;
EOF
break;
fi

fi
done
wait


# 检查备份是否成功
if [ $? -eq 0 ]; then
    echo "Backup successful: $BACKUP_DIR$DATE" | tee -a $LOG_FILE
else
    echo "Backup failed: Check logs for details." | tee -a $LOG_FILE
fi


恢复数据库实例

以下为完整的过程介绍和解释,脚本备份忽略步骤一、步骤2

步骤一:发起日志归档
1.oracle_test 租户的租户管理员登录数据库。

2.执行以下命令,配置归档目的端。

obclient> ALTER SYSTEM SET LOG_ARCHIVE_DEST='LOCATION=file:///data/nfs/backup/archive';
3.开启日志归档模式。

obclient> ALTER SYSTEM ARCHIVELOG;
4.确认日志归档状态是否为 DOING。仅当日志归档状态为 DOING,才能发起数据备份。

obclient> SELECT * FROM DBA_OB_ARCHIVELOG\G

从查询结果中可知,日志归档状态 STATUS 为 DOING。



步骤二:发起数据备份
确认日志归档状态为 DOING 后,即可发起数据备份。

oracle_test 租户的租户管理员登录数据库。

执行以下命令,配置备份目的端。

obclient> ALTER SYSTEM SET DATA_BACKUP_DEST='file:///data/nfs/backup/data';
发起全量数据备份。

obclient> ALTER SYSTEM BACKUP DATABASE;
等待数据备份结束。

可以查询视图 DBA_OB_BACKUP_TASKS,如果查询出来的任务列表为空,则表示数据备份结束。

obclient> SELECT * FROM DBA_OB_BACKUP_TASKS;
查看数据备份结果。

obclient> SELECT * FROM DBA_OB_BACKUP_JOB_HISTORY;




步骤三:执行物理恢复
使用 root 用户登录目标租户所在集群的 sys 租户。

创建目标租户所需的资源。

创建资源单元 unit_backup。

obclient> CREATE RESOURCE UNIT unit_backup MAX_CPU 8, MEMORY_SIZE = '16G', MAX_IOPS 10240, MIN_IOPS=10240;
创建目标租户所使用的资源池,建议尽量与源租户保持同构,即资源池中 UNIT_NUM 的个数与源租户相同。

obclient> CREATE RESOURCE POOL restore_pool UNIT = 'unit_backup', UNIT_NUM = 1, ZONE_LIST = ('z1');
执行物理恢复,恢复出新租户 oracle_backup。

obclient> ALTER SYSTEM RESTORE oracle_backup FROM 'file:///data/nfs/backup/data,file:///data/nfs/backup/archive' WITH 'pool_list=restore_pool&locality=F@z1';


0

评论区