<?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; ORA-?????</title>
	<atom:link href="http://colacios.es/blog/WordPress3/category/ora/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>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>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>
		<item>
		<title>ORA-28002: The password expire within 7 days &#8230; como solucionarlo</title>
		<link>http://colacios.es/blog/WordPress3/ora-28002-the-password-expire-within-7-days-como-solucionarlo/</link>
		<comments>http://colacios.es/blog/WordPress3/ora-28002-the-password-expire-within-7-days-como-solucionarlo/#comments</comments>
		<pubDate>Wed, 31 Jul 2013 10:15:51 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Administración Oracle]]></category>
		<category><![CDATA[ORA-?????]]></category>
		<category><![CDATA[expired]]></category>
		<category><![CDATA[ORA-28002]]></category>
		<category><![CDATA[password]]></category>
		<category><![CDATA[profile]]></category>

		<guid isPermaLink="false">http://colacios.es/blog/WordPress3/?p=338</guid>
		<description><![CDATA[Es posible que en alguna ocasión que como DBA te llame un usuario y te diga que al intentar acceder con su usuario a su cuenta le salga el mensaje de error: ORA-28002: the password will expire within 7 days &#8230; <a href="http://colacios.es/blog/WordPress3/ora-28002-the-password-expire-within-7-days-como-solucionarlo/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;"><a href="http://colacios.es/blog/WordPress3/wp-content/uploads/2013/07/imagesCAQG0NM3.jpe"><img class="aligncenter  wp-image-369" title="sólo me quedan 7 días ..." src="http://colacios.es/blog/WordPress3/wp-content/uploads/2013/07/imagesCAQG0NM3.jpe" alt="" width="146" height="180" /></a>Es posible que en alguna ocasión que como DBA te llame un usuario y te diga que al intentar acceder con su usuario a su cuenta le salga el mensaje de error:</p>
<p style="text-align: justify;"><strong><em>ORA-28002: the password will expire within 7 days</em></strong></p>
<p style="text-align: justify;">Tú le cambias la contraseña, vuelves a probar, y desgraciadamente sigue saliendo el mismo error. Incluso, el usuario puede tener ya la cuenta bloqueada después de varios intentos fallidos de conexión. Visitar este enlace para ver como desbloquear la cuenta: <a title="Bloquear/Desbloquear cuenta de usuario ORACLE" href="http://colacios.es/blog/WordPress3/bloqueardesbloquear-una-cuenta-oracle/" target="_blank">Bloquear/Desbloquear una cuenta ORACLE</a></p>
<p style="text-align: justify;">El problema es de fácil solución. Todo es debido al perfil (profile) que tenga asociado dicho usuario. Normalmente, el perfil asociado a un usuario en el proceso de creación es DEFAULT. Y dentro de ese perfil, se definen valores como la caducidad y otros parámetros que determinan la caducidad de la contraseña. Para evitar este error, revisaremos dichos parámetros del perfil.</p>
<p style="text-align: justify;">Los podemos consultar via SQLPLUS o bien con OEM. En el ejemplo veremos las dos maneras.</p>
<p style="text-align: justify;">Debemos tener en consideración que &#8230;</p>
<p style="text-align: justify;">- Es recomendable que el password expire aunque sea en un periodo prolongado de tiempo.<br />
- El perfil se define en la sentencia de creación del usuario &#8220;CREATE USER &#8230;&#8221;<br />
- Podemos modificar los perfiles una vez creado dicho usuario e incluso cambiar el perfil del usuario.</p>
<p style="text-align: justify;">Empecemos&#8230;..</p>
<p style="text-align: justify;"><span style="text-decoration: underline;">Desde SQLPLUS</span></p>
<p style="text-align: justify;">Miramos que perfil tiene el usuario asignado:</p>
<pre>SQL&gt;  select username, profile from dba_users
where username = 'USUARIO';</pre>
<p>&nbsp;</p>
<p style="text-align: justify;">USERNAME                       PROFILE<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
USUARIO                          DEFAULT</p>
<p style="text-align: justify;">vemos que tiene asignado el perfil DEFAULT, será el que editaremos para cambiar los valores de expiración de la contraseña. Estos valores de perfil son PASSWORD_LIFE_TIME y basados en la tabla de atributos de usuario ASTATUS y EXPTIME.</p>
<p style="text-align: justify;">sacamos los valores &#8230;</p>
<pre style="text-align: justify;">SQL&gt; select username, account_status, expiry_date from dba_users;</pre>
<p>USERNAME                       ACCOUNT_STATUS                   EXPIRY_DATE<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; &#8212;&#8212;&#8212;&#8212;<br />
USUARIO                           EXPIRED &amp; LOCKED                 15-AUG-12</p>
<p style="text-align: justify;">en este caso el usuario le expiró el 15 de Agosto de 2012 y además, tiene la cuenta bloqueada. Por tanto, primero desbloquearemos la cuenta tal y como explicamos en la entrada de blog del enlace anterior. Y procedermos a cambiar el límite de caducidad en el profile.</p>
<pre style="text-align: justify;"><!--[if gte mso 9]><xml>
 <w:LatentStyles DefLockedState="false" LatentStyleCount="156">
 </w:LatentStyles>
</xml><![endif]--><!--[if gte mso 10]>
<style>
 /* Style Definitions */
 table.MsoNormalTable
	{mso-style-name:"Tabla normal";
	mso-tstyle-rowband-size:0;
	mso-tstyle-colband-size:0;
	mso-style-noshow:yes;
	mso-style-parent:"";
	mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
	mso-para-margin:0cm;
	mso-para-margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	font-size:10.0pt;
	font-family:"Times New Roman";
	mso-ansi-language:#0400;
	mso-fareast-language:#0400;
	mso-bidi-language:#0400;}
</style>

<![endif]--><span style="font-size: 10pt; line-height: 115%; font-family: 'Courier New'; color: #000000;" lang="EN-US">SQL&gt; ALTER PROFILE "DEFAULT" LIMIT PASSWORD_LIFE_TIME UNLIMITED;</span></pre>
<p style="text-align: justify;">Teniendo en cuenta que no le estamos poniendo fecha de &#8220;expiración&#8221; y siempre es aconsejable hacerlo.  Esto por si sólo no solventa el error, hasta que las tareas de cambio de password, desbloqueo pendientes estén realizadas. Una vez hechas, el usuario al conectarse cogerá los nuevos valores definidos en el perfil.</p>
<p style="text-align: justify;">Recordad que para cambiar la clave del usuario haremos:</p>
<pre>SQL&gt;  ALTER USER usuario IDENTIFIED BY VALUES 'clave';</pre>
<p style="text-align: justify;"><em><span style="text-decoration: underline;">CONCLUSIÓN</span>:</em><br />
<em>La caducidad de la contraseña está controlada por el límite PASSWORD_LIFE_TIME definido en el perfil (DEFAULT por defecto) y se activa al iniciar la sesión Oracle, pero depende de la combinación de los parámetros ASTATUS y EXPTIME y se reestablece por un cambio de contraseña (alter user &#8230; identified by &#8230;). El cambio de perfil NO cambiará ASTATUS. En el cambio de contraseña se restablece ASTATUS y PTIME, pero no EXPTIME. Por tanto, los usuarios que estén bloqueados, se tendrán que desbloquear y los que esten en &#8220;EXPIRED&#8221; se les tendrá que cambiar la contraseña.</em></p>
<p>Ahora vamos a ver lo mismo desde OEM &#8230;</p>
<p>iremos a la pestaña &#8220;Servidor&#8221; y en el apartado<span style="color: #0000ff;"> Seguridad</span> pulsaremos en el enlace &#8220;Perfiles&#8221;.</p>
<p><a href="http://colacios.es/blog/WordPress3/wp-content/uploads/2013/07/oem_perfiles1.jpg"><img class="aligncenter size-full wp-image-343" title="oem_perfiles1" src="http://colacios.es/blog/WordPress3/wp-content/uploads/2013/07/oem_perfiles1.jpg" alt="" width="1181" height="574" /></a> Seguidamente en el perfil (normalmente suele ser el perfil DEFAULT) que corresponda al usuario afectado, pulsaremos en el perfil y luego lo editaremos &#8230;</p>
<p><a href="http://colacios.es/blog/WordPress3/wp-content/uploads/2013/07/oem_perfiles2.jpg"><img class="aligncenter size-full wp-image-344" title="oem_perfiles2" src="http://colacios.es/blog/WordPress3/wp-content/uploads/2013/07/oem_perfiles2.jpg" alt="" width="1181" height="443" /></a>Por último, editaremos el perfil y cambiaremos sus valores, pulsaremos en &#8220;Aplicar&#8221; para aplicar los cambios realizados.</p>
<p><a href="http://colacios.es/blog/WordPress3/wp-content/uploads/2013/07/oem_perfiles3.jpg"><img class="aligncenter size-full wp-image-346" title="oem_perfiles3" src="http://colacios.es/blog/WordPress3/wp-content/uploads/2013/07/oem_perfiles3.jpg" alt="" width="1131" height="470" /></a></p>
<p>Pues esto es todo &#8230;<br />
Sencillito!!! <img src='http://colacios.es/blog/WordPress3/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://colacios.es/blog/WordPress3/ora-28002-the-password-expire-within-7-days-como-solucionarlo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ORA-01031: privilegios insuficientes &#8230; al hacer un GRANT</title>
		<link>http://colacios.es/blog/WordPress3/ora-01031-privilegios-insuficientes-al-hacer-un-grant/</link>
		<comments>http://colacios.es/blog/WordPress3/ora-01031-privilegios-insuficientes-al-hacer-un-grant/#comments</comments>
		<pubDate>Tue, 12 Feb 2013 10:37:18 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Administración Oracle]]></category>
		<category><![CDATA[ORA-?????]]></category>
		<category><![CDATA[GRANT]]></category>
		<category><![CDATA[ORA-01031]]></category>

		<guid isPermaLink="false">http://colacios.es/blog/WordPress3/?p=232</guid>
		<description><![CDATA[Al hacer un GRANT conectado tanto como el usuario SYSTEM y/o SYS en una versión Oracle 7.3.4 para dar permisos de un package de un usuario a otro me aparece el error Oracle: ORA-01031: privilegios insuficientes La solución más rápida &#8230; <a href="http://colacios.es/blog/WordPress3/ora-01031-privilegios-insuficientes-al-hacer-un-grant/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;"><a href="http://colacios.es/blog/WordPress3/wp-content/uploads/2013/02/imagesCAYIGJQC.jpe"><img class="aligncenter  wp-image-375" title="¡¡¡ tú no tienes privilegios !!!" src="http://colacios.es/blog/WordPress3/wp-content/uploads/2013/02/imagesCAYIGJQC.jpe" alt="" width="164" height="158" /></a>Al hacer un GRANT conectado tanto como el usuario SYSTEM y/o SYS en una versión Oracle 7.3.4 para dar permisos de un package de un usuario a otro me aparece el error Oracle:</p>
<p style="text-align: justify;"><strong>ORA-01031: privilegios insuficientes</strong></p>
<p style="text-align: justify;">La solución más rápida a este error es conectarse <strong><span style="text-decoration: underline;">como el usuario propietario</span></strong> del Package (u del objeto que nos dé problemas) y ejecutar el comando GRANT.</p>
<p style="text-align: justify;">Ej.</p>
<p style="text-align: left;"><em><strong>$ sqlplus system/password_system</strong></em><br />
<em><strong>SQL&gt; connect usuario/password_usuario</strong></em><br />
<em><strong>SQL&gt; show user</strong></em><br />
<em><strong>el usuario es &#8220;usuario&#8221;</strong></em><br />
<em><strong>SQL&gt;  GRANT DELETE, INSERT, SELECT, UPDATE ON OPS$USUARIO.PACKAGE_EJEMPLO TO OPS$USUARIO_DESTINO;</strong></em></p>
<p style="text-align: justify;">Pero en mi caso, no tenía el password del usuario en concreto y tampoco me dejaban cambiarlo por si afectaba a alguna aplicación. ¿ Que se puede hacer en este caso ?</p>
<p style="text-align: justify;">Como sí que tenía el password de root a nivel de sistema operativo (Unix en este caso) hice lo siguiente:</p>
<p style="text-align: justify;"><em><strong># su &#8211; usuario</strong></em><br />
<em><strong>$ whoami</strong></em><br />
<em><strong>usuario</strong></em><br />
<em><strong>$ sqlplus /</strong></em></p>
<p style="text-align: justify;">Ahora ya estaba conectado como el usuario &#8220;usuario&#8221; y ya podía ejecutar el comando GRANT.</p>
<p style="text-align: left;"><em><strong>SQL&gt; show user</strong></em><br />
<em><strong>el usuario es &#8220;usuario&#8221;</strong></em><br />
<em><strong>SQL&gt;  GRANT DELETE, INSERT, SELECT, UPDATE ON OPS$USUARIO.PACKAGE_EJEMPLO TO OPS$USUARIO_DESTINO;</strong></em></p>
<p style="text-align: justify;">Fácil  ¿verdad?</p>
]]></content:encoded>
			<wfw:commentRss>http://colacios.es/blog/WordPress3/ora-01031-privilegios-insuficientes-al-hacer-un-grant/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SHLIB_PATH y LD_LIBRARY_PATH y su relación con el error ORA-12547: TNS:lost contact</title>
		<link>http://colacios.es/blog/WordPress3/shlib_path-y-ld_library_path-y-su-relacion-con-el-error-ora-12547-tnslost-contact/</link>
		<comments>http://colacios.es/blog/WordPress3/shlib_path-y-ld_library_path-y-su-relacion-con-el-error-ora-12547-tnslost-contact/#comments</comments>
		<pubDate>Wed, 23 Jan 2013 15:30:46 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Administración Oracle]]></category>
		<category><![CDATA[Administración Sistemas]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[ORA-?????]]></category>
		<category><![CDATA[HP_UX]]></category>
		<category><![CDATA[LD_LIBRARY_PATH]]></category>
		<category><![CDATA[ORA-12547]]></category>
		<category><![CDATA[SHLIB_PATH]]></category>

		<guid isPermaLink="false">http://colacios.es/blog/WordPress3/?p=169</guid>
		<description><![CDATA[Al intentar conectar a Oracle versión 8.1.7.0 en un entorno HP-UX me encontré con el siguiente error: # sqlplus scott/tiger SQL*Plus: Release 8.1.7.0.0 &#8211; Production on Mon May 19 14:47:42 2003 (c) Copyright 2000 Oracle Corporation.  All rights reserved. /usr/lib/pa20_64/dld.sl: Unable &#8230; <a href="http://colacios.es/blog/WordPress3/shlib_path-y-ld_library_path-y-su-relacion-con-el-error-ora-12547-tnslost-contact/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Al intentar conectar a Oracle versión 8.1.7.0 en un entorno HP-UX me encontré con el siguiente error:</p>
<p style="text-align: justify;"># sqlplus scott/tiger</p>
<p style="text-align: justify;">SQL*Plus: Release 8.1.7.0.0 &#8211; Production on Mon May 19 14:47:42 2003<br />
(c) Copyright 2000 Oracle Corporation.  All rights reserved.<br />
/usr/lib/pa20_64/dld.sl: Unable to find library &#8216;libjox8.sl&#8217;.<br />
ERROR:<br />
<strong>ORA-12547: TNS:lost contact</strong><br />
Enter user-name:</p>
<p style="text-align: justify;"> ¿ Que puede estar sucediendo ?</p>
<p style="text-align: justify;">Basicamente es que Oracle no puede encontrar las librerias dinámicas compartidas. Por tanto, la solución parece, a priori, ser bastante sencilla. Y de hecho lo es.</p>
<p style="text-align: justify;">Las librerias o bibliotecas compartidas son librerias que cargan los programas cuando se inician. Cuando una biblioteca compartida se instala correctamente, todos los programas que se inician automáticamente usan esta biblioteca compartida. Es más, en Linux estas bibliotecas se pueden actualizar, se pueden anular íncluso funciones específicas de una determinada biblioteca, y todo esto mientras los programas están en ejecución.</p>
<p style="text-align: justify;">Para poder realizar estas tareas, se pueden configurar variables de entorno que nos permitan controlar estos procesos y normalmente se suelen usar para sustituir una biblioteca por una diferente para una ejecución particular, como por ejemplo un entorno ORACLE determinado.</p>
<p style="text-align: justify;">Es aquí donde prestan protagonismo las variables de entorno que hago referencia en esta entrada de blog.</p>
<p style="text-align: justify;">LD _LIBRARY_PATH y SHLIB_PATH es un conjunto de directorios separados por &#8220;:&#8221; en donde se especifica o fija la ruta donde primero se tiene que buscar para encontrar las librerias necesarias para ejecutar cualquier programa, como por ejemplo sqlplus.</p>
<p style="text-align: justify;">¿ Pero que diferencia hay o porqué se usa una u otra ?</p>
<p style="text-align: justify;">LD_LIBRARY_PATH funciona en muchos sistemas Unix como Sun  y Linux, SHLIB_PATH sólo funciona en HP-UX y su equivalencia en AIX es la variable de entorno LIBPATH con la misma sintaxis, lista separada por &#8220;:&#8221;.</p>
<p style="text-align: justify;">Lo que quiere decir que para sistemas HP-UX usaremos las dos variables de entorno (SHLIB_PATH y LD_LIBRARY_PATH) para Linux o Sun Solaris sólo LD_LIBRARY_PATH y para AIX LIBPATH.</p>
<p style="text-align: justify;">Ahora, volvamos al error que nos ha dado ORACLE y vamos a solucionarlo &#8230;.</p>
<p style="text-align: justify;">Simplemente editaremos el fichero donde tengamos definidas las variables del entorno Oracle (normalmente el .profile del usuario Oracle) y añadiremos las rutas que nos muestra el error Oracle (/usr/lib) a las variables de entorno que toque en función del sistema Unix/Linux en el que estemos trabajando. En mi caso era HP-UX y tuve que configurar el entorno como sigue:</p>
<p style="text-align: justify;">export ORACLE_SID=ORCL<br />
export ORACLE_HOME=/u/oracle<br />
export PATH=$PATH:$ORACLE_HOME/bin:$ORACLE_HOME/lib:$ORACLE_HOME/lib32<br />
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$ORACLE_HOME/lib32:<strong>/usr/lib<br />
</strong>export SHLIB_PATH=<strong>/usr/lib</strong>:/psg_pr103/oracle/lib:/psg_pr103/oracle/lib64</p>
<p style="text-align: justify;">Ahora ya podríamos ejecutar sqlplus sin problemas.</p>
<p style="text-align: justify;">
]]></content:encoded>
			<wfw:commentRss>http://colacios.es/blog/WordPress3/shlib_path-y-ld_library_path-y-su-relacion-con-el-error-ora-12547-tnslost-contact/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
