<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Administración de ORACLE en Español &#187; Administración Oracle</title>
	<atom:link href="http://colacios.es/blog/WordPress3/category/dba/feed/" rel="self" type="application/rss+xml" />
	<link>http://colacios.es/blog/WordPress3</link>
	<description>Administración de Base de datos ORACLE en español</description>
	<lastBuildDate>Tue, 11 Mar 2014 12:56:35 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Cómo crear el usuario ORACLE necesario para monitorizar con NAGIOS</title>
		<link>http://colacios.es/blog/WordPress3/como-crear-el-usuario-oracle-necesario-para-monitorizar-con-nagios/</link>
		<comments>http://colacios.es/blog/WordPress3/como-crear-el-usuario-oracle-necesario-para-monitorizar-con-nagios/#comments</comments>
		<pubDate>Tue, 11 Mar 2014 12:53:50 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Administración Oracle]]></category>
		<category><![CDATA[Administración Sistemas]]></category>
		<category><![CDATA[nagios]]></category>
		<category><![CDATA[O7_DICTIONARY_ACCESSIBILITY]]></category>
		<category><![CDATA[select any dictionary]]></category>
		<category><![CDATA[SELECT ANY TABLE]]></category>

		<guid isPermaLink="false">http://colacios.es/blog/WordPress3/?p=834</guid>
		<description><![CDATA[Para poder monitorizar con NAGIOS los parámetros de Oracle, es necesario crear un usuario llamado &#8220;nagios&#8221; dentro de la BBDD que queremos monitorizar. Dependiendo de la versión de Oracle que tengamos, tendremos que asignarle unos grants diferentes para que la &#8230; <a href="http://colacios.es/blog/WordPress3/como-crear-el-usuario-oracle-necesario-para-monitorizar-con-nagios/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Para poder monitorizar con NAGIOS los parámetros de Oracle, es necesario crear un usuario llamado &#8220;nagios&#8221; dentro de la BBDD que queremos monitorizar. Dependiendo de la versión de Oracle que tengamos, tendremos que asignarle unos grants diferentes para que la monitorización se pueda realizar de manera adecuada.</p>
<p>Para versiones 9,10G y 11G:</p>
<pre style="text-align: justify;"><em>CREATE USER nagios IDENTIFIED BY oradbmon;</em> <strong>-- Poner el password que deseemos</strong>
 <em>GRANT CREATE SESSION TO nagios;</em>
 <em> GRANT SELECT any dictionary TO nagios;</em> <strong>-- Este no funciona en 8i</strong>
 <em> GRANT SELECT ON V_$SYSSTAT TO nagios;</em>
 <em> GRANT SELECT ON V_$INSTANCE TO nagios;</em>
 <em> GRANT SELECT ON V_$LOG TO nagios;</em>
 <em> GRANT SELECT ON SYS.DBA_DATA_FILES TO nagios;</em>
 <em> GRANT SELECT ON SYS.DBA_FREE_SPACE TO nagios;</em></pre>
<p>Para versiones 8i (8.1.7) poner además &#8230;</p>
<pre> GRANT SELECT ON sys.dba_tablespaces TO nagios;
 GRANT SELECT ON dba_temp_files TO nagios;
 GRANT SELECT ON sys.v_$Temp_extent_pool TO nagios;
 GRANT SELECT ON sys.v_$TEMP_SPACE_HEADER  TO nagios;
 GRANT SELECT ON sys.v_$session TO nagios;</pre>
<pre> GRANT SELECT ON SYS.OBJAUTH$ TO nagios;
 GRANT SELECT ON SYS.OBJ$ TO nagios;
 GRANT SELECT ON SYS.USER$ to nagios;
 GRANT SELECT ON SYS.COL$ TO nagios;
 GRANT SELECT ON SYS.TABLE_PRIVILEGE_MAP TO nagios;</pre>
<p style="text-align: justify;">Hay que tener en cuenta que para versiones 8i el privilegio SELECT ANY DICTIONARY no está soportado, y por tanto, se deben conceder de manera individual sobre los objetos del diccionario. Asimismo, el privilegio SELECT ANY TABLE  no permite el acceso a objetos del diccionario, a menos que cambiemos el parámetro&#8230;<br />
<em>O7_DICTIONARY_ACCESSIBILITY</em>  de FALSE a TRUE de la siguiente manera:</p>
<pre style="text-align: justify;">alter system set o7_dictionary_accessibility=TRUE scope=spfile;</pre>
]]></content:encoded>
			<wfw:commentRss>http://colacios.es/blog/WordPress3/como-crear-el-usuario-oracle-necesario-para-monitorizar-con-nagios/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Consultar tabla sin que se sepa quien es el propietario</title>
		<link>http://colacios.es/blog/WordPress3/consultar-tabla-sin-que-se-sepa-quien-es-el-propietario/</link>
		<comments>http://colacios.es/blog/WordPress3/consultar-tabla-sin-que-se-sepa-quien-es-el-propietario/#comments</comments>
		<pubDate>Tue, 11 Mar 2014 12:35:58 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Administración Oracle]]></category>
		<category><![CDATA[public synonym]]></category>

		<guid isPermaLink="false">http://colacios.es/blog/WordPress3/?p=832</guid>
		<description><![CDATA[Esta entrada de blog trata de una cosa muy simple, pero que nos puede servir de ayuda para si alguna vez, queremos que algún usuario pueda realizar consultas sobre alguna tabla que no queramos que se conozca quien es el &#8230; <a href="http://colacios.es/blog/WordPress3/consultar-tabla-sin-que-se-sepa-quien-es-el-propietario/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Esta entrada de blog trata de una cosa muy simple, pero que nos puede servir de ayuda para si alguna vez, queremos que algún usuario pueda realizar consultas sobre alguna tabla que no queramos que se conozca quien es el propietario. Para ello, basta con crear un sinónimo de dicha tabla y dar el permiso de consulta sobre el sinónimo.</p>
<p style="text-align: justify;">Crear el sinónimo:</p>
<pre><em><strong>create public synonym</strong> s_tabla <strong>for</strong> usuario.tabla;</em></pre>
<p>Asignar los permisos:</p>
<pre><em><strong>grant select on </strong> s_tabla<strong> to</strong> usuario_destino;</em></pre>
<p>Cuando hagamos una select del <em>&#8220;s_tabla</em>&#8221; veremos el contenido de &#8220;tabla&#8221; cuyo propietario es &#8220;usuario&#8221; pero no será necesario indicarlo en la consulta.</p>
<p>Una tontería facilona, pero que puede sernos útiles en algún momento.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://colacios.es/blog/WordPress3/consultar-tabla-sin-que-se-sepa-quien-es-el-propietario/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lanzar informe de carga de repositorio de trabajo (AWR) desde sqlplus</title>
		<link>http://colacios.es/blog/WordPress3/lanzar-informe-de-carga-de-repositorio-de-trabajo-awr-desde-sqlplus/</link>
		<comments>http://colacios.es/blog/WordPress3/lanzar-informe-de-carga-de-repositorio-de-trabajo-awr-desde-sqlplus/#comments</comments>
		<pubDate>Fri, 22 Nov 2013 14:59:39 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Administración Oracle]]></category>
		<category><![CDATA[AWR]]></category>
		<category><![CDATA[awrrpt.sql]]></category>
		<category><![CDATA[awrrpti.sql]]></category>
		<category><![CDATA[statspack]]></category>
		<category><![CDATA[workload repository]]></category>

		<guid isPermaLink="false">http://colacios.es/blog/WordPress3/?p=718</guid>
		<description><![CDATA[Oracle proporciona dos scripts para producir informes de repositorio de carga de trabajo (awrrpt.sql y awrrpti.sql) que podemos ejecutar directamente desde sqlplus sin necesidad de ejecutarlos via OEM con un navegador . Son similares en formato a los informes STATSPACK &#8230; <a href="http://colacios.es/blog/WordPress3/lanzar-informe-de-carga-de-repositorio-de-trabajo-awr-desde-sqlplus/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Oracle proporciona dos scripts para producir informes de repositorio de carga de trabajo (<strong><em>awrrpt.sql y awrrpti.sql</em></strong>) que podemos ejecutar directamente desde sqlplus sin necesidad de ejecutarlos via OEM con un navegador .</p>
<p style="text-align: justify;">Son similares en formato a los informes STATSPACK y dan la opción de formato HTML o texto plano. Los dos informes dan esencialmente la misma salida pero el <strong><em>awrrpti.sql</em></strong> te permite seleccionar una sola instancia. Los informes se pueden generar de la siguiente manera:</p>
<pre>Conectados como sys o system ...

SQL&gt; @$ORACLE_HOME/rdbms/admin/awrrpt.sql
SQL&gt; @$ORACLE_HOME/rdbms/admin/awrrpti.sql</pre>
<p style="text-align: justify;">Las secuencias de comandos te pedirá que ingreses el formato del informe (html o texto), el identificador de instantánea inicial, el id instantánea final y el informe de nombre de archivo. El informe resultante o su apertura se realizará en un navegador o editor de texto en consecuencia.</p>
<p style="text-align: justify;">El informe via html es algo parecido a la siguiente pantalla (muestro sólo una parte pequeña del informe total):</p>
<p style="text-align: justify;"><a href="http://colacios.es/blog/WordPress3/wp-content/uploads/2013/11/awr12.jpg"><img class="aligncenter size-full wp-image-729" title="Parte de un informe AWR en formato html" src="http://colacios.es/blog/WordPress3/wp-content/uploads/2013/11/awr12.jpg" alt="" width="524" height="831" /></a></p>
<p style="text-align: justify;">
]]></content:encoded>
			<wfw:commentRss>http://colacios.es/blog/WordPress3/lanzar-informe-de-carga-de-repositorio-de-trabajo-awr-desde-sqlplus/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Crear una tabla con contenido mediante database link de una base de datos a otra</title>
		<link>http://colacios.es/blog/WordPress3/crear-una-tabla-con-contenido-mediante-database-link-de-una-base-de-datos-a-otra/</link>
		<comments>http://colacios.es/blog/WordPress3/crear-una-tabla-con-contenido-mediante-database-link-de-una-base-de-datos-a-otra/#comments</comments>
		<pubDate>Thu, 31 Oct 2013 11:31:36 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Administración Oracle]]></category>
		<category><![CDATA[as select]]></category>
		<category><![CDATA[create table]]></category>
		<category><![CDATA[DATABASE LINK]]></category>
		<category><![CDATA[DBLINK]]></category>
		<category><![CDATA[STORAGE]]></category>

		<guid isPermaLink="false">http://colacios.es/blog/WordPress3/?p=647</guid>
		<description><![CDATA[En la siguiente entrada de Blog, voy a explicar como crear una tabla con contenido en una base de datos Oracle accediendo a otra base de datos Oracle mediante un database Link. Además voy a mostrar que la creación de &#8230; <a href="http://colacios.es/blog/WordPress3/crear-una-tabla-con-contenido-mediante-database-link-de-una-base-de-datos-a-otra/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">En la siguiente entrada de Blog, voy a explicar como <span style="text-decoration: underline;">crear una tabla con contenido</span> en una base de datos Oracle accediendo a otra base de datos Oracle mediante un database Link. Además voy a mostrar que la creación de la tabla en destino puede presentar diferencias de storage dependiendo de cómo la creemos. Si queremos que sea idéntica a la de origen, tendremos que copiar sus parámetros de storage en la sentencia de creación. Esto es una manera de crear una tabla con contenido sin necesidad de utilizar las utilidades exp/imp ni expdp/impdp.</p>
<p style="text-align: justify;">Esto es muy útil cuando queremos crear una tabla que tenemos en Desarrollo o Pre-producción y queremos pasarlo al entorno de producción.</p>
<p style="text-align: justify;">Para el ejemplo daré por hecho que tenemos un Data Base Link creado que permite acceder a la Base de datos de destino. Un database link se crea de la siguiente manera:</p>
<pre style="text-align: justify;">CREATE PUBLIC DATABASE LINK "<em>MY_DBLINK</em>"
CONNECT TO <em>USUARIO_PRUEBA</em>
IDENTIFIED BY  "<em>&lt;pwd_usuario&gt;</em>"
USING '&lt;cadena_conexión&gt;'; <strong>-- Esto consiste en una cadena de conexión que debe estar en tnsnames.ora</strong></pre>
<p style="text-align: justify;">Puedes ampliar información sobre DBLinks <a href="http://colacios.es/blog/WordPress3/manipular-una-tabla-de-un-entorno-oracle-desde-otro-entorno-oracle-mediante-dblink/" target="_blank">aqui</a></p>
<p style="text-align: justify;">Para comprobar que el DBLink funciona, podemos hacer la consulta hacia la tabla que queremos copiar de la siguiente  manera:</p>
<pre>SQL&gt; SELECT * FROM USUARIO_PRUEBA.TABLA@MY_DBLINK;</pre>
<p style="text-align: justify;"> Ahora creamos la tabla con el contenido de la siguiente manera:</p>
<p style="text-align: justify;">- Primero nos conectamos a la Base de datos, con el usuario que corresponda, donde queremos crear la tabla con el contenido:</p>
<pre>sqlplus usuario_prueba@cadena_conexion</pre>
<p>- Ahora creamos la tabla &#8230;</p>
<pre style="text-align: justify;">SQL&gt; <strong>CREATE TABLE</strong> usuario_prueba.nombre_tabla <strong>AS SELECT</strong> * from USUARIO_PRUEBA.TABLA@MY_DBLINK;</pre>
<p style="text-align: justify;">Esta sentencia creará la tabla en el destino con su contenido, pero los parámetros de STORAGE serán los que tenga el tablespace donde esta asignado &#8220;usuario_prueba&#8221;. Es decir, no cogerá los valores de STORAGE que tiene la tabla en origen.</p>
<p style="text-align: justify;">Ahora probaremos con otro ejemplo, donde si detallamos el STORAGE que queremos y el tablespace donde queremos ubicar la tabla.</p>
<pre style="text-align: justify;">CREATE TABLE usuario_prueba.nombre_tabla
 <strong>TABLESPACE</strong> tablespace
 PCTUSED    40
 PCTFREE    10
 INITRANS   1
 MAXTRANS   255
 <strong>STORAGE  </strong>  (
 INITIAL          10016K
 NEXT             10000K
 MINEXTENTS       1
 MAXEXTENTS       499
 PCTINCREASE      0
 FREELISTS        1
 FREELIST GROUPS  1
 BUFFER_POOL      DEFAULT
 )
 LOGGING
 NOCACHE
 NOPARALLEL <strong>AS SELECT</strong> * FROM <strong>USUARIO_PRUEBA.TABLA@MY_DBLINK</strong>;</pre>
<p style="text-align: justify;">En este otro ejemplo, el storage que tendrá la tabla será el especificado en la misma sentecia CREATE TABLE, y los datos los cogerá exactamente igual que la sentencia anterior.</p>
<p style="text-align: justify;">
]]></content:encoded>
			<wfw:commentRss>http://colacios.es/blog/WordPress3/crear-una-tabla-con-contenido-mediante-database-link-de-una-base-de-datos-a-otra/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ORA-00054: recurso ocupado y obtenido con NOWAIT especificado o timeout vencido &#124;&#124; Bloqueos</title>
		<link>http://colacios.es/blog/WordPress3/ora-00054-recurso-ocupado-y-obtenido-con-nowait-especificado-o-timeout-vencido-bloqueos/</link>
		<comments>http://colacios.es/blog/WordPress3/ora-00054-recurso-ocupado-y-obtenido-con-nowait-especificado-o-timeout-vencido-bloqueos/#comments</comments>
		<pubDate>Fri, 18 Oct 2013 15:16:08 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Administración Oracle]]></category>
		<category><![CDATA[ORA-?????]]></category>
		<category><![CDATA[bloqueos]]></category>
		<category><![CDATA[kill -9]]></category>
		<category><![CDATA[kill session]]></category>
		<category><![CDATA[ORA-00054]]></category>
		<category><![CDATA[ps -ef]]></category>

		<guid isPermaLink="false">http://colacios.es/blog/WordPress3/?p=627</guid>
		<description><![CDATA[Este error suele aparecer cuando existen bloqueos esperando a que otro usuario termine una operación, para poder realizar la suya. Uno de los más comunes que suelen suceder  es cuando se hacen &#8220;truncate&#8221; o &#8220;drop&#8221; de tablas y no nos &#8230; <a href="http://colacios.es/blog/WordPress3/ora-00054-recurso-ocupado-y-obtenido-con-nowait-especificado-o-timeout-vencido-bloqueos/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Este error suele aparecer cuando existen bloqueos esperando a que otro usuario termine una operación, para poder realizar la suya. Uno de los más comunes que suelen suceder  es cuando se hacen &#8220;truncate&#8221; o &#8220;drop&#8221; de tablas y no nos deja hacerlo porque las tabla/s están bloqueada/s por otros procesos de ese mismo u otros usuarios.</p>
<p style="text-align: justify;">En el ejemplo que explico seguidamente el problema se produjo porque al llenarse un tablespace (datafile al 100%) realizando unos &#8220;inserts&#8221; en una tabla, el proceso se quedó bloqueado hasta poder hacer la inserción. En  mi caso, como podía volver a lanzar el proceso sin problema, y no quería ampliar más la ocupación del tablespace afectado. Decidí matar los procesos que estaban bloqueados y volver a lanzar la ejecución de los inserts que provocaron por error que se llenara el tablespace.</p>
<p style="text-align: justify;">En este ejemplo sólo se va a tratar el problema del bloqueo, no se va a tener en cuenta el problema de la falta de espacio del tablespace, porque eso fue debido a otra causa, pero que fue, en parte el causante del error que os voy a explicar y cuya solución veréis en esta entrada de blog.</p>
<p style="text-align: justify;">Entro en detalle:</p>
<p style="text-align: justify;">Al intentar hacer un truncate de una tabla salta el error:</p>
<p style="text-align: justify;">ORA-00054: recurso ocupado y obtenido con NOWAIT especificado o timeout vencido</p>
<pre>SQL&gt; <strong>truncate table &lt;mi_tabla&gt; ;</strong>
truncate table &lt;mitabla&gt;
*
ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT specified</pre>
<p style="text-align: justify;">Esto ocurre porque se ha bloqueado uno o varios registros mediante setencias SQL. Select´s especificados como &#8220;NO WAIT&#8221; o &#8220;FOR UPDATE NOWAIT&#8221; o por una operación DDL que fue bloqueada. La solución podía pasar por hacer el commit o rollback. El commit no funcionó porque no hay espacio en el tablespace. El rollback no se probó, porque preferí matar la sesión que estaba provocando el error tal y como explico seguidamente.</p>
<p style="text-align: justify;">En Oracle hay una vista llamada v$lock que nos indica los objetos que se encuentran en bloqueo, el identificador de usuario,  sesion y el tipo de bloqueo. Una join con la tabla dba_objects nos proporcionará ademas el nombre y tipo de los objetos bloqueados. La consulta seria como sigue:</p>
<pre>SELECT
     decode(L.TYPE,'TM','TABLE','TX','Record(s)') TYPE_LOCK,
     decode(L.REQUEST,0,'NO','YES') WAIT,
     S.OSUSER OSUSER_LOCKER,
     S.PROCESS PROCESS_LOCKER,
     S.USERNAME DBUSER_LOCKER,
     O.OBJECT_NAME OBJECT_NAME,
     O.OBJECT_TYPE OBJECT_TYPE,
     CONCAT(' ',s.PROGRAM) PROGRAM,
     O.OWNER OWNER
 FROM v$lock l,dba_objects o,v$session s
 WHERE l.ID1 = o.OBJECT_ID AND s.SID =l.SID AND l.TYPE in ('TM','TX','UL');</pre>
<p style="text-align: justify;">Existen varios tipos de bloqueo (TM,TX,UL):</p>
<p style="text-align: justify;"><strong>TM</strong> – DML enqueue. Bloqueos a nivel de tabla. Los bloqueos a nivel de tabla son creados cuando se ejecuta una sentencia DML del tipo: update, insert, delete, select ..for update sobre la tabla entera.</p>
<p style="text-align: justify;">Por ejemplo:</p>
<pre style="text-align: justify;">DELETE from &lt;mi_tabla&gt;;
TRUNCATE &lt;mi_tabla&gt;;
UPDATE &lt;mi_tabla&gt; SET campo1 = valor;</pre>
<p style="text-align: justify;">haciendo un &#8220;delete&#8221; fue el error en este ejemplo. Por tanto tenía un bloqueo a nivel de tabla.</p>
<p style="text-align: justify;"><strong>TX</strong> – Transaction enqueue. Bloqueos a nivel de fila. Los bloqueos a nivel de fila se crean cuando se ejecutan senencias DML contra un conjunto de registros específicos.</p>
<p style="text-align: justify;"><strong>UL</strong> – User supplied.  Bloqueos a nivel de usuario.</p>
<p style="text-align: justify;">Para solucionar el error:</p>
<p style="text-align: justify;">Nos conectaremos como system a Oracle y ejecutaremos la siguiente consulta para ver si existe algún bloqueo:</p>
<pre style="text-align: justify;"> SQL&gt; show user
 USER is "SYSTEM"
 SQL&gt; select * from v$lock where request!=0;</pre>
<p style="text-align: justify;">Si hacemos una join con v$open_cursor podremos ver que consulta es la que se encuentra parada a la espera de que se produzca el desbloqueo para poder ejecutarse.</p>
<p style="text-align: justify;">En la consulta siguiente podemos ver las sentencias paradas esperando a que termine un bloqueo, la sentencia que quieren ejecutar y el id de proceso que las está bloqueando:</p>
<pre style="text-align: justify;">select /*+ ordered
    no_merge(L_WAITER)
    no_merge(L_LOCKER) use_hash(L_LOCKER)
    no_merge(S_WAITER) use_hash(S_WAITER)
    no_merge(S_LOCKER) use_hash(S_LOCKER)
    use_nl(O)
    use_nl(U)
    */
    /* first the table-level locks (TM) and mixed TM/TX TX/TM */
    S_LOCKER.OSUSER OS_LOCKER,
    S_LOCKER.USERNAME LOCKER_SCHEMA,
    S_LOCKER.PROCESS LOCKER_PID,
    S_WAITER.OSUSER OS_WAITER,
    S_WAITER.USERNAME WAITER_SCHEMA,
    S_WAITER.PROCESS WAITER_PID,
    'Table lock (TM): '||U.NAME||'.'||O.NAME||
    ' - Mode held: '||
    decode(L_LOCKER.LMODE,
    0, 'None', /* same as Monitor */
    1, 'Null', /* N */
    2, 'Row-S (SS)', /* L */
    3, 'Row-X (SX)', /* R */
    4, 'Share', /* S */
    5, 'S/Row-X (SSX)', /* C */
    6, 'Exclusive', /* X */
    '???: '||to_char(L_LOCKER.LMODE))||
    ' / Mode requested: '||
    decode(L_WAITER.REQUEST,
    0, 'None', /* same as Monitor */
    1, 'Null', /* N */
    2, 'Row-S (SS)', /* L */
    3, 'Row-X (SX)', /* R */
    4, 'Share', /* S */
    5, 'S/Row-X (SSX)', /* C */
    6, 'Exclusive', /* X */
    '???: '||to_char(L_WAITER.REQUEST))
    SQL_TEXT_WAITER
from
    V$LOCK L_WAITER,
    V$LOCK L_LOCKER,
    V$SESSION S_WAITER,
    V$SESSION S_LOCKER,
    sys.OBJ$ O,
    sys.USER$ U
where S_WAITER.SID = L_WAITER.SID
    and L_WAITER.TYPE IN ('TM')
    and S_LOCKER.sid = L_LOCKER.sid
    and L_LOCKER.ID1 = L_WAITER.ID1
    and L_WAITER.REQUEST &gt; 0
    and L_LOCKER.LMODE &gt; 0
    and L_WAITER.ADDR != L_LOCKER.ADDR
    and L_WAITER.ID1 = O.OBJ#
    and U.USER# = O.OWNER#
union
    select /*+ ordered
        no_merge(L_WAITER)
        no_merge(L_LOCKER) use_hash(L_LOCKER)
        no_merge(S_WAITER) use_hash(S_WAITER)
        no_merge(S_LOCKER) use_hash(S_LOCKER)
        no_merge(L1_WAITER) use_hash(L1_WAITER)
        no_merge(O) use_hash(O)
        */
        /* now the (usual) row-locks TX */
        S_LOCKER.OSUSER OS_LOCKER,
        S_LOCKER.USERNAME LOCKER_SCHEMA,
        S_LOCKER.PROCESS LOCK_PID,
        S_WAITER.OSUSER OS_WAITER,
        S_WAITER.USERNAME WAITER_SCHEMA,
        S_WAITER.PROCESS WAITER_PID,
        'TX: '||O.SQL_TEXT SQL_TEXT_WAITER
    from
        V$LOCK L_WAITER,
        V$LOCK L_LOCKER,
        V$SESSION S_WAITER,
        V$SESSION S_LOCKER,
        V$_LOCK L1_WAITER,
        V$OPEN_CURSOR O
    where S_WAITER.SID = L_WAITER.SID
        and L_WAITER.TYPE IN ('TX')
        and S_LOCKER.sid = L_LOCKER.sid
        and L_LOCKER.ID1 = L_WAITER.ID1
        and L_WAITER.REQUEST &gt; 0
        and L_LOCKER.LMODE &gt; 0
        and L_WAITER.ADDR != L_LOCKER.ADDR
        and L1_WAITER.LADDR = L_WAITER.ADDR
        and L1_WAITER.KADDR = L_WAITER.KADDR
        and L1_WAITER.SADDR = O.SADDR
        and O.HASH_VALUE = S_WAITER.SQL_HASH_VALUE
/</pre>
<p style="text-align: justify;">Pero sino devuelve nada, que era lo que me pasaba a mi, y como el error me lo generaba un delete o un truncate, tuve que ejecutar la siguiente consulta para ver que era lo que tenía que &#8220;matar&#8221;.</p>
<pre>SQL&gt; SELECT mode_held FROM dba_dml_locks where OWNER='&lt;<em>mi_usuario</em>&gt;';
MODE_HELD
-------------
Row-X (SX)
Row-X (SX)
Row-X (SX)</pre>
<p>Seguidamente podía listar los bloqueos que ocurrían en ese momento en la base de datos.Y  por medio de los campos LMODE y REQUEST saber de que tipo son :</p>
<p>none<br />
null (NULL)<br />
row-S (SS)<br />
row-X (SX)<br />
share (S)<br />
S/Row-X (SSX)<br />
exclusive (X)</p>
<pre>SELECT oracle_username || ' (' || s.osuser || ')' username
    ,  s.sid || ',' || s.serial# sess_id
    ,  owner || '.' || object_name object
    ,  object_type
    ,  decode( l.block
       ,       0, 'Not Blocking'
       ,       1, 'Blocking'
       ,       2, 'Global') status
    ,  decode(v.locked_mode
      ,       0, 'None'
      ,       1, 'Null'
      ,       2, 'Row-S (SS)'
      ,       3, 'Row-X (SX)'
      ,       4, 'Share'
      ,       5, 'S/Row-X (SSX)'
      ,       6, 'Exclusive', TO_CHAR(lmode)) mode_held
FROM v$locked_object v,dba_objects d,v$lock l,v$session s
WHERE v.object_id = d.object_id
   and v.object_id = l.id1
   and v.session_id = s.sid
ORDER BY oracle_username,session_id
/</pre>
<p>Sale algo como &#8230; <a href="http://colacios.es/blog/WordPress3/wp-content/uploads/2013/10/pant_bloqueo_usuario1.jpg"><img class="aligncenter size-full wp-image-637" title="pant_bloqueo_usuario1" src="http://colacios.es/blog/WordPress3/wp-content/uploads/2013/10/pant_bloqueo_usuario1.jpg" alt="" width="833" height="53" /></a></p>
<p style="text-align: justify;">Intento matarlo &#8230;</p>
<pre style="text-align: justify;">SQL&gt; alter system kill session '215,2774';
alter system kill session '215,2774'
*
ERROR at line 1:
ORA-00031: session marked for kill</pre>
<p style="text-align: justify;">Pruebo entonces con immediate y si me funciona.</p>
<pre style="text-align: justify;">alter system kill session '215,2774' immediate;</pre>
<p style="text-align: justify;">Pero si lo anterior fallase buscaría por medio de esta SQL el  SPID que es el número de proceso de Linux/unix que usaría para matar el proceso a nivel de S.O.</p>
<pre style="text-align: justify;">SELECT s.sid, p.spid, s.osuser, s.program
FROM   v$process p, v$session s
WHERE  p.addr = s.paddr;</pre>
<p style="text-align: justify;">La consulta anterior me muestra todos los procesos, buscaría el SID del proceso que quiero matar y me anotaría el campo SPID que es el que definitivamente usaré para matar el proceso. Pero si quiero sólo buscar el SID de la que quiero matar, ejecutaría:</p>
<pre style="text-align: justify;">SELECT s.sid, p.spid, s.osuser, s.program
FROM   v$process p, v$session s
WHERE  p.addr = s.paddr and s.sid = '<em>215</em>'; <strong>--&gt; SID basado en mi ejemplo</strong></pre>
<p style="text-align: justify;">Para saber cual es el SPID busco con el campo SID que me salia en la primera consulta. Es el primer valor antes de la &#8220;,&#8221; que uso en el&#8221; alter kill session &#8230;&#8221;</p>
<p style="text-align: justify;">Para matar el proceso a nivel de S.O en mi caso un Linux. Se hace así:</p>
<p style="text-align: justify;">Conectado como root al linux &#8230;</p>
<pre style="text-align: justify;"># ps -ef |grep  &lt;<em>SPID</em>&gt; --&gt; Donde SPID es el número de proceso
# kill -9 &lt;<em>SPID</em>&gt;</pre>
<p style="text-align: justify;">
]]></content:encoded>
			<wfw:commentRss>http://colacios.es/blog/WordPress3/ora-00054-recurso-ocupado-y-obtenido-con-nowait-especificado-o-timeout-vencido-bloqueos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Que GRANT se puede asignar en función del objeto destino en ORACLE</title>
		<link>http://colacios.es/blog/WordPress3/que-grantse-puede-dar-en-funcion-del-objeto-destino-en-oracle/</link>
		<comments>http://colacios.es/blog/WordPress3/que-grantse-puede-dar-en-funcion-del-objeto-destino-en-oracle/#comments</comments>
		<pubDate>Thu, 17 Oct 2013 09:59:54 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Administración Oracle]]></category>
		<category><![CDATA[GRANT]]></category>

		<guid isPermaLink="false">http://colacios.es/blog/WordPress3/?p=614</guid>
		<description><![CDATA[Según el objeto de que se trate, en Oracle podemos dar los siguientes privilegios: Tables: select, insert, update, delete, alter, debug, flashback, on commit refresh, query rewrite, references, all Views: select, insert, update, delete, under, references, flashback, debug Sequence: alter, &#8230; <a href="http://colacios.es/blog/WordPress3/que-grantse-puede-dar-en-funcion-del-objeto-destino-en-oracle/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Según el objeto de que se trate, en Oracle podemos dar los siguientes privilegios:</p>
<p style="text-align: justify;"><strong>Tables</strong>: select, insert, update, delete, alter, debug, flashback, on commit refresh, query rewrite, references, all<br />
<strong>Views</strong>: select, insert, update, delete, under, references, flashback, debug<br />
<strong>Sequence:</strong> alter, select<br />
<strong>Packages, Procedures, Functions (Java classes, sources&#8230;):</strong> execute, debug<br />
<strong>Materialized Views</strong>: delete, flashback, insert, select, update<br />
<strong>Directories</strong>: read, write<br />
<strong>Libraries</strong>: execute<br />
<strong>User defined types</strong>: execute, debug, under<br />
<strong>Operators</strong>: execute<br />
<strong>Indextypes</strong>: execute</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://colacios.es/blog/WordPress3/que-grantse-puede-dar-en-funcion-del-objeto-destino-en-oracle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Manipular una tabla de un entorno Oracle desde otro entorno Oracle mediante DBLINK</title>
		<link>http://colacios.es/blog/WordPress3/manipular-una-tabla-de-un-entorno-oracle-desde-otro-entorno-oracle-mediante-dblink/</link>
		<comments>http://colacios.es/blog/WordPress3/manipular-una-tabla-de-un-entorno-oracle-desde-otro-entorno-oracle-mediante-dblink/#comments</comments>
		<pubDate>Thu, 17 Oct 2013 09:34:32 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Administración Oracle]]></category>
		<category><![CDATA[DATABASE LINK]]></category>
		<category><![CDATA[GRANT]]></category>

		<guid isPermaLink="false">http://colacios.es/blog/WordPress3/?p=609</guid>
		<description><![CDATA[Probablemente como administradores de Oracle nos habrán solicitado lo siguiente: Querer consultar o modificar una tabla que está en un Servidor Oracle con un usuario que está en otro servidor Oracle. Para poder realizar esta tarea, basta con crear un &#8230; <a href="http://colacios.es/blog/WordPress3/manipular-una-tabla-de-un-entorno-oracle-desde-otro-entorno-oracle-mediante-dblink/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Probablemente como administradores de Oracle nos habrán solicitado lo siguiente:</p>
<p style="text-align: justify;"><em>Querer consultar o modificar una tabla que está en un Servidor Oracle con un usuario que está en otro servidor Oracle.</em></p>
<p style="text-align: justify;">Para poder realizar esta tarea, basta con <span style="text-decoration: underline;">crear un dblink entre ambas bases de datos</span> y crearlo de manera PUBLIC y posteriormente <span style="text-decoration: underline;">asignar los privilegios</span>(GRANT) de la tabla que queremos poder ver a PUBLIC. Dicha asignación de permisos a PUBLIC la realizaremos en el servidor Oracle donde está la tabla que queremos ver. Para ver que tipo de GRANT podemos asignar puedes consultar esta <a title="GRANT en función del objeto destino" href="http://colacios.es/blog/WordPress3/que-grantse-puede-dar-en-funcion-del-objeto-destino-en-oracle" target="_blank">entrada de blog</a>.</p>
<p style="text-align: justify;">Ejemplo:</p>
<p style="text-align: justify;">En el servidor &#8220;origen&#8221; creamos el dblink public:</p>
<pre style="text-align: justify;">CREATE <strong>PUBLIC</strong> DATABASE LINK "<em>DBLINK_DESTINO</em>"
CONNECT TO <em>SYSTEM</em> <strong>--&gt; o el usuario que queramos usar</strong>
IDENTIFIED BY "&lt;pwd&gt;"
USING '<em>CADENA_CONEXION_DESTINO</em>'; <strong>--&gt; que existirá en tnsnames.ora </strong>
<strong>del servidor Origen y donde se especifica el servidor, puerto, etc...</strong>
<strong>donde conectaremos cuando hagamos las consultas</strong></pre>
<p style="text-align: justify;">Luego en el servidor &#8220;destino&#8221;:</p>
<p style="text-align: justify;">Ejecutaremos desde sqlplus por ejemplo y con el propietario de la tabla en cuestión:</p>
<pre style="text-align: justify;">GRANT ALL ON &lt;nombre_propietario&gt;.&lt;nombre_tabla&gt; TO <strong>PUBLIC</strong>;</pre>
<p style="text-align: justify;">Para mejorar lo anterior y evitar tener que escribir el nombre del propietario en las consultas, podemos crear un sinónimo de esta manera:</p>
<pre style="text-align: justify;">CREATE <strong>PUBLIC</strong> SYNONYM &lt;nombre_tabla&gt; FOR &lt;nombre_propietario&gt;.&lt;nombre_tabla&gt;;</pre>
<p style="text-align: justify;">Lo importante de las sentencias anteriores es especificar &#8220;PUBLIC&#8221; de esta manera los privilegios se hacen disponibles a todos los usuarios de la base de datos. Y mediante el dblink, también lo haces disponibles a aquellos usuarios que puedan conectarse mediante ese dblink, que en este ejemplo son todos.</p>
]]></content:encoded>
			<wfw:commentRss>http://colacios.es/blog/WordPress3/manipular-una-tabla-de-un-entorno-oracle-desde-otro-entorno-oracle-mediante-dblink/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Configurar los servicios Heterogéneos de ORACLE para acceder a SQL SERVER</title>
		<link>http://colacios.es/blog/WordPress3/configurar-los-servicios-heterogeneos-de-oracle-para-acceder-a-sql-server/</link>
		<comments>http://colacios.es/blog/WordPress3/configurar-los-servicios-heterogeneos-de-oracle-para-acceder-a-sql-server/#comments</comments>
		<pubDate>Mon, 07 Oct 2013 11:28:10 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Administración Oracle]]></category>
		<category><![CDATA[Can't open lib '/usr/local/easysoft/sqlserver/lib/libessqlsrv.sl' : can't open the module]]></category>
		<category><![CDATA[Cannot connect to shareable /usr/local/easysoft/sqlserver/lib/libessqlsrv.sl]]></category>
		<category><![CDATA[Could not SQLConnect]]></category>
		<category><![CDATA[FIND_IMAGE_SYMBOL]]></category>
		<category><![CDATA[heterogéneos]]></category>
		<category><![CDATA[hs]]></category>
		<category><![CDATA[isql]]></category>
		<category><![CDATA[LD_LIBRARY_PATH]]></category>
		<category><![CDATA[ODBC]]></category>
		<category><![CDATA[ORA-02063]]></category>
		<category><![CDATA[ORA-28500]]></category>
		<category><![CDATA[SHLIB_PATH]]></category>
		<category><![CDATA[Unable to find library 'libodbcinst.sl.1']]></category>

		<guid isPermaLink="false">http://colacios.es/blog/WordPress3/?p=531</guid>
		<description><![CDATA[El objetivo de esta entrada de blog es explicar cómo configurar Oracle para poder acceder a bases de datos SQL Server como si estuviésemos en el mismo Oracle. La idea parece fabulosa y de hecho lo es. Porque con lo &#8230; <a href="http://colacios.es/blog/WordPress3/configurar-los-servicios-heterogeneos-de-oracle-para-acceder-a-sql-server/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">El objetivo de esta entrada de blog es explicar cómo configurar Oracle para poder acceder a bases de datos SQL Server como si estuviésemos en el mismo Oracle. La idea parece fabulosa y de hecho lo es. Porque con lo que explicaré seguidamente, podrás conectar cualquier Base de datos Oracle 8.x o superior a SQL Server 7.0, SQL Server 2000, SQL Server 2005, SQL Server 2008, SQL Server 2012 y SQL Server Express.</p>
<p style="text-align: justify;">Servicios heterogéneos de Oracle es un componente integrado en el servidor de base de datos Oracle. Permite el acceso SQL transparente desde un cliente de Oracle para los sistemas que no son de Oracle como si el sistema no Oracle fuera una base de datos Oracle . En este ejemplo vamos a utilizar el agente de Servicios heterogéneo ODBC (HSODBC) con productos Easysoft, esta funcionalidad puede ser extendida en plataformas que no sean Windows para incluir cualquier base de datos compatible con ODBC o JDBC.</p>
<p style="text-align: justify;">Es muy importante saber que HSODBC es normalmente una aplicación de 32 bits incluso cuando se distribuye con una versión de 64 bits de Oracle. Es necesario utilizar el HSODBC 32 bits con un controlador ODBC Easysoft de 32 bits. Para las plataformas de 64 bits, seleccionar también la versión de 32 bits del controlador, incluso cuando haya una versión de 64 bits disponible, ya que los controladores de 32 bits seguirán funcionando correctamente en una plataforma de 64 bits.</p>
<p style="text-align: justify;">Para comprobar si tenemos una versión de 32 bits o 64 bits de HSODBC, en la máquina de Oracle, ejecutaremos:</p>
<pre style="text-align: justify;"><strong> $ORACLE_HOME/bin/hsodbc</strong></pre>
<p style="text-align: justify;">Si la salida del comando contiene ELF-Class64 (o algo similar, como ELF-64 o ELF 64-bit), tenemos un HSODBC 64 bits. De lo contrario, tenemos una versión de 32 bits.</p>
<p style="text-align: justify;">Otra manera de saber si un fichero es de 32 o 64 bits es mediante el uso del comando UNIX &#8220;file&#8221;, se puede determinar relativamente fiable si el programa utilizado y la biblioteca existen en 32 bits o en forma de 64 bits. Ejemplo de uso:</p>
<p style="text-align: justify;"><em>&lt;programa&gt; archivo</em><br />
<em> &lt;biblioteca&gt; archivo</em></p>
<p style="text-align: justify;">Si la línea de resultados contiene un &#8217;64 &#8216; , el archivo existe en la versión de 64 -bit . De lo contrario , se puede asumir que se trata de la versión de 32 -bit .</p>
<p style="text-align: justify;">Si se determina que la inconsistencia entre <em>&lt;programa&gt;</em> y <em>&lt;biblioteca&gt;</em> llamando el comando &#8216;file&#8217; , hay que  corregir la incompatibilidad ajustando las variables de entorno <strong>SHLIB_PATH</strong> (HP-UX) en nuestro ejemplo, LIBPATH (en sistemas AIX) y LD_LIBRARY_PATH en otras variantes de Unix.</p>
<p style="text-align: justify;">Ejemplo de ejecución de &#8220;file&#8221; que nos muestra que es de 32 bits:</p>
<pre style="text-align: justify;"><strong>$ file /usr/local/easysoft/sqlserver/lib/libessqlsrv.sl</strong>
/usr/local/easysoft/sqlserver/lib/libessqlsrv.sl: PA-RISC1.1 shared library -not stripped</pre>
<p style="text-align: justify;">Ejemplo de ejecución de &#8220;file&#8221; que nos muestra que es de 64 bits:</p>
<pre style="text-align: justify;"><strong>$ file /usr/local/easysoft/sqlserver/lib/libessqlsrv.sl</strong>
/usr/local/easysoft/sqlserver/lib/libessqlsrv.sl: <strong>ELF-64</strong> shared object file - PA-RISC 2.0 (LP64) Si <strong>$ORACLE_HOME/bin/hsodbc</strong> no está presente, debermos instalarlo para poder seguir con el proceso de configuración de esta entrada de blog.</pre>
<p style="text-align: justify;">En referencia al driver ODBC que vamos a utilizar en la parte Unix (donde tengo instalado el servidor Oracle) puedes ampliar la información en:</p>
<p style="text-align: justify;"><a title="Particularidades Driver ODBC" href="http://www.easysoft.com/products/data_access/odbc-sql-server-driver/index.html" target="_blank">http://www.easysoft.com/products/data_access/odbc-sql-server-driver/index.html</a></p>
<p style="text-align: justify;">En este ejemplo conectaremos un <strong>Oracle 8.1.7.4</strong>  instalado en un <strong>Unix HP-UX 11.11</strong> a un <strong>SQL Server 2005</strong>.</p>
<p style="text-align: justify;">Para llevar la tarea a cabo. Se realizarán los siguientes pasos:</p>
<p style="text-align: justify;"><span style="text-decoration: underline;"><strong>En el Servidor &#8220;destino&#8221; SQL SERVER</strong></span><br />
1.- Definir un nombre de origen de datos (DSN) para SQL Server.</p>
<p style="text-align: justify;"><span style="text-decoration: underline;"><strong>En el servidor &#8220;Orígen&#8221; por la parte de Oracle</strong></span><br />
2.- Crear un fichero de inicialización de los servicios heterogéneos.<br />
3.- Crear un nuevo listener dentro del fichero listener.ora.<br />
4.- Añadir una nueva entrada en el fichero tnsnames.ora.<br />
5.- Crear un Database Link en Oracle.</p>
<p style="text-align: justify;"><span style="color: #000000;"><strong><span style="text-decoration: underline;">En el servidor &#8220;Orígen&#8221;  por la parte de Unix</span></strong></span><br />
6.- <a title="Instalación del driver ODBC de Easysoft para Unix" href="http://colacios.es/blog/WordPress3/instalar-easysoft-odbc-driver-en-sistemas-hp-ux-para-conectar-oracle-con-sql-server/" target="_blank">Instalar</a>/configurar el driver ODBC en el sistema Unix donde reside el servidor Oracle.</p>
<p style="text-align: justify;"><strong><span style="text-decoration: underline;">7.- Posibles errores durante la configuración</span></strong></p>
<p style="text-align: justify;"><span style="text-decoration: underline;"><strong>8.- Juego de pruebas de comprobación de correcta instalación</strong></span></p>
<p style="text-align: justify;"><span style="text-decoration: underline;"><strong>En el Servidor destino SQL SERVER</strong></span></p>
<p style="text-align: justify;"><strong>1.- Definir un nombre de origen de datos (DSN) para SQL Server.</strong></p>
<p style="text-align: justify;">En primer lugar accederemos como administradores al servidor destino SQL Server. Y crearemos el ODBC de la siguiente manera:</p>
<p style="text-align: justify;">En versiones más antiguas &#8230;. Desde el panel de control &#8230;.</p>
<p style="text-align: justify;"><a href="http://colacios.es/blog/WordPress3/wp-content/uploads/2013/09/1w_odbc.jpg"><img class="aligncenter size-full wp-image-541" title="1w_odbc" src="http://colacios.es/blog/WordPress3/wp-content/uploads/2013/09/1w_odbc.jpg" alt="" width="493" height="446" /></a>En versiones posteriores sería desde <em>menú inicio &#8211;&gt; Herramientas administrativas &#8211;&gt; Orígenes de datos ODBC</em></p>
<p style="text-align: justify;"><a href="http://colacios.es/blog/WordPress3/wp-content/uploads/2013/09/pant_odbc_win.jpg"><img class="aligncenter size-full wp-image-539" title="pant_odbc_win" src="http://colacios.es/blog/WordPress3/wp-content/uploads/2013/09/pant_odbc_win.jpg" alt="" width="908" height="533" /></a>Importante: Seleccionar la pestaña &#8220;SystemDSN&#8221; y pulsar doble click o &#8220;Add&#8221;</p>
<p style="text-align: justify;"><a href="http://colacios.es/blog/WordPress3/wp-content/uploads/2013/09/2w_odbc.jpg"><img class="aligncenter size-full wp-image-542" title="2w_odbc" src="http://colacios.es/blog/WordPress3/wp-content/uploads/2013/09/2w_odbc.jpg" alt="" width="459" height="377" /></a><span id="result_box" lang="es"><span class="hps">En la siguiente pantalla seleccionaremos</span><span class="hps"> el</span> <span class="hps">controlador (driver) de SQL Server</span> <span class="hps">ya que esta será</span> <span class="hps">una conexión a</span> <span class="hps">SQL</span> <span class="hps">Server.</span> Heremos<span class="hps"> clic en Finalizar</span> <span class="hps">para continuar con</span> <span class="hps">la definición del origen</span> <span class="hps">de datos.</span></span></p>
<p style="text-align: justify;"><a href="http://colacios.es/blog/WordPress3/wp-content/uploads/2013/09/3w_odbc.jpg"><img class="aligncenter size-full wp-image-543" title="3w_odbc" src="http://colacios.es/blog/WordPress3/wp-content/uploads/2013/09/3w_odbc.jpg" alt="" width="468" height="346" /></a>Escribir un nombre que haga referencia a esta fuente de datos ODBC. He elegido <strong>MYSQLSERVERDSN</strong> por simplificar el entendimiento, pero debe ser descriptivo de la base de datos que conecte dentro de SQL Server. También puede describir el origen de datos en la forma que desee. Como en mi caso se conecta en local dejo Server &#8220;local&#8221;. Hacer click en Siguiente &#8220;Next&#8221; para continuar (no en finish).</p>
<p style="text-align: justify;"><a href="http://colacios.es/blog/WordPress3/wp-content/uploads/2013/09/4w_odbc.jpg"><img class="aligncenter size-full wp-image-546" title="4w_odbc" src="http://colacios.es/blog/WordPress3/wp-content/uploads/2013/09/4w_odbc.jpg" alt="" width="510" height="355" /></a>Seleccionaremos autentificación mediante Windows si tenemos usuario de red. En mi caso, tenía el usuario y clave del administrador de Windows.</p>
<p style="text-align: justify;"><a href="http://colacios.es/blog/WordPress3/wp-content/uploads/2013/09/5w_odbc.jpg"><img class="aligncenter size-full wp-image-547" title="5w_odbc" src="http://colacios.es/blog/WordPress3/wp-content/uploads/2013/09/5w_odbc.jpg" alt="" width="510" height="355" /></a><span id="result_box" lang="es"><span class="hps">En general</span><span>, en la siguiente ventana</span> <span class="hps">se rellena con</span> <span class="hps">la base de datos</span> <span class="hps">de SQL Server predeterminada</span> <span class="hps">de</span> <span class="hps">&#8220;maestro&#8221;.</span> <span class="hps">Haga clic en la</span> <span class="hps">casilla de verificación para</span> <span class="hps">cambiar la</span> <span class="hps">base de datos predeterminada</span> y selecciona la Base de datos a usar en la<span class="hps"> conexión</span> <span class="hps">ODBC</span>. En mi ejemplo, la base de datos de SQL SERVER a la que nos vamos a conectar será &#8220;<strong>bbddsqlserver</strong>&#8221; y el usuario administrador será &#8220;<strong>sa</strong>&#8221; y clave &#8220;<strong>sa_clave</strong>&#8220;.</span></p>
<p style="text-align: justify;"><span id="result_box" lang="es"><span id="result_box" lang="es">Hacer click en Siguiente</span> <span class="hps">para continuar.</span></span></p>
<p style="text-align: justify;"><a href="http://colacios.es/blog/WordPress3/wp-content/uploads/2013/09/6w_odbc.jpg"><img class="aligncenter size-full wp-image-548" title="6w_odbc" src="http://colacios.es/blog/WordPress3/wp-content/uploads/2013/09/6w_odbc.jpg" alt="" width="510" height="355" /></a>En la siguiente pantalla pulsar &#8220;Finish&#8221;&#8230;.</p>
<p style="text-align: justify;"><a href="http://colacios.es/blog/WordPress3/wp-content/uploads/2013/09/7w_odbc.jpg"><img class="aligncenter size-full wp-image-550" title="7w_odbc" src="http://colacios.es/blog/WordPress3/wp-content/uploads/2013/09/7w_odbc.jpg" alt="" width="510" height="355" /></a>Aperecerá una<span id="result_box" lang="es"><span class="hps"> ventana</span> con la información que hemos configurado <span class="hps">para que comprobemos</span> <span class="hps">los ajustes que hemos</span> <span class="hps">configurado para el</span> <span class="hps">origen de datos.</span> <span class="hps">Haremos click en</span></span><span id="result_box" lang="es"><span class="hps"> &#8220;Probar origen de datos</span>&#8221; <span class="hps">para validar su</span> <span class="hps">definición</span><span>. Y si todo ha ido correctamente saldrá una pantalla como la siguiente:</span></span></p>
<p style="text-align: justify;"><span id="result_box" lang="es"><span><a href="http://colacios.es/blog/WordPress3/wp-content/uploads/2013/09/8w_odbc.jpg"><img class="aligncenter size-full wp-image-552" title="8w_odbc" src="http://colacios.es/blog/WordPress3/wp-content/uploads/2013/09/8w_odbc.jpg" alt="" width="369" height="379" /></a></span></span></p>
<p style="text-align: justify;">Lo instalado debe aparecer como un DSN de sistema válido como se ve en la siguiente pantalla. Si en un futuro se desea modificar algo, basta con editarlo pulsando en &#8220;Configure&#8221; pero tendremos que volver a borrar y crear el dbLink en la parte de Oracle para activar de nuevo las modificaciones realizadas en el ODBC.</p>
<p style="text-align: justify;"><a href="http://colacios.es/blog/WordPress3/wp-content/uploads/2013/09/9w_odbc.jpg"><img class="aligncenter size-full wp-image-553" title="9w_odbc" src="http://colacios.es/blog/WordPress3/wp-content/uploads/2013/09/9w_odbc.jpg" alt="" width="461" height="379" /></a>Hacer click en &#8220;Ok&#8221; para salir del administrador de la DSN. Ya tenemos la parte de Windows realizada.</p>
<p style="text-align: justify;">Ahora pasaremos a configurar la parte de Oracle &#8230;.</p>
<p style="text-align: justify;"><span id="result_box" lang="es"><span><strong>En el servidor &#8220;Orígen&#8221; por la parte de Oracle</strong><br />
2.- Crear un fichero de inicialización de los servicios heterogéneos.</span></span></p>
<p style="text-align: justify;">Dentro del directorio $ORACLE_HOME/hs/admin Oracle tiene unos ficheros init de ejemplo que usaremos para configurar el nuestro.  Sino existe el directorio es porque Oracle Servicios heterogéneos no está instalado y se tendrá que instalar. (Estará en el CD de Oracle Enterprise Edition probablemente). En mi caso, como si está instalado, lo que haremos será copiar el fichero de ejemplo con otro nombre en el mismo directorio, luego lo editaremos con la información de mi configuración:</p>
<p style="text-align: justify;">Se hace así &#8230;</p>
<pre style="text-align: justify;">$ cd $ORACLE_HOME/hs/admin
$ cp inithsodbc.ora initMYSQLSERVERDSN.ora</pre>
<p style="text-align: justify;">Este es el contenido del fichero de muestra:</p>
<pre style="text-align: justify;"># This is a sample agent init file that contains the HS parameters that are
# needed for an ODBC Agent. 

#
# HS init parameters
#
HS_FDS_CONNECT_INFO = &lt;odbc data_source_name&gt;
HS_FDS_TRACE_LEVEL = &lt;trace_level&gt;
HS_FDS_TRACE_FILE_NAME = &lt;log file name&gt;
HS_FDS_SHAREABLE_NAME = &lt;full path name of odbc driver manager or driver&gt;

#
# ODBC specific environment variables
#
set ODBCINI=&lt;full path name of the odbc initilization file&gt;

#
# Environment variables required for the non-Oracle system
#
set &lt;envvar&gt;=&lt;value&gt;</pre>
<p style="text-align: justify;">Este es el fichero ya editado con los valores de mi instalación:</p>
<pre style="text-align: justify;"># This is a sample agent init file that contains the HS parameters that are
# needed for an ODBC Agent. 

#
# HS init parameters
#
HS_FDS_CONNECT_INFO = <strong>MYSQLSERVERDSN</strong>
HS_FDS_TRACE_LEVEL = 0
HS_FDS_TRACE_FILE_NAME =<strong>/tmp/hsodbcsql.trc</strong>
HS_FDS_SHAREABLE_NAME =<strong>/usr/local/easysoft/sqlserver/lib/libessqlsrv.sl</strong>

#
# ODBC specific environment variables
#
set ODBCINI=<strong>/etc/odbc.ini</strong>

#
# Environment variables required for the non-Oracle system
#
#set &lt;envvar&gt;=&lt;value&gt;</pre>
<p style="text-align: justify;">En negrita aparecen los valores que yo he añadido y he eliminado la &#8220;#&#8221; de comentario del principio de cada línea. Son los valores que necesita un SA para usar un agente ODBC. Explicaré alguno de los parámetros, pero para más información consultar la documentación de Oracle y/o la de Easysoft Driver configuration.</p>
<p style="text-align: justify;"><em><strong> HS_FDS_CONNECT_INFO</strong></em> es el nombre del origen de datos tal como se escribió dentro de <strong>/etc/odbc.ini</strong> Tener en cuenta que como hsODBC utiliza la API de ODBC SQLDriverConnect, en realidad se puede poner cualquier cadena de conexión ODBC válida aquí. Dentro de /etc/odbc.ini tendremos los datos de conexión del servidor SQL Server.</p>
<p style="text-align: justify;"><strong><em>HS_FDS_TRACE_LEVEL</em></strong> determina el nivel de rastreo. Como el rastreo ralentiza las operaciones he puesto &#8220;0&#8243;. Sin embargo, si tenemos problemas HS_FDS_TRACE_LEVEL puede ajustarse a un número del 1 al 4 (donde 4 es el más detallado) y la salida de rastreo se escribe en el archivo especificado con HS_FDS_TRACE_FILE_NAME.</p>
<p style="text-align: justify;"><strong><em>HS_FDS_SHAREABLE_NAME</em></strong> es el nombre de la shared library, coincide con el nombre del driver a utilizar (dentro del campo driver en /etc/odbc.ini). Para saber que driver se va a utilizar podemos ejecutar <strong>$ ./odbcinst -j</strong> dentro de la ruta <strong>/usr/local/easysoft/unixODBC/bin</strong> para nuestro ejemplo, ya que nosotros usamos un driver ODBC de Unix de la empresa Easysoft. Veremos todo esto en la parte de instalación/configuración del driver al final de esta entrada de blog.</p>
<p style="text-align: justify;">3.- Crear un nuevo listener dentro del fichero listener.ora.</p>
<p style="text-align: justify;">En el mismo directorio anterior, tambien tenemos un ejemplo de listener.ora y tnsnames.ora. Yo lo que hice, fue utilizar el contenido de este ejemplo y añadirlo al listener.ora &#8220;de toda la vida&#8221; ubicado en $ORACLE_HOME/network/admin. Lo que realmente se debe tener en cuenta es especificar el PROGRAM y que el SID name coincida con el que vamos a configurar en el tnsnames.ora. En negrita está todo lo modificado y de mayor importáncia:</p>
<p style="text-align: justify;">Contenido del listener.ora adecuado:</p>
<pre style="text-align: justify;"><strong>LISTENERMYSQLSERVERDSN</strong> =
 (ADDRESS_LIST=
    (ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=<strong>1522</strong>))
    (ADDRESS=(PROTOCOL=ipc)(KEY=PNPKEY)))

<strong>SID_LIST_LISTENERMYSQLSERVERDSN</strong>=
 (SID_LIST=
   (SID_DESC=
    (SID_NAME=<strong>MYSQLSERVERDSN</strong>)
    (ORACLE_HOME = /psg_oetc/oracle)
    <strong>(PROGRAM=hsodbc)</strong>
   (ENVS=LD_LIBRARY_PATH = /usr/local/easysoft/unixODBC/lib:/usr/local/easysoft/
lib:<strong>$ORACLE_HOME/lib32</strong>:/usr/local/easysoft/sqlserver/lib)
   )
 )</pre>
<p style="text-align: justify;">A tener en cuenta &#8230;</p>
<p style="text-align: justify;">- Se puede usar el puerto 1522 para evitar conflictos con otro listener o con el de por defecto de ORACLE 1521.<br />
- Se debe parar y volver a arrancar para que los cambios tengan efecto. Podemos hacer un tnsping para comprobar que todo está Ok.<br />
- La variable ENVS puede omitirse, creo que funcionaría igual, siempre y cuando definamos correctamente las variables de entorno LD_LIBRARY_PATH y SHLIB_PATH (HP-UX).<br />
- Tened en cuenta que la variable de entorno $ORACLE_HOME/lib<strong>32</strong> sólo s encontrará en sistemas de 32 bits. Para sistemas operativos de 64 bits,  poner lib64 ($ORACLE_HOME/lib64).</p>
<p style="text-align: justify;">Para arrancar el listener hacer:</p>
<pre><strong>$ lsnrctl start LISTENERMYSQLSERVERDSN</strong>
TNSLSNR for HPUX: Version 8.1.7.4.0 - Production</pre>
<pre style="text-align: justify;">El fichero de parámetros del sistema es /oracle/network/admin/listenera
Mensajes del log escritos en /oracle/network/log/listenermysqlserverdsg
Recibiendo en: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=servidor_local)(POR)
Recibiendo en: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=PNPKEY)))

