MERCADOS FINANCIEROS

jueves, 21 de noviembre de 2013

Expresiones Regulares

http://www.oracle.com/technetwork/es/articles/sql/expresiones-regulares-base-de-datos-1569340-esa.HTML


REGEXP_LIKECondición que se puede utilizar en la cláusula WHERE de una sentencia SQL SELECT y que permite retornar aquellas filas que coinciden con el patrón especificado en una expresión regular.
REGEXP_COUNTFunción que permite contar el número de veces que un patrón aparece en una cadena de caracteres.
REGEXP_INSTRFunción que permite determinar la posición de inicio de un patrón específico en una cadena de caracteres.
REGEXP_REPLACEFunción que permite hacer búsqueda y reemplazo en una cadena de caracteres utilizando expresiones regulares para la búsqueda.
REGEXP_SUBSTRFunción para extraer de una cadena una subcadena de caracteres que coincidan con un patrón especificado en una expresión regular.

El patron de telefonos es este:

'([A-Z0-9]*\-*\.*\_*\@*\#*\s*)(.*)(\s*TELEFONO[E|FO|NO|AX|(\s)]*\s*(\-)*(\_)*(\.)*(\:)*[A-Z0-9]*\s*([\d]{1,7}\-*\s*[\d]{2,4}\-*\s*([\d]{2,6})*\-*\s*([\d]{2,7})*[Y]*))+(.*)([A-Z0-9]*\-*\.*\_*\@*\#*\s*)'
 
El patron de mail es este:  
'((\w.*)\s+)*(.+\s*@.+\.[A-Za-z]+)(.*)*
 

Prólogo
Históricamente Oracle había ofrecido prestaciones muy básicas para el uso de expresiones regulares y la manipulación de cadenas de caracteres. Aquellos desarrolladores que necesitaban hacer uso de expresiones regulares se veían prácticamente obligados a extraer los datos de la base para manipular las cadenas de caracteres en capas intermedias de la aplicación. A partir de la versión 10g, con la introducción de las llamadas funciones REGEXP (REGular EXPressions), Oracle nos ofrece una batería de sofisticadas y potentes herramientas nativas que permiten al desarrollador centralizar el procesamiento intensivo de cadenas de caracteres dentro de la base de datos Oracle y con los lenguajes SQL y PL/SQL.
Tabla de Contenidos
¿Qué son las Expresiones Regulares?
Antes de introducirnos bien en el mundo de las expresiones regulares es necesario que le perdamos un poco el miedo. Lo más común es que un ser humano huya desesperadamente cuando se encuentra por primera vez con una expresión regular como la siguiente:
^Ab*[0-8]\*(ha|ve)n$

Sin embargo, un buen manejo de las expresiones regulares es algo tan poderoso que vale la pena que nos tomemos un tiempo para aprender a utilizarlas. Además, saber manejar expresiones regulares nos servirá no solamente en el mundo de las bases de datos Oracle; las podremos usar también en otros lenguajes de programación como Perl, Java, .Net, Php y Unix Shell Scripting, entre otros.
La idea de este documento es hacer una introducción al tema de manera práctica, comenzando con ejemplos sencillos para luego ir aumentando la complejidad.
Comenzamos entonces definiendo a una expresión regular como una cadena de caracteres que definen un patrón de búsqueda. En una expresión regular encontramos literales y metacaracteres. Los literales se leen al pie de la letra. Los metacaracteres son caracteres que tienen un significado especial.
Tomemos por ejemplo la siguiente expresión regular:
[n|p]ata

Los metacaracteres son los corchetes y el símbolo pipe (|). El resto son literales.
Los corchetes agrupan a varios caracteres en un solo caracter.
El símbolo pipe indica un símbolo u otro; es decir la 'n' o la 'p'.
Luego, la expresión regular:
[n|p]ata

Coincide con las cadenas:
nata
pata

Seguramente el lector se preguntará cómo determinar qué elementos de una expresión regular son literales y qué elementos son metacaracteres. Más adelante encontrará la respuesta. Sigamos.
¿Para qué sirven las Expresiones Regulares?
En una base de datos Oracle existen diversos escenarios en que la implementación de expresiones regulares constituye una herramienta de gran utilidad:
  • Búsqueda de texto. Las expresiones regulares nos permiten hacer búsquedas complejas de cadenas de caracteres dentro de las columnas de nuestras tablas.
  • Formateo de datos. Podemos modificar los datos proyectados en las sentencias SELECT, invirtiendo palabras, agregando o quitando caracteres, etc.
  • Definición de constraints. A fin de forzar el contenido de una columna para que se ajuste a un formato determinado: casilla de correo, número telefónico, etc.
  • Manipulación de datos. Por ejemplo, regularizando datos en procesos de migración desde aplicaciones legacy y aplicando reglas de búsqueda y reemplazo (Search & Replace).
Entendiendo las Expresiones Regulares
Como se había dicho anteriormente, en una expresión regular encontramos literales y metacaracteres. Al analizar una expresión regular, lo primero que tenemos que hacer es determinar qué elementos son literales y qué elementos son metacaracteres (también llamados operadores). Existe una larga lista de metacaracteres soportados por Oracle. No es la intención estudiarlos a todos en este documento. A continuación iremos viendo algunos.
El metacaracter punto (.)
El metacaracter punto coincide con cualquier carácter. Por ejemplo, en la expresión regular
ca.a

Para que una cadena de caracteres coincida con dicho patrón:
- Debe estar el literal 'c'.
- Le debe seguir el literal 'a'
- Le debe seguir un y solamente un carácter cualquiera.
- Le debe seguir el literal 'a'
En la expresión regular encontramos 3 literales y el metacaracter punto. Analicemos las siguientes cadenas y veamos cuales coinciden con el patrón buscado y cuáles no.
Cadena¿Coincide?Análisis
casaSiCoinciden los literales y en la posición del operador punto aparece sólo un carácter
canaSiCoinciden los literales y en la posición del operador punto aparece sólo un carácter
caraSiCoinciden los literales y en la posición del operador punto aparece sólo un carácter
cantaNoEn la posición del punto aparece más de un carácter
palaNoEl literal 'p' en la primer posición no respeta el literal ´c´ definido en la expresión regular

El metacaracter suma (+)
El metacaracter suma coincide con una o más ocurrencias de la subexpresión que lo precede. Por ejemplo, analicemos la expresión regular
cas+a

Para que una cadena de caracteres coincida con dicho patrón:
- Debe estar el carácter 'c'
- Le debe seguir el carácter 'a'
- Le debe seguir una o mas ocurrencias del carácter 's'
- Le debe seguir el carácter 'a'
Vemos nuevamente tres literales y el metacaracter Suma. Busquemos el patrón en las siguientes cadenas y veamos las coincidencias.
Cadena¿Coincide?Análisis
cassa
cassssa
cassssssssa
SiEl símbolo más (+) es precedido por la subexpresión "s". Por lo tanto todas las cadenas que tienen una o más "s" en a partir de la tercer posición y respetan el resto de los literales, coinciden con el patrón representado en la expresión regular.
CaaNoEl patrón definido requiere al menos una ‘s’ en la tercer posición
LasaNoNo respeta todos los literales de la expresión regular
TassaNoNo respeta todos los literales de la expresión regular

El metacaracter asterisco (*)
Coincide con cero o más ocurrencias de la subexpresión que le precede al asterisco. Analicemos la expresión:
cas*a

Para que una cadena de caracteres coincida con dicho patrón:
- Debe estar el carácter 'c' - Le debe seguir el carácter 'a' - Le debe seguir cero o mas ocurrencias del carácter 's'. Es decir que el carácter 's' puede o no estar. - Le debe seguir el carácter 'a'
Analicemos qué pasa con las mismas cadenas de caracteres del ejemplo anterior:
Cadena¿Coincide?Análisis
Casa
cassssa
cassssssssa
SiEl símbolo asterisco (*) es precedido por la subexpresión "s". Por lo tanto todas las cadenas que tienen cero o más "s" a partir de la tercera posición y respetan el resto de los literales, coinciden con el patrón representado en la expresión regular.
caaSiEl patrón acepta la no existencia del carácter 's' en la tercera posición.
lasaNoNo respeta todos los literales de la expresión regular
tassaNoNo respeta todos los literales de la expresión regular

El metacaracter [char...]
Coincide con una sola ocurrencia de alguno de los caracteres de la lista entre corchetes. En la lista, todos los caracteres son tomados como literales excepto algunos caracteres que son interpretados como metacaracteres. Aquí nos limitaremos a mencionar el metacaracter '-' para representar rangos de caracteres. Analicemos la siguiente expresión regular:
ca[snt]a

