12c 可扩展的字符类型MAX_STRING_SIZE , varchar2 到32k长度

本文详细记录了在Oracle数据库中调整SQL字符串大小限制、升级系统版本并解决相关错误的过程,包括参数设置、错误排查及系统重启步骤。


SQL> show parameter compatible

NAME                                 TYPE
------------------------------------ ---------------------------------
VALUE
------------------------------
compatible                           string
12.1.0.2.0
noncdb_compatible                    boolean
FALSE





SQL>  show parameter max_sql_string_size;


SQL>  alter system set max_sql_string_size='EXTENDED' scope=spfile;
 alter system set max_sql_string_size='EXTENDED' scope=spfile
                  *
ERROR at line 1:
ORA-02065: illegal option for ALTER SYSTEM


SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.


SQL> startup upgrade;
ORACLE instance started.

Total System Global Area 1610612736 bytes
Fixed Size                  2924928 bytes
Variable Size            1224740480 bytes
Database Buffers          369098752 bytes
Redo Buffers               13848576 bytes
Database mounted.
Database opened.


SQL> alter system set max_string_size=EXTENDED scope=both;

System altered.

SQL> @?/rdbms/admin/utl32k.sql

Session altered.

DOC>#######################################################################
DOC>#######################################################################
DOC>   The following statement will cause an "ORA-01722: invalid number"
DOC>   error if the database has not been opened for UPGRADE.
DOC>
DOC>   Perform a "SHUTDOWN ABORT"  and
DOC>   restart using UPGRADE.
DOC>#######################################################################
DOC>#######################################################################
DOC>#

no rows selected

DOC>#######################################################################
DOC>#######################################################################
DOC>   The following statement will cause an "ORA-01722: invalid number"
DOC>   error if the database does not have compatible >= 12.0.0
DOC>
DOC>   Set compatible >= 12.0.0 and retry.
DOC>#######################################################################
DOC>#######################################################################
DOC>#

PL/SQL procedure successfully completed.


Session altered.


29 rows updated.


Commit complete.


System altered.


PL/SQL procedure successfully completed.


Commit complete.


System altered.


Session altered.


PL/SQL procedure successfully completed.

No errors.

Session altered.


PL/SQL procedure successfully completed.


Commit complete.


Package altered.


Package altered.


SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.


SQL> startup
ORACLE instance started.

Total System Global Area 1610612736 bytes
Fixed Size                  2924928 bytes
Variable Size            1224740480 bytes
Database Buffers          369098752 bytes
Redo Buffers               13848576 bytes
Database mounted.
Database opened.


SQL> show parameter max_string_size

NAME                                 TYPE
------------------------------------ ---------------------------------
VALUE
------------------------------
max_string_size                      string
EXTENDED