Conectándose a (ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1522))
ESTADO del LISTENER
------------------------
Alias                     LISTENERMYSQLSERVERDSN
Versión                   TNSLSNR for HPUX: Version 8.1.7.4.0 - Production
Fecha de Inicio           30-SEP-2013 14:56:05
Tiempo de actividad                    0 días 0 hr. 0 min. 0 seg.
Nivel de Rastreo          off
Seguridad                 OFF
SNMP                      OFF
Fichero de Parámetros del Listener   /oracle/network/admin/listener.ora
Fichero Log del Listener      /oracle/network/log/listenermysqlserverdg
Resumen de servicios...
  MYSQLSERVERDSN                tiene 1 gestor(es) de servicio
El comando se ha ejecutado correctamente</pre>
<p style="text-align: justify;">Para pararlo:</p>
<pre style="text-align: justify;"><strong>$ lsnrctl stop LISTENERMYSQLSERVERDSN</strong>
LSNRCTL for HPUX: Version 8.1.7.4.0 - Production on 30-SEP-2013 15:02:00

(c) Copyright 1998 Oracle Corporation.  All rights reserved.

Conectándose a (ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1522))
El comando se ha ejecutado correctamente</pre>
<p style="text-align: justify;">Para comprobar que funciona:</p>
<p style="text-align: justify;">Nota: Antes de hacer la prueba debemos tener definida la instancia MYSQLSERVERDSN en el fichero tnsnames.ora como se explica en el siguiente punto. Observar que se hace el tnsping al nombre de la instancia y no al nombre del listener creado.</p>
<pre style="text-align: justify;"><strong>$ tnsping MYSQLSERVERDSN</strong>
TNS Ping Utility for HPUX: Version 8.1.7.4.0 - Production on 30-SEP-2013 15:00:1

