下面的测试来至于一位朋友,不小心将sys用户下面的所有的sequence全部删除了。下面测试仅限测试环境,如在生产环境,请提前备份。整个实验利用数据库的闪回查询功能使用,其它如果undo中数据不存在,那么我们也可以利用软件来抽取表已经delete的行记录,前提是块中空间没有被覆盖。
1,数据库版本与OS版本
www.htz.pw > !lsb_release -a LSB Version: :core-3.0-amd64:core-3.0-ia32:core-3.0-noarch:graphics-3.0-amd64:graphics-3.0-ia32:graphics-3.0-noarch Distributor ID: RedHatEnterpriseAS Description: Red Hat Enterprise Linux AS release 4 (Nahant Update 8) Release: 4 Codename: NahantUpdate8
www.htz.pw > select * from v$version where rownum<2;
BANNER ——————————————————————————– Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 – 64bit Production |
2,DROP用户SYS序列
select ‘drop sequence ‘||sequence_owner||’.’||sequence_name||’;’ from dba_sequences where sequence_owner=’SYS’;
drop sequence SYS.APPLY$_DEST_OBJ_ID; drop sequence SYS.APPLY$_ERROR_HANDLER_SEQUENCE; drop sequence SYS.APPLY$_SOURCE_OBJ_ID; drop sequence SYS.AQ$_ALERT_QT_N; drop sequence SYS.AQ$_AQ$_MEM_MC_N; drop sequence SYS.AQ$_AQ_PROP_TABLE_N; drop sequence SYS.AQ$_CHAINSEQ; drop sequence SYS.AQ$_IOTENQTXID; drop sequence SYS.AQ$_KUPC$DATAPUMP_QUETAB_1_N; drop sequence SYS.AQ$_KUPC$DATAPUMP_QUETAB_N; drop sequence SYS.AQ$_NONDURSUB_SEQUENCE; drop sequence SYS.AQ$_PROPAGATION_SEQUENCE; drop sequence SYS.AQ$_PUBLISHER_SEQUENCE; drop sequence SYS.AQ$_RULE_SEQUENCE; drop sequence SYS.AQ$_RULE_SET_SEQUENCE; drop sequence SYS.AQ$_SCHEDULER$_EVENT_QTAB_N; drop sequence SYS.AQ$_SCHEDULER$_REMDB_JOBQTAB_N; drop sequence SYS.AQ$_SCHEDULER_FILEWATCHER_QT_N; drop sequence SYS.AQ$_SYS$SERVICE_METRICS_TAB_N; drop sequence SYS.AQ$_TRANS_SEQUENCE; drop sequence SYS.AUDSES$; drop sequence SYS.AWCREATE10G_S$; drop sequence SYS.AWCREATE_S$; drop sequence SYS.AWLOGSEQ$; drop sequence SYS.AWMD_S$; drop sequence SYS.AWREPORT_S$; drop sequence SYS.AWSEQ$; drop sequence SYS.AWXML_S$; drop sequence SYS.CACHE_STATS_SEQ_0; drop sequence SYS.CACHE_STATS_SEQ_1; drop sequence SYS.CDC_RSID_SEQ$; drop sequence SYS.CDC_SUBSCRIBE_SEQ$; drop sequence SYS.CHNF$_CLAUSEID_SEQ; drop sequence SYS.CHNF$_QUERYID_SEQ; drop sequence SYS.COMPARISON_SCAN_SEQ$; drop sequence SYS.COMPARISON_SEQ$; drop sequence SYS.CONFLICT_HANDLER_ID_SEQ$; drop sequence SYS.DAM_CLEANUP_SEQ$; drop sequence SYS.DBFS_HS$_ARCHIVEREFIDSEQ; drop sequence SYS.DBFS_HS$_BACKUPFILEIDSEQ; drop sequence SYS.DBFS_HS$_POLICYIDSEQ; drop sequence SYS.DBFS_HS$_RSEQ; drop sequence SYS.DBFS_HS$_STOREIDSEQ; drop sequence SYS.DBFS_HS$_TARBALLSEQ; drop sequence SYS.DBFS_SFS$_FSSEQ; drop sequence SYS.DBMS_CUBE_ADVICE_SEQ$; drop sequence SYS.DBMS_LOCK_ID; drop sequence SYS.DBMS_PARALLEL_EXECUTE_SEQ$; drop sequence SYS.DEPTREE_SEQ; drop sequence SYS.DM$EXPIMP_ID_SEQ; drop sequence SYS.EXPRESS_S$; drop sequence SYS.FGR$_NAMES_S; drop sequence SYS.GENERATOR$_S; drop sequence SYS.GROUP_NUM_SEQ; drop sequence SYS.HS$_BASE_DD_S; drop sequence SYS.HS$_CLASS_CAPS_S; drop sequence SYS.HS$_CLASS_DD_S; drop sequence SYS.HS$_CLASS_INIT_S; drop sequence SYS.HS$_FDS_CLASS_S; drop sequence SYS.HS$_FDS_INST_S; drop sequence SYS.HS$_INST_CAPS_S; drop sequence SYS.HS$_INST_DD_S; drop sequence SYS.HS$_INST_INIT_S; drop sequence SYS.HS_BULK_SEQ; drop sequence SYS.IDGEN1$; drop sequence SYS.IDX_RB$JOBSEQ; drop sequence SYS.INVALIDATION_REG_ID$; drop sequence SYS.JAVA$POLICY$SEQUENCE$; drop sequence SYS.JAVA$PREFS$SEQ$; drop sequence SYS.JOBSEQ; drop sequence SYS.JOBSEQLSBY; drop sequence SYS.LOG$SEQUENCE; drop sequence SYS.MV_RF$JOBSEQ; drop sequence SYS.OBJECT_GRANT; drop sequence SYS.OLAP_ASSIGNMENTS_SEQ; drop sequence SYS.OLAP_ATTRIBUTES_SEQ; drop sequence SYS.OLAP_CALCULATED_MEMBERS_SEQ; drop sequence SYS.OLAP_DIMENSIONALITY_SEQ; drop sequence SYS.OLAP_DIM_LEVELS_SEQ; drop sequence SYS.OLAP_HIERARCHIES_SEQ; drop sequence SYS.OLAP_HIER_LEVELS_SEQ; drop sequence SYS.OLAP_MAPPINGS_SEQ; drop sequence SYS.OLAP_MEASURES_SEQ; drop sequence SYS.OLAP_MODELS_SEQ; drop sequence SYS.ORA_PLAN_ID_SEQ$; drop sequence SYS.ORA_TQ_BASE$; drop sequence SYS.PARTITION_NAME$; drop sequence SYS.PROFNUM$; drop sequence SYS.PSINDEX_SEQ$; drop sequence SYS.REDEF_SEQ$; drop sequence SYS.RGROUPSEQ; drop sequence SYS.SCHEDULER$_EVTSEQ; drop sequence SYS.SCHEDULER$_INSTANCE_S; drop sequence SYS.SCHEDULER$_JOBSUFFIX_S; drop sequence SYS.SCHEDULER$_LWJOB_OID_SEQ; drop sequence SYS.SCHEDULER$_RDB_SEQ; drop sequence SYS.SNAPSHOT_ID$; drop sequence SYS.SNAPSITE_ID$; drop sequence SYS.SQLLOG$_SEQ; drop sequence SYS.SQL_TK_CHK_ID; drop sequence SYS.SSCR_CAP_SEQ$; drop sequence SYS.STREAMS$_APPLY_SPILL_TXNKEY_S; drop sequence SYS.STREAMS$_CAPTURE_INST; drop sequence SYS.STREAMS$_CAP_SUB_INST; drop sequence SYS.STREAMS$_PROPAGATION_SEQNUM; drop sequence SYS.STREAMS$_RULE_NAME_S; drop sequence SYS.STREAMS$_SM_ID; drop sequence SYS.STREAMS$_STMT_HANDLER_SEQ; drop sequence SYS.SYNOPSIS_NUM_SEQ; drop sequence SYS.SYSTEM_GRANT; drop sequence SYS.TSM_MIG_SEQ$; drop sequence SYS.UGROUP_SEQUENCE; drop sequence SYS.UTL_RECOMP_SEQ; drop sequence SYS.WRI$_ADV_SEQ_DIR; drop sequence SYS.WRI$_ADV_SEQ_DIR_INST; drop sequence SYS.WRI$_ADV_SEQ_EXEC; drop sequence SYS.WRI$_ADV_SEQ_JOURNAL; drop sequence SYS.WRI$_ADV_SEQ_MSGGROUP; drop sequence SYS.WRI$_ADV_SEQ_SQLW_QUERY; drop sequence SYS.WRI$_ADV_SEQ_TASK; drop sequence SYS.WRI$_ADV_SQLT_PLAN_SEQ; drop sequence SYS.WRI$_ALERT_SEQUENCE; drop sequence SYS.WRI$_ALERT_THRSLOG_SEQUENCE; drop sequence SYS.WRI$_REPT_COMP_ID_SEQ; drop sequence SYS.WRI$_REPT_FILE_ID_SEQ; drop sequence SYS.WRI$_REPT_FORMAT_ID_SEQ; drop sequence SYS.WRI$_REPT_REPT_ID_SEQ; drop sequence SYS.WRI$_SQLSET_ID_SEQ; drop sequence SYS.WRI$_SQLSET_REF_ID_SEQ; drop sequence SYS.WRI$_SQLSET_STMT_ID_SEQ; drop sequence SYS.WRI$_SQLSET_WORKSPACE_PLAN_SEQ; drop sequence SYS.WRM$_DEEP_PURGE_EXTENT; drop sequence SYS.WRM$_DEEP_PURGE_INTERVAL; drop sequence SYS.WRR$_CAPTURE_ID; drop sequence SYS.WRR$_REPLAY_ID; drop sequence SYS.XSPARAM_REG_SEQUENCE$; |
3,恢复序列
3.1 生成dba_sequences的DDL语句
平时查询序列的时候都是查询dba_sequences这个视图,下面来看看dba_sequences由那几张底层表构成。
CREATE OR REPLACE FORCE VIEW "SYS"."DBA_SEQUENCES" ("SEQUENCE_OWNER", "SEQUENCE_NAME", "MIN_VALUE", "MAX_VALUE", "INCREMENT_BY", "CYCLE_FLAG", "ORDER_FLAG", "CACHE_SIZE", "LAST_NUMBER") AS select u.name, o.name, s.minvalue, s.maxvalue, s.increment$, decode (s.cycle#, 0, ‘N’, 1, ‘Y’), decode (s.order$, 0, ‘N’, 1, ‘Y’), s.cache, s.highwater from sys.seq$ s, sys.obj$ o, sys.user$ u where u.user# = o.owner# and o.obj# = s.obj# |
这里看到由seq$,obj$,user$这几张表构成。
3.2 闪回查询delete数据
下面利用闪回查询来查找已经delete的数据
www.htz.pw > create table scott.seq as select * from seq$ as of timestamp to_timestamp(‘2014-08-21 11:31:57′,’YYYY-MM-DD HH24:MI:SS’);
Table created.
www.htz.pw > create table scott.obj as select * from obj$ as of timestamp to_timestamp(‘2014-08-21 11:31:57′,’YYYY-MM-DD HH24:MI:SS’);
Table created. users这张表是可心不需要的 www.htz.pw > create table scott.users as select * from user$ as of timestamp to_timestamp(‘2014-08-21 11:31:57′,’YYYY-MM-DD HH24:MI:SS’);
Table created. |
3.3 插入已经删除的值
下面的两条SQL写得性能不高,如果大量数据,可以使用merge来改写,性能高一些。
www.htz.pw > insert into sys.seq$ 2 select * 3 from scott.seq b 4 where b.obj# in (select s.obj# from scott.seq s, scott.obj o, scott.users u 6 where u.user# = o.owner# 7 and o.obj# = s.obj# 8 and u.name = ‘SYS’) 9 ;
136 rows created.
insert into sys.obj$ 2 select * 3 from scott.obj b 4 where b.obj# in (select s.obj# from scott.seq s, scott.obj o, scott.users u 6 where u.user# = o.owner# 7 and o.obj# = s.obj# 8 and u.name = ‘SYS’) 9 ;
136 rows created.
www.htz.pw > select count(*) from seq$; |
3.4 重新运行建库脚本
@?/rdbms/admin/catalog.sql 运行过程中会报很多错误,原因是由于sequence不存在,可心不用管
@?/rdbms/admin/catproc.sql @?/sqlplus/admin/pupbld.sql
www.htz.pw > @?/rdbms/admin/utlrp.sql www.htz.pw > Rem 无效对象
www.htz.pw > select status,count(*) from dba_objects group by status;
STATUS COUNT(*) ——- ———- VALID 74600 |
3.5 重启数据库,功能测试
www.htz.pw > startup force; ORACLE instance started.
Total System Global Area 839282688 bytes Fixed Size 2233000 bytes Variable Size 641731928 bytes Database Buffers 192937984 bytes Redo Buffers 2379776 bytes Database mounted. Database opened. |
测试这里就不写了
整个实现结束
SYS用户所有序列删除的恢复:等您坐沙发呢!