En una base de datos Oracle el parámetro MAX_STRING_SIZE controla el tamaño máximo de los tipo VARCHAR2, NVARCHAR2 y RAW en SQL.
En la versión 19c que actualmente esta en el RU 19.23 y en la versión 23c que se encuentra disponible en el OCI como DBaaS y que pronto estar disponible en las demás plataformas para ON-PREMISE, el valor de facto es STANDARD, lo que implica, que el tamaño máximo que puede almacenar son 4000 bytes.
Utilizando el comando ALTER SYSTEM, eso sí, solo cuando la base de datos esté en modo UPGRADE y posteriormente ejecutando el script utl32k.sql, como se explica en este artículo, podrán cambiar la capacidad máximo de almacenamiento para este tipo de variables.
STANDARD significa que se aplican los límites de longitud para las versiones de Oracle Database anteriores a Oracle Database 12c (por ejemplo, 4000 bytes para VARCHAR2 y NVARCHAR2 y 2000 bytes para RAW).
EXTENDED significa que se aplica el límite de 32767 bytes introducido en Oracle Database 12c.
Puede cambiar el valor de MAX_STRING_SIZE desde STANDARD a EXTENDED. Sin embargo, no puede cambiar el valor de MAX_STRING_SIZE de EXTENDED a STANDARD.
Al establecer MAX_STRING_SIZE= EXTENDED, los usuarios están realizando una acción explícita que podría introducir incompatibilidad de aplicaciones en su base de datos. Las aplicaciones que no quieran utilizar los tipos de datos expandidos se pueden reescribir para que sean compatibles con cualquiera de las configuraciones; por ejemplo, estas aplicaciones podrían usar CAST explícitos para fijar la longitud de VARCHAR2 en las expresiones durante CREATE TABLE AS SELECT.
La modificación MAX_STRING_SIZE actualizará los objetos de la base de datos y posiblemente los invalidará, según la documentación oficial de Oracle, de la siguiente manera:
- Las tablas con columnas virtuales se actualizarán con nuevos metadatos de tipos de datos para columnas virtuales de VARCHAR2(4000), 4000 bytes.
- Los índices funcionales quedarán inutilizables si un cambio en sus columnas virtuales asociadas hace que la clave de índice exceda los límites de longitud de la clave de índice. Los intentos de reconstruir dichos índices fracasarán con ORA-01450: maximum key length exceeded.
- Las vistas se invalidarán si contienen columnas VARCHAR2(4000) de , 4000 bytes NVARCHAR2 o RAW(2000).
- Las vistas materializadas se actualizarán con nuevos metadatos VARCHAR2(4000), 4000 bytes NVARCHAR2y RAW(2000)columnas de expresión escrita.
En una base de datos utilizando Container Database, el cambio debe realizarse tanto en el CDB como en los PDB requeridos.
Realizarlo en el CDB permitirá que los PDBS que se creen posterior al cambio, ya tengan como valor de facto en la variable, los 32K de tamaño.
Veamos como se hace el procedimiento de cambio.
Para realizar este proceso será necesario utilizar el script "catcon.pl" para ejecutar el archivo de comando utl32k.sql ubicado en $ORACLE_HOME/rdbms/admin.
Va a requerir contar con la contraseña del usuario SYS, la cuál será solicitada durante la ejecución del script.
login as: opc
Authenticating with public key "rsa-key-20200507"
Passphrase for key "rsa-key-20200507":
Last login: Wed Apr 24 21:00:55 2024 from 201.198.177.186
[opc@oracle-database-server-19c ~]$ sudo su - oracle
Last login: Wed Apr 24 21:01:20 GMT 2024 on pts/0
-bash-4.2$ lsnrctl start
-bash: lsnrctl: command not found
-bash-4.2$ . oraenv
ORACLE_SID = [oracle] ? cdb
The Oracle base has been set to /opt/app/oracle
-bash-4.2$ lsnrctl status
LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 26-APR-2024 15:46:43
Copyright (c) 1991, 2023, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=oracle-database-server-19c.vcnlandb.vcntestinglab.oraclevcn.com)(PORT=1521)))
TNS-12541: TNS:no listener
TNS-12560: TNS:protocol adapter error
TNS-00511: No listener
Linux Error: 111: Connection refused
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))
TNS-12541: TNS:no listener
TNS-12560: TNS:protocol adapter error
TNS-00511: No listener
Linux Error: 2: No such file or directory
-bash-4.2$ lsnrctl start
LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 26-APR-2024 15:46:45
Copyright (c) 1991, 2023, Oracle. All rights reserved.
Starting /opt/app/oracle/product/19c/bin/tnslsnr: please wait...
TNSLSNR for Linux: Version 19.0.0.0.0 - Production
System parameter file is /opt/app/oracle/product/19c/network/admin/listener.ora
Log messages written to /opt/app/oracle/diag/tnslsnr/oracle-database-server-19c/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oracle-database-server-19c.vcnlandb.vcntestinglab.oraclevcn.com)(PORT=1521)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=oracle-database-server-19c.vcnlandb.vcntestinglab.oraclevcn.com)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 19.0.0.0.0 - Production
Start Date 26-APR-2024 15:46:45
Uptime 0 days 0 hr. 0 min. 0 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /opt/app/oracle/product/19c/network/admin/listener.ora
Listener Log File /opt/app/oracle/diag/tnslsnr/oracle-database-server-19c/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oracle-database-server-19c.vcnlandb.vcntestinglab.oraclevcn.com)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
The listener supports no services
The command completed successfully
-bash-4.2$ sqlplus /nolog
SQL*Plus: Release 19.0.0.0.0 - Production on Fri Apr 26 15:46:49 2024
Version 19.22.0.0.0
Copyright (c) 1982, 2023, Oracle. All rights reserved.
SQL> connect / as sysdba
Connected to an idle instance.
SQL> startup
ORACLE instance started.
Total System Global Area 4.2950E+10 bytes
Fixed Size 9189176 bytes
Variable Size 4966055936 bytes
Database Buffers 3.7849E+10 bytes
Redo Buffers 125026304 bytes
Database mounted.
Database opened.
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PRODUCCION READ WRITE NO
SQL> show parameter max_string_size
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
max_string_size string STANDARD
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PRODUCCION READ WRITE NO
SQL> alter pluggable database PRODUCCION close immediate;
Pluggable database altered.
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PRODUCCION MOUNTED
SQL> alter system set max_string_size=extended scope=both;
alter system set max_string_size=extended scope=both
*
ERROR at line 1:
ORA-02097: parameter cannot be modified because specified value is invalid
ORA-02095: specified initialization parameter cannot be modified
SQL> alter pluggable database PRODUCCION open;
Pluggable database altered.
SQL> alter session set container=PRODUCCION;
Session altered.
SQL> alter system set max_string_size=extended scope=both;
alter system set max_string_size=extended scope=both
*
ERROR at line 1:
ORA-02097: parameter cannot be modified because specified value is invalid
ORA-14694: database must in UPGRADE mode to begin MAX_STRING_SIZE migration
SQL> connect / as sysdba
Connected.
SQL> alter system set max_string_size=extended scope=spfile;
System altered.
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup migrate
ORACLE instance started.
Total System Global Area 4.2950E+10 bytes
Fixed Size 9189176 bytes
Variable Size 4966055936 bytes
Database Buffers 3.7849E+10 bytes
Redo Buffers 125026304 bytes
Database mounted.
Database opened.
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED MIGRATE YES
3 PRODUCCION MOUNTED
SQL> alter pluggable database produccion open upgrade;
Pluggable database altered.
SQL> exit
Disconnected from Oracle Database 19c Enterprise Edition - Core Release 19.0.0.0.0 - Production
Version 19.22.0.0.0
-bash-4.2$ cd $ORACLE_HOME
-bash-4.2$ cd rdbms
-bash-4.2$ cd admin
-bash-4.2$ mkdir utl32k
-bash-4.2$ cd utl32k/
-bash-4.2$ pwd
/opt/app/oracle/product/19c/rdbms/admin/utl32k
-bash-4.2$ sqlplus sys/oracle as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Fri Apr 26 16:14:14 2024
Version 19.22.0.0.0
Copyright (c) 1982, 2023, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition - Core Release 19.0.0.0.0 - Production
Version 19.22.0.0.0
SQL> exit
Disconnected from Oracle Database 19c Enterprise Edition - Core Release 19.0.0.0.0 - Production
Version 19.22.0.0.0
-bash-4.2$ $ORACLE_HOME/perl/bin/perl $ORACLE_HOME/rdbms/admin/catcon.pl -u SYS \
> -d $ORACLE_HOME/rdbms/admin -l '/opt/app/oracle/product/19c/rdbms/admin/utl32k' -b \
> utl32k_cdb_pdbs_output utl32k.sql
catcon::set_log_file_base_path: ALL catcon-related output will be written to [/opt/app/oracle/product/19c/rdbms/admin/utl32k/utl32k_cdb_pdbs_output_catcon_6945.lst]
catcon::set_log_file_base_path: catcon: See [/opt/app/oracle/product/19c/rdbms/admin/utl32k/utl32k_cdb_pdbs_output*.log] files for output generated by scripts
catcon::set_log_file_base_path: catcon: See [/opt/app/oracle/product/19c/rdbms/admin/utl32k/utl32k_cdb_pdbs_output_*.lst] files for spool files, if any
Enter Password:
catcon.pl: completed successfully
-bash-4.2$ sqlplus /nolog
SQL*Plus: Release 19.0.0.0.0 - Production on Fri Apr 26 16:16:48 2024
Version 19.22.0.0.0
Copyright (c) 1982, 2023, Oracle. All rights reserved.
SQL> connect / as sysdba
Connected.
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
Total System Global Area 4.2950E+10 bytes
Fixed Size 9189176 bytes
Variable Size 4966055936 bytes
Database Buffers 3.7849E+10 bytes
Redo Buffers 125026304 bytes
Database mounted.
Database opened.
SQL> show parameter max_string_size
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
max_string_size string EXTENDED
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PRODUCCION READ WRITE NO
SQL> alter session set container=produccion;
Session altered.
SQL> show parameter max_string_size
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
max_string_size string EXTENDED
SQL>
SQL> connect / as sysdba
Connected.
SQL> create pluggable database pdb2 from PRODUCCION;
Pluggable database created.
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PRODUCCION READ WRITE NO
4 PDB2 MOUNTED
SQL> alter pluggable database pdb2 open;
Pluggable database altered.
SQL> alter session set container=pdb2;
Session altered.
SQL> show parameter max_string_size
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
max_string_size string EXTENDED
SQL>