How-to eliminación manual de Bases de Datos registradas en el Grid Control

Hola a todos,

En este post voy a presentar unos pequeños pasos para poder eliminar manualmente las Bases de Datos registradas en un repositorio Grid Control 10.2.0.4.
No olvidéis que toda la información del Oracle Management Repository se encuentra en el esquema SYSMAN,  y mediante sus vistas, procedimientos, paquetes etc vamos a poder interactuar con el.

Para nuestro caso vamos a necesitar utilizar la vista MGMT$DB_DBNINSTANCEINFO para visualizar las bases de datos registradas en el repositorio (target_type : oracle_database)

SQL> SELECT HOST_NAME,TARGET_NAME,TARGET_TYPE,DATABASE_NAME,GLOBAL_NAME,INSTANCE_NAME FROM SYSMAN.MGMT$DB_DBNINSTANCEINFO
HOST_NAME         TARGET_NAME      TARGET_TYPE           DATABASE_NAME        GLOBAL_NAME       INSTANCE_NAME
------------   ---------------- -------------------- -------------------- -------------------   --------------
hostora          onedb              oracle_database            ONEDB               ONEDB              onedb
hostora          twodb              oracle_database            TWODB               TWODB              twodb
hostora          threedb            oracle_database            THREEDB             THREEDB            threedb
hostora          fourdb             oracle_database            FOURDB              FOURDB             fourdb

A partir de aquí selecciono y elimino la Base de Datos mediante el paquete mgmt_admin y su procedimiento delete_target
Una cosa importante ha tener en cuenta es que una vez lanzado el procedimiento no se permite la recuperación de la información eliminada  así pues si un error ocurre durante el proceso , la tablas afectadas pueden quedarse en estado inconsistente, olvidaos de ROLLBACK!!! cada 1000 registros o tablas eliminada hace COMMIT.

En este ejemplo vamos a eliminar la bbdd onedb,

SQL> EXEC MGMT_ADMIN.DELETE_TARGET('ONEDB','ORACLE_DATABASE');

Después de un buen rato esperando que el job elimine los registros, realizo de nuevo la consulta, y me encuentro que todavía existe.

SQL> SELECT HOST_NAME,TARGET_NAME,TARGET_TYPE,DATABASE_NAME,GLOBAL_NAME,INSTANCE_NAME FROM SYSMAN.MGMT$DB_DBNINSTANCEINFO
HOST_NAME         TARGET_NAME      TARGET_TYPE           DATABASE_NAME        GLOBAL_NAME       INSTANCE_NAME
------------   ---------------- -------------------- -------------------- -------------------   --------------
hostora          onedb              oracle_database            ONEDB               ONEDB              onedb
hostora          twodb              oracle_database            TWODB               TWODB              twodb
hostora          threedb            oracle_database            THREEDB             THREEDB            threedb
hostora          fourdb             oracle_database            FOURDB              FOURDB             fourdb

Lanzo de nuevo el comando :

SQL> EXEC MGMT_ADMIN.DELETE_TARGET('ONEDB','ORACLE_DATABASE');
BEGIN mgmt_admin.delete_target('onedb','oracle_database'); END;
*
ERROR at line 1:
ORA-20238: Target onedb:oracle_database is currently in the process of being deleted
ORA-06512: at "SYSMAN.MGMT_ADMIN", line 436
ORA-06512: at "SYSMAN.MGMT_ADMIN", line 599
ORA-06512: at line 1

Me conecto a Oracle Support, busco y encuentro la siguiente Nota 419956.1 , indican que la solución es hacer un rebuild del índice SYSMAN.MGMT_STRING_METRIC_HISTORY_PK.

SQL> ALTER INDEX SYSMAN.MGMT_STRING_METRIC_HISTORY_PK REBUILD;
SQL> EXEC MGMT_ADMIN.DELETE_TARGET('ONEDB','ORACLE_DATABASE');

inmediatamente después hago la consulta   y veo que no aparece la Base de Datos eliminada.

SQL> SELECT HOST_NAME,TARGET_NAME,TARGET_TYPE,DATABASE_NAME,GLOBAL_NAME,INSTANCE_NAME FROM SYSMAN.MGMT$DB_DBNINSTANCEINFO
HOST_NAME         TARGET_NAME      TARGET_TYPE           DATABASE_NAME        GLOBAL_NAME       INSTANCE_NAME
------------   ---------------- -------------------- -------------------- -------------------   --------------
hostora          twodb              oracle_database            TWODB               TWODB              twodb
hostora          threedb            oracle_database            THREEDB             THREEDB            threedb
hostora          fourdb             oracle_database            FOURDB              FOURDB             fourdb

Saludos.

R. Alberto Hernández