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

每天10分钟学会OceanBase系列(Day 11):备份与恢复,给数据上一道“保险”

昨天我们让SQL“跑”起来了,但作为DBA,心里还缺块石头——万一误删了数据,或者磁盘坏了怎么办?今天我们就来掌握OceanBase的“后悔药”:备份与恢复

核心概念:Paxos保不丢,备份防误删

很多新手有个误区:“OceanBase有三副本,数据不会丢,是不是就不用备份了?”

大错特错!Paxos协议保证的是硬件故障时数据不丢(RPO=0),但它防不住人为误操作(比如DROP TABLEDELETE忘加WHERE)。一旦误删,三副本会瞬间同步删除,这时候只有备份能救你。

一、备份配置及操作

1. 前置检查

-- 确认当前租户和权限(需在 sys 租户执行) SELECT TENANT_NAME, TENANT_ID, TENANT_TYPE FROM oceanbase.DBA_OB_TENANTS; -- 查看当前备份相关参数 SHOW PARAMETERS LIKE 'backup%' TENANT = 'sys'; SHOW PARAMETERS LIKE 'log_archive%' TENANT = 'sys';

2. 生产环境推荐配置(OSS 为例)

-- ========== 在 sys 租户下执行 ========== -- 1. 设置数据备份目的端(OSS) ALTER SYSTEM SET backup_dest = 'oss://your-bucket/backup?host=oss-cn-hangzhou-internal.aliyuncs.com&access_id=LTAIxxxxxx&access_key=yyyyyyyy'; -- 2. 设置日志备份目的端(可以与数据备份同一路径,建议分开) ALTER SYSTEM SET log_archive_dest = 'oss://your-bucket/archivelog?host=oss-cn-hangzhou-internal.aliyuncs.com&access_id=LTAIxxxxxx&access_key=yyyyyyyy'; -- 3. 设置定时全量数据备份(每天凌晨2点) ALTER SYSTEM SET backup_data_trigger = '0 2 * * *'; -- 4. 设置备份保留策略(保留7天,自动清理过期备份) ALTER SYSTEM SET backup_recovery_window = '7d'; -- 5. 开启日志备份(PITR 必须) ALTER SYSTEM ARCHIVELOG; -- 6. 手动触发一次全量备份(验证配置) ALTER SYSTEM BACKUP DATABASE;

3. 本地路径配置(测试/开发环境)

-- 数据备份路径 ALTER SYSTEM SET backup_dest = 'file:///data/ob_backup/data'; -- 日志备份路径 ALTER SYSTEM SET log_archive_dest = 'file:///data/ob_backup/archivelog'; -- 其余配置同上 ALTER SYSTEM SET backup_data_trigger = '0 2 * * *'; ALTER SYSTEM SET backup_recovery_window = '7d'; ALTER SYSTEM ARCHIVELOG; ALTER SYSTEM BACKUP DATABASE;

4. 配置验证

-- 查看备份参数 SHOW PARAMETERS LIKE 'backup_dest'; SHOW PARAMETERS LIKE 'log_archive_dest'; SHOW PARAMETERS LIKE 'backup_data_trigger'; -- 查看日志归档状态 SELECT * FROM oceanbase.CDB_OB_ARCHIVELOG_SUMMARY; -- 查看数据备份任务 SELECT * FROM oceanbase.CDB_OB_BACKUP_TASK; -- 查看备份集详情 SELECT * FROM oceanbase.CDB_OB_BACKUP_SET_DETAILS ORDER BY BACKUP_SET_ID DESC; -- 查看备份进度(实时) SELECT * FROM oceanbase.CDB_OB_BACKUP_PROGRESS;

5. 10分钟实操:配置一次自动备份

OceanBase的备份分为数据备份日志备份,建议两者都开启。我们以最简单的本地NFS或OSS为例,这里演示配置数据备份

-- 1. 设置备份目的端(以本地路径为例,生产建议用OSS/NFS) ALTER SYSTEM SET backup_dest = 'file:///data/ob_backup'; -- 2. 开启数据备份(每天凌晨2点自动执行) ALTER SYSTEM SET backup_data_trigger = '0 2 * * *'; -- 3. 手动触发一次全量备份(立即执行,不等定时) ALTER SYSTEM BACKUP DATABASE;

查看备份进度:

-- 查看备份任务状态 SELECT job_id, status, start_time, end_time, result FROM oceanbase.CDB_OB_BACKUP_JOBS ORDER BY start_time DESC LIMIT 1;

