1,以sysdba连接数据库
[oracle]$ sqlplus / as sysdba
SQL> show parameter COMPATIBLE ; --兼容性参数compatible要为12.0.0.0.0及以上
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
compatible string 12.1.0.2.0
SQL> show parameter MAX_STRING_SIZE; --字符串大小参数max_string_size初始值为STANDARD
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
max_string_size string STANDARD
2,关闭数据库,并以upgrade试启动数据库
SQL> shutdown immediate;
SQL> startup upgrade;
3,修改参数
SQL> alter system set max_string_size=extended scope=both;
4,字符类型扩展脚本
SQL> shutdown immediate;
SQL> startup upgrade;
SQL> @?/rdbms/admin/utl32k.sql
5,以NOMAL模式重启数据库
SQL> shutdown immediate;
SQL> startup;
6,执行脚本编译数据库
SQL> @?/rdbms/admin/utlrp.sql
SQL> select count(*) from dba_objects where status<>'VALID';
COUNT(*)
----------
上面代码测试过程中,执行完扩展脚本后多次重启失败,报错记录如下 :
第一次,执行完扩展脚本无法正常重启,此时是有3259个invalid的,打算重启后再执行编译脚本,重启报错如下
ORA-01092: ORACLE instance terminated. Disconnection forced
ORA-14694: database must in UPGRADE mode to begin MAX_STRING_SIZE migration
第二次,重启失败后再次重启
ORA-01092: ORACLE instance terminated. Disconnection forced
ORA-14695: MAX_STRING_SIZE migration is incomplete
第三次,以upgrade模式重启,启动后两次执行编译脚本utlrp.sql,invalid降为0;再次以NOMAL模式重启,报错如下
ORA-01092: ORACLE instance terminated. Disconnection forced
ORA-14695: MAX_STRING_SIZE migration is incomplete
第四次,以upgrade模式重启,启动后执行扩展脚本utl32k.sql,再执行编译脚本utlrp.sql,invalid降为0;最后以NOMAL模式重启,正常。
补:报错分析,修改参数max_string_size=extended时用的scope=spfile,然后再跑的扩展脚本,怀疑就是因为此时内存里参数值仍为stardard,跑扩展脚本是不生效的。要重启DB使max_string_size=extended生效后再跑扩展脚本就可以了。避免上述报错的办法是修改参数max_string_size=extended时用scope=both。
字符长度扩展后,测试使用:
SQL> create table test1(name varchar2(30000));
Table created.
SQL> insert into test1 values('kiti');