背景:
在日常的运维工作中,有时会遇到不慎误删表的情况。尽管OceanBase 提供了开启回收站并闪回误删表的功能,但这种操作可能会给生产系统带来性能资源上的负担以及潜在的问题。由于生产系统通常都会进行日常备份,并启用归档,因此我们可以通过这些备份来恢复被误操作的表。
操作步骤:
<1> 3.x 版本恢复方式
对于3.x版本,因为备份是集群级别的,所以恢复的话只能恢复到一个新的资源环境,我们可以找个测试环境进行数据恢复,然后通过oms/datax/obdump等各种灵活的方式将新恢复的表数据导回生产
1. 创建unit
create resource unit restore_unit min_cpu=3, max_cpu=3, min_memory=12884901888, max_memory=12884901888, min_iops=10240, max_iops=10240, max_disk_size=1649267441664, max_session_num=8192; |
2.创建资源池
create resource pool restore_pool UNIT= 'restore_unit', unit_num = 1, zone_list =('zone1','zone2','zone3'); |
3.恢复指定表到指定时间点
ALTER SYSTEM RESTORE zry.cs1 FOR new_tenant1 FROM sc_prod AT 'file:///nfs/obbackup' UNTIL '2024-04-12 00:00:00' WITH 'backup_cluster_name=obsccluster&backup_cluster_id=6&pool_list=restore_pool'; |
<2> 4.x版本恢复方式
对于4.x版本,就可以恢复到原环境了,也可以恢复到其他的租户环境,但是注意两点,如果表上有表组,需要先创建上对应的表组。表所依赖的用户也要提前创建上。
当然如果想修改恢复的表名、用户和表组也可以,通过REMAP TABLE和REMAP TABLEGROUP 命令就可以。
1. 创建unit
CREATE RESOURCE UNIT restore_unit MAX_CPU 4, MEMORY_SIZE = '16G', MAX_IOPS 10240, MIN_IOPS=10240; |
2.创建资源池
create resource pool restore_pool UNIT= 'restore_unit', unit_num = 1, zone_list =('zone1','zone2','zone3'); |
3. 恢复指定表到指定时间点
ALTER SYSTEM RECOVER TABLE USER01.TEST1 TO TENANT oratest1 – 需要恢复的目标端租户名称,如果把表恢复在源租户下写源租户的名称 FROM 'file:///obbackup/ob4zry/1699999999/tenant_incarnation_1/1002/data,file:///obbackup/ ob4zry /1699999999/tenant_incarnation_1/1002/clog' UNTIL TIME='2024-05-23 18:00:00' WITH 'pool_list=restore_pool1&concurrency=8' --- pool_list为创建恢复中间租户的资源池 |
注意点:
1. 两种版本都需要资源,3.x需要指定资源池恢复成一个新租户,4.x是利用中间资源恢复到指定租户
2. 3.x恢复命令中的cluster_id,cluster_name,tenant信息可以查询__all_cluster,__all_tenant视图。
3. 4.x恢复需要指定url,即备份的数据和日志目录。可以通过CDB_OB_BACKUP_PARAMETER和CDB_OB_ARCHIVE_DEST查询。
4. 3.x可以通过select * from __all_restore_history;查询恢复记录,如果报错或者完成的话都可以看到信息。
当恢复正常发起后,以下语句查询不到信息时一般也是恢复完成或者很快就完成了。
--系统表 select svr_ip,role,is_restore,count(*) from __all_root_table a, (select value from __all_restore_info where name='tenant_id') as b where a.tenant_id=b.value group by role,is_restore,svr_ip order by svr_ip,is_restore; --用户表 select svr_ip,role,is_restore,count(*) from __all_virtual_meta_table a, (select value from __all_restore_info where name='tenant_id') as b where a.tenant_id=b.value group by role,is_restore,svr_ip order by svr_ip,is_restore; |
5. 4.x可以通过以下语句观察
##备份完就查不到了 SELECT * FROM oceanbase.CDB_OB_BACKUP_JOBS\G ###可以看备份进度 SELECT * FROM oceanbase.CDB_OB_BACKUP_TASKS\G |
结论:
备份恢复可以说是数据安全的最后一道防线了,平时大家一定要注意好自己的操作,做好相应的安全规范,对于业务用户遵循最小权限的原则,从源头避免和减少这类情况的发生。
希望这篇分享可以给大家提供一个保障。