Para que una cadena de caracteres coincida con dicho patrón:
- Debe estar el carácter 'c'
- Le debe seguir el carácter 'a'
- Le debe seguir uno y solamente uno de los siguientes caracteres: 's', 'n' o 't'.
- Le debe seguir el carácter 'a'
Cadena¿Coincide?Análisis
casaSiCoinciden los literales y en la posición del operador aparece sólo un carácter y es de los de la lista
canaSiCoinciden los literales y en la posición del operador aparece sólo un carácter y es de los de la lista
cataSiCoinciden los literales y en la posición del operador aparece sólo un carácter y es de los de la lista
caraNoEn la posición del operador aparece un solo carácter pero no está en la lista
cantaNoSi bien en la posición del operador aparecen literales de la lista; son más de uno
pasaNoNo respeta el primer literal de la lista

Como se dijo anteriormente, en la lista se puede utilizar el metacaracter rango '-'. Haciendo uso de este metacaracter la siguiente lista de caracteres:
[123456789]

Podemos expresarla como
[1-9]

Y la siguiente lista de caracteres
[abcdef]

Podemos expresarla como
[a-f]

Analicemos ahora la siguiente expresión regular:
a[3-7][f-i]9

Para que una cadena coincida con el patrón:
- Debe tener el literal 'a'
- Le debe seguir un numero de 3 a 7. Es decir: 3, 4, 5, 6 ó 7.
- Le debe seguir una letra de la f a la i. Es decir 'f', 'g', 'h' o 'i'
- Le debe seguir el numero 9
Cadena¿Coincide?Análisis
a3h9SiCoinciden los literales y en la posición de los operadores aparecen literales incluidos en los rangos especificados en el patrón de la expresión regular.
a33f9NoEn la posición del primer operador aparece más de un caracter
a3z9NoLa 'z' no está incluida en el rango del segundo operador

El metacaracter [^char...]
El sombrerito (^) que precede a la lista indica que los literales que le siguen no deben estar en la cadena de caracteres para que se produzca una coincidencia. Veamos,
ca[^snt]a

Para que una cadena de caracteres coincida con dicho patrón:
- Debe estar el carácter 'c'
- Le debe seguir el carácter 'a'
- Le debe seguir uno y solamente un carácter que no sea ni 's' ni 'n' ni 't'.
- Le debe seguir el carácter 'a'
Cadena¿Coincide?Análisis
casaNoCoinciden los literales y en la posición del operador aparece un carácter de los negados en la lista
canaNoCoinciden los literales y en la posición del operador aparece un carácter de los negados en la lista
cataNoCoinciden los literales y en la posición del operador aparece un carácter de los negados en la lista
caraSiCoinciden los literales y en la poscion del operador aparece un carácter que no está en la lista de literales negados.
cantaNoEn la posición del operador aparece más de un valor
paraNoNo respeta el primer literal de la lista

El metacaracter subexpresión (expr)
Considera a toda la expresión entre paréntesis como una unidad. La expresión puede ser una simple cadena de literales o una expresión compleja conteniendo otros metacaracteres. Analicemos la siguiente expresión regular
chau(hola)*chau

Ahora el asterisco precede a la expresión
hola

El asterisco indica que la expresión
hola

Puede aparecer cero ó más veces
Cadena¿Coincide?Análisis
chauchauSiCoinciden los literales y la expresión 'hola' aparece cero veces
chauholachauSiCoinciden los literales y la expresión 'hola' aparece una vez, es decir cero o más veces.
chauholaholachauSiCoinciden los literales y la expresión 'hola' aparece dos veces, es decir cero o más veces.
holachauNoNo aparecen el literal chau' que precede al ‘hola’
chauNoNo aparece el literal 'chau' que precede al ‘hola’

El metacaracter de anclaje de principio de línea (^)
Coincide con el principio de línea y el operador está representado con el caracter sombrerito (^). En la expresión regular
^hola

Los literales que componen la palabra 'hola' deben estar al inicio de la línea para que se produzca la coincidencia con el patrón expresado.
Cadena¿Coincide?Análisis
holaSiLos literales que componen la palabra 'hola' están al inicio de la línea
chauholaNoLa línea no comienza con los literales que conforman la palabra 'hola'
holachauSiLos literales que componen la palabra 'hola' están al inicio de la línea
holaholaSiLos literales que componen la palabra 'hola' están al inicio de la línea

El metacaracter de anclaje de fin de línea ($)
Coincide con el final de línea y el operador está representado con el carácter pesos ($). En la expresión regular
hola$

Los literales que componen la palabra 'hola' deben estar al final de la línea para que se produzca la coincidencia con el patrón expresado.
Cadena¿Coincide?Análisis
HolaSiLos literales que componen la palabra 'hola' están al final de la línea
chauholaSiLa línea finaliza con los literales que conforman la palabra 'hola'
holachauNoLos literales que componen la palabra 'hola' no están al final de la línea
holaholaSiLos literales que componen la palabra 'hola' están al final de la línea

El metacaracter de escape (\)
Precediendo a un metacaracter con el símbolo de escape, el metacaracter será interpretado como un literal. El doble carácter de escape (\\) permite considerar al carácter de escape como literal.
En la expresión regular
hola\*

Cadena¿Coincide?Análisis
holaNoFalta el literal '*' que sigue literal 'a'
Hola*SiCoinciden todos los literales
hol*NoFaltan los literales 'a' y ‘*’

Construyendo Expresiones Regulares complejas
Hasta aquí hemos visto algunos de los metacaracteres que se usan con más frecuencia. Combinando varios de estos metacaracteres en una sola expresión regular, podemos hacer construcciones más complejas y muy poderosas. Analicemos la siguiente expresión regular en la que encontramos varios metacaracteres
^hola[0-9]*chau[^a]+$

Hagamos un desglose de la expresión regular:
^holaAl principio de la línea debe estar la palabra 'hola'
[0-9]*Luego de la palabra 'hola' deben aparecer cero o mas dígitos del 0 al 9
chauLuego debe aparecer el literal 'chau'
[^a]+$La línea debe continuar hasta el final con uno o más caracteres distintos de 'a'

Busquemos el patrón en algunas cadenas de caracteres
Cadena¿Coincide?Análisis
hola123chaubSiComienza con el texto 'hola'. Le siguen varios dígitos entre 0 y 9. Le sigue el literal 'chau' y finaliza con al menos una letra distinta de 'a'.
holachaucSiComienza con el texto 'hola'. No aparecen dígitos del 0 al 9 (el asterisco indica que esto es aceptado para que haya coincidencia). Luego aparece el literal 'chau' y se finaliza con una letra distinta de 'a'
hola0chauaNoFinaliza con una ‘a’

Uso de las Expresiones Regulares en Oracle
Hasta aquí hemos visto un poco de teoría y algunos ejemplos prácticos para conocer y aprender un poco acerca de las expresiones regulares. Pero, ¿cómo podemos hacer uso de este conocimiento adquirido en una base de datos Oracle?
A partir de la versión 10g Oracle nos ofrece un grupo de nuevas funciones y condiciones para poder manejar expresiones regulares en el lenguaje SQL:
REGEXP_LIKECondición que se puede utilizar en la cláusula WHERE de una sentencia SQL SELECT y que permite retornar aquellas filas que coinciden con el patrón especificado en una expresión regular.
REGEXP_COUNTFunción que permite contar el número de veces que un patrón aparece en una cadena de caracteres.
REGEXP_INSTRFunción que permite determinar la posición de inicio de un patrón específico en una cadena de caracteres.
REGEXP_REPLACEFunción que permite hacer búsqueda y reemplazo en una cadena de caracteres utilizando expresiones regulares para la búsqueda.
REGEXP_SUBSTRFunción para extraer de una cadena una subcadena de caracteres que coincidan con un patrón especificado en una expresión regular.

Veamos algunos ejemplos de implementación de estas condiciones y funciones combinadas con el uso de expresiones regulares.
La condición REGEXP_LIKE es similar a la condición LIKE pero, a diferencia del LIKE, utiliza patrones basados en expresiones regulares para la búsqueda de coincidencias en las cadenas de caracteres analizadas.
En el siguiente ejemplo, vemos una tabla de empleados cuyos nombres fueron migrados de un sistema legacy. En muchos casos el nombre ha quedado separado del apellido por varios espacios en blanco:
SQL> select nombre from empleados;
 
NOMBRE
----------------------------------------
Fernando         Garcia
Marcelo  Burgos
       Marcelo         Ochoa
Gerardo     Tezza
Clarisa Maman Orfali
Rodolfo  Pajuelo Quispe
 
6 rows selected.

El único caso de un solo espacio entre el nombre y el apellido es el de Clarisa Maman Orfali. Veamos cómo podemos construir un query que detecte aquellas filas en que haya dos o más espacios separando nombres de apellidos.
SQL> select nombre
  2  from empleados
  3  where regexp_like(nombre, '[ ][ ][ ]*');
 
NOMBRE
----------------------------------------
Fernando         Garcia
Marcelo  Burgos
       Marcelo         Ochoa
Gerardo     Tezza
Rodolfo  Pajuelo Quispe

Corrijamos esta situación dejando un solo blanco de separación en donde hay dos o más espacios en blanco.
SQL> update empleados
  2  set nombre = regexp_replace(nombre, '[ ][ ][ ]*', ' ')
  3  where regexp_count(nombre, '[ ][ ][ ]*') > 0;
 
5 rows updated.

