关于sequence问题的紧急处理(r2第26天)

今天早上收到邮件,说有一个很紧急的问题,是关于sequence的。 错误日志里面还有ORA的错误 ----- ... 7 more Caused by: java.sql.SQLException: ORA-08004: sequence TRX_1SQ.NEXTVAL exceeds MAXVALUE and cannot be instantiated 猛一看就是sequence的值越界了。 导致这个问题的原因主要有两个: 1)设置的maxvalue值过小了。 2)sequence的cycle模式没有启用 从库里查看sequence的状态。

SEQUENCE_NAME                   MIN_VALUE  MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER
------------------------------ ---------- ---------- ------------ - - ---------- -----------
   TRX_1SQ                             1  999999999            1 N N        100  1000000000

从上面的结果可以看出,sequence的cycle模式没有启用,sequence值越界了。 修复问题可以有两种思路。就是设置maxvalue,或者选择开启cycle模式。 先来看看设置maxvalue,问题就来了,需要设置多大,这个得找开发确认,而开发也不确定最大能设置多大。问题又跑到了dba这边, 关于maxvalue的值,官方文档是这么描述的。最大28位。 MAXVALUE Specify the maximum value the sequence can generate. This integer value can have 28 or fewer digits. MAXVALUE must be equal to or greater than START WITH and must be greater than MINVALUE.

有了这个思路,貌似问题简单了很多。从数据库层面来说似乎行得通了,设置一个最大值即可。从业务上是不是支持更大的数值呢,这个看似需要开发来确认,但是和dba也是有一些关联的,我找到sequence相关的表,大概有5张左右的表使用了那个sequence, 查看对应的表列,可以看到有些字段是支持的,有些字段却是NUMBER(9),很明显设置maxvalue会带来更多的问题。 因为相关的几个表都是核心表,如果修改表的精度也是有潜在风险的。 这个时候就需要找开发确认,是不是应该开启cycle模式,对于现有数据是否有影响了。很快得到产品线的回馈,有同样一个问题在别的项目发生过,需要开发cycle模式。 对于dba来说,需要做的工作基本就是测试和验证了。 从生产备份库中使用dbms_metadata.get_ddl得到sequence的创建语句

SQL> CREATE SEQUENCE  "TRX_1SQ"  MINVALUE 1 MAXVALUE 999999999 INCREMENT BY 1 START WITH 1000000000 CACHE 100 NOORDER  NOCYCLE
    /
Sequence created.

--复现问题

SQL> select trx_1sq.nextval from dual;
select csm_trx_1sq.nextval from dual
       *
ERROR at line 1:
ORA-08004: sequence CSM_TRX_1SQ.NEXTVAL exceeds MAXVALUE and cannot be
instantiated

--修复问题

SQL> alter sequence CSM_TRX_1SQ cycle;
Sequence altered.

--验证问题

SQL> select csm_trx_1sq.nextval from dual;
   NEXTVAL
----------
         1
SQL> /
   NEXTVAL
----------
         2
SEQUENCE_NAME                   MIN_VALUE  MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER
------------------------------ ---------- ---------- ------------ - - ---------- -----------
    TRX_1SQ                             1  999999999            1 Y N        100         101

当然了,如果要设置maxvalue的话。有一个细节需要注意的。 如果设置为28位,最高位是没有问题的。 SQL> alter sequence csm_trx_1sq maxvalue 9999999999999999999999999999; Sequence altered. SQL> select *from user_sequences where sequence_name='TRX_1SQ'; SEQUENCE_NAME MIN_VALUE MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER ------------------------------ ---------- ---------- ------------ - - ---------- ----------- TRX_1SQ 1 1.0000E+28 1 Y N 100 3

但是如果你设置了30位,也是不会报错的,提示运行成功。但是查看sequence的最大长度,却还是28位。 SQL> alter sequence csm_trx_1sq maxvalue 999999999999999999999999999999; Sequence altered. SQL> select *from user_sequences where sequence_name='CSM_TRX_1SQ'; SEQUENCE_NAME MIN_VALUE MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER ------------------------------ ---------- ---------- ------------ - - ---------- ----------- TRX_1SQ 1 1.0000E+28 1 Y N 100 3

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2014-07-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏MasiMaro 的技术博文

自己写的驱动用CreateFile打开时错误码返回1的问题

就像题目上说的,今天在写一个例子代码时遇到了这个问题,下面是当时驱动层和应用层的代码:

1175
来自专栏转载gongluck的CSDN博客

linux平台下的写文件刷新

c语言libc库自带的fflush和linux的sync、fsync、fdatasync,字面上都是刷新缓冲区数据到磁盘(当然,fflush还可以刷新缓冲区数据...

2745
来自专栏乐沙弥的世界

只读表空间的备份与恢复

--====================== --  只读表空间的备份与恢复 --====================== 一、只读表空间的特性...

662
来自专栏皮振伟的专栏

[linux][memory]内存映射技术分析

前言: KVM的设备虚拟化,除了前文《PIO技术分析》,还有另外一个核心概念---MMIO。原计划这里分析一下KVM的MMIO虚拟化。考虑到MMIO比PIO复杂...

39411
来自专栏乐沙弥的世界

MySQL 5.7 时间显示修改(log_timestamps UTC)

在MySQL 5.7版本中,日志记录时间发生了变化,使用了UTC方式来记录日志时间,也就是说这是个世界统一时间,与我们常用的本地时间不协调,因此,初始化MySQ...

683
来自专栏杨建荣的学习笔记

记一次数据库重启后归档急剧增加的问题(98天)

在本地的环境中测试外部表的性能,由于空间有限,不一会儿归档的空间就爆了。然后文件貌似出现了系统级的问题,刚刚rm掉的归档日志文件。隔了几秒钟再ls,就出现了。怎...

3184
来自专栏大内老A

如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案[上篇]

一、提出问题 在开发一个企业级 应用的时候,尤其在一个涉及到敏感数据的应用,比如财务系统、物流系统,我们往往有这样的需求:对于数据库中每一笔数据的添加、修改和删...

2149
来自专栏乐沙弥的世界

关于undo表空间配置错误的ORA-30012

      undo表空间是Oracle体系结构的重要组成部分,为什么我们可以回滚,就是因为有它。数据库任意数据的修改都会在undo表空间里生成前镜像,一是可以...

441
来自专栏C/C++基础

C++利用MSQL API连接和操作数据库

在Windows平台,我们可以使用ADO、ODBC或者MySQL API进行连接和操作。ADO (ActiveX Data Objects,ActiveX数据对...

1071
来自专栏乐沙弥的世界

数据导入时遭遇 ORA-01187 ORA-01110

最近的数据导入(IMP)时碰到了ORA-01187 ORA-01110 错误,由于这个数据库是使用热备恢复过来的,且恢复也是成功的,因为数据库能够成功open,...

643

扫码关注云+社区