昨天碰到一个客户的问题,在更改字段长度的时候报错:ORA-00910:指定的长度对于数据类型而言过长
环境:oracle rac12c
错误如下:
NVARCHAR2(),最大值为2000,单位是字符,而且不管是汉字还是字母,每个字符的长度都是2个字节。
所以nvarchar2类型的数据最多能存放2000个汉字,也最多只能存放2000个字母。 并且NVARCHAR2不受数
据库字符集的影响。
从12c开始,varchar2(实际包括nvarchar2和raw)开始支持32767个字节,即32K的容量。
他是由max_string_size这个参数控制的,默认值是STANDARD,为了支持32K,需要将其改为EXTENDED
处理步骤;
1、在其中一个节点执行
alter system set cluster_database = false scope = spfile;
2、关闭数据库
srvctl stop database -d dbname;
3、在其中一个节点执行
startup upgrade;
ALTER SYSTEM SET MAX_STRING_SIZE=EXTENDED SID='*';
@?/rdbms/admin/utl32k.sql
但是在执行过程中报错:
ORA-38301: can not perform DDL/DML over objects in Recycle Bin
NAME
TNAME
CNAME ERROR
BIN$vG/y3fVHFZzgU2UIqMDRNw==$0
品牌 ORA-38301: can not perform DDL/DML over objects in Recycle Bin
CATARC_DW
BIN$vG/y3fVHFZzgU2UIqMDRNw==$0
企业简称 ORA-38301: can not perform DDL/DML over objects in Recycle Bin
UNAME
TNAME
CNAME ERROR
CATARC_DW
BIN$vG/y3fVIFZzgU2UIqMDRNw==$0
批次 ORA-38301: can not perform DDL/DML over objects in Recycle Bin
CATARC_DW
BIN$vG/y3fVJFZzgU2UIqMDRNw==$0
PC ORA-38301: can not perform DDL/DML over objects in Recycle Bin
重新启动数据库之后报错如下:
ORA-00603: ORACLE server session terminated by fatal error
ORA-01092: ORACLE instance terminated. Disconnection forced
ORA-14695: MAX_STRING_SIZE migration is incomplete
Process ID: 316458
Session ID: 327 Serial number: 22369
Ps:查看当前参数设置值MAX_STRING_SIZE=EXTENDED; 但是提示升级没完成
4、重新启动数据库到migration状态
startup upgrade;
5、清理回收站
purge dba_recyclebin
6、执行脚本
@?/rdbms/admin/utl32k.sql
@?/rdbms/admin/utlrp.sql (编译时效对象)
7、关闭数据库
shutdown immediate
8、启动数据库
srvctl start database -d dbname;
9、尝试更改字段类型成功;