(c) Copyright 1997 Oracle Corporation.  All rights reserved.

Attempting to contact (ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1522))
Realizado correctamente (110 mseg)</pre>
<p style="text-align: justify;">4.- Añadir una nueva entrada en el fichero tnsnames.ora.</p>
<p style="text-align: justify;">Un ejemplo de tnsnames.ora lo podemos encontrar también en $ORACLE_HOME/hs/admin. Lo importante en este caso, es también lo que tenemos subrayado en negrita.</p>
<p style="text-align: justify;"><strong> MYSQLSERVERDSN</strong>  =<br />
(DESCRIPTION=<br />
(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=<strong>1522</strong>))<br />
(CONNECT_DATA=(SID=<strong>MYSQLSERVERDSN</strong>))<br />
<strong>(HS=OK)</strong><br />
)</p>
<p style="text-align: justify;">Lo más destacable en este punto es sobretodo:</p>
<p style="text-align: justify;">- Indicar correctamente el nombre de la instancia &#8220;SID&#8221;. Esta cadena es la que usaremos en las llamadas a los ficheros odbc.ini en los drivers ODBC del sistema Unix e incluso será el nombre del ODBC del sistema Windows donde reside SQL Server.</p>
<p style="text-align: justify;">- He puesto el puerto 1522 para evitar conflictos con el de por defecto de Oracle 1521. Debemos tener en cuenta que el puerto que pongamos tiene que estar abierto. Sino estamos seguros, realizar todo el proceso con el puerto 1521 y después de la instalación cambiar al puerto deseado. Parar y volver a arrancar el listener y ya estaría.</p>
<p style="text-align: justify;">- El valor de HS se pone a &#8220;OK&#8221; para que Oracle use los servicios heterogéneos.</p>
<p style="text-align: justify;">5.- Crear un Database Link en Oracle.</p>
<p style="text-align: justify;">Se ha de crear un Database link, porque será de esta manera el cómo realizaremos las consultas desde SQL de Oracle al servidor No-Oracle que en este caso será un SQL SERVER. Es decir, con el &#8220;@MYSQLSERVER&#8221; después de cada consulta que hagamos. Lo vermos más adelante con algún ejemplo de consulta al servidor destino.</p>
<p>&nbsp;</p>
<pre class="MsoNormal"><span style="color: #000000;"><span style="font-size: 10pt; font-family: Courier; background: none repeat scroll 0% 0% white;" lang="EN-US">CREATE PUBLIC DATABASE LINK</span><span style="font-size: 10pt; font-family: Courier; background: none repeat scroll 0% 0% white;" lang="EN-US"><strong> MYSQLSERVERDSN</strong> CONNECT TO</span><span style="font-size: 10pt; font-family: Courier; background: none repeat scroll 0% 0% white;" lang="EN-US"> "sa" IDENTIFIED BY</span><span style="font-size: 10pt; font-family: Courier; background: none repeat scroll 0% 0% white;" lang="EN-US"> "</span><span style="font-size: 10pt; font-family: Courier; background: none repeat scroll 0% 0% white;" lang="EN-US">as" USING</span><span style="font-size: 10pt; font-family: Courier; background: none repeat scroll 0% 0% white;" lang="EN-US"> '<strong><em>MYSQLSERVERDSN</em></strong>'</span><span style="font-size: 10pt; font-family: Courier; background: none repeat scroll 0% 0% white;" lang="EN-US">;</span></span></pre>
<p style="text-align: justify;">Muy importante a tener en cuenta a la hora de crear el database link:</p>
<p style="text-align: justify;">- Crearlo con el usuario system en la BBDD Oracle, la cual nos conectaremos a sqlplus cuando queramos acceder a SQL Server.<br />
- Tanto el usuario como la clave de la conexión, ponerla en comillas dobles y el SID de despues del &#8220;using&#8221; ponerlo en comillas simples. Sino se hace así, es posible que Oracle te permita crear el database link, pero no te funcionará.<br />
- Creamos el database link como public para que todos los usuarios puedan acceder a la consulta del SQL Server.<br />
- Para que el DBLlink funcione nos debemos asegurar de que el parámetro &#8220;global_names&#8221; del init.ora de la BBDD Oracle está definido como &#8220;FALSE&#8221;. Para ello podemos realizar la siguiente consulta:</p>
<pre style="text-align: justify;">SELECT * FROM v$parameter
WHERE name LIKE 'global_names%';</pre>
<p style="text-align: justify;">Si el parámetro está seteado a &#8220;TRUE&#8221; deberemos cambiarlo en el fichero init.ora y volver a reiniciar la BBDD antes de crear el DB Link.</p>
<p style="text-align: justify;"><strong>En el servidor &#8220;Orígen&#8221;  por la parte de Unix</strong><br />
6.- <a title="Instalación del driver ODBC de Easysoft para Unix" href="http://colacios.es/blog/WordPress3/instalar-easysoft-odbc-driver-en-sistemas-hp-ux-para-conectar-oracle-con-sql-server/" target="_blank">Instalar</a>/configurar el driver ODBC en el sistema Unix donde reside el servidor Oracle.</p>
<p style="text-align: justify;">Seguir la documentación explicada en la entrada de blog del enlace anterior. Para realizar la instalación del Driver ODBC para Unix. En este ejemplo he utilizado el facilitado por la empresa Easysoft y que requiere de licencia.</p>
<p><strong><span style="text-decoration: underline;"><strong>7.-Posibles errores durante la configuración</strong></span></strong></p>
<p style="text-align: justify;">Es muy probable que durante la configuración de alguno de los procesos anteriores, nos encontremos con algún error. Seguidamente detallo alguno de los errores encontrados y la solución aplicada. He de comentar, que si se ha seguido al pie de la letra la documentación, estos errores no deberían producirse. Ya que la documentación se ha hecho dándo ya la solución a los mismos.</p>
<p style="text-align: justify;"><span style="text-decoration: underline;">Error 1</span></p>
<p style="text-align: justify;">Al ejecutar &#8230;</p>
<pre># ./odbcinst -j
/usr/lib/pa20_64/dld.sl: Unable to find library 'libodbcinst.sl.1'.
Killed</pre>
<p style="text-align: justify;"><span style="text-decoration: underline;">Solución</span><br />
Este error en concreto es debido a que no encuentra una librería de 64 bits cuando en realidad necesitábamos una de 32 bits. La solución fue borrar la versión de 64 bits (explicado en <a title="Instalación del driver ODBC de Easysoft para Unix" href="http://colacios.es/blog/WordPress3/instalar-easysoft-odbc-driver-en-sistemas-hp-ux-para-conectar-oracle-con-sql-server/" target="_blank">esta</a> entrada de blog), descargar la versión del driver para <strong><span style="text-decoration: underline;">32 bits</span></strong> e instalarla.</p>
<p><span style="text-decoration: underline;">Error 2</span></p>
<p>SQL&gt; select * from dual@MYSQLSERVERDSN;<br />
/usr/lib/dld.sl: Bad magic number for shared library: /usr/local/easysoft/sqlsel/usr/lib/dld.sl: Exec format error<br />
select * from dual@MYSQLSERVERDSN<br />
*<br />
ERROR en línea 1:<br />
ORA-28500: la conexión de ORACLE a un sistema no Oracle ha devuelto este<br />
mensaje:[Generic Connectivity Using ODBC]Exec format error; at FIND_IMAGE_SYMBOL<br />
Cannot connect to shareable /usr/local/easysoft/sqlserver/lib/libessqlsrv.sl.<br />
Using dummy functions<br />
ORA-02063: 3 lines precediendo a MYSQLSERVERDSN</p>
<p><span style="text-decoration: underline;">Solución</span></p>
<p>Añadir los valores en negrita a las variables de entorno LD_LIBRARY_PATH y SHLIB_PATH.</p>
<pre>export LD_LIBRARY_PATH=$LD_LIBRARY_PATH<strong>:/usr/local/easysoft/sqlserver/lib </strong></pre>
<pre>export SH_LIB_PATH=$SH_LIB_PATH:<strong><strong>/usr/local/easysoft/sqlserver/lib</strong></strong></pre>
<p><strong><span style="text-decoration: underline;">Error 3</span></strong></p>
<pre>$ ./isql -v MYSQLSERVERDSN sa as
 [01000][unixODBC][Driver Manager]Can't open lib '/usr/local/easysoft/sqlserver/lib/libessqlsrv.sl' : can't open the module
 [ISQL]ERROR: Could not SQLConnect</pre>