二、PITR 时间点恢复操作

前提条件

  1. 已有全量数据备份(Backup Set)

  2. 日志备份已开启且连续(无断档)

  3. 知道要恢复到的精确时间点

恢复流程

-- ========== Step 1: 确认可恢复的时间范围 ========== -- 查看所有备份集 SELECT BACKUP_SET_ID, BACKUP_TYPE, STATUS, START_TIME, END_TIME, MIN_RESTORE_SCN, MAX_RESTORE_SCN FROM oceanbase.CDB_OB_BACKUP_SET_DETAILS ORDER BY BACKUP_SET_ID DESC; -- 查看日志备份时间范围 SELECT DEST_ID, ROUND_ID, MIN_FIRST_TIME, MAX_NEXT_TIME, STATUS FROM oceanbase.CDB_OB_ARCHIVELOG_SUMMARY; -- ========== Step 2: 在目标租户执行恢复(以恢复到新租户为例) ========== -- 方式一:恢复到新租户(推荐,不影响原租户) -- 先创建空租户 CREATE TENANT IF NOT EXISTS tenant_recover PRIMARY_ZONE='zone1', LOCALITY='F@zone1' SET VARIABLES ob_tcp_invited_nodes='%'; -- 执行恢复(指定时间点) ALTER SYSTEM RESTORE TENANT tenant_recover FROM 'oss://your-bucket/backup?host=oss-cn-hangzhou-internal.aliyuncs.com&access_id=LTAIxxxxxx&access_key=yyyyyyyy' UNTIL TIME '2026-07-06 08:00:00'; -- ========== Step 3: 监控恢复进度 ========== -- 查看恢复任务 SELECT * FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_NAME = 'tenant_recover'; -- 查看恢复进度详情 SELECT * FROM oceanbase.CDB_OB_RESTORE_PROGRESS; -- 查看恢复历史 SELECT * FROM oceanbase.CDB_OB_RESTORE_HISTORY ORDER BY START_TIME DESC; -- ========== Step 4: 恢复完成后验证 ========== -- 切换到恢复后的租户验证数据 -- obclient -h127.0.0.1 -P2883 -uroot@tenant_recover#cluster_name -p -- 确认数据正确后,可重命名租户或做数据迁移

原地恢复(覆盖原租户)⚠️ 危险操作

-- 停止业务写入 -- 删除原租户(会丢失删除后的所有数据!) DROP TENANT tenant_name FORCE; -- 从备份恢复(恢复到原租户名) ALTER SYSTEM RESTORE TENANT tenant_name FROM 'oss://your-bucket/backup?host=...' UNTIL TIME '2026-07-06 08:00:00';

三、生产环境监控脚本(Bash)

#!/bin/bash # ob_backup_monitor.sh - OceanBase 备份监控 OB_CLUSTER="your_cluster" ALERT_WEBHOOK="https://oapi.dingtalk.com/robot/send?access_token=xxx" # 检查最近备份状态 check_backup() { result=$(obclient -h127.0.0.1 -P2883 -uroot@sys#${OB_CLUSTER} -e " SELECT BACKUP_SET_ID, STATUS, END_TIME FROM oceanbase.CDB_OB_BACKUP_SET_DETAILS ORDER BY BACKUP_SET_ID DESC LIMIT 1; " 2>/dev/null) if echo "$result" | grep -q "FAILED"; then send_alert "OceanBase备份失败" "最近备份状态: FAILED\n$result" elif echo "$result" | grep -q "COMPLETED"; then last_time=$(echo "$result" | grep COMPLETED | awk '{print $3}') echo "备份正常,最近完成时间: $last_time" else send_alert "OceanBase备份异常" "无法获取备份状态" fi } # 检查日志归档状态 check_archivelog() { result=$(obclient -h127.0.0.1 -P2883 -uroot@sys#${OB_CLUSTER} -e " SELECT STATUS FROM oceanbase.CDB_OB_ARCHIVELOG_SUMMARY LIMIT 1; " 2>/dev/null) if ! echo "$result" | grep -q "DOING\|READY"; then send_alert "OceanBase日志归档异常" "当前状态: $result" fi } # 发送告警 send_alert() { title=$1 content=$2 curl -s -X POST "$ALERT_WEBHOOK" \ -H "Content-Type: application/json" \ -d "{\"msgtype\":\"text\",\"text\":{\"content\":\"【告警】$title\n$content\"}}" } # 执行检查 check_backup check_archivelog