Veamos cómo quedo la tabla luego de la corrección
SQL> select nombre from empleados;
 
NOMBRE
----------------------------------------
Fernando Garcia
Marcelo Burgos
 Marcelo Ochoa
Gerardo Tezza
Clarisa Maman Orfali
Rodolfo Pajuelo Quispe
 
6 rows selected.

Bastante bien. Salvo el caso de Marcelo Ochoa, en donde nos quedó un espacio en blanco al principio de la línea. Eliminemos entonces los espacios en blanco que están al principio de la línea.
SQL> update empleados
  2  set nombre = regexp_replace(nombre, '^ ')
  3  where regexp_count(nombre, '^ ') > 0
  4  /
 
1 row updated.
 
SQL> select nombre from empleados;
 
NOMBRE
----------------------------------------
Fernando Garcia
Marcelo Burgos
Marcelo Ochoa
Gerardo Tezza
Clarisa Maman Orfali
Rodolfo Pajuelo Quispe
 
6 rows selected.

En este otro ejemplo vemos una tabla de impuestos en la que almacenamos un código de identificación tributaria numérico y que debe respetar el siguiente formato:
99-99999999-99 
 
SQL> select cuit from impuestos;
 
CUIT
-------------
20-20198123-9
10-43112345-8
1-22123987-9
8883838382
aa-75212456-x

Busquemos aquellos códigos que no están respetando el formato requerido:
select cuit
from impuestos
where not regexp_like (cuit, '[0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]-[0-9]')
 
CUIT
-------------
1-22123987-9
8883838382
aa-75212456-x

A fin de evitar que la tabla siga admitiendo códigos que no respetan el formato, podemos crear una constraint que fuerce el ingreso de códigos que respeten el formato.
alter table impuestos
add constraint c_cuit
check (regexp_like(cuit,'[0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]-[0-9]'))
enable novalidate
/
Table altered.

Veamos qué ocurre al ingresar nuevas filas a la table de impuestos
SQL> insert into impuestos (cuit) values ('20-17979866-2');
 
1 row created.
 
SQL> insert into impuestos (cuit) values ('1x-17979866-2');
insert into impuestos (cuit) values ('1x-17979866-2')
*
ERROR at line 1:
ORA-02290: check constraint (SYS.C_CUIT) violated
 
 
SQL> insert into impuestos values ('12888122812');
insert into impuestos values ('12888122812')
*
ERROR at line 1:
ORA-02290: check constraint (SYS.C_CUIT) violated

Profundizando el conocimiento y uso de las expresiones regulares en Oracle
Hemos visto varios ejemplos para demostrar el potencial y utilidad que nos ofrecen las expresiones regulares en las bases de datos Oracle. Existen muchos más metacaracteres que no hemos mencionado aquí. Las funciones tampoco las hemos visto en profundidad; hay más argumentos para hacer búsquedas que ignoren mayúsculas y minúsculas, etc. Para seguir profundizando el tema, aquí dejamos algunos links de interés:
Using Regular Expressions in Database Applications
Oracle® Database Advanced Application Developer's Guide
11g Release 2 (11.2)
Part Number E25518-04
http://docs.oracle.com/cd/E11882_01/appdev.112/e25518/adfns_regexp.htm#ADFNS1003
Introducing Oracle Regular
Expressions
An Oracle White Paper
Author: Peter Linsley
http://www.oracle.com/technetwork/database/focus-areas/application-development/twp-regular-expressions-133133.pdf
Regular-Expressions.info
The Premier website about Regular Expressions
http://www.regular-expressions.info/

martes, 19 de noviembre de 2013

configuracion fstab /dev/shm

tmpfs                   /dev/shm                tmpfs   defaults,size=3G 0 0

martes, 5 de noviembre de 2013

CAMBIAR PASSWORD ASM

1. How to create asmsnmp user
——————————————-

First Check which all users are present for ASM >>

SQL> select * from v$pwfile_users;
no rows selected

OR

ASMCMD> lspwusr
Username sysdba sysoper sysasm 
This shows no user are present

A) Create a password file if not already present
$orapwd file=/u01/app/11.2.0/grid/dbs/orapw+ASM password=


++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Remember below important point about password file in ASM
If there are two nodes with +ASM1 running on node 1 and +ASM2 running on node2.
– Pre 11gR2 –
Password file on Node1: orapw+ASM1
Password file on Node2: orapw+ASM2
– 11gR2 –
Password file on Node1: orapw+ASM
Password file on Node2: orapw+ASM
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


B) Copy the password file to other nodes
$ scp orapw+ASM :/u01/app/11.2.0/grid/dbs/

copy the password files to other nodes if you have more than 2 nodes in the RAC.

C) create user and give sysdba privileges

SQL>create user asmsnmp identified by ;
SQL> grant sysdba to asmsnmp;


Check again for users in ASM  >>

SQL> select * from v$pwfile_users;
 
USERNAME              SYSDB                SYSOP             SYSAS
——————————————————————————————————————— —– —– —————————————————————————————————————–
SYS                    TRUE                TRUE                 TRUE
ASMSNMP                TRUE                FALSE                FALSE

SQL> show parameter pass
NAME                                   TYPE                            VALUE
———————————— —————————————————————————————– ——————————————————————————————————
remote_login_passwordfile             string                          EXCLUSIVE

The ASM instance parameter “REMOTE_LOGIN_PASSWORDFILE” has to be set to EXCLUSIVE or you will get an ORA-01999 error.

Also you can check  user detials from asmcmd

ASMCMD> lspwusr
Username        sysdba         sysoper       sysasm
SYS             TRUE           TRUE          FALSE
ASMSNMP         TRUE           FALSE         FALSE



How to Change password for ASMSNMP
——————————————————–
ASMCMD> lspwusr
Username  sysdba sysoper sysasm
SYS       TRUE   TRUE     TRUE
ASMSNMP   TRUE   FALSE    FALSE

ASMCMD> orapwusr --modify --password ASMSNMP
Enter password: *******
(give new password and press enter)
orapwusr attempts to update passwords on all nodes in a cluster. The command requires the SYSASM privilege to run. A user logged in as SYSDBA cannot change its password using this command.

Test new asmsnmp password >>
————————–
$ sqlplus asmsnmp/asmsnmp as sysdba
SQL*Plus: Release 11.2.0.3.0 Production on Wed Feb 6 12:57:30 2013
Copyright (c) 1982, 2011, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 – 64bit Production
With the Real Application Clusters and Automatic Storage Management options
SQL>

martes, 15 de octubre de 2013

CHECK CONSTRAINT FECHA

I am trying to check add the following constraint but Oracle returns the error shown below.

ALTER TABLE Table1
ADD (CONSTRAINT GT_Table1_CloseDate
CHECK (CloseDate > SYSDATE),
CONSTRAINT LT_Table1_CloseDate
CHECK (CloseDate <= SYSDATE + 365)),
CONSTRAINT GT_Table1_StartDate
CHECK (StartDate > (CloseDate + (SYSDATE + 730))));
Error:
Error report:
SQL Error: ORA-02436: date or system variable wrongly specified in CHECK constraint
02436. 00000 -  "date or system variable wrongly specified in CHECK constraint"
*Cause:    An attempt was made to use a date constant or system variable,
           such as USER, in a check constraint that was not completely
           specified in a CREATE TABLE or ALTER TABLE statement.  For
           example, a date was specified without the century.
*Action:   Completely specify the date constant or system variable.
           Setting the event 10149 allows constraints like "a1 > '10-MAY-96'",
           which a bug permitted to be created before version 8.
share|improve this question

3 Answers

 
     
A check constraint, unfortunately, cannot reference a function like SYSDATE. You would need to create a trigger that checked these values when DML occurs, i.e.

CREATE OR REPLACE TRIGGER trg_check_dates
  BEFORE INSERT OR UPDATE ON table1
  FOR EACH ROW
BEGIN
  IF( :new.CloseDate <= SYSDATE )
  THEN
    RAISE_APPLICATION_ERROR( -20001, 
          'Invalid CloseDate: CloseDate must be greater than the current date - value = ' || 
          to_char( :new.CloseDate, 'YYYY-MM-DD HH24:MI:SS' ) );
  END IF;
  IF( :new.CloseDate > add_months(SYSDATE,12) )
  THEN
    RAISE_APPLICATION_ERROR( -20002, 
         'Invalid CloseDate: CloseDate must be within the next year - value = ' || 
         to_char( :new.CloseDate, 'YYYY-MM-DD HH24:MI:SS' ) );
  END IF;
  IF( :new.StartDate <= add_months(:new.CloseDate,24) )
  THEN
    RAISE_APPLICATION_ERROR( -20002, 
          'Invalid StartDate: StartDate must be within 24 months of the CloseDate - StartDate = ' || 
          to_char( :new.StartDate, 'YYYY-MM-DD HH24:MI:SS' ) ||
          ' CloseDate = ' || to_char( :new.CloseDate , 'YYYY-MM-DD HH24:MI:SS' ) );
  END IF;
END;

jueves, 3 de octubre de 2013