<p><span style="text-decoration: underline;">Solución</span></p>
<p>Esto es porque dentro del directorio /usr/local el directorio easysoft no tiene permisos de lectura/ejecución de alguna librería. Se soluciona entrando en /usr/local y ejecutando conectado como &#8220;root&#8221;:</p>
<pre># cd /usr/local
#  chmod -R 777 easysoft</pre>
<p style="text-align: justify;"><strong><span style="text-decoration: underline;">Otros Errores comunes</span></strong></p>
<pre>ERROR en línea 1:
ORA-28500: la conexión de ORACLE a un sistema no Oracle ha devuelto este
mensaje:[Generic Connectivity Using ODBC]Exec format error; at
FIND_IMAGE_SYMBOL</pre>
<p style="text-align: justify;">La mayoría de los errores que se producen durante este tipo de instalación es o bien:</p>
<p style="text-align: justify;">- Porque no se están instalando los drivers adecuados en cuanto a la versión de 32 o 64 bits.</p>
<p style="text-align: justify;">- Porque no se ha definido o no se ha definido de manera adecuada las variables de entorno <strong>LD_LIBRARY_PATH</strong> (cualquier sistema o variante de Unix) y <strong>SHLIB_PATH</strong> (HP). En entornos (AIX) en lugar de SHLIB_PATH se usa LIBPATH.</p>
<p style="text-align: justify;">- Cuando falla alguna librería, y normalmente es por los motivos comentados anteriormente. Es decir, se ha instalado una de 64 bits cuando necesitamos 32 bits, una manera de ver donde enlaza la librería es usando el comando chatr &lt;nombre_libreria&gt;.</p>
<p style="text-align: justify;">Ejemplo:</p>
<pre>$ <strong>chatr</strong> $ORACLE_HOME/lib/libclntsh.sl</pre>
<p style="text-align: justify;">/oracle/lib/libclntsh.sl:<br />
shared library<br />
shared library dynamic path search:<br />
<strong>SHLIB_PATH     enabled</strong>   first<br />
embedded path  disabled  second Not Defined<br />
internal name:<br />
libclntsh.sl.8.0<br />
shared library list:<br />
dynamic   <strong>/oracle/lib</strong>/libwtc8.sl<br />
dynamic  <strong> /usr/lib</strong>/librt.2<br />
dynamic   /usr/lib/libpthread.1<br />
dynamic   /usr/lib/libnss_dns.1<br />
dynamic   /usr/lib/libdld.2<br />
dynamic   /usr/lib/libm.2<br />
dynamic   /usr/lib/libc.2<br />
dynamic   /usr/lib/libcl.2<br />
shared vtable support disabled<br />
static branch prediction disabled<br />
executable from stack: D (default)<br />
kernel assisted branch prediction enabled<br />
lazy swap allocation disabled<br />
text segment locking disabled<br />
data segment locking disabled<br />
third quadrant private data space disabled<br />
fourth quadrant private data space disabled<br />
third quadrant global data space disabled<br />
data page size: D (default)<br />
instruction page size: D (default)<br />
nulptr references enabled<br />
shared library private mapping disabled</p>
<p style="text-align: justify;"><span style="text-decoration: underline;">Solución</span><br />
Podemos asegurarnos de que estas rutas están definidas en la variable de entorno PATH.</p>
<p style="text-align: justify;"><span style="text-decoration: underline;"><strong>8.- Juego de pruebas de comprobación de correcta instalación</strong></span></p>
<p style="text-align: justify;">Una vez acabada la instalación realizaré las siguientes comprobaciones.</p>
<p style="text-align: justify;">- Añadiré las variables de entorno LD_LIBRARY_PATH y SHLIB_PATH al entorno o .profile del usuario Oracle.</p>
<p style="text-align: justify;">- Comprobaré que el ODBC está instalado de manera adecuada y me informo de dónde están los drivers:</p>
<p style="text-align: justify;">En la ruta</p>
<pre>cd /usr/local/easysoft/unixODBC/bin
# <strong>./odbcinst -j</strong></pre>
<p style="text-align: justify;">Si al ejecutar sale el error:</p>
<pre>./odbcinst -j
/usr/lib/dld.sl: Can't open shared library: /usr/home_dir/svnbuild-32/external/p
roducts/unixodbc_2_3/threaded/lib/libodbcinst.sl.1
/usr/lib/dld.sl: No such file or directory
Abort(coredump)</pre>
<p style="text-align: justify;"><span style="text-decoration: underline;">Solución</span><br />
Hay que borrar el fichero &#8220;core&#8221; que ha generado en el directorio y cargar con valores adecuados las variables de entorno <strong>LD_LIBRARY_PATH</strong> y <strong>SHLIB_PATH</strong>.</p>
<p style="text-align: justify;">Ejemplos válidos:</p>
<pre> export <strong>LD_LIBRARY_PATH</strong>=$ORACLE_HOME/jdbc/lib:$ORACLE_HOME/lib:/usr/local/easysoft/sqlserver:/usr/local/easysoft/lib:/usr/local/easysoft/unixODBC/lib:/usr/local/easysoft/sqlserver/lib</pre>
<pre>export <strong>SHLIB_PATH</strong>=$ORACLE_HOME/jdbc/lib:$ORACLE_HOME/lib:/usr/local/easysoft/sqlserver:/usr/local/easysoft/lib:/usr/local/easysoft/unixODBC/lib:/usr/local/easysoft/sqlserver/lib</pre>
<p style="text-align: justify;">Ahora comprobaré que la conexión del driver ODBC funciona:</p>
<pre>cd /usr/local/easysoft/unixODBC/bin
<strong>./isql -v </strong>MYSQLSERVERDSN sa as</pre>
<p style="text-align: justify;">Si esto falla, es porque no puede leer las librerias.</p>
<p style="text-align: justify;"><span style="text-decoration: underline;">Solución</span></p>
<pre># cd /usr/local
#  chmod -R 777 easysoft</pre>
<p style="text-align: justify;">Ahora me conecto a sqlplus de Oracle y compruebo que accedo al servidor de SQL Server:</p>
<p style="text-align: justify;">Antes de hacer esto. Podemos asegurarnos de parar y volver a arrancar el listener con las variables de entorno LD_LIBRARY_PATH y SHLIB_PATH adecuadamente configuradas. Porque sino nos podemos encontrar que esto no funcione.</p>
<pre>sqlplus system/password</pre>
<pre>SQL&gt; select * from dual@MYSQLSERVERDSN;
ninguna fila seleccionada</pre>
<p style="text-align: justify;">Que no devuelva ninguna fila es posible. Lo importante es que no dé errores de Oracle u otros errores. También podemos probar con alguna tabla que sepamos que existe en el SQL Server de destino. Pero no olvidarse, en este caso, de poner el nombre del propietario de la tabla delante y usar el DBLink a la hora de hacer la select.</p>
<p style="text-align: justify;">Ejemplo:</p>
<pre>SQL&gt; select * from usuario.tabla@MYSQLSERVERDSN;</pre>
<p>¡¡¡ Pues ya tenemos nuestro Oracle Heterogeneous configurado!!!</p>
]]></content:encoded>
			<wfw:commentRss>http://colacios.es/blog/WordPress3/configurar-los-servicios-heterogeneos-de-oracle-para-acceder-a-sql-server/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OEM no arranca después de llenarse el filesystem que contiene el software ORACLE</title>
		<link>http://colacios.es/blog/WordPress3/oem-no-arranca-despues-de-llenarse-el-filesystem-que-contiene-el-software-oracle/</link>
		<comments>http://colacios.es/blog/WordPress3/oem-no-arranca-despues-de-llenarse-el-filesystem-que-contiene-el-software-oracle/#comments</comments>
		<pubDate>Wed, 02 Oct 2013 13:43:41 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Administración Oracle]]></category>
		<category><![CDATA[Administración Sistemas]]></category>
		<category><![CDATA[404 Not Found]]></category>
		<category><![CDATA[OEM]]></category>
		<category><![CDATA[server.xml]]></category>

		<guid isPermaLink="false">http://colacios.es/blog/WordPress3/?p=566</guid>
		<description><![CDATA[Tal y como indica el título de la entrada de blog me he encontrado que después de llenarse al 100% el filesystem que contiene el software de Oracle, donde normalmente, por defecto se copian los datafiles de los tablespaces TEMP, &#8230; <a href="http://colacios.es/blog/WordPress3/oem-no-arranca-despues-de-llenarse-el-filesystem-que-contiene-el-software-oracle/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Tal y como indica el título de la entrada de blog me he encontrado que después de llenarse al 100% el filesystem que contiene el software de Oracle, donde normalmente, por defecto se copian los datafiles de los tablespaces TEMP, REDO, SYSTEM, USERS, etc&#8230; el Oracle Enterprise Manager no me arranca.</p>
<p style="text-align: justify;">Cuando intento acceder mediante el navegador a la url:</p>
<pre>https://&lt;IP_de_mi_servidor_oracle&gt;:1158/em/console/logon/logon</pre>
<p style="text-align: justify;">Sale un error parecido o igual a:</p>
<pre style="text-align: justify;"><strong>404 Not Found</strong></pre>
<p style="text-align: justify;">¿ Que ha sucedido ?</p>
<p style="text-align: justify;">¿Porqué se ha llenado el filesystem?<br />
Normalmente, por un crecimiento inesperado de cualquier tablespace definido como autoextensible automáticamente y que llene el disco. Esto suele suceder con los tablespaces UNDO y TEMP que si no los modificas después de la primera instalación del servidor Oracle se quedan configurados como autoextensibles.</p>
<p style="text-align: justify;">Independientemente de cómo se hayan llenado el filesystem la solución es la siguiente:</p>
<p style="text-align: justify;"><span style="text-decoration: underline;">Solución</span></p>
<p style="text-align: justify;">He comprobado que cuando se llena el filesystem que contiene los binarios de Oracle, no sé explicar el motivo, pero los ficheros server.xml y emoms.properties se &#8220;truncan&#8221; y se quedan en el directorio donde residen, pero sorprendentemente sin contenido.</p>
<p style="text-align: justify;">Estos ficheros se encuentran normalmente en las rutas:</p>
<pre style="text-align: justify;"><strong>$ORACLE_HOME/oc4j/j2ee/OC4J_DBConsole_<em>&lt;tu_servidor&gt;</em>/config</strong>/server.xml</pre>
<pre style="text-align: justify;"><strong>$ORACLE_HOME/<em>&lt;tu_servidor&gt;</em>/sysman/config</strong>/emoms.properties</pre>
<p style="text-align: justify;">La solución, pasa por recuperar de un backup ambos ficheros y el problema se solucionará. Ya podrás volver a arrancar la consola de OEM. Te recomiendo entonces, tener un backup de esos mismos ficheros ubicados en los directorios anteriores.</p>
<p style="text-align: justify;">Por ejemplo:</p>
<pre>$ cd $ORACLE_HOME/oc4j/j2ee/OC4J_DBConsole_<em>&lt;tu_servidor&gt;</em>/config/server.xml
$ cp server.xml server.xml.backup</pre>
<pre>$ cd $ORACLE_HOME/<em>&lt;tu_servidor&gt;</em>/sysman/config/emoms.properties
$ cp emoms.properties emoms.properties.backup</pre>
<p style="text-align: justify;">Después al arrancar de nuevo la consola de OEM puede salir esto, pero al rato, en el próximo refresco volverá automáticamente a su estado normal.</p>
<p style="text-align: justify;"><a href="http://colacios.es/blog/WordPress3/wp-content/uploads/2013/10/pantOEM_borrado.jpg"><img class="aligncenter size-full wp-image-574" title="pantOEM_borrado" src="http://colacios.es/blog/WordPress3/wp-content/uploads/2013/10/pantOEM_borrado.jpg" alt="" width="600" height="331" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://colacios.es/blog/WordPress3/oem-no-arranca-despues-de-llenarse-el-filesystem-que-contiene-el-software-oracle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ORA-01552: no se puede usar segm. rollback SYSTEM para tablespace &#8216;&#8216;</title>
		<link>http://colacios.es/blog/WordPress3/ora-01552-no-se-puede-usar-segm-rollback-system-para-tablespace/</link>
		<comments>http://colacios.es/blog/WordPress3/ora-01552-no-se-puede-usar-segm-rollback-system-para-tablespace/#comments</comments>
		<pubDate>Fri, 23 Aug 2013 11:59:31 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Administración Oracle]]></category>
		<category><![CDATA[ORA-?????]]></category>
		<category><![CDATA[ORA-01552]]></category>
		<category><![CDATA[ORA-01555]]></category>
		<category><![CDATA[ORA-1650]]></category>
		<category><![CDATA[rollback segment]]></category>

		<guid isPermaLink="false">http://colacios.es/blog/WordPress3/?p=457</guid>
		<description><![CDATA[En esta entrada de blog voy a intentar dar alguna solución a este error sobretodo para versiones antiguas de ORACLE. En versiones a partir de la 10G la solución estaría más basada en los tablespace de UNDO que en los &#8230; <a href="http://colacios.es/blog/WordPress3/ora-01552-no-se-puede-usar-segm-rollback-system-para-tablespace/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">En esta entrada de blog voy a intentar dar alguna solución a este error sobretodo para versiones antiguas de ORACLE. En versiones a partir de la 10G la solución estaría más basada en los tablespace de UNDO que en los segmentos de rollback propiamente dichos.</p>
<p style="text-align: justify;">El error que suele aparecer es el siguiente:</p>
<pre style="text-align: justify;">Error de Java Gateway: JDBC Gateway SP execute(0) error 0:
 ORA-01552: no se puede usar segm. rollback SYSTEM para tablespace '&lt;<strong><em>tablespace_afectado</em></strong>&gt;' NO-SYSTEM</pre>
<p style="text-align: justify;">Donde &#8230; tablespace_afectado corresponderá al tablespace específico de tu BBDD.</p>
<p style="text-align: justify;">Lo primero que tenemos que hacer es consultar el fichero de alertas del servidor Oracle. Normalmente ubicado en <strong><em>$ORACLE_HOME/oracle/admin/&lt;SID&gt;/bdump</em></strong>. El fichero de alertas suele llamarse <strong><em>alert_&lt;SID&gt;.log</em></strong> y almacena todos los movimientos y errores de la BBDD. Donde &lt;SID&gt; es el nombre de nuestra instancia.</p>
<p style="text-align: justify;">Normalmente en esta ruta, se almacenan también los ficheros de traza que tienen la extensión.trc y almacenarán el error concreto de manera más específica que el fichero alert_&lt;SID&gt;.log.</p>
<p style="text-align: justify;">En el caso que nos ocupa, el error aparecerá en el fichero de alertas, pero muy probablemente en el mismo fichero de alerta se nos indicará el nombre del fichero de traza que almacenará el error &#8220;origen&#8221; que ha provocado el error que finalmente vemos en el fichero de traza.</p>
<p style="text-align: justify;">Por tanto, miraremos el fichero de alerta para encontrar el fichero de traza que miraremos posteriormente para averiguar &#8220;el nuevo error&#8221; o el &#8220;error origen&#8221; para ponerle remedio.</p>
<p style="text-align: justify;">En el ejemplo siguiente vemos un posible  caso de lo que puede aparecer en el fichero de alerta:</p>
<pre style="text-align: justify;">FULL status of rollback segment 19 set.
ORA-1650: unable to extend rollback segment RBS9 by 128 intablespace RBS

Failure to extend rollback segment 10 because of 1650 condition
FULL status of rollback segment 10 set.
Thu Aug 22 14:04:52 2013
Errors in file /oracle/admin/&lt;SID&gt;/bdump/<strong>snp3_3448_p103.trc</strong>:
ORA-12012: error on auto execute of job 121
ORA-01552: cannot use system rollback segment for non-system tablespace '<em><strong>&lt;tablespace_afectado&gt;</strong></em>'</pre>
<p style="text-align: justify;">Lo siguiente sería consultar el fichero de traza que hemos visto en el de alerta&#8230;.</p>
<p style="text-align: justify;">Si nos fijamos en el ejemplo anterior, en negrita, tenemos el nombre del fichero de traza que nos detalla de manera más precisa el error que ha provocado la falta de espacio en los rollback segments: (<strong>snp3_3448_p103.trc</strong>).</p>
<p style="text-align: justify;">Si miramos su contenido veremos algo como:</p>
<pre>Unix process pid: <strong>3448</strong>, image: oracle@h0514 (SNP3)
*** SESSION ID:(511.55794) 2013-08-12 14:25:26.821
*** 2013-08-12 14:25:26.821
ORA-12012: error on auto execute of job 101
ORA-01555: snapshot too old: rollback segment number 6 with name "<strong>RBS5</strong>" too small
ORA-06512: at "<em><strong>OPS$USUARIO.PROCEDIMIENTO</strong></em>", line 109</pre>
<p style="text-align: justify;">Este fichero nos informa del pid del proceso Unix por si tenemos que cancelarlo, el segmento de rollback afectado y el procedimiento, acción, función, etc&#8230; que se estaba ejecutando y que ha provocado el error. Esto lo usaremos para informar al usuario que lanza dicho proceso o a los desarrolladores de que es lo que está provocando la carga excesiva, por si es necesario, crear algún segmento de rollback especial para este proceso y especificarlo en la aplicación por medio del comando:</p>
<pre style="text-align: justify;">SQL&gt; set transaction use rollback segment &lt;nombre_tablespace_rollback&gt;;</pre>
<p style="text-align: justify;">Pero la solución para evitar el error ORA_01552 sería ampliar con un datafile &lt;tablespace_afectado&gt; y revisar la contención, que los datafiles del tablespace del segmento de rollback tengan espacio y el parámetro OPTIMAL de los segmentos de rollback.</p>
<p style="text-align: justify;">Para modificar el OPTIMAL de un segmento de rollback se hace:</p>
<pre style="text-align: justify;">ALTER ROLLBACK SEGMENT "RBS5" STORAGE ( OPTIMAL 4096K);</pre>
<p style="text-align: justify;">
]]></content:encoded>
			<wfw:commentRss>http://colacios.es/blog/WordPress3/ora-01552-no-se-puede-usar-segm-rollback-system-para-tablespace/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