💡 恢复实战:误删表怎么办?

假设你手滑执行了DROP TABLE t_order;,别慌,按以下步骤恢复:

  1. 确认备份集:找到误操作前最近的一次成功备份。

  2. 执行恢复

    -- 恢复到指定时间点(精确到秒) RECOVER TENANT my_tenant UNTIL TIME '2026-07-05 10:30:00';
  3. 验证数据:恢复完成后,重新登录my_tenant,检查t_order是否回来。

⚠️ 生产环境避坑指南

  1. 备份与业务分离:备份目的端绝对不能和数据库数据盘在同一块物理磁盘上,否则磁盘坏了备份也没了。
  2. 定期恢复演练:备份不是目的,能恢复才是目的。建议每月做一次恢复演练,验证备份文件的完整性。
  3. 日志备份不能停:数据备份是“快照”,日志备份是“流水”。只有两者配合,才能实现任意时间点恢复(PITR)

今日小结

今天我们给OceanBase上了“保险”。记住:Paxos是安全带,备份是安全气囊,两者缺一不可。配置好自动备份,今晚才能睡个安稳觉。

💡 课后思考

如果我想恢复单张表而不是整个租户,OceanBase支持吗?如果支持,语法是什么?(提示:OceanBase 4.x 引入了表级恢复特性。)

http://www.jsqmd.com/news/1137753/

相关文章:

  • RHCE实验环境搭建:1台主机同时配置HTTPS网站与DHCP服务器的3个关键点
  • ASM330LHH与STM32L4S5ZI的硬件协同设计与运动跟踪算法
  • RevokeMsgPatcher 2.1:Windows平台企业级消息保留解决方案深度解析
  • 桌面端自动化测试框架设计:从分层架构到AI辅助的工程实践
  • OpenCV 4.x 人脸识别:3种算法(EigenFace/FisherFace/LBPH)在ORL数据集上的准确率对比
  • 终极网页资源批量下载指南:如何一键保存所有网站素材?
  • JS逆向实战:从抓包到Python复现,破解莫莫铺子sign签名算法
  • YAAW for Chrome:终极Aria2可视化下载管理完全指南
  • 负指数二项式展开:从组合数 (n k) 到 (-n k) 的 3 步推导与代码验证
  • 免费开源卡拉OK游戏UltraStar Deluxe:在家享受专业K歌体验的完整指南 [特殊字符]
  • Spring框架安全漏洞应急响应:从官方公告到实战修复的完整指南
  • Ubuntu 22.04 无头服务器 GPU 风扇控制:coolgpus 脚本 3 步部署与 systemd 服务配置
  • Obi Fluid v4.0.2 实战:Unity 2022.3 实现复杂管道流体交互(附3个关键参数)
  • UE4 HISM 与 ISM 性能对比:10万实例下 DrawCall 与帧率实测分析
  • Plone迁移实战:Django与Wagtail技术底座重构指南
  • 无线信道衰落模型对比:瑞利、莱斯、AWGN 3种模型适用场景与MATLAB仿真误差分析
  • 如何构建多平台音乐聚合系统:洛雪音乐聚合音源技术深度解析
  • Scikit-learn 1.4.2 实战:3类线性模型在Kaggle房价预测中的MAE/RMSE对比
  • GA事件100%采集方案:IndexedDB+Cloudflare Worker四层防御架构
  • Linux 文件描述符泄漏排查:从 /proc/<pid>/fd 分析到 lsof 命令的 5 步定位法
  • Control Rig vs Additive动画:3个维度对比UE5角色受击方案性能与灵活性
  • Windows 10 蓝屏分析实战:WinDbg 定位 condrv.sys 空指针访问(附完整 POC)
  • 微信取证 v8.0.47:3种账号标识(wxid_/微信号/昵称)的数据库定位与解析
  • AWS Well-Architected自评估:架构健康体检而非KPI考核
  • 移动硬盘 Ubuntu 22.04 即插即用:3步配置实现跨电脑启动引导
  • LlamaIndex 0.10.12 构建《The World House》知识库:5步实现语义检索与主题分析
  • 一文讲透 Agent Skill 的原理与实践
  • 3分钟GPU显存稳定性检测:你的显卡真的健康吗?
  • Alpine Linux 3.19 部署 Xfce 4.18:3步配置中文环境与字体,解决乱码问题
  • Halcon 深度学习目标检测:3种常见报错(CUDA OOM/标注不匹配/推理异常)排查指南