Creación de fichero tnsnames.ora desde Cloud Control

Hola a todos!

Hoy queríamos compartir con vosotros un script que hemos utilizado en varias ocasiones para generar el fichero tnsnames.ora de conexión mediante una consulta a Cloud Control. 

Para ello, utilizamos las vistas mgmt_target_properties y mgmt$target. De la primera vista consultamos los valores MachineName, Port y SID para extraer los datos que necesitamos. Los datos de la consulta los exportamos a fichero y con un pequeño programa shell script generamos nuestro nuevo tnsnames.ora.

La consulta que utilizamos para la primera parte es:

set pages 999 lines 200 heading off
col host for a50
col port for a10
col sid for a10

spool db_all.txt

select
distinct mgmt$target.host_name||'|'||sid.PROPERTY_VALUE||'|'||port.PROPERTY_VALUE
from
sysman.mgmt_target_properties machine,
sysman.mgmt_target_properties port,
sysman.mgmt_target_properties sid,
sysman.mgmt_target_properties domain,
sysman.mgmt$target
where
machine.target_guid=sid.target_guid
AND sid.target_guid=port.target_guid
AND port.target_guid=domain.target_guid
AND machine.PROPERTY_NAME='MachineName'
AND port.PROPERTY_NAME='Port'
AND sid.PROPERTY_NAME='SID'
AND sid.PROPERTY_VALUE not like '%ASM%'
AND machine.TARGET_GUID in (select TARGET_GUID from sysman.mgmt_current_availability 
where sysman.EM_SEVERITY.get_avail_string(current_status)='UP')
AND machine.TARGET_GUID=mgmt$target.target_guid
order by 1;

spool off

En la consulta se buscan solo aquellas instancias que están con estado “UP”, se puede quitar la condición para buscar todas. También tenemos la posibilidad de buscar las de una máquina en concreto, por lo que podemos consultar añadiendo:

AND machine.PROPERTY_VALUE=’maquina1′

 

Una ve generado el fichero, buscamos los valores y formateamos la salida en formato tnsnames.ora:

cat db_all.txt |grep -v "^$"| while read each_line
do
        HOST_NAME=`echo $each_line |cut -d"|" -f1`
        ORACLE_SID=`echo $each_line |cut -d"|" -f2`
        PORT=`echo $each_line |cut -d"|" -f3`

echo "${ORACLE_SID} ="                             >> tnsnames.ora
echo "  (DESCRIPTION ="                            >> tnsnames.ora
echo "    (ADDRESS = (PROTOCOL = TCP)"             >> tnsnames.ora
echo "     (HOST = ${HOST_NAME})(PORT = ${PORT}))" >> tnsnames.ora
echo "    (CONNECT_DATA = "                        >> tnsnames.ora
echo "     (SID = ${ORACLE_SID})"                  >> tnsnames.ora
echo "    )"                                       >> tnsnames.ora
echo "  )"                                         >> tnsnames.ora
echo " "                                           >> tnsnames.ora

done

Esperamos que os sea de tanta utilidad como a nosotros.

Un saludo.

Equipo DBA.