昨天我们让SQL“跑”起来了,但作为DBA,心里还缺块石头——万一误删了数据,或者磁盘坏了怎么办?今天我们就来掌握OceanBase的“后悔药”:备份与恢复。
核心概念:Paxos保不丢,备份防误删
很多新手有个误区:“OceanBase有三副本,数据不会丢,是不是就不用备份了?”
大错特错!Paxos协议保证的是硬件故障时数据不丢(RPO=0),但它防不住人为误操作(比如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?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 时间点恢复操作
前提条件
已有全量数据备份(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_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;,别慌,按以下步骤恢复:
确认备份集:找到误操作前最近的一次成功备份。
执行恢复:
-- 恢复到指定时间点(精确到秒) RECOVER TENANT my_tenant UNTIL TIME '2026-07-05 10:30:00';验证数据:恢复完成后,重新登录
my_tenant,检查t_order是否回来。
⚠️ 生产环境避坑指南
- 备份与业务分离:备份目的端绝对不能和数据库数据盘在同一块物理磁盘上,否则磁盘坏了备份也没了。
- 定期恢复演练:备份不是目的,能恢复才是目的。建议每月做一次恢复演练,验证备份文件的完整性。
- 日志备份不能停:数据备份是“快照”,日志备份是“流水”。只有两者配合,才能实现任意时间点恢复(PITR)。
今日小结
今天我们给OceanBase上了“保险”。记住:Paxos是安全带,备份是安全气囊,两者缺一不可。配置好自动备份,今晚才能睡个安稳觉。
💡 课后思考
如果我想恢复单张表而不是整个租户,OceanBase支持吗?如果支持,语法是什么?(提示:OceanBase 4.x 引入了表级恢复特性。)