domingo, 26 de enero de 2014

Como Renombrar un Tablespace

A partir de Oracle 10g podemos renombrar un Tablespace con una sola sentencia:

ALTER TABLESPACE tablespace_name RENAME TO tablespace_new_name;


El parámetro COMPATIBLE debe estar seteado en 10.0.0 o superior. El tablespace a renombrar y todos sus datafiles deben estar online. Se pueden renombrar tablespaces permanentes o temporales. No se pueden renombrar los tablespaces SYSTEM y SYSAUX.

Casos de estudio

1-  Renombramos el tablespace Users como Users_Data

-> Verificamos que existe el tablespace USERS
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
XS$NULL                        USERS
SPATIAL_WFS_ADMIN_USR          USERS
ORACLE_OCM                     USERS
SPATIAL_CSW_ADMIN_USR          USERS
SCOTT                          USERS
APEX_PUBLIC_USER               USERS
OE                             USERS
DIP                            USERS
SH                             USERS

USERNAME                       DEFAULT_TABLESPACE
------------------------------ ------------------------------
IX                             USERS
MDDATA                         USERS
HR                             USERS
DHAMBY                         USERS
RPANDYA                        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
XS$NULL                        USERS_DATA
SPATIAL_WFS_ADMIN_USR          USERS_DATA
ORACLE_OCM                     USERS_DATA
SPATIAL_CSW_ADMIN_USR          USERS_DATA
SCOTT                          USERS_DATA
APEX_PUBLIC_USER               USERS_DATA
OE                             USERS_DATA
DIP                            USERS_DATA
SH                             USERS_DATA

USERNAME                       DEFAULT_TABLESPACE
------------------------------ ------------------------------
IX                             USERS_DATA
MDDATA                         USERS_DATA
HR                             USERS_DATA
DHAMBY                         USERS_DATA
RPANDYA                        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 también el Default Tablespace de dichos usuarios.

2 - Renombramos el UNDO tablespace, UNDOTBS1 por UNDOTBS2

-> Verificamos que usamos SPFILE
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

-> Ejecutamos un Restart de 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. 


3 - Renombramos el Tablespace Temporal

->Para ver el Default Temporary Tablespace consultamos la tabla DATABASE_PROPERTIES

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


-> Vemos que todos los usuarios 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.

4-  Renombramos un Tablespace Read Only

-> Verificamos que el tablespace READONLY_TBS esta definido como READ ONLY
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.



No hay comentarios:

Publicar un comentario