前言:本文以 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行数据。奉劝大家且删且谨慎~