合 12c 扩展数据类型(Extended Data Types)-- MAX_STRING_SIZE
Database SQL Language Reference ---- 》》 Data Types
在Oracle Database 12c中,可以指定 VARCHAR2 、 NVARCHAR2 和 RAW 数据类型的最大大小为 32767 字节。这样,用户便可以在数据库中存储更长的字符串。在本发行版之前, VARCHAR2和 NVARCHAR2 数据类型的最大大小为 4000 字节, RAW 数据类型的最大大小为 2000 字节 。声明的VARCHAR2、 NVARCHAR2 或 RAW 列长度影响如何在内部存储列。
•声明列长度为 4000 字节或更少的 VARCHAR2 和 NVARCHAR2 列以及声明列长度为 2000 字节或更少的 RAW 列在行内存储。
•声明列长度大于 4000 字节的 VARCHAR2 和 NVARCHAR2 列以及声明列长度大于 2000 字节的 RAW 列称为“扩展字符数据类型列”,它们在行外存储。
MAX_STRING_SIZE控制 SQL 中扩展数据类型的最大大小:
• STANDARD 表示在 Oracle 12c 之前使用的数据类型长度限制。
• EXTENDED 表示 Oracle Database 12c 中的 32767 字节限制。
扩展字符数据类型具有以下限制:
•在聚簇表和按索引组织的表中不受支持。
•没有分区内并行 DDL 、 UPDATE 和 DELETE DML 。
•对于在使用自动段空间管理 (Automatic Segment Space Management,ASSM) 进行管理的表空间中存储的表,没有分区内并行直接路径插入。
对比 LOB 数据类型,在 ASSM 表空间管理中,扩展数据类型的字段以 SecureFiles LOB 加以存储,而在非 ASSM 表空间管理中,它们则是以 BasciFiles LOB 进行存储的。
注意点:
Ø 不能将值从EXTENDED更改为 STANDARD 。 The only way to revert is to restore the database from backup prior to running the conversion script, $ORACLE_HOME/rdbms/admin/utl32k.sql
Ø 在RAC环境中,要关闭所有实例。只有将数据库实例参数 MAX_STRING_SIZE 设置为 EXTENDED 后,才能创建包含扩展字符数据类型列的表。 RAC 环境中所有 RAC 节点上 MAX_STRING_SIZE 初始化参数的值也必须相同。
Ø 需要特别注意的是:
① Oracle 12c中的扩展的数据类型只是针对 非CDB 和 PDB 而言的,而 CDB的根容器不支持扩展的数据类型 ,即使在根容器中修改成功也不能在CDB的根容器中创建超过 4000 字节的列。
② 从Oracle 12.2版本开始,可以在不修改 MAX_STRING_SIZE 参数的情况下创建最大 32767 字节的列,但是,实际最大存储依然是 4000 字节。所以,要想真正支持扩展数据类型,那么必须修改 MAX_STRING_SIZE 参数,而且运行相关脚本 utl32k.sql 和 utlrp.sql 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 | 1.1 启用扩展数据类型 1.1.1 pdb或非cdb(Non-CDB) pdb或非cdb的数据库要使用扩展字符类型需要执行以下过程: 1. 关闭pdb数据库或非cdb数据库实例。如果是RAC则需要关闭所有实例,若有必要可以把cluster_database设置为false: alter system set cluster_database = false scope = spfile; shutdown immediate 2.在UPGRADE模式下重新启动数据库;如果是rac,则只启动一个实例。 startup upgrade 3.将MAX_STRING_SIZE的设置更改为EXTENDED。 ALTER SYSTEM SET MAX_STRING_SIZE=EXTENDED SID='*'; 4.以SYSDBA用户身份运行以下脚本。 $ORACLE_HOME/rdbms/admin/utl32k.sql 5.正常关闭数据库,然后以读写模式重启数据库。 shutdown immediate startup 6.执行脚本rdbms/admin/utlrp.sql编译失效对象: $ORACLE_HOME/rdbms/admin/utlrp.sql 7.测试: show parameter max_string create table testa(name varchar2(32767)); create table testb(name varchar2(32768)); set line 80 desc testa insert into testa values(lpad('a',32766,'x')); commit; SELECT length(name) FROM testa; 升级PDB$SEED数据库: SQL> startup mount SQL> alter database open migrate; Database altered. SQL> select con_id, name, open_mode from v$pdbs; CON_ID NAME OPEN_MODE ---------- ------------------------------ ---------- 2 PDB$SEED MIGRATE SQL> alter session set container=PDB$SEED; Session altered. SQL> alter system set max_string_size = EXTENDED; System altered. SQL> @?/rdbms/admin/utl32k.sql PL/SQL procedure successfully completed. 1.1.2 CDB库 对于CDB的库启用扩展数据类型后,所有的PDB都可以使用扩展数据类型,而没有必要对每个PDB都进行升级操作。但是,需要注意的是,根容器是不支持扩展的数据类型的。CDB库启用扩展数据类型的步骤: 1、SYS用户执行: ALTER SESSION SET CONTAINER=CDB$ROOT; ALTER SYSTEM SET max_string_size=extended SCOPE=SPFILE; 2、关闭数据库并以升级模式重启数据库 shutdown immediate startup upgrade; 3、保证所有的pdb处于UPGRADE模式(包括pdb$seed) ALTER PLUGGABLE DATABASE ALL OPEN UPGRADE; show pdbs 4、执行脚本 $ cd $ORACLE_HOME/rdbms/admin $ mkdir -p /home/oracle/utl32k_output $ $ORACLE_HOME/perl/bin/perl $ORACLE_HOME/rdbms/admin/catcon.pl -u SYS -d $ORACLE_HOME/rdbms/admin -l '/home/oracle/utl32k_output' -b utl32k_cdb_pdbs_output utl32k.sql 5、以OS认证方式登录CDB数据库后,再关闭CDB,再正常启动CDB,确保所有的pdb都处于READ WRITE状态 sqlplus / as sysdba shutdown immediate startup ALTER PLUGGABLE DATABASE ALL OPEN READ WRITE; show pdbs 6、执行脚本utlrp.sql来编译失效对象 $ cd $ORACLE_HOME/rdbms/admin $ mkdir -p /home/oracle/utlrp_output $ $ORACLE_HOME/perl/bin/perl $ORACLE_HOME/rdbms/admin/catcon.pl -u SYS -d $ORACLE_HOME/rdbms/admin -l '/home/oracle/utlrp_output' -b utl32k_cdb_pdbs_output utlrp.sql 7、校验是否可以创建大于4000的字符串类型的列 show parameter max_string create table testa(name varchar2(32767)); create table testb(name varchar2(32768)); set line 80 desc testa insert into testa values(lpad('a',32766,'x')); commit; SELECT length(name) FROM testa; 1.1.3 DG环境 To increase the maximum size of VARCHAR2, NVARCHAR2, and RAW columns in an Oracle Data Guard logical standby database: 1. Shut down the Oracle Data Guard primary database and logical standby database. 2. Restart the primary database and logical standby database in UPGRADE mode. 3. Change the setting of MAX_STRING_SIZE to EXTENDED on the primary database and logical standby database. 4. Run the rdbms/admin/utl32k.sql script on both the primary database and the logical standby database. You must be connected AS SYSDBA to run the script. 5. Restart the primary database and logical standby database in NORMAL mode. Note: The utl32k.sql script increases the maximum size of the VARCHAR2, NVARCHAR2, and RAW columns for the views where this is required. The script does not increase the maximum size of the VARCHAR2, NVARCHAR2, and RAW columns in some views because of the way the SQL for those views is written. 6. Run the rdbms/admin/utlrp.sql script on the primary database and logical standby database to recompile invalid objects. You must be connected AS SYSDBA to run the script. 7. Restart SQL Apply. |
与早期版本相比,诸如 VARCHAR2, NAVARCHAR2 这些数据类型的大小会从 4K 字节扩展至 32K 数据类型的使用。为了启用扩展字符大小,你必须将 MAX_STRING_SIZE 。
要使用扩展字符类型需要执行以下过程:
1.关闭数据库
2.以升级模式重启数据库
3.更改参数: ALTER SYSTEM SET MAX_STRING_SIZE=EXTENDED;
4.执行 utl32k.sql as sysdba :SQL> @?/rdbms/admin/utl32k.sql
5.关闭数据库
6.以读写模式重启数据库
varcha2、nvarchar2和raw字段的定义长度将影响字段的内部存储方式