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

发布时间:2026/7/6 23:27:19
每天10分钟学会OceanBase系列(Day 11):备份与恢复,给数据上一道“保险” 昨天我们让SQL“跑”起来了但作为DBA心里还缺块石头——万一误删了数据或者磁盘坏了怎么办今天我们就来掌握OceanBase的“后悔药”备份与恢复。核心概念Paxos保不丢备份防误删很多新手有个误区“OceanBase有三副本数据不会丢是不是就不用备份了”大错特错Paxos协议保证的是硬件故障时数据不丢RPO0但它防不住人为误操作比如DROP TABLE或DELETE忘加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?hostoss-cn-hangzhou-internal.aliyuncs.comaccess_idLTAIxxxxxxaccess_keyyyyyyyyy; -- 2. 设置日志备份目的端可以与数据备份同一路径建议分开 ALTER SYSTEM SET log_archive_dest oss://your-bucket/archivelog?hostoss-cn-hangzhou-internal.aliyuncs.comaccess_idLTAIxxxxxxaccess_keyyyyyyyyy; -- 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 时间点恢复操作前提条件已有全量数据备份Backup Set日志备份已开启且连续无断档知道要恢复到的精确时间点恢复流程-- 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_ZONEzone1, LOCALITYFzone1 SET VARIABLES ob_tcp_invited_nodes%; -- 执行恢复指定时间点 ALTER SYSTEM RESTORE TENANT tenant_recover FROM oss://your-bucket/backup?hostoss-cn-hangzhou-internal.aliyuncs.comaccess_idLTAIxxxxxxaccess_keyyyyyyyyy 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 -uroottenant_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_CLUSTERyour_cluster ALERT_WEBHOOKhttps://oapi.dingtalk.com/robot/send?access_tokenxxx # 检查最近备份状态 check_backup() { result$(obclient -h127.0.0.1 -P2883 -urootsys#${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 -urootsys#${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;别慌按以下步骤恢复确认备份集找到误操作前最近的一次成功备份。执行恢复-- 恢复到指定时间点精确到秒 RECOVER TENANT my_tenant UNTIL TIME 2026-07-05 10:30:00;验证数据恢复完成后重新登录my_tenant检查t_order是否回来。⚠️ 生产环境避坑指南备份与业务分离备份目的端绝对不能和数据库数据盘在同一块物理磁盘上否则磁盘坏了备份也没了。定期恢复演练备份不是目的能恢复才是目的。建议每月做一次恢复演练验证备份文件的完整性。日志备份不能停数据备份是“快照”日志备份是“流水”。只有两者配合才能实现任意时间点恢复PITR。今日小结今天我们给OceanBase上了“保险”。记住Paxos是安全带备份是安全气囊两者缺一不可。配置好自动备份今晚才能睡个安稳觉。 课后思考如果我想恢复单张表而不是整个租户OceanBase支持吗如果支持语法是什么提示OceanBase 4.x 引入了表级恢复特性。