FECHA FORMATO DDSPTH

SQL> SELECT TO_CHAR(SYSDATE,'MONTH DDSPTH') from dual;
TO_CHAR(SYSDATE,'MONTHDDSPTH')
------------------------------------------------------------------------
OCTOBER   THIRD
SQL> SELECT TO_CHAR(SYSDATE,'YEAR MONTH DDSPTH') from dual;
TO_CHAR(SYSDATE,'YEARMONTHDDSPTH')
--------------------------------------------------------------------------------
TWENTY THIRTEEN OCTOBER   THIRD
SQL> SELECT TO_CHAR(SYSDATE,'YEAR MONTH DAY DDSPTH') from dual;
TO_CHAR(SYSDATE,'YEARMONTHDAYDDSPTH')
--------------------------------------------------------------------------------
TWENTY THIRTEEN OCTOBER   THURSDAY  THIRD

miércoles, 18 de septiembre de 2013

How to convert non-partitioned table to partition table using re-definition

SQL> set pagesize 200SQL> set long 999999
SQL> set linesize 150
SQL> select dbms_metadata.get_ddl('TABLE','OUT_CDR','CR_2') from dual;

DBMS_METADATA.GET_DDL('TABLE','OUT_CDR','CR_2')
--------------------------------------------------------------------------------

CREATE TABLE "CR_2"."OUT_CDR" ( "ID" NUMBER(32,0) NOT NULL ENABLE, "CDATE" DATE NOT NULL ENABLE,
"DDATE" DATE NOT NULL ENABLE,
"ACCTSESSIONID" VARCHAR2(100),
"CALLINGNO" VARCHAR2(100),
"CALLEDNO" VARCHAR2(100) NOT NULL ENABLE,
"AREACODE" VARCHAR2(100),
"PREFIX" VARCHAR2(100),
"SESSIONTIME" NUMBER(32,0),
"BILLABLETIME" NUMBER(32,0),
"RATE" NUMBER(32,4),
"CALL_COST" NUMBER(32,4),
"CURRENTBILL" NUMBER(32,4),
"DISCONNECTCAUSE" VARCHAR2(50),
"SOURCEIP" VARCHAR2(100),
"DESTIP" VARCHAR2(100),
"BILLABLE" NUMBER(32,0) NOT NULL ENABLE,
"LESS" NUMBER(32,0) NOT NULL ENABLE,
"ACCID" NUMBER(32,0),
"IN_DDATE" DATE,
"IN_PREFIX" VARCHAR2(100),
"IN_SESSIONTIME" NUMBER(32,0),
"IN_BILLABLETIME" NUMBER(32,0),
"IN_RATE" NUMBER(32,4),
"IN_CALL_COST" NUMBER(32,4),
"IN_MONEYLEFT" NUMBER(32,4),
"IN_DISCONNECTCAUSE" VARCHAR2(50),
"IN_BILLABLE" NUMBER(32,0),
"IN_LESS" NUMBER(32,0), "SWITCH_ID
" NUMBER(32,0) NOT NULL ENABLE,
"USER_ID" NUMBER(32,0) NOT NULL ENABLE,
"IN_USER_ID" NUMBER(32,0),
"PROCESSED" NUMBER(1,0),
CONSTRAINT "OUT_CDR_PK" PRIMARY KEY ("ID")USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICSSTORAGE(INITIAL 168820736 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)TABLESPACE "CDR_INDX_SPC" ENABLE, CONSTRAINT "OUT_CDR_UQ" UNIQUE ("CDATE", "CALLEDNO", "USER_ID")USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICSSTORAGE(INITIAL 522190848 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)TABLESPACE "CDR_INDX_SPC" ENABLE, CONSTRAINT "OUT_CDR_UQ_2" UNIQUE ("DDATE", "CALLEDNO", "USER_ID")USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICSSTORAGE(INITIAL 521142272 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)TABLESPACE "CDR_INDX_SPC" ENABLE ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGINGSTORAGE(INITIAL 2013265920 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)TABLESPACE "OUT_CDR_NEW_SPC"


Step 02: Let's determine if the table OUT_CDR can be redefined online.
SQL> exec dbms_redefinition.can_redef_table('CR_2', 'OUT_CDR');
PL/SQL procedure successfully completed.

Step 03: Create a interim table which holds the same structure as the original table except constraints, indexes, triggers but add the partitioning attribute.I named the interim table as OUT_CDR_. Later we may drop it.

SQL> CREATE TABLE "CR_
2"."OUT_CDR_"2 ( "ID" NUMBER(32,0),
3 "CDATE" DATE ,
4 "DDATE" DATE ,
5 "ACCTSESSIONID" VARCHAR2(100),
6 "CALLINGNO" VARCHAR2(100),
7 "CALLEDNO" VARCHAR2(100) ,
8 "AREACODE" VARCHAR2(100),
9 "PREFIX" VARCHAR2(100),
10 "SESSIONTIME" NUMBER(32,0),
11 "BILLABLETIME" NUMBER(32,0),
12 "RATE" NUMBER(32,4),
13 "CALL_COST" NUMBER(32,4),
14 "CURRENTBILL" NUMBER(32,4),
15 "DISCONNECTCAUSE" VARCHAR2(50),
16 "SOURCEIP" VARCHAR2(100),
17 "DESTIP" VARCHAR2(100),
18 "BILLABLE" NUMBER(32,0) ,
19 "LESS" NUMBER(32,0) ,
20 "ACCID" NUMBER(32,0),
21 "IN_DDATE" DATE,
22 "IN_PREFIX" VARCHAR2(100),
23 "IN_SESSIONTIME" NUMBER(32,0),
24 "IN_BILLABLETIME" NUMBER(32,0),
25 "IN_RATE" NUMBER(32,4),
26 "IN_CALL_COST" NUMBER(32,4),
27 "IN_MONEYLEFT" NUMBER(32,4),
28 "IN_DISCONNECTCAUSE" VARCHAR2(50),
29 "IN_BILLABLE" NUMBER(32,0),
30 "IN_LESS" NUMBER(32,0),
31 "SWITCH_ID" NUMBER(32,0) ,
32 "USER_ID" NUMBER(32,0) ,
33 "IN_USER_ID" NUMBER(32,0),
34 "PROCESSED" NUMBER(1,0)
35 ) TABLESPACE "OUT_CDR_NEW_SPC"36 Partition by range(cdate)37 (38 partition P08152008 values less than (to_date('15-AUG-2008','DD-MON-YYYY')),39 partition P09012008 values less than (to_date('01-SEP-2008','DD-MON-YYYY')),40 partition P09152008 values less than (to_date('15-SEP-2008','DD-MON-YYYY')),41 partition P10012008 values less than (to_date('01-OCT-2008','DD-MON-YYYY')),42 partition P10152008 values less than (to_date('15-OCT-2008','DD-MON-YYYY')),43 partition P11012008 values less than (to_date('01-NOV-2008','DD-MON-YYYY')),44 partition P11152008 values less than (to_date('15-NOV-2008','DD-MON-YYYY')),45 partition P12012008 values less than (to_date('01-DEC-2008','DD-MON-YYYY')),46 partition P12152008 values less than (to_date('15-DEC-2008','DD-MON-YYYY')),47 partition P01012009 values less than (to_date('01-JAN-2009','DD-MON-YYYY')),48 partition P01152009 values less than (to_date('15-JAN-2009','DD-MON-YYYY')),49 partition P02012009 values less than (to_date('01-FEB-2009','DD-MON-YYYY')),50 partition PMAX values less than (maxvalue));
Table created.

Step 04: Initiates the redefinition process by calling dbms_redefinition.start_redef_table procedure.
SQL> exec dbms_redefinition.start_redef_table('CR_2', 'OUT_CDR', 'OUT_CDR_');
PL/SQL procedure successfully completed.


Step 05: Copies the dependent objects of the original table onto the interim table. The COPY_TABLE_DEPENDENTS Procedure clones the dependent objects of the table being redefined onto the interim table and registers the dependent objects. But this procedure does not clone the already registered dependent objects.In fact COPY_TABLE_DEPENDENTS Procedure is used to clone the dependent objects like grants, triggers, constraints and privileges from the table being redefined to the interim table which in facr represents the post-redefinition table.

SQL> declare
2 error_count pls_integer := 0;
3 BEGIN
4 dbms_redefinition.copy_table_dependents('CR_2', 'OUT_CDR', 'OUT_CDR_',1, true, true, true, false,error_count);
5 dbms_output.put_line('errors := ' to_char(error_count));
6 END;
7 /PL/SQL procedure successfully completed.



Step 06: Completes the redefinition process by calling FINISH_REDEF_TABLE Procedure.
SQL> exec dbms_redefinition.finish_redef_table('CR_2', 'OUT_CDR', 'OUT_CDR_');
PL/SQL procedure successfully completed.


