关于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
- 微信跨界开了家人脸智慧时尚店 “刷脸”就能买买买
- Excel中使用了自定义函数的单元格自动更新
- 程序员还没有30K月薪,看你现在到底能做到以下几点?
- IIS7的应用程序池
- MapX中实现友好的交互
- 170个城市网约车车辆准入条件大数据报告
- 测试人员的“偷懒大法”
- Flash背景透明的代码
- Maven私服Nexus3.x环境构建操作记录
- Mapx用xml创建点图层
- 编程语言之间的百舸争流
- Mysql连接错误:Lost connection to Mysql server at 'waiting for initial communication packet'
- 适应现代变化的数据架构
- Linux下修改系统编码的操作记录
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- spring-boot-route(四)全局异常处理
- PHP registerXPathNamespace()函数讲解
- Python闭包装饰器使用方法汇总
- spring-boot-route(五)整合Swaager2生成接口文档
- spring-boot-route(六)整合JApiDocs生成接口文档
- Python unittest基本使用方法代码实例
- spring-boot-route(七)整合jdbcTemplate操作数据库
- Pytorch 卷积中的 Input Shape用法
- 解决TensorFlow程序无限制占用GPU的方法
- 基于Python的自媒体小助手—登录页面的实现代码
- PHP addAttribute()函数讲解
- PHP PDOStatement::setAttribute讲解
- PHP中的访问修饰符简单比较
- PHP asXML()函数讲解
- PhpStorm配置Xdebug调试的方法步骤