viernes, 26 de abril de 2024

El parámetro MAX_STRING_SIZE, como aumentar el tamaño a 32K de almacenamiento en 19c y 23c de las variables VARCHAR2, NVARCHAR2 y RAW

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>


No hay comentarios:

Publicar un comentario

Te agradezco tus comentarios. Te esperamos de vuelta.

Todos los Sábados a las 8:00PM

Optimismo para una vida Mejor

Optimismo para una vida Mejor
Noticias buenas que comentar