误删除序列sequence,是否可以找回?

今天同事手一抖,误删除了一套测试环境中的所有sequence序列对象。序列不像表这种对象,drop删除可以从回收站中找回来,当然一般认为序列并不是那么重要,只要记得名称以及一些非默认参数,可以选择重建。唯一可能有问题的就是,一般序列常用于主键字段,如果之前的序列已经被用了,他的last_number可能就不是初始值了,换句话说,如果此时只是简单地重建,很有可能使用过程中,会出现seq.nextval的值之前已经用了主键,此时会报ORA-00001约束冲突的错误。

我觉得针对这个问题,有两种解决方法。

1. create sequence的时候设置minvalue为一个比较大的值,尽量可以超过之前使用的值。但这种方法掺杂蒙的成分,且不一定准确。

2. 是否可以找回之前删除的序列?

对于问题2,答案是可能找回,可能找不回。

1. 可能找回的实验

之所以可以找回,原理就是用闪回,准确说是闪回查询的方法,利用的就是UNDO表空间,如下可以检索dba_seqences视图中sysdate - 60/1440,即1小时之前的数据镜像,

之前我们说了,之所以不是直接重建,是因为我要知道删除之前,序列last_number用到什么了,因此拼接create sequence的时候可以将minvalue参数值设为last_number的实际值。同时可以指定序列属主,避免扰乱,

使用minus将当前和历史镜像相减,是另一种方法,

sys.seq$亦可以检索序列,但需要使用OBJ#字段和dba_objects的OBJECT_ID字段关联才可以知道对应的序列名称,

无论用什么方法,得到SQL语句,就可以直接用来重建序列了。

2. 不可能找回的实验

这问题其实和闪回查询的原理有关,因为闪回查询使用的是UNDO表空间,因此回滚段是否包含指定删除时间的镜像,就成为了是否可以找回的关键,如果当前需要找回的数据已经从UNDO删除,则可能报错ORA-01555,说明已经从UNDO找不着前镜像了,因此无法执行SQL,

总结:

1. 使用闪回查询,可能找回删除的序列定义,进而可以知道last_number值,将其设为minvalue,就不会影响使用,相当于了断点续传的作用。

2. 若闪回查询使用的UNDO记录已被删除,此时查询报错ORA-01555,这种方法就不支持找回sequence了。

如果您觉得此篇文章对您有帮助,欢迎关注微信公众号:bisal的个人杂货铺,您的支持是对我最大的鼓励!共同学习,共同进步:)

时间: 2024-10-02 20:17:02

误删除序列sequence,是否可以找回?的相关文章

SQL基础--> 序列(SEQUENCE)、同义词(SYNONYM)

--============================================= --SQL基础--> 序列(SEQUENCE).同义词(SYNONYM) --=============================================   一.序列     是一个Oracle对象,提供唯一的数字,在需要时根据指定的增量值来递增,通常用于产生主键值     类似于SQL server中的IDENTITY(int,1,1) 或者列为IDENTITY列.SQL serve

Oracle中使用触发器(trigger)和序列(sequence)模拟实现自增列实例_oracle

问题:在SQL Server数据库中,有自增列这个字段属性,使用起来也是很方便的.而在Oracle中却没有这个功能,该如何实现呢? 答:在Oracle中虽然没有自增列的说法,但却可以通过触发器(trigger)和序列(sequence)来模式实现. 示例: 1.建立表 复制代码 代码如下: create table user  (       id   number(6) not null,       name   varchar2(30)   not null primary key  ) 

ORACLE中序列-sequence的应用

oracle oracle中没有象Acces中自动编号的字段类型,所以在oracle中要想用一个字段自动增值,还比较麻烦,在此提供给大家一个方法,利用序列,来完成字段的自动增加,下边介绍一下怎么创建序列,使用序列,和删除序列. 1.创建序列--------------create sequence  create sequence  Seq_AutoID   //所起序列名叫 Seq_AutoID ,需要记住此序列名,以后方可调用 minvalue   1   //最小值从1开始 可以根据自己的

SQL基础12—— 序列(SEQUENCE)、同义词(SYNONYM)

一.序列     是一个Oracle对象,提供唯一的数字,在需要时根据指定的增量值来递增,通常用于产生主键值     类似于SQL server中的IDENTITY(int,1,1) 或者列为IDENTITY列.SQL server可以直接将列指定     为IDENTITY列,在使用的时候可以不需要理会IDENTITY列,系统会自动递增,这样看来SQL     server 中主键的产生更为简便.         1.序列的特性:        自动提供唯一的数值        共享对象   

MySQL模拟Oracle序列sequence

DROP TABLE IF EXISTS sys_sequence ; CREATE TABLE sys_sequence (   seq_name VARCHAR (50) NOT NULL,   curr_value BIGINT NOT NULL DEFAULT 0,   increment_by INT NOT NULL DEFAULT 1,   PRIMARY KEY (seq_name) ) ENGINE = INNODB ; INSERT INTO sys_sequence VAL

浅谈Oracle的Sequence序列

Oracle的Sequence是一种数据库对象,它可以生成有序数字,主要用于主键的自动生成.如果没有 Sequence,主键的自动生成必须得在代码逻辑里实现,大致过程是:获取当前主键值,新主键值=当前 主键值+增量.如果多个用户同时请求新主键,则会产生并发等待,影响效率,Sequence就是用来解决 这个问题. 创建Sequence CREATE SEQUENCE emp_sequence INCREMENT BY 1 START WITH 1 NOMAXVALUE NOCYCLE CACHE

MySQL中如何实现类似Oracle的序列

Oracle一般使用序列(Sequence)来处理主键字段,而MySQL则提供了自增长(increment)来实现类似的目的: 但在实际使用过程中发现,MySQL的自增长有诸多的弊端:不能控制步长.开始索引.是否循环等:若需要迁移数据库,则对于主键这块,也是个头大的问题. 本文记录了一个模拟Oracle序列的方案,重点是想法,代码其次. Oracle序列的使用,无非是使用.nextval和.currval伪列,基本想法是:1.MySQL中新建表,用于存储序列名称和值:2.创建函数,用于获取序列表

数据恢复-数据丢失该怎么找回,什么原因造成的?

问题描述 数据丢失该怎么找回,什么原因造成的? wps表为什么数据消失?只消失一部分,输的电子表数据到9.1号保存过了,但是重新开机9月1的数据就不见了 解决方案 数据丢失的原因很多:存贮介质问题,你的操作问题,非法关机等都可以引起. 你可以试着找找专门用来恢复表格的工具,还有有可能有一些用处的. 解决方案二: 你的问题取决于二个方面: 一是软件的保存效果,WPS是国产软件,它的保存应该是有保证的.你要设置打开软件自动保存功能,让软件2分钟自动保存一次.同时设置打开自动备份功能.这样,退出前保存

Python基础03 序列

原文:Python基础03 序列 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!  谢谢thunder424纠错   sequence 序列 sequence(序列)是一组有顺序的元素的集合 (严格的说,是对象的集合,但鉴于我们还没有引入"对象"概念,暂时说元素)   序列可以包含一个或多个元素,也可以没有任何元素. 我们之前所说的基本数据类型,都可以作为序列的元素.元素还可以是另一个序列,以及我们以后要介绍的其他对