miércoles, 3 de junio de 2015

Como Renombrar un Tablespace

Como Renombrar un Tablespace

Introducción
A partir de Oracle 10g podemos renombrar un Tablespace con una sola sentencia:
ALTER TABLESPACE tablespace_name RENAME TO tablespace_new_name;
Se pueden renombrar todos los tablespaces permanentes o temporales excepto SYSTEM y SYSAUX.
Requisitos :
  • El parámetro COMPATIBLE debe estar seteado en 10.0.0 o superior.
  • El tablespace a renombrar y todos sus datafiles deben estar online. 

Casos de estudio

  1. Renombramos el Tablespace Users como Users_Data
    • Verificamos que existe el tablespace USERS
  2. SQL> select tablespace_name from dba_tablespaces;
    
    TABLESPACE_NAME
    ------------------------------------------------
    SYSTEM
    SYSAUX
    UNDOTBS1
    TEMP
    USERS
    EXAMPLE
    TBSJMW
    INVENTORY
    
    8 rows selected.
    

      • Vemos que varios usuarios tienen el tablespace USERS como Default Tablespace
    SQL> select username, default_tablespace from  dba_users where default_tablespace='USERS';
    
    USERNAME                        DEFAULT_TABLESPACE
    ------------------------------  ------------------------------
    PM                              USERS
    BI                              USERS
    .............................................................
    
    16 rows selected.

    -> Renombramos Users como Users_Data
    SQL> alter tablespace users rename to users_data;
    
    Tablespace altered.

      • Verificamos que ya no existe USERS en cambio existe USERS_DATA
    SQL> select tablespace_name from dba_tablespaces;
    
    TABLESPACE_NAME
    ------------------------------
    SYSTEM
    SYSAUX
    UNDOTBS1
    TEMP
    USERS_DATA
    EXAMPLE
    TBSJMW
    INVENTORY
    
    8 rows selected.

      • Verificamos que no quedaron usuarios con default tablespace USERS
    SQL> select username, default_tablespace from  dba_users where default_tablespace='USERS';
    no rows  selected 

      • Verificamos que automáticamente actualizó el Default Tablespace de los usuarios que tenían USERS a USERS_DATA
    SQL> select username, default_tablespace from  dba_users where default_tablespace='USERS_DATA';
    
    USERNAME                        DEFAULT_TABLESPACE
    ------------------------------  ------------------------------
    PM                              USERS_DATA
    BI                              USERS_DATA
    
    ............................................................
    
    16 rows selected.

    Conclusión : Excepto SYSTEM y SYSAUX que no se puede renombrar, al renombrar cualquier tablespace que los usuarios tienen definido como Default Tablespace, automáticamente queda actualizado el Default Tablespace de dichos usuarios.

  3. Renombramos el UNDO Tablespace, UNDOTBS1 por UNDOTBS2
    • Verificamos que usamos SPFILE
  4. SQL> show parameters pfile
    
    NAME          TYPE        VALUE
    --------      ----------  -----------------------------
    spfile        string      /u01/app/oracle/product/11.2.0
                              /dbhome_1/dbs/spfileorcl.ora

    • Verificamos que esta definido UNDOTBS1
    SQL> show parameters UNDO
    
    NAME                                 TYPE         VALUE
    -----------------------------------  -----------  ---------------------
    undo_management                      string        AUTO
    undo_retention                       integer       172800
    undo_tablespace                      string        UNDOTBS1

    • Renombramos UNDOTBS1 a UNDOTBS2
    SQL> alter tablespace undotbs1 rename to undotbs2;
    Tablespace altered.

    • Comprobamos que NO quedo actualizado 
    SQL> show parameters UNDO
    
    NAME                                  TYPE         VALUE
    ------------------------------------  ----------   --------------------
    undo_management                       string       AUTO
    undo_retention                        integer      172800
    undo_tablespace                       string       UNDOTBS1

    • Verificamos que lo cambio en el spfile
    SQL> select value from v$spparameter where  name='undo_tablespace';
    
    VALUE
    ---------------------------------------------------------------
    UNDOTBS2

    • Reiniciamos la base
    SQL> shutdown immediate
    Database closed.
    Database dismounted.
    ORACLE instance shut down.
    SQL> startup
    ORACLE instance started.
    Total System Global Area  418484224 bytes
    Fixed Size                   1336932 bytes
    Variable Size              297798044 bytes
    Database Buffers           113246208 bytes
    Redo Buffers                 6103040 bytes
    Database mounted.
    Database opened.

    • Verificamos el cambio
    SQL> show parameter UNDO
    
    NAME                                  TYPE         VALUE
    ------------------------------------ -----------  ---------------------
    undo_management                       string      AUTO
    undo_retention                        integer     172800
    undo_tablespace                       string      UNDOTBS2

    Conclusión : Renombrar el Undo tablespace solo toma efecto después de reiniciar la base. Si no usamos spfile, antes de levantar la base tenemos que cambiar manualmente el parámetro en el pfile.
  5. Renombramos el Tablespace Temporal
    • Para ver el Default Temporary Tablespace consultamos la tabla DATABASE_PROPERTIES
  6. SQL> column property_name format a25
    SQL> column property_value format a15
    SQL> select property_name, property_value from  DATABASE_PROPERTIES 
    where PROPERTY_NAME='DEFAULT_TEMP_TABLESPACE';
    
    PROPERTY_NAME              PROPERTY_VALUE
    ------------------------   ----------------------
    DEFAULT_TEMP_TABLESPACE    TEMP 

    • Consultamos los usuarios que usan TEMP de Tablespace Temporal
    SQL> select username, temporary_tablespace from  dba_users where temporary_tablespace='TEMP';
    
    USERNAME                        TEMPORARY_TABLESPACE
    ------------------------------  ------------------------------
    DBSNMP                          TEMP
    DBA1                            TEMP
    BI                              TEMP
    ...........................................................
    
    40 rows selected.

    • Renombramos TEMP como TEMP1 
    SQL> alter tablespace TEMP rename to TEMP1;
    Tablespace altered.

    • Verificamos que no quedaron usuarios con temporary tablespace TEMP
    SQL> select username, temporary_tablespace from  dba_users 
    where temporary_tablespace='TEMP';
    no rows  selected 

    • Verificamos que automáticamente actualizó el Temporary Tablespace de los usuarios que tenían TEMP a TEMP1
    SQL> select username, temporary_tablespace from  dba_users 
    where temporary_tablespace='TEMP1';
    
    USERNAME                        TEMPORARY_TABLESPACE
    ------------------------------  ------------------------------
    DBSNMP                          TEMP1
    DBA1                            TEMP1
    BI                              TEMP1
    .............................................................
    
    40 rows selected.

    • Verificamos que automáticamente actualizó tabla DATABASE_PROPERTIES
    SQL> select property_name, property_value from  DATABASE_PROPERTIES 
    where PROPERTY_NAME='DEFAULT_TEMP_TABLESPACE';
    
    PROPERTY_NAME              PROPERTY_VALUE
    -------------------------  -----------------------
    DEFAULT_TEMP_TABLESPACE    TEMP1 

    Conclusión : Al renombrar un Tablespace Temporal que los usuarios lo tienen definido como Temporary Tablespace, automáticamente queda actualizado el Temporary Tablespace de dichos usuarios. Si este Tablespace Temporal es el Default Temporary Tablespace también lo actualiza en la tabla Database_Properties.

  7. Renombramos un Tablespace Read Only
    • Verificamos que el tablespace READONLY_TBS esta definido como READ ONLY
  8. SQL> select  tablespace_name,status from dba_tablespaces;
    
    TABLESPACE_NAME                 STATUS
    ------------------------------  ------------
    SYSTEM                          ONLINE
    SYSAUX                          ONLINE
    UNDOTBS1                        ONLINE
    TEMP                            ONLINE
    USERS                           ONLINE
    EXAMPLE                         ONLINE
    TBSJMW                          ONLINE
    INVENTORY                       ONLINE
    READONLY_TBS                    READ ONLY 
    
    9 rows selected.

    • Renombramos READONLY_TBS como APP_READONLY
    SQL> alter tablespace readonly_tbs  rename to app_readonly;

    • Verificamos que ya no existe READONLY_TBS, en cambio existe APP_READONLY
    SQL> select  tablespace_name,status from dba_tablespaces;
    
    TABLESPACE_NAME                 STATUS
    ------------------------------  ---------
    SYSTEM                          ONLINE
    SYSAUX                          ONLINE
    UNDOTBS1                        ONLINE
    TEMP                            ONLINE
    USERS                           ONLINE
    EXAMPLE                         ONLINE
    TBSJMW                          ONLINE
    INVENTORY                       ONLINE
    APP_READONLY                    READ ONLY
    
    9 rows selected.

    • Revisamos el alert.log
    [oracle@host01]$ tail  alert_orcl.log
    Completed: create tablespace  ReadOnly_TBS datafile '+DATA' size 100M
    Sun Jan 26 09:30:34 2014
    alter tablespace  ReadOnly_TBS read only
    Converting  block 0 to version 10 format
    Completed: alter tablespace ReadOnly_TBS read only
    Sun Jan 26 09:35:51 2014
    alter tablespace readonly_tbs  rename to app_readonly
    Tablespace  'READONLY_TBS' is renamed to 'APP_READONLY'.
    Tablespace  name change is not propagated to file headersbecause the tablespace is read  only. 
    Completed: alter tablespace readonly_tbs rename to  app_readonly

    Conclusión : Si el tablespace es Read Only, los headers de los datafiles no son actualizados. Esto no significa que quede corrupto. En el alert.log va a escribir un mensaje que los headers de los datafiles no fueron renombrados pero en el diccionario de datos y en los control file quedó actualizado.