Oracle误删表后恢复表与索引

本文详细介绍了如何在Oracle中找回误删的SO04_HIST表数据,包括从历史时间点查询、插入现有表,以及恢复表、索引和约束的过程。特别强调了利用Oracle回收站和闪回功能进行数据恢复的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:本文以 SO04_HIST 表为例

0、找回删除的数据

0.1 在Oracle中找到历史某一时间点的数据:
select *
from SY_PROPERTIES
    as of timestamp to_timestamp('2023-12-13 10:00:00', 'yyyy-mm-dd hh24:mi:ss');
0.2 将查询到的数据插入到现有的表中(更新)
insert into SY_PROPERTIES
select *
from SY_PROPERTIES
    as of timestamp to_timestamp('2023-12-13 10:00:00', 'yyyy-mm-dd hh24:mi:ss');

注意:如果是只找回一行或者几行的话,要用merge

1、找回删除的表

1.1 在Oracle自带的回收站中找到误删的表:
select * from user_recyclebin where ORIGINAL_NAME = 'SO04_HIST';
1.2根据表名找到找到对应回收站表的OBJECT_NAME
例如:"BIN$5XV9qTKs9KzgVVBUAKvbpA==$0"
1.3 根据OBJECT_NAME恢复对应的表
flashback Table "BIN$5XV9qTKs9KzgVVBUAKvbpA==$0" to before drop;

至此,误删的表恢复完成 ^ ^

2、恢复表的索引与约束

备注:鉴于删除表的时候没有删除索引和约束,所以可以对其进行恢复

2.1 恢复表的索引(index)
  • 当表被删除后,系统会自动为索引进行更名
  • 在all_indexes中查找SO04_HIST拥有的索引
select * from all_indexes WHERE table_name = 'SO04_HIST';
  • 恢复索引我们有两种方案可行:①直接对索引进行更名;②删除旧索引重新创建
  • 我们选择第二种方案(繁琐但稳妥)
  • 由于以BIN$开头的索引无法直接删除,所以我们需要对其进行更名
alter index "BIN$5XV9qTKs9KzgVVBUAKvbpA==$0" rename to PK_SO04_HIST;
  • 删除更名后的索引
drop index PK_SO04_HIST;
  • 重新创建索引
create index SO04_HIST_MRP_CONTROLLER_INDEX on SO04_HIST (MRP_CONTROLLER)

至此,索引 恢复 or 重建完成 ^ ^

2.2 恢复表的约束(constraint)

逻辑与恢复索引的相同

  • 查看该表所有的constraint
select * from USER_CONSTRAINTS where TABLE_NAME = 'SO04_HIST';
  • 恢复约束我们有两种方案可行:①直接对约束进行更名;②删除旧约束重新创建
  • 这里我们选择第一种方案,对约束进行更名
alter table SO04_HIST rename constraint "BIN$5XV9qTKg9KzgVVBUAKvbpA==$0" to PK_SO04_HIST2;

至此我们恢复了constraint ^ ^

得益于Oracle有回收站,否则我这次都得跑路了,本文提到的SO04_HIST表中有9526445行数据。奉劝大家且删且谨慎~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值