<think>好的,我现在需要帮助用户解决关于Oracle数据库中MAX_STRING_SIZE参数的查询和设置为EXTENDED的问题。首先,我需要确保自己对这个参数有足够的了解。MAX_STRING_SIZE控制着VARCHAR2、NVARCHAR2和RAW数据类型的最大长度。默认是STANDARD,即4000字节,而EXTENDED可以扩展到32767字节。不过,这个设置需要谨慎操作,因为它会影响数据库的结构,并且可能需要升级或修改。 用户的问题分为两部分:如何查询当前设置,以及如何将其设置为EXTENDED。我需要先回答查询方法,然后说明设置步骤。根据引用中的信息,比如引用[2]提到了在12c中使用ALTER SYSTEM命令设置,但需要重启数据库。另外,引用[5]提到修改CDB的MAX_STRING_SIZE,可能需要运行特定的脚本如utl32k.sql,并且需要清理一些文件。还有引用[4]提到这个脚本会调整某些视图的列大小,但并不是所有视图都会修改。 首先,查询当前参数的方法。通常可以通过SHOW PARAMETER命令或者查询V$PARAMETER视图。例如,用户可以使用`SHOW PARAMETER max_string_size`或者在SQL*Plus中执行`SELECT name, value FROM v$parameter WHERE name = 'max_string_size';`。这可能来自引用[2]中的示例,用户提供的引用中有相关命令。 然后是设置方法。根据Oracle文档,设置这个参数需要在CDB级别进行,并且只能在升级数据库或新创建的数据库中进行。用户需要先关闭数据库,以UPGRADE模式启动,运行`ALTER SYSTEM SET max_string_size=EXTENDED SCOPE=SPFILE;`,然后执行utl32k.sql脚本。引用[5]提到运行这个脚本后需要清理输出目录,所以需要注意步骤中的细节。此外,设置后需要重新编译失效对象,如引用[3]中的检查失效对象的SQL,可能需要运行utlrp.sql来重新编译。 但用户可能是在现有数据库上修改这个参数,需要注意这只能在数据库创建时或升级时进行。如果是现有数据库,可能需要迁移数据,或者只能在新的PDB中设置。需要提醒用户这个设置不可逆,且需要备份。 另外,用户提供的引用中有关于执行脚本和检查失效对象的部分,比如引用[3]中的`select count(*) from dba_objects where status<>'VALID'`,所以设置完成后需要检查是否有失效对象并重新编译。 总结步骤应该是: 1. 检查当前参数值。 2. 确认数据库版本和类型(CDB或非CDB)。 3. 关闭数据库,以UPGRADE模式启动。 4. 修改参数并运行utl32k.sql脚本。 5. 重新启动数据库,运行utlrp.sql重新编译对象。 6. 验证参数是否生效,检查失效对象。 在回答过程中,需要引用用户提供的参考文献,比如引用[2]和[5]中的命令,引用[4]关于脚本的作用,引用[3]关于检查失效对象。同时要提醒注意事项,比如需要足够的存储空间,不可逆操作,备份的重要性等。 用户可能的后续问题可能涉及设置后的性能影响,或者如何处理迁移数据的问题,但根据当前问题,只需回答查询和设置方法即可。生成的相关问题可以包括设置后的影响、如何迁移数据、参数的限制等。</think>### 如何查询和设置 Oracle 参数 `MAX_STRING_SIZE` 为 `EXTENDED` #### 一、查询当前参数值 1. **通过 SQL 命令查询** 在 SQL*Plus 或 SQL 开发工具中执行以下命令: ```sql SHOW PARAMETER max_string_size; -- 或 SELECT name, value FROM v$parameter WHERE name = 'max_string_size'; ``` 若输出为 `STANDARD`,表示当前最大字符串长度为 4000 字节;若为 `EXTENDED`,则为 32767 字节[^2][^4]。 2. **检查数据库版本** 该参数仅适用于 Oracle 12c 及以上版本。可通过以下命令验证版本: ```sql SELECT * FROM v$version; ``` --- #### 二、设置 `MAX_STRING_SIZE=EXTENDED` ##### 步骤 1:准备工作 1. **仅适用于新数据库或升级场景** 修改此参数需在数据库创建时或升级后执行,且不可逆[^5]。 2. **备份数据库** 操作前务必备份数据,避免意外损失。 ##### 步骤 2:关闭数据库 ```sql SHUTDOWN IMMEDIATE; ``` ##### 步骤 3:以 `UPGRADE` 模式启动数据库 ```sql STARTUP UPGRADE; ``` ##### 步骤 4:修改参数并执行脚本 1. **设置参数** ```sql ALTER SYSTEM SET max_string_size=EXTENDED SCOPE=SPFILE; ``` 2. **运行官方脚本 `utl32k.sql`** ```sql @?/rdbms/admin/utl32k.sql ``` 该脚本会调整部分系统视图的列长度限制(如 `DBA_VIEWS` 的 `TEXT` 列)[^5]。 ##### 步骤 5:重启数据库并编译失效对象 1. **重启数据库** ```sql SHUTDOWN IMMEDIATE; STARTUP; ``` 2. **重新编译失效对象** ```sql @?/rdbms/admin/utlrp.sql ``` 通过以下命令验证是否所有对象有效: ```sql SELECT COUNT(*) FROM dba_objects WHERE status <> 'VALID'; -- 结果为 0 表示无失效对象[^3] ``` --- #### 三、注意事项 1. **仅限 CDB/PDB 架构** 若为多租户环境,需在 CDB 级别修改参数,并同步至所有 PDB。 2. **存储空间要求** `EXTENDED` 模式会增加数据块存储开销,需提前评估空间。 3. **兼容性影响** 修改后,部分第三方工具可能无法兼容超长字符串。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值