Step 07: Check the partitioning validation by,
SQL> Select partition_name, high_value from user_tab_partitions where table_name='OUT_CDR';PARTITION_NAME HIGH_VALUE------------------------------ ---------------------------------------------------------------------------------------------------P01012009 TO_DATE(' 2009-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAP01152009 TO_DATE(' 2009-01-15 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAP02012009 TO_DATE(' 2009-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAP08152008 TO_DATE(' 2008-08-15 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAP09012008 TO_DATE(' 2008-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAP09152008 TO_DATE(' 2008-09-15 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAP10012008 TO_DATE(' 2008-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAP10152008 TO_DATE(' 2008-10-15 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAP11012008 TO_DATE(' 2008-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAP11152008 TO_DATE(' 2008-11-15 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAP12012008 TO_DATE(' 2008-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAP12152008 TO_DATE(' 2008-12-15 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAPMAX MAXVALUE13 rows selected.Check index status by,SQL> select index_name , status from user_indexes where table_name='OUT_CDR';INDEX_NAME STATUS------------------------------ --------OUT_CDR_PK VALIDOUT_CDR_UQ VALIDOUT_CDR_UQ_2 VALIDStep 08: Drop the interim table OUT_CDR_.SQL> DROP TABLE OUT_CDR_;Table dropped.

jueves, 22 de agosto de 2013

EXAMPLE BACKUP AS COPY



[oracle@localhost labs2]$ rman target /
Recovery Manager: Release 11.2.0.1.0 - Production on Thu Aug 22 17:37:16 2013
Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.
connected to target database: ACME (DBID=2003395651)
RMAN> backup incremental level 1 for recover of copy with tag 'backup_incr' database;
Starting backup at 2013-08-22:17:38:04
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=37 device type=DISK
no parent backup or copy of datafile 1 found
no parent backup or copy of datafile 2 found
no parent backup or copy of datafile 5 found
no parent backup or copy of datafile 3 found
no parent backup or copy of datafile 4 found
channel ORA_DISK_1: starting datafile copy
input datafile file number=00001 name=/u01/app/oracle/oradata/acme/system01.dbf
output file name=/u01/app/oracle/flash_recovery_area/ACME/datafile/o1_mf_system_91f4phck_.dbf tag=BACKUP_INCR RECID=2 STAMP=824146789
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:01:45
channel ORA_DISK_1: starting datafile copy
input datafile file number=00002 name=/u01/app/oracle/oradata/acme/sysaux01.dbf
output file name=/u01/app/oracle/flash_recovery_area/ACME/datafile/o1_mf_sysaux_91f4svo0_.dbf tag=BACKUP_INCR RECID=3 STAMP=824146910
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:02:07
channel ORA_DISK_1: starting datafile copy
input datafile file number=00005 name=/u01/app/oracle/oradata/acme/example01.dbf
output file name=/u01/app/oracle/flash_recovery_area/ACME/datafile/o1_mf_example_91f4xrrq_.dbf tag=BACKUP_INCR RECID=4 STAMP=824146928
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:15
channel ORA_DISK_1: starting datafile copy
input datafile file number=00003 name=/u01/app/oracle/oradata/acme/undotbs01.dbf
output file name=/u01/app/oracle/flash_recovery_area/ACME/datafile/o1_mf_undotbs1_91f4y845_.dbf tag=BACKUP_INCR RECID=5 STAMP=824146942
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:08
channel ORA_DISK_1: starting datafile copy
input datafile file number=00004 name=/u01/app/oracle/oradata/acme/users01.dbf
output file name=/u01/app/oracle/flash_recovery_area/ACME/datafile/o1_mf_users_91f4yjjo_.dbf tag=BACKUP_INCR RECID=6 STAMP=824146945
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:01
Finished backup at 2013-08-22:17:42:25
Starting Control File and SPFILE Autobackup at 2013-08-22:17:42:26
piece handle=/u01/app/oracle/flash_recovery_area/ACME/autobackup/2013_08_22/o1_mf_s_824146946_91f4yny0_.bkp comment=NONE
Finished Control File and SPFILE Autobackup at 2013-08-22:17:42:33
RMAN> list copy of tablespace example;
List of Datafile Copies
=======================
Key     File S Completion Time     Ckp SCN    Ckp Time          
------- ---- - ------------------- ---------- -------------------
4       5    A 2013-08-22:17:42:08 2084754    2013-08-22:17:42:00
        Name: /u01/app/oracle/flash_recovery_area/ACME/datafile/o1_mf_example_91f4xrrq_.dbf
        Tag: BACKUP_INCR

RMAN> backup incremental level 1 for recover of copy with tag 'backup_incr' database;
Starting backup at 2013-08-22:18:04:22
using channel ORA_DISK_1
channel ORA_DISK_1: starting incremental level 1 datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00001 name=/u01/app/oracle/oradata/acme/system01.dbf
input datafile file number=00002 name=/u01/app/oracle/oradata/acme/sysaux01.dbf
input datafile file number=00005 name=/u01/app/oracle/oradata/acme/example01.dbf
input datafile file number=00003 name=/u01/app/oracle/oradata/acme/undotbs01.dbf
input datafile file number=00004 name=/u01/app/oracle/oradata/acme/users01.dbf
channel ORA_DISK_1: starting piece 1 at 2013-08-22:18:04:23
channel ORA_DISK_1: finished piece 1 at 2013-08-22:18:05:48
piece handle=/u01/app/oracle/flash_recovery_area/ACME/backupset/2013_08_22/o1_mf_nnnd1_BACKUP_INCR_91f67v6c_.bkp tag=BACKUP_INCR comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:01:25
Finished backup at 2013-08-22:18:05:48
Starting Control File and SPFILE Autobackup at 2013-08-22:18:05:48
piece handle=/u01/app/oracle/flash_recovery_area/ACME/autobackup/2013_08_22/o1_mf_s_824148348_91f6bfxw_.bkp comment=NONE
Finished Control File and SPFILE Autobackup at 2013-08-22:18:05:51
RMAN> list copy of tablespace example;
List of Datafile Copies
=======================
Key     File S Completion Time     Ckp SCN    Ckp Time          
------- ---- - ------------------- ---------- -------------------
4       5    A 2013-08-22:17:42:08 2084754    2013-08-22:17:42:00
        Name: /u01/app/oracle/flash_recovery_area/ACME/datafile/o1_mf_example_91f4xrrq_.dbf
        Tag: BACKUP_INCR

RMAN> backup incremental level 1 for recover of copy with tag 'backup_incr' database;
Starting backup at 2013-08-22:18:19:54
using channel ORA_DISK_1
channel ORA_DISK_1: starting incremental level 1 datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00001 name=/u01/app/oracle/oradata/acme/system01.dbf
input datafile file number=00002 name=/u01/app/oracle/oradata/acme/sysaux01.dbf
input datafile file number=00005 name=/u01/app/oracle/oradata/acme/example01.dbf
input datafile file number=00003 name=/u01/app/oracle/oradata/acme/undotbs01.dbf
input datafile file number=00004 name=/u01/app/oracle/oradata/acme/users01.dbf
channel ORA_DISK_1: starting piece 1 at 2013-08-22:18:19:55
channel ORA_DISK_1: finished piece 1 at 2013-08-22:18:21:00
piece handle=/u01/app/oracle/flash_recovery_area/ACME/backupset/2013_08_22/o1_mf_nnnd1_BACKUP_INCR_91f74vxw_.bkp tag=BACKUP_INCR comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:01:05
Finished backup at 2013-08-22:18:21:01
Starting Control File and SPFILE Autobackup at 2013-08-22:18:21:01
piece handle=/u01/app/oracle/flash_recovery_area/ACME/autobackup/2013_08_22/o1_mf_s_824149261_91f76z85_.bkp comment=NONE
Finished Control File and SPFILE Autobackup at 2013-08-22:18:21:04
RMAN> list copy of tablespace example;
List of Datafile Copies
=======================
Key     File S Completion Time     Ckp SCN    Ckp Time          
------- ---- - ------------------- ---------- -------------------
4       5    A 2013-08-22:17:42:08 2084754    2013-08-22:17:42:00
        Name: /u01/app/oracle/flash_recovery_area/ACME/datafile/o1_mf_example_91f4xrrq_.dbf
        Tag: BACKUP_INCR

RMAN> recover copy of tablespace example with tag 'backup_incr';        
Starting recover at 2013-08-22:18:31:13
using channel ORA_DISK_1
allocated channel: ORA_SBT_TAPE_1
channel ORA_SBT_TAPE_1: SID=43 device type=SBT_TAPE
channel ORA_SBT_TAPE_1: WARNING: Oracle Test Disk API
channel ORA_DISK_1: starting incremental datafile backup set restore
channel ORA_DISK_1: specifying datafile copies to recover
recovering datafile copy file number=00005 name=/u01/app/oracle/flash_recovery_area/ACME/datafile/o1_mf_example_91f4xrrq_.dbf
channel ORA_DISK_1: reading from backup piece /u01/app/oracle/flash_recovery_area/ACME/backupset/2013_08_22/o1_mf_nnnd1_BACKUP_INCR_91f67v6c_.bkp
channel ORA_DISK_1: piece handle=/u01/app/oracle/flash_recovery_area/ACME/backupset/2013_08_22/o1_mf_nnnd1_BACKUP_INCR_91f67v6c_.bkp tag=BACKUP_INCR
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed time: 00:00:01
channel ORA_DISK_1: starting incremental datafile backup set restore
channel ORA_DISK_1: specifying datafile copies to recover
recovering datafile copy file number=00005 name=/u01/app/oracle/flash_recovery_area/ACME/datafile/o1_mf_example_91f4xrrq_.dbf
channel ORA_DISK_1: reading from backup piece /u01/app/oracle/flash_recovery_area/ACME/backupset/2013_08_22/o1_mf_nnnd1_BACKUP_INCR_91f74vxw_.bkp
channel ORA_DISK_1: piece handle=/u01/app/oracle/flash_recovery_area/ACME/backupset/2013_08_22/o1_mf_nnnd1_BACKUP_INCR_91f74vxw_.bkp tag=BACKUP_INCR
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed time: 00:00:01
Finished recover at 2013-08-22:18:31:19
Starting Control File and SPFILE Autobackup at 2013-08-22:18:31:19
piece handle=/u01/app/oracle/flash_recovery_area/ACME/autobackup/2013_08_22/o1_mf_s_824149879_91f7t7yj_.bkp comment=NONE
Finished Control File and SPFILE Autobackup at 2013-08-22:18:31:22
RMAN> list copy of tablespace example;
List of Datafile Copies
=======================
Key     File S Completion Time     Ckp SCN    Ckp Time          
------- ---- - ------------------- ---------- -------------------
8       5    A 2013-08-22:18:31:18 2087900    2013-08-22:18:19:55
        Name: /u01/app/oracle/flash_recovery_area/ACME/datafile/o1_mf_example_91f4xrrq_.dbf
        Tag: BACKUP_INCR

RMAN>

viernes, 16 de agosto de 2013

PASSWORD ORACLE

SYS.USER$ view, what do the CTIME, PTIME, and LTIME

Oracle y VMware: ¿amigos o enemigos?

 

Me encontré este Articulo y me pareció interesante

http://blog.avanttic.com/2010/12/01/oracle-y-vmware-%c2%bfamigos-o-enemigos/#more-2543

Oracle y VMware: ¿amigos o enemigos?

En esta entrada de blog intentaré aclarar el estado en que se encuentra la combinación de Oracle y VMware a fecha de hoy y describir lo que personalmente creo será el futuro de esta combinación de tecnologías.
VMWARE_vs_ORACLE
En el primer punto, que dividiré en “estado de soporte” de la combinación y “requerimientos de licenciado”, intentaré ser lo más simple y neutral posible, basándome únicamente en lo que ambas empresas (Oracle y VMware) han publicado al respecto.
El segundo punto será justo lo contrario, fruto de opiniones tanto personales como recogidas por la red… por lo que será totalmente discutible.
Nota: Téngase en cuenta que  toda la información aquí presentada ha sido recopilada con fecha 22-11-2010, y que en el momento de la lectura de este post se podrían haber producido cambios de política o estrategia por parte de Oracle.

Soporte Oracle de productos ejecutados sobre VMware

A la pregunta: ¿cuál es el estado del soporte del software Oracle instalado sobre la plataforma de virtualización de VMware?
La respuesta la encontramos en la nota de Oracle:
Support Position for Oracle Products Running on VMWare Virtualized Environments [ID 249212.1]
que básicamente dice lo siguiente:
  • Oracle no certifica ninguno de sus productos sobre la plataforma de virtualización VMware.
  • En caso de encontrar un problema ya tipificado como tal, se facilitaran los parches y posibles mecanismos alternativos de solución ya existentes.
  • Se investigará (y creará un parche si fuese necesario) sólo si el cliente demuestra que se reproduce la incidencia sobre máquinas físicas (entornos sin virtualizar).
  • No se dará soporte en ningún caso para instalaciones de Oracle RAC versión 11gR1 o anteriores. Para instalaciones Oracle RAC 11gR2 o superiores se siguen las mismas normas que para el resto de productos (puntos anteriores).
Por tanto, si no se cumplen las anteriores condiciones no se considerará problema de Oracle y deberá ser VMware quien dé soporte a la incidencia.
La mencionada nota fue actualizada en día 8-11-2010, provocando un gran revuelo en el mundo VMware. La causa de tal revuelo fue que apareció el soporte para Oracle RAC a partir de la versión 11gR2 (previamente no se soportaba RAC en ningún caso).
Resumiendo, si opto por integrar los productos Oracle en mi plataforma de virtualización VMware, ¿me dará Oracle soporte?
>>> Si el problema por el que se pide soporte ya ha sido reportado, Soporte Oracle nos indicará los parches y/o workarrounds disponibles. Lo que no hará será pedir a los desarrolladores que investiguen o creen un parche si no se dispone previamente de éste, a no ser que demostremos que la incidencia se reproduce en un entorno no virtualizado.
En el siguiente link tenéis la nota original de Oracle Support a fecha 08-11-2010 (es de libre distribución):
http://www.avanttic.com/pdf/Blog/Support_Position_Oracle_VMWare.pdf

Licenciamiento de Oracle sobre VMware

A la pregunta: ¿en caso de disponer de productos Oracle sobre VMWare, cómo los debo licenciar?
Podemos contestar que, si bien VMware permite asignar a una determinada maquina virtual sólo una parte de las CPU’s de la máquina física en la que se ejecuta, Oracle no reconoce ese sistema como válido para particionar a nivel de servidor.
Soft partitioning is not permitted as a means to determine or limit the number of software licenses required for any given server.
Existen sistemas de particionado de servidores que Oracle considera como hard partitions, entre ellos algunos de Sun, HP o IBM. Estos sistemas permiten crear “particiones virtuales” con un subconjunto de CPU’s, memoria y disco de una máquina física. En estos casos Oracle requiere licenciar sólo el subconjunto de CPU’s de la partición.
VMware a partir de la versión 4.1 dispone de un sistema llamado DRS Virtual Machine Host Affinity, que permite “confinar” una maquina virtual en un subconjunto de máquinas físicas del cluster. Hasta el momento Oracle no lo ha considerado un sistema de hard partition, y por tanto seguimos con las condiciones de licenciado anteriormente mencionadas.
Para más detalles de qué Oracle considera hard partitioning y qué soft partitioning, podéis consultar el documento al respecto disponible en la web de Oracle:
http://www.oracle.com/us/corporate/pricing/partitioning-070609.pdf

Y personalmente pienso que…

El software Oracle sobre entornos virtualizados simplemente irá en aumento. Cada vez son más los departamentos de informática que deciden pasar sus entornos físicos a virtuales por las ventajas que estos aportan, y los productos Oracle no pueden esquivar esta tendencia. De hecho Oracle ya dispone de su propio entorno de virtualitzación (Oracle VM) y da soporte a sus productos sobre él.
El principal problema acostumbra a ser más el licenciado que el soporte, básicamente por el sobrecoste que representa el tener que licenciar todas las CPU’s físicas. A nivel de soporte, y si se usan versiones de productos con un cierto recorrido, es baja la posibilidad de tener incidentes que no estén ya “reportados”.
Existen multitud de empresas que han pasado sus entornos productivos Oracle a VMware, y VMware está muy interesada en ello, de manera que no escatima esfuerzos para que los productos Oracle funcionen correctamente bajo su entorno de virtualización:
http://www.vmware.com/solutions/partners/alliances/oracle-database-customers.html
Para disminuir en parte el problema con el licenciado algunas empresas crean múltiples clusters VMware en lugar de uno solo. El primero con pocas maquinas físicas (2 por ejemplo) para las maquinas virtuales con productos Oracle, y el segundo con el resto de servidores físicos para el resto de maquinas virtuales.
En nuestro caso particular trabajamos con varios clientes que han optado por esta solución con resultados satisfactorios en la mayoría de los casos, tanto para entornos de desarrollo como para productivos.
Hacer notar que, de momento, no todas las opciones que nos aporta VMware son susceptibles de ser aplicadas a servidores con productos Oracle:
  • Los “snapshots en caliente” de máquinas con BBDD son motivo de controversia pues la BBDD deberá realizar una recuperación cuando arranquemos desde uno de ellos. ¿Se pueden por tanto considerar un sistema de copias valido? En mi opinión no, y deberíamos continuar realizando las copias a nivel de Oracle (con RMAN por ejemplo) y no optar por ellos como sistema de backup.
  • Existen casos reportados de problemas con VMotion y Oracle RAC por lo que, personalmente, tampoco recomiendo su uso. No obstante también podemos encontrar casos en que funciona sin problemas. En consecuencia, usarlos o no es una elección a realizar por el cliente que use Oracle RAC sobre VMware.
Por otra parte la virtualización nos aporta muchas ventajas:
  • Alta disponibilidad:  En caso de problemas en el servidor físico en que esté ubicada la maquina virtual, la podemos arrancar en otro nodo del cluster (de manera manual o automática).
  • Facilidad y seguridad ante cambios: Podemos realizar un snapshot con la maquina parada y actualizar el S.O. o el propio software Oracle con la tranquilidad de que si algo malo pasa, todo podrá volver a quedar “como antes” sin prácticamente esfuerzo.
  • Crear entornos para desarrollo o para test de nuevas aplicaciones, con gran facilidad, partiendo de copias en frio de las maquinas virtuales productivas.
  • Y, principalmente, integrar los servidores Oracle con el resto de nuestros sistemas virtualizados, evitando que sean “sistemas a parte”.
Llegados a este punto lo normal sería seguir con dudas sobre si implementar Oracle sobre VMware o no. Es una decisión a tomar por cada departamento de IT y no es fácil, pero la tendencia parece apuntar a que la virtualización seguirá ganando terreno, incluso en los entornos Oracle.

lunes, 12 de agosto de 2013

UTL_MAIL

ORA-06502 ORA-24247 calling UTL_MAIL from Oracle 11gR2

Environment: Oracle database 11.2.0.3.0, Oracle Linux 6.2
Sending e-mails from within the Oracle database using the UTL_MAIL PL/SQL package used to be quite easy in Oracle 10g. However, in Oracle 11gR2, things have changed.
Suppose that you created the following wrapper procedure in PL/SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
CREATE OR REPLACE PROCEDURE UTILS.SEND_MAIL (
   p_sender       IN   VARCHAR2,
   p_recipients   IN   VARCHAR2,
   p_cc           IN   VARCHAR2 DEFAULT NULL,
   p_bcc          IN   VARCHAR2 DEFAULT NULL,
   p_subject      IN   VARCHAR2,
   p_message      IN   VARCHAR2,
   p_mime_type    IN   VARCHAR2 DEFAULT 'text/plain; charset=us-ascii'
)
IS
 BEGIN
   UTL_MAIL.SEND (sender          => p_sender,
                  recipients      => p_recipients,
                  cc              => p_cc,
                  bcc             => p_bcc,
                  subject         => p_subject,
                  message         => p_message,
                  mime_type       => p_mime_type
                 );
EXCEPTION
   WHEN OTHERS
   THEN
      RAISE;
END send_mail;
/

To get this procedure working on Oracle 11g, there are several steps you need to take.
First, you need to actually install the UTL_MAIL package. It’s not installed by default on 11g:
 
1
2
3
4
5
6
7
$ sqlplus /nolog
SQL*Plus: Release 11.2.0.3.0 Production on Fri Apr 27 14:49:33 2012
SQL> connect / as sysdba
Connected.
SQL> @?/rdbms/admin/utlmail.sql
SQL> @?/rdbms/admin/prvtmail.plb
SQL> grant execute on utl_mail to public;

Next, you need to add the address and port of the e-mail server to the “smtp_out_server” initialization parameter. If you do not do this, you will receive a “ORA-06502: PL/SQL: numeric or value error” error when you try to use the UTL_MAIL package.
Execute the following with user SYS as SYSDBA:
 
1
SQL> alter system set smtp_out_server = 'mymailserver@mydomain.com:25' scope=both;

Finally, you need to create an Access Control List (ACL) for your e-mail server and grant the necessary users access to this ACL. Without an ACL, you will receive the following error: “ORA-24247: network access denied by access control list (ACL)“.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
BEGIN
   DBMS_NETWORK_ACL_ADMIN.CREATE_ACL (
    acl          => 'mail_access.xml',
    description  => 'Permissions to access e-mail server.',
    principal    => 'PUBLIC',
    is_grant     => TRUE,
    privilege    => 'connect');
   COMMIT;
END;
 
BEGIN
   DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL (
    acl          => 'mail_access.xml',
    host         => 'mymailserver@mydomain.com',
    lower_port   => 25,
    upper_port   => 25
    );
   COMMIT;
END;
After these steps, you should be able to successfully send e-mails from within the database:

begin
utils.send_mail(
p_sender => ‘ora11gtest@mydomain.com’,
p_recipients => ‘matthiash@mydomain.com’,
p_subject => ‘This is the subject line!’,
p_message => ‘Hello World!’);
end;
*Action:
anonymous block completed
Matthias

ORA-24247 during LDAP authentication from APEX 4.1.1 on Oracle 11gR2

Environment: APEX 4.1.1, Oracle database 11.2.0.3.0, Oracle Linux 6.2
In Oracle database 11g, access to external network resources has been more restricted than in previous versions. Access to network resources is now controlled through ACL’s (Access Control Lists). This can lead to various problems when you migrate APEX applications from a server running Oracle 10g to one running 11g.For example, if you wrote your own LDAP authentication functions using the built-in DBMS_LDAP package, you will receive the following error message when you try to authenticate to LDAP:
ORA-24247: network access denied by access control list (ACL)
This is because the owner of the authentication function lacks access to the required network resources. You can easily test this with the following piece of PL/SQL code:
1
2
3
4
5
declare
l_session dbms_ldap.session;
begin
l_session := dbms_ldap.init('windowsdc.mydomain.com',389);
end;
In this case, “windowsdc.mydomain.com” is a Windows LDAP server running Microsoft’s Active Directory.
To grant access to a specific network resource in 11g, you first need to create a ACL (Access Control List). I executed this with SYS as SYSDBA:
1
2
3
4
5
6
7
8
9
BEGIN
   DBMS_NETWORK_ACL_ADMIN.CREATE_ACL (
    acl          => 'ldap_access.xml',
    description  => 'Permissions to access LDAP servers.',
    principal    => 'MATTHIASH',
    is_grant     => TRUE,
    privilege    => 'connect');
   COMMIT;
END;
In this example, “ldap_access.xml” is the name of my ACL, and “MATTHIASH” is the name of the user account which needs access to the LDAP server. This account owns my custom LDAP authentication function.
Next, you need to add the LDAP server to the ACL we just created (don’t forget to COMMIT):
1
2
3
4
5
6
7
8
9
BEGIN
   DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL (
    acl          => 'ldap_access.xml',
    host         => 'windowsdc.mydomain.com',
    lower_port   => 389,
    upper_port   => 389
    );
   COMMIT;
END;
You can check the ACL using the following queries:

SELECT * FROM DBA_NETWORK_ACLS;
SELECT * FROM DBA_NETWORK_ACL_PRIVILEGES;

jueves, 21 de marzo de 2013

Oracle 11gr2 : Problemas con ASM y Cluster Synchronization Service

Seteamos nuestro ambiente para la instancia ASM
export ORACLE_HOME=/u01/app/oracle/product/11.2.0/grid
export ORACLE_BASE=/u01/app/oracle
export ORACLE_SID=+ASM
export PATH=$PATH:/u01/app/oracle/product/11.2.0/grid/bin


Y procedemos a levantar la instancia ASM

[oracle@oracle11g ~]$ sqlplus /nolog
SQL*Plus: Release 11.2.0.1.0 Production on Fri Apr 16 05:37:25 2010
Copyright (c) 1982, 2009, Oracle. All rights reserved.
SQL> conn / as sysdba
Connected to an idle instance.
SQL> startup
ORA-01078: failure in processing system parameters
ORA-29701: unable to connect to Cluster Synchronization Service
SQL>




¿Cómo solucionamos este inconveniente?
Pues he acá la explicación


El demonio del Cluster Synchronization Service (cssd daemon) no queda online después del reboteo y como la instancia ASM , necesita ese demonio, pues por eso ASM no levanta
La forma de chequearlo


[oracle@oracle11g ~]$ crsctl check cssd
CRS-4530: Communications failure contacting Cluster Synchronization Services daemon
[oracle@oracle11g ~]$ crsctl check has
CRS-4638: Oracle High Availability Services is online
[oracle@oracle11g ~]$ ps -fea | grep d.bin
oracle 6208 1 0 Apr15 ? 00:02:37 /u01/app/oracle/product/11.2.0/grid/bin/ohasd.bin reboot



Y efectivamente vemos que el servicio está abajo ... aunque el servicio ohasd este online


¿Cuál es la causa de este inconveniente?
Pues a partir de Oracle11gr2 los demonios cssd y diskmon no son levantados vía el oratab, ahora estos demonios son levantados por el HAS (High Availability Service) y registrados en un OCR local como un recurso más.
Para analizar esto, procedemos a ir al HOME de la instalación del Grid Infraestructure, que en el fondo es el HOME que soporta el ASM
Y analizamos los recursos existentes
[oracle@oracle11g ~]$ cd $ORACLE_HOME
[oracle@oracle11g grid]$ pwd
/u01/app/oracle/product/11.2.0/grid
[oracle@oracle11g grid]$ cd bin
[oracle@oracle11g bin]$ ./crsctl status resource -t
--------------------------------------------------------------------------------
NAME TARGET STATE SERVER STATE_DETAILS
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.DATA.dg
OFFLINE OFFLINE oracle11g
ora.asm
OFFLINE OFFLINE oracle11g
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.cssd
1 ONLINE OFFLINE
ora.diskmon
1 ONLINE OFFLINE




Como vemos , ambos demonios , inscritos como recursos se encuentran OFFLINE
Para ver el origen del problema, analizamos los recursos con su configuración en detalle
Nota : Solamente vamos a mostrar los recursos que tienen problemas (CSSD y DISKMON)
[oracle@oracle11g bin]$ ./crsctl status resource -p
NAME=ora.cssd
TYPE=ora.cssd.type
ACL=owner:oracle:rwx,pgrp:oinstall:rwx,other::r--
ACTIVE_PLACEMENT=0
AGENT_FILENAME=%CRS_HOME%/bin/cssdagent%CRS_EXE_SUFFIX%
AGENT_HB_INTERVAL=0
AGENT_HB_MISCOUNT=10
AUTO_START=never
CARDINALITY=1
CHECK_INTERVAL=30
CLEAN_ARGS=abort
CSSD_PATH=%CRS_HOME%/bin/ocssd%CRS_EXE_SUFFIX%
CSS_USER=oracle
DEGREE=1
DESCRIPTION="Resource type for CSSD"
DETACHED=true
ENABLED=1
FAILOVER_DELAY=0
FAILURE_INTERVAL=3
FAILURE_THRESHOLD=5
LOAD=1
LOGGING_LEVEL=1
OFFLINE_CHECK_INTERVAL=0
OMON_INITRATE=1000
OMON_POLLRATE=500
ORA_VERSION=11.2.0.1.0
PLACEMENT=balanced
PROCD_TIMEOUT=1000
RESTART_ATTEMPTS=5
SCRIPT_TIMEOUT=600
START_DEPENDENCIES=weak(concurrent:ora.diskmon)
START_TIMEOUT=600
STOP_DEPENDENCIES=hard(shutdown:ora.diskmon)
STOP_TIMEOUT=900
UPTIME_THRESHOLD=1m
VMON_INITLIMIT=16
VMON_INITRATE=500
VMON_POLLRATE=500
NAME=ora.diskmon
TYPE=ora.diskmon.type
ACL=owner:oracle:rwx,pgrp:oinstall:rwx,other::r--
ACTIVE_PLACEMENT=0
AGENT_FILENAME=%CRS_HOME%/bin/orarootagent%CRS_EXE_SUFFIX%
AUTO_START=never
CARDINALITY=1
CHECK_INTERVAL=20
CHECK_TIMEOUT=10
DEGREE=1
DESCRIPTION="Resource type for Diskmon"
DETACHED=true
ENABLED=1
FAILOVER_DELAY=0
FAILURE_INTERVAL=3
FAILURE_THRESHOLD=5
LOAD=1
LOGGING_LEVEL=1
OFFLINE_CHECK_INTERVAL=0
ORA_VERSION=11.2.0.1.0
PLACEMENT=balanced
RESTART_ATTEMPTS=10
SCRIPT_TIMEOUT=60
START_DEPENDENCIES=weak(concurrent:ora.cssd)pullup:always(ora.cssd)
START_TIMEOUT=60
STOP_TIMEOUT=60
UPTIME_THRESHOLD=5s
USR_ORA_ENV=ORACLE_USER=oracle
VERSION=11.2.0.1.0




La propiedad AUTO_START esta seteada como NEVER o como 2 , para los demonios CDDS y DISKMON, esto implica que estos recursos no serán levantados nunca en un reincio por el HAS, y si el Cluster Synchronization Service no puede levantar, implica que la instancia ASM no puede partir.
Para solucionar el problema se debe configurar el AUTO_START para esos demonios (diskmon y cssd)
[oracle@oracle11g bin]$ ./crsctl modify resource "ora.cssd" -attr "AUTO_START=1"
[oracle@oracle11g bin]$
[oracle@oracle11g bin]$
[oracle@oracle11g bin]$ ./crsctl modify resource "ora.diskmon" -attr "AUTO_START=1"
[oracle@oracle11g bin]$




Una vez ejecutados esos comandos, procedemos a analizar nuevamente la configuración de los recursos
NAME=ora.cssd
TYPE=ora.cssd.type
AUTO_START=1
NAME=ora.diskmon
TYPE=ora.diskmon.type
AUTO_START=1



Verificamos los recursos y su estado actual
[oracle@oracle11g bin]$ ./crsctl status resource -t
--------------------------------------------------------------------------------
NAME TARGET STATE SERVER STATE_DETAILS
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.DATA.dg
OFFLINE OFFLINE oracle11g
ora.asm
OFFLINE OFFLINE oracle11g
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.cssd
1 ONLINE OFFLINE
ora.diskmon
1 ONLINE OFFLINE
[oracle@oracle11g bin]$




Como podemos apreciar, ahora se encuentran con un TARGET ONLINE, lo que implica que se reiniciarán con un reboteo..
Pero se aprecia que el STATE es OFFLINE, eso implica que no están arriba los recursos, procedemos a levantarlos
[oracle@oracle11g bin]$ ./crs_start -all
Intentando iniciar `ora.cssd` en el miembro `oracle11g`
Intentando parar `ora.diskmon` en el miembro `oracle11g`
La parada de `ora.diskmon` en el miembro `oracle11g` se ha realizado correctamente.
Intentando iniciar `ora.diskmon` en el miembro `oracle11g`
El inicio de `ora.diskmon` en el miembro `oracle11g` se ha realizado correctamente.
El inicio de `ora.cssd` en el miembro `oracle11g` se ha realizado correctamente.
Intentando iniciar `ora.asm` en el miembro `oracle11g`
El inicio de `ora.asm` en el miembro `oracle11g` se ha realizado correctamente.
Intentando iniciar `ora.DATA.dg` en el miembro `oracle11g`
El inicio de `ora.DATA.dg` en el miembro `oracle11g` se ha realizado correctamente.



Y los volvemos a verificar
[oracle@oracle11g bin]$ ./crsctl status resource -t
--------------------------------------------------------------------------------
NAME TARGET STATE SERVER STATE_DETAILS
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.DATA.dg
ONLINE ONLINE oracle11g
ora.asm
ONLINE ONLINE oracle11g Started
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.cssd
1 ONLINE ONLINE oracle11g
ora.diskmon
1 ONLINE ONLINE oracle11g




Ahora procedemos a levantar nuestra instancia ASM
Vale la pena recordar, que la instancia ASM ya no se levanta con el rol SYSDBA, existe uno nuevo llamado SYSASM , si nos conectamos con SYSDBA, aparecerá un error de privilegios
[oracle@oracle11g bin]$ sqlplus /nolog
SQL*Plus: Release 11.2.0.1.0 Production on Fri Apr 16 06:05:11 2010
Copyright (c) 1982, 2009, Oracle. All rights reserved.
SQL> conn / as sysdba
Connected.
SQL> startup
ORA-01031: insufficient privileges
SQL>


 Nos conectamos con el rol indicado y procedemos a subir la instancia ASM

SQL> conn / as sysasm
Connected.
SQL> startup
ASM instance started
Total System Global Area 284565504 bytes
Fixed Size 1336036 bytes
Variable Size 258063644 bytes
ASM Cache 25165824 bytes
ASM diskgroups mounted

miércoles, 20 de marzo de 2013

Buscar History

history grep | mkfs

Muestra la lista de historia de órdenes con números de línea, el fichero de historial por defecto esta contenido en el valor de la variable HISTFILE.
history n muestra las últimas n líneas
history -c borra la lista de historial (borrando todas las entradas).
history -d 625 Borra el comando que se encuentre en la posición 625 de la lista de historial
history -a añade las líneas de historia ‘‘nuevas’’ (las introducidas desde el inicio de la sesión de bash en curso) al fichero de historia.
history -r lee los contenidos del fichero de historia y los usa como la historia en curso.
Trabajando con el Historial de comandos
!find ejecuta la última orden que empieza por la cadena find
!?home? ejecuta la última orden que contenga la cadena home
ctrl+r busca la cadena en el history
comando ejecuta comando sin que este sea almacenado en el historial de comandos, esto será así dependiendo del valor de las variables de ambiente HISTCONTROL y HISTIGNORE (ver man bash, para mayor información)
kill -9 $$ sale del shell actual sin guardar el historial de comandos.

martes, 19 de marzo de 2013

UPTIME


Calcular Disponibilidad

select
   'Hostname : ' || host_name
   ,'Instance Name : ' || instance_name
   ,'Started At : ' || to_char(startup_time,'DD-MON-YYYY HH24:MI:SS') stime
   ,'Uptime : ' || floor(sysdate - startup_time) || ' days(s) ' ||
   trunc( 24*((sysdate-startup_time) -
   trunc(sysdate-startup_time))) || ' hour(s) ' ||
   mod(trunc(1440*((sysdate-startup_time) -
   trunc(sysdate-startup_time))), 60) ||' minute(s) ' ||
   mod(trunc(86400*((sysdate-startup_time) -
   trunc(sysdate-startup_time))), 60) ||' seconds' uptime
from
   sys.v_$instance;
If you assume that PMON startup time is the same as the database startup time, you can get the uptime here:select
   to_char(logon_time,'DD/MM/YYYY HH24:MI:SS')
from
   v$session
where
   sid=1;