误删数据或表恢复案例--仅适用Oracle数据库
一、误删数据恢复案例--仅适用Oracle数据库
一般能恢复在15分钟内误删除的数据,超过15分钟,数据在内存中已被覆盖不能用这种方式恢复,只能用物理RMAN、逻辑IMPDP等方式恢复,不过前提是误删数据前数据库有做物理RMAN备份或逻辑EXPDP备份。
以下介绍的是闪回查询方式恢复误数据步骤:
以下以2018-01-02 13:39:47分有人误删了t_ssc_jobhis表中的数据进行闪回恢复为例进行介绍如何进行误删表数据的恢复。
1、通过flashback query查询某历史时点的数据量,找到删除时点的前1s( t_ssc_jobhis 要改为现场误删的表名,2018-01-02 13:39:47的时间要改为现场误删除的时间,精确到秒级,如果一开始给不了那么准的时间,可以多试几个时间进行闪回,直到试到最适合删除数据的时间进行数据的闪回):
闪回表数据的SQL语句:
select * from t_ssc_jobhis as of timestamp to_timestamp('2018-01-02 13:39:47','yyyy-mm-dd hh24:mi:ss’);
# 查询6万多条数据,如果查询48s的数据,则减少到1万多,说明数据是在47s时删除的。
2、创建临时表,从删除之前的那一刻恢复所有数据。
create table t_ssc_jobhis_0102
as select * from t_ssc_jobhis as of timestamp to_timestamp('2018-01-02 13:39:47','yyyy-mm-dd hh24:mi:ss’);
3、从恢复的表中把当前表中不存在的记录恢复。
insert into t_ssc_jobhis select * from t_ssc_jobhis_0102 where fid not in (select fid from t_ssc_jobhis);
4、数据恢复完成。
# 让现场验证数据无误,并确定没问题时删除临时创建的表。
二、误删表恢复案例--仅适用Oracle数据库
1. 用sqlplus登录到数据库SQL>下,c:\>sqlplus D0023_C/eas;
2.停止eas应用服务器实例,备份生产数据库中的数据(用expdp备份),由于是恢复整张表不是删除数据,备份数据这步可选择性处理,非必需的。
3. 通过sql> select * from user_recyclebin where can_undrop='YES' and original_name like 'T_%'; --查询需要恢复的业务表。
4.将要恢复的表先进行更名,如 sql> alter table T_AP_OTHERBILLENTRY rename TO T_AP_OTHERBILLENTRY_BAK;
5.对删除的表进行闪回,如: sql> flashback table T_AP_OTHERBILLENTRY to before drop;
6.如更名后的表中有数据,则校验后将更名后中的数据插入到已闪回的表中。
7.重复第三与第五步,闪回第二点中的所有表。
8.闪回表后,对应的表索引的名称为系统里编制的一个名称,如BIN$FHndJWi6Se6Kso8K9tFEVg==$0,不是以前的名称。为了与eas系统原有的索引与主键名一样,便于日后维护,需要删除已有索引或主键约束后,对表中的索引与主键重建。 或将索引名称改为以前表中
的索引(在pl/sql developer中通过edit某个表的表结构,可以进行更名)。 以后凡是系统自动生成的名称,引用时都得加上引号,否则会无法引用。
说明: 更改索引名称与主键约束名称不是必需要做的步骤。
在做此步之前,由于要跟闪回前的表的索引名称与主键约束一样,先在测试库上恢复最近表未drop前备份的数据,以便进行索引名称的核对与查看重建时索引名与主键约束名取相同的名称。
--更改索引名称为eas系统标准的名称:其实就是先删除以前的索引,然后重建新的索引:
例:
--先将闪回前T_BD_ACCOUNTVIEW表进行rename更名后的对应索引
--T_BD_ACCOUNTVIEW表更名后的表名是T_BD_ACCOUNTVIEW_BAK,删除索引IX_ACCTVIEW_CNH
drop index IX_ACCTVIEW_CNH
--删除闪回表后T_BD_ACCOUNTVIEW里的BIN$FHndJWi6Se6Kso8K9tFEVg==$0索引,跟原表的IX_ACCTVIEW_CNH索引名称相同的索引列:
-- Drop indexes
drop index "BIN$FHndJWi6Se6Kso8K9tFEVg==$0"; --一定要加上双引号
--重新对T_BD_ACCOUNTVIEW表创建IX_ACCTVIEW_CNH索引:
-- Create/Recreate indexes
create index IX_ACCTVIEW_CNH on T_BD_ACCOUNTVIEW (FCOMPANYID, FNUMBER, FHELPCODE)
tablespace EAS_D_D0023_C_STANDARD
pctfree 10
initrans 2
maxtrans 255;
--删除与添加主键:
例:
--先将闪回前T_BD_ACCOUNTVIEW表进行rename更名后的对应主键约束
--T_BD_ACCOUNTVIEW表更名后的表名是T_BD_ACCOUNTVIEW_BAK,删除主键约束PK_BD_ACCOUNTVIEW
alter table T_BD_ACCOUNTVIEW_BAK
drop constraint PK_BD_ACCOUNTVIEW cascade;
--删除闪回的表对应的主键约束
-- Drop primary, unique and foreign key constraints
alter table T_BD_ACCOUNTVIEW
drop constraint "BIN$L4smqVx3Q8W71fbg60ouPg==$0" cascade; --一定要加上双引号
--对闪回的表添加主键约束
-- Create/Recreate primary, unique and foreign key constraints
alter table T_BD_ACCOUNTVIEW
add constraint PK_BD_ACCOUNTVIEW primary key (FID)
using index
tablespace EAS_D_D0023_C_STANDARD
pctfree 10
initrans 2
maxtrans 255;
9.建议对闪回的表与索引做一次统计分析操作(通过OEM中调度统计分析,或通过脚本进行执行)。
附:
--根据表名查看表对应的索引名称
select * from user_indexes where table_name='T_BD_ACCOUNTVIEW';
--根据表名查看表对应索引的列名称
select * from user_ind_columns where table_name='T_BD_ACCOUNTVIEW' order by index_name, column_position;
--要看表的主键约束名称
select * from user_constraints where table_name='T_BD_ACCOUNTVIEW' AND CONSTRAINT_TYPE='P';
三、通过expdp/impdp恢复误删表数据(建议在测试环境上进行恢复,如果在生产环境上进行恢复,要先停EAS服务,同时要恢复的原表要先做好备份):
需要现场提供EAS数据用户名与密码,以及SYSTEM用户名与密码,以前xx号备份的数据库文件名与以及备份文件所存在的路径。以下是以之前expdp逻辑备份的eas20201011.dmp备份文件进行数据恢复,以恢复pjjteas数据库用户 t_pm_user表为例介绍如何进行表的恢复。
以下数据表恢复操作需在数据库主机上操作,操作前EAS所有服务需进行停止:
1. 假如将之前备份的eas20201011.dmp(以现场xx号晚上备份的文件名为准,此处是举例)文件 拷贝到某个目录下,如:d:\oracle11g\backup_files2 ,如果备份文件在数据库主机上则告之存
放的路径。
2. c:\>sqlplus / as sysdba --登录到数据库SQL>下执行
3. sql>create directory dump_kingdee as 'd:\oracle11g\backup_files2'; --其中
d:\oracle11g\backup_files2为之前备份文件所在的目录
4. sql>grant read,write on directory dump_kingdee to system; --将备份虚目录的读写权限赋予system用户
5. sql>conn system/oracle
6. sql>create table pjjteas.t_pm_user_bk as pjjteas.select * from t_pm_user; --以pjjteas数据库用户为例,现场需根据实际数据库用户进行用户名称替换。
sql>drop table pjjteas.T_pm_user; --确认以上表正确备份成功后,将要还原的表进行删除
sql>exit --从SQL>方式退出到操作系统命令方式下,然后通过备份文件还原pjjteas用户下t_pm_user表的数据。以下第7步进行数据导入(其中dumpfile中的备份文件的名称eas20201011.dmp需改成需要还原数据备份的文件名称 )
7. c:\>impdp system/oracle schemas=pjjteas tables=t_pm_user
dumpfile=eas20201011.dmp logfile=impdp1030_c.log directory=dump_kingdee
8. 将备份后的数据导入到已还原的表中(如果备份完数据后有新增数据,可以通过以下方法进行核
对,并把后面新增的数据插入到还原的表中),这步由现场人员自行处理。
现以dump_kingdee这个表为例进行举例,其它的按这种方法自行更换表名与条件后去处理,如
下所示:
c:\>sqlplus system/oracle
sql>insert into pjjteas.t_pm_user select * from pjjteas.t_pm_user_BK userbaks where
not exists(select 1 from pjjteas.t_pm_user users where users.FID=userbaks.FID);
其中上面关联条件中的FID是表的主键对应的字段,其它表的处理的条件也是为表主键对应的列
去关联。
9. sql>commit; --插入数据提交
以下所有操作完数据校验无误后启EAS所有的服务。
注:c:\> 为在操作系统CMD下执行, sql> 说明进入数据库的sql>下执行
误删数据或表恢复案例--仅适用Oracle数据库
本文2024-09-22 20:22:36发表“eas cloud知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-eas-113230.html