Administración de la base de datos

Administración de la base de datos Dataprix Tue, 09/08/2009 - 09:46

AWR Formatter para DBA's de Oracle

AWR Formatter Oscar_paredes Sat, 06/11/2011 - 13:06

Anyone who usually look at AWR performance reports to analyze Oracle performance problems, often have their own reading process and approach to all data that shows this report, but I always missed a tool that make easier reading all data.

 

I've found! "AWR Formatter" developed by the DBA Tyler Muth facilitates this reading. Fantastic, you must try.

 

AWR Formatter is an extension of Chrome (file with. Crx) free once installed in the browser, each time you view an AWR report in HTML, gives you the option to format to help you see all your information. Once formatted text, HTML is seen in browser in different tabs. Highlight the following features that gives you the added format:

  • Possibility of performing conversions dynamically KB / MB / GB / TB in the various indicators
  • Possibility of searching the meaning of a pending event, parameter, etc ... (this is really useful)
  • Formatted tables sortable, much like an Excel ...
  • Ability to view the text of the SQL command's ...

AWR Formatter

 

 

Overall, nothing compared to the large standard html file ... wonderful. You can download it free from the following link:

https://dl.dropbox.com/u/4131944/AWR-Format/AWR-Format.crx

 

A tab called "Observations", aims to give reading indications reading of the report, but it is a first approach, and of course, each DBA should follow it as their responsibility.

 

Hope you enjoy,

Oscar Paredes - oscar.paredes@dataprix.com

Acceso remoto mediante DBLink de Oracle

Acceso remoto mediante DBLink de Oracle Carlos Mon, 03/12/2007 - 23:18

Para acceder desde una base de datos Oracle a objetos de otra base de datos Oracle la manera más sencilla es utilizar un DBLink (que sea la más sencilla no significa que siempre sea la más aconsejable, el abuso de los dblinks puede generar muchos problemas, tanto de rendimiento como de seguridad)

Vistas materializadas en Oracle Enterprise Manager

Para ello es necesario, con un usuario que posea el privilegio CREATE DATABASE LINK, crear el DBLINK en la base de datos Oracle origen (A) mediante una sencilla sentencia como la siguiente:

SQL> Create database link LNK_DE_A_a_B connect to USUARIO identified by CONTRASEÑA USING 'B'; 

'LNK_DE_A_a_B' es el nombre del link, 'USUARIO' y 'CONTRASEÑA' son los identificadores del usuario que utilizará el database link para conectarse, los permisos del cual heredarán todos los accesos a través del db link, y B es el nombre de la instancia de la base de datos.

A través del dblink se puede conectar con los objetos de la base de datos remota con los permisos que tenga el usuario que se ha proporcionado en la sentencia de creación.

 

Para referenciar un objeto de la base de datos remota se ha de indicar el nombre del objeto, concatenado con el carácter '@' y el nombre que se le ha dado al DBLINK.

Ejemplo de consulta de select sobre una tabla a través de una database link:

SQL> select * from TABLA@LNK_DE_A_a_B 

 

Para ampliar información sobre la creación y utilización de database links se puede consultar la documentación de Oracle que se proporciona online en documentacion oracle create database.

Si lo que se quiere es acceder a una base de datos de otro fabricante, se puede crear el DBLink utilizando Heterogeneous Services. Se puede consultar cómo hacerlo con SQLServer en el artículo Heterogeneous services: Conexión desde Oracle a SQLServer

 


Libros de Administración Oracle (DBA) y PL/SQL

¿Quieres profundizar más en PL/SQL de Oracle o en administración de bases de datos Oracle? Puedes hacerlo consultando alguno de estos libros de Oracle.


 

Cuestiones sobre los dblinks de Oracle

Cuestiones sobre los dblinks de Oracle Carlos Mon, 10/19/2009 - 16:08

Abro este tema a partir del artículo Acceso remoto mediante DBLink de Oracle para que podamos comentar dudas y experiencias sobre la creación y utilización de database links de Oracle.

hola, queria ver si hay alguna manera de accesar con algun nombre de usuario y contraseña universal o algo asi porque acabo de instalar el sql plus, pero no tengo esos datos. gracias y espero me pueda ayudar alguien

In reply to by Carlos

Estimados, soy nuevo en oracle y estoy haciendo una conexión entre dos servidores pero al momento de compilar mis paquetes me da el error ORA-04052.

Variables:

DBLINKS

Variable Global_name = FALSE;

Tengo el sinonimo:

CREATE SYNONYM  r_csh_ppm
    FOR awunadm.csh_ppm@toawas

create database link TOAWAS
connect to awunadm identified by awunadm123 using
'  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST =  172.20.130.2)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SID = ASYWDB)
      (SERVER = DEDICATED)
      (GLOBAL_NAME = ASYWDB.UNCTAD.ORG)
    )
  )
'

EL paquete hace un

select * from r_csh_ppm

 

Al compilar devuelve el error ORA-04052, me pueden ayudar con esto?

Gracias de antemano

 

In reply to by Anonimo (not verified)

Entiendo que desde SQLPlus la SELECT sobre el sinónimo te funciona correctamente, y el problema lo tienes al intentar utilizar este sinónimo dentro de un PROCEDURE.

Supongo que has escrito global_name (sin la 's') por error. De todas maneras en Oracle global_names puedes encontrar una explicación sobre los GLOBAL_NAMES(S) y el DB_DOMAIN.

  • Por si acaso asegúrate de que el parámetro GLOBAL_NAMES está a FALSE en ambas bases de datos.
     
  • Supongo que el error te habrá devuelto el texto:
ORA-04052 error occurred when looking up remote object %s%s%s%s%s
Cause:
An error has occurred when trying to look up a remote object.
Action:
Fix the error. Make sure the remote database system has run KGLR.SQL to create necessary views used for querying/looking up objects stored in the database.

En las versiones actuales de BD, este script ya no se llama KGLR.SQL. Si no encuentras este fichero busca catlog.sql y catproc.sql. Aunque en teoría se ejecutan al instalar la base de datos, puedes probar a ejecutarlos en las dos bases de datos, y puede que así se resuelva el problema
 

In reply to by Carlos

Hola se que usted es esperto en Oracle tengo la siguiente duda:

mi trabajo o tarea es hacer un replica de una base de datos en oracle 10g express y para ello necesito hacer un database link pero antes

necesito modificar los archivos de la siguiente ruta:

C:\oraclexe\app\oracle\product\10.2.0\server\NETWORK\ADMIN dentro de esta direccion esta el archivo tnsnames.ORA

y la verdad no se cual de estos codigos voy a mo dificar (osea si voy a modificar o agregar nuevas lineas) ALUMNO-PC3 es el nombre de mi maquina y ALUMNO-PC4 EL de la otra maquina.  estos son los codigos que hay dentro de este archivo:

XE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = ALUMNO-PC3)(PORT = 1521))                  // en la otra maquina aparece ALUMNO-PC4
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = XE)
    )
  )

EXTPROC_CONNECTION_DATA =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_FOR_XE))
    )
    (CONNECT_DATA =
      (SID = PLSExtProc)
      (PRESENTATION = RO)
    )
  )

ORACLR_CONNECTION_DATA =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_FOR_XE))
    )
    (CONNECT_DATA =
      (SID = CLRExtProc)
      (PRESENTATION = RO)
    )
  )

LO MISMO TIENEN LAS DOS MAQUINAS dime por favor como quedaria modificado este archivo en ALUMNO-PC3 Y ALUMNO-PC4.

tambien lei que el archivo listener pero no se si tambien se va a modificar y que parte se modificara. este es el codigo:

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = C:\oraclexe\app\oracle\product\10.2.0\server)
      (PROGRAM = extproc)
    )
    (SID_DESC =
      (SID_NAME = CLRExtProc)
      (ORACLE_HOME = C:\oraclexe\app\oracle\product\10.2.0\server)
      (PROGRAM = extproc)
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_FOR_XE))
      (ADDRESS = (PROTOCOL = TCP)(HOST = ALUMNO-PC3)(PORT = 1521))
    )
  )

DEFAULT_SERVICE_LISTENER = (XE)
 

Y me gustaria como quedaria creado el dblink  que necesito

ambas maquinas tienen instalado el oracle 10g y los usuarios son para ALUMNO-PC3 es HR y contraseña: QWERTY.  y para ALUMNO-PC4 es ALUMNOS Y HR y la contraseña para ambos es recursos. y como hacer una consulta una vez creado el database link.

OJALA Y ME RESPONDAS CLARO Y CONCISO YO SOY NOBATO EN ESTO GRACIASSSSSSSS

ANDRES.....

In reply to by ADRES (not verified)

En el TNSNAMES se agregan las 'referencias' a los servidores de bases de datos con los que se quiera conectar desde la máquina. Como en tu caso quieres hacer un DBLINK desde ALUMNO-PC3 hasta ALUMNO-PC4 tendrías que modificar el TNSNAMES de ALUMNO-PC3 con los datos de conexión a la BD de ALUMNO-PC4:

XE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = ALUMNO-PC4)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = XE)
    )
  )

 

En principio, si vas a hacer un dblink entre dos BBDD Oracle no tienes porqué modificar la configuración del listener.

 

Tal como comento en el post Acceso remoto mediante DBLINK de Oracle, para crear después el database link en la BD origen (la de ALUMNO-PC3), deberías ejecutar con un usuario con suficientes privilegios una sentencia como la siguiente:

create database link LINK_de_PC3_a_PC4 connect to ALUMNOS identified by recursos;

Y para hacer desde la BD de ALUMNO-PC3 una select sobre una tabla de la BD de ALUMNO-PC4:

select * from TABLA_DE_PC4@LINK_de_PC3_a_PC4;

 

 

In reply to by Carlos

 Carlos espero pueda ayudarme con este problemita:

 

estoy ejecutando el siguiente código desde una BD Oracle 9i para consultar datos de una base de datos en 10g mediante un debelink llamado suiscen:

 

begin

 

select *

from persona@suiscen;

 

end;

 

pero me genera el siguiente error:

 

ORA-06550: line 4, column 6:

PL/SQL: ORA-04052: error occurred when looking up remote object SERECE.PERSONA@SUISCEN

ORA-00604: error occurred at recursive SQL level 1

ORA-06502: PL/SQL: numeric or value error

ORA-06512: at line 64

ORA-24757: duplicate transaction identifier

ORA-02063: preceding 4 lines from SUISCEN

ORA-06550: line 3, column 1:

 

este error solo se presenta cuando esta entre el BEGIN y el END 

he investigado y al parecer es un bug y me indican debo migra mi BD que esta en 9i a 10G sera que existe otra salida?

 

Carlos de antemano mil gracias en lo que me pueda asesorar.

 

 

In reply to by kmilo666 (not verified)

Seguro que es un bug? Si quieres puedes enlazar el lugar donde comentan lo del bug y le echamos un vistazo. Ahora no tengo disponible una BD 9i para probarlo, pero es la primera noticia que tengo de que exista este problema entre versiones.

A mi lo que me parece más indicativo es el error ORA-24757: duplicate transaction identifier. Podría ser que según cómo estén configuradas las BBDD te diera problemas utilizar a la vez el DBLINK desde varios lugares. Asegúrate de que no tengas abierta ninguna otra conexión que utilice el link y vuelve a probar con el Procedure. Para la prueba utiliza el mismo procedure que indicas, no sea que sea el mismo procedure el que abra demasiados enlaces.

Las dos bases de datos están en el mismo servidor? Eso también podría darte algún problema de identificadores.

In reply to by Carlos

Carlos gracias por la pronta respuesta....bueno lo del enlace fue tanto lo que busque que no guarde dichos enlaces pero los buscare nuevamente...

 

las bases de datos están en distintos servidores y lo que me faltó comentar es que el servidor donde esta la BD en 10g esta en modo RAC (Real Apliccation Server) .

Es decir el codigo o procedure funciona correctamente hacia los servidores con Oracle 9i normal y  el error me aparece con los dblinks que apuntan hacia las BD que están en RAC.

In reply to by kmilo666 (not verified)

Lo de RAC es un detalle importante, esas cosas se dicen antes ;)

Si no lo has hecho ya deberías comprobar los valores de los parámetros OPEN_LINKS y OPEN_LINKS_PER_INSTANCE de la BD que está en RAC para saber cuántos dblinks pueden abrirse como máximo en una sesión o una instancia de esta base de datos.

El problema podría ser simplemente que superaras este límite al utilizar el DBLINK desde el procedure.

In reply to by Carlos

Hola Carlos... te saluda Ivan, tengo una consulta:

Estoy tratando de crear una conexion DBLINK desde Oracle 11g para conectarme a SQL Server 2008.

Para hacer la conexion utilizo un Driver ODBC 11 de oracle... y la conexion se hace con éxito.

Pero al momento de hacer una consulta (SELECT, INSERT, UPDATE), me sale el siguiente error:

ORA-00942: la tabla o vista no existe
[Microsoft][ODBC SQL Server Driver][SQL Server]El nombre de objeto 'TM0000000001.AREA' no es válido. {42S02,NativeErr = 208}[Microsoft][ODBC SQL Server Driver][SQL Server]No se puede preparar la instrucción o instrucciones. {42000,NativeErr = 8180}
ORA-02063: 2 lines precediendo a SASERVER_LINK
00942. 00000 -  "table or view does not exist"

 

Favor ayudarme para solucionar este problema y poder hacer mis consultar respectivas... gracias

In reply to by Ivan (not verified)

Hola Iván

Parece sólo que no te reconoce el nombre de la tabla. ¿Puede ser que te falte el propietario de la tabla de SQL Server? Si la base de datos es TM0000000001 el nombre completo sería 'TM0000000001.dbo.AREA', o 'TM0000000001.ivan.AREA' si fuera del usuario ivan.

Saludos,

In reply to by Carlos

Carlos ya hice todo lo que me indicaste y el databaselink  si lo crea pero al querer consultar manda el siguiente error:

ORA-02019: no se ha encontrado la descripción de la conexión para la base de datos remota

y e buscado este error pero no encuentro la solucion y lo hice tal como me dijistes.

 

contesta porfa. de ante mano Gracias...   ATTE Andres...

 

In reply to by ANDRES (not verified)

Puede que la base de datos tenga el global_names activado, y al utilizar el dblink necesites especificar el nombre del dominio. El tema de los global names lo explico un poco en esta entrada del foro.

Comprueba cuál es el DB_DOMAIN de la base de datos y agrégalo al nombre del DBLINK al utilizarlo. Si utilizas una herramienta visual como SQLDeveloper, por ejemplo, seguramente en el nombre del dblink ya te indicará el nombre completo que tienes que utilizar.

Prueba a hacer esto:

 SQL> select * from global_name; 
 GLOBAL_NAME -------------------
 XE.MIDOMINIO.COM 

Lo que te ponga en lugar de MIDOMINIO.COM agregalo en la SELECT del database link:

 select * from TABLA_DE_PC4@LINK_de_PC3_a_PC4.MIDOMINIO.COM;

Suerte!!

In reply to by Carlos

Hola, ya hice lo del dominio, como dominio me aparecia solo XE despues de eso yo cambie el dominio a mibd.dominio.com de la sig manera

-------------------------------------

SQL> alter database rename GLOBAL_NAME to MIBD.DATAPRIX.COM;
Database altered.

-------------------------------------

ya que no me regreso algun domino la primer parte, use lo sig.

------------------------------------

select * from Datos_Personales@LINK_de_pc-3_a_pc-4.MIBD.DOMINO.COM;

y me mando el mismo error (ora-0219) la verdad me gustaria que nos siguieras orientando por que hasta ahora tu apoyo ha sido de mucha ayuda.clarificamos muchas dudas que teniamos probando todo lo que nos has enviado y leyendo los foros que tienes en tu pagina(www.dataprix.com) sin mas que decir me despido deseandole una muy buena tarde.

In reply to by Jonathan (not verified)

Si has hecho el alter database como comentas, el dominio que le has asignado a la BD es DATAPRIX.COM

Entonces la select te quedaría:

SELECT * FROM Datos_Personales@LINK_de_pc-3_a_pc-4.DATAPRIX.COM

Recuerda que al link sólo le has de agregar el dominio, el nombre de la base de datos no lo tienes que incluir.

Venga, que ya falta menos!!

In reply to by ANDRES (not verified)

No lo hemos especificado, pero entiendo que el alter database para modificar el dominio lo has hecho en la base de datos remota (PC4). Otra cosa que habría que hacer es modificar el TNSNAMES de la BD local (la de PC3) teniendo en cuenta el nuevo dominio:

XE.DATAPRIX.COM =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = ALUMNO-PC4)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = XE)
    )
  )

Y después recrea de nuevo el dblink, incluyendo también el dominio:

SQL> dropdatabase link LINK_de_PC3_a_PC4;
SQL> create database link LINK_de_PC3_a_PC4.DATAPRIX.COM connect to ALUMNOS identified by recursos;
SQL> select * from TABLA_DE_PC4@LINK_de_PC3_a_PC4.DATAPRIX.COM;

Enlazo otro post donde también comento cosas sobre los Global Names, por si sirve de ayuda.
Espero que ahora salga todo bien..

Tengo dos bases de datos distintas A y B. Tengo un DBLink DBL_BA creado en B que apunta a las tablas creadas en A.

Funciona sin problemas, accedo a los datos de las tablas de A y creo vistas materializadas con esos datos. Mi problema

es que intento que dichas vistas sean de tipo FAST, es decir, que su refresco sea de tipo incremental, pues el volumen de

datos que tengo que manejar es muy grande.

 

Para ello creo LOGS en las tablas de A:

 

CREATE MATERIALIZED VIEW LOG ON esquemaA.tabla1
  WITH ROWID;
 
CREATE MATERIALIZED VIEW LOG ON esquemaA.tabla2 
WITH ROWID;

 

Ahora creo la vista materializada tipo FAST a través del dblink en mi base de datos B:

 

CREATE MATERIALIZED VIEW esquemaB.vmtablas   
PARALLEL BUILD IMMEDIATE
       REFRESH FAST
       AS
       SELECT T1.ROWID "CN_ID_1", T2.ROWID "CN_ID_2", T1.DC_NOMBRE, T2.DC_NOMBRE
       FROM tabla1@DBL_BA T1, tabla2@DBL_BA T2
       WHERE  T1.CN_ID = T2.CN_ID;

Obteniendo el siguiente error:

ORA-12015: no se puede crear una vista materializada de refrescamiento rápido a partir de una consulta compleja
 

Tengo todos los permisos necesarios, he probado a crear sinónimos de las tablas de A, pero sigo obteniendo el mismo

resultado...

 

Sin embargo, si creo la vista materializada sin utilizar el dblink, es decir, sobre la propia base de datos A,

me la crea sin problemas.

 

CREATE MATERIALIZED VIEW esquemaA.vmtablas   
PARALLEL BUILD IMMEDIATE
       REFRESH FAST
       AS
       SELECT T1.ROWID "CN_ID_1", T2.ROWID "CN_ID_2", T1.DC_NOMBRE, T2.DC_NOMBRE
       FROM tabla1 T1, tabla2 T2
       WHERE  T1.CN_ID = T2.CN_ID;

 

Espero puedan ayudarme :). Gracias por adelantado

In reply to by Elena (not verified)

La creación de vistas materializadas con el método de refresco FAST tiene bastantes restricciones, y el error ORA-12015 que te devuelve parece referirse precisamente a eso.

En el artículo Vistas materializadas de Oracle para optimizar un Datawarehouse incluyo un enlace a la documentación de Oracle donde habla de las restricciones para el método FAST. Si no lo has hecho ya, échale un vistazo. De todas maneras copio las restricciones generales que documenta Oracle:

General Restrictions on Fast Refresh

The defining query of the materialized view is restricted as follows:

  • The materialized view must not contain references to non-repeating expressions like SYSDATE and ROWNUM.

  • The materialized view must not contain references to RAW or LONG RAW data types.

  • It cannot contain a SELECT list subquery.

  • It cannot contain analytical functions (for example, RANK) in the SELECT clause.

  • It cannot contain a MODEL clause.

  • It cannot contain a HAVING clause with a subquery.

  • It cannot contain nested queries that have ANY, ALL, or NOT EXISTS.

  • It cannot contain a [START WITH ...] CONNECT BY clause.

  • It cannot contain multiple detail tables at different sites.

  • On-commit materialized view cannot have remote detail tables.

  • Nested materialized views must have a join or aggregate.

Como puedes ver parece que con el tipo de refresco FAST y la opción ON-COMMIT no se pueden utilizar tablas remotas en la vista. Pueba a definir la vista forzando la opción de refresco ON-DEMAND, y yo creo que te funcionará.

Ya nos contarás..

In reply to by Carlos

Efectivamente, la opción ON-COMMIT me daba problemas, la cambié a ON-DEMAND, pero el error persistía :(

Me dijeron que podía ser un problema con la versión de oracle y haciendo pruebas descubrí que así era. Ejecutando las Vistas Materializadas en una versión 11g no daba problemas (yo estaba usando la 9i para hacer las pruebas).

Muchas gracias por la ayuda :)

Estimado Carlos:

Yo podria atrapar un error de conexion utilizando dblink  entre una base de datos y otra  para luego indicarle a esa conexion que internte conectarse de nuevo. Lo que deseo es que si un hay un problema conectandome a la base de datos utiliwando dblink el procedo de reconexion se haga automaticamente en un intervalo de tiempo para garantizar que la extraccion de datos se haga siepre.

 

In reply to by Damian (not verified)

 Te entiendo, yo he tenido problemas al utilizar un dblink para conectar con un MySQL y cargar datos en el Data Warehouse corporativo. Funcionaba, pero también fallaba demasiado a menudo, y además cuando fallaba se quedaba frito y ya había manera de hacer nada.

En aquel momento no encontré ninguna manera de reconectar automáticamente el link, por lo que no puedo darte una solución en este sentido, no sé si se puede llegar a hacer. Cuando pueda investigaré un poco, o a ver si alguien más nos ayuda.

Lo que sí te puedo contar es que para que el error de conexión no me dejara vacías las tablas destino, lo que hice fue utilizar vistas materializadas en la stage area del DWH, así si la conexión fallaba simplemente la tabla no actualizaba los datos de ese día y no me paraba la carga. Después tenía un control adicional que me informaba si el día se había cargado o no. Supongo que tú lo solucionas tratando el error directamente en la ETL.

Bueno, ya nos contarás si averiguas algo tú antes, el tema es interesante..

Hola,

 

mi pregunta es sencilla. He leído que cuando se hace una select remota a una tabla mediante dblink, internamente

se inicia una trasacción distribuida.

Uso vistas que realizan select remota a otra/s tablas mediante dblink, ¿es necesario poner COMMIT

después del select para cerrar esta trasacción o todo esto lo hace Oracle internamente?.

 

 

Gracias

 

In reply to by Jose (not verified)

Para hacer una select no es necesario hacer un commit. Independientemente de si se utilizan database links o no, si no modificas datos de ninguna tabla no hay ninguna razón para hacer un commit.

Si Oracle internamente inicia una transacción distribuída, también la cerrará internamente, no tienes que preocuparte por eso.

 

Hola.

 

Tengo un error extraño de bbdd que no se como encajar:

 

Tengo un package compilado en un oracle 8i, lo llamo desde una app deployada en un jboss 4.5 y el 90% de las veces funciona OK. De vez en cuando falla devolviendo: "ORA-01007: la variable no se encuentra en la lista de selección"... Al entrar en el package y compilar de nuevo funciona OK...  no le veo explicación.. salvo que el package utiliza un DBLink que de vez en cuando falla, pero NO en ese procedure !

 

ALguna explicación ? Muchas gracias.

In reply to by Juan (not verified)

Hola Juan

No creo que sea un problema del dblink. Primero porque lo que tú mismo dices de que el database link está en otro procedure, y segundo porque si fallara te devolvería otro tipo de error, más de comunicaciones, conexiones, servidores remotos y esas cosas.

Revisa el procedure y las SELECTS que haces en el mismo. Si te falla sólo a veces tiene que ser que a veces la sentencia devuelve algo que no esperas, o no devuelve nada..

 

ORA-01007 variable not in select list

Cause: A reference was made to a variable not listed in the SELECT clause.

In OCI, this can occur if the number passed for the position parameter is less than one or greater than the number of variables in the SELECT clause in any of the following calls: DESCRIBE, NAME, or DEFINE.

In SQL*Forms or SQL*Report, specifying more variables in an INTO clause than in the SELECT clause also causes this error.

Action: Determine which of the problems listed caused the problem and take appropriate action.

 

Hola Carlos,

Estoy trabajando por primer vez con los dblinks en Oracle On Demand y tengo algunas dudas:

1.- Es necesario que las BD que quiera conectar tengan la misma versión??
2.- Tienen que estar en el mismo servidor las bases que quiera conectar??

Gracias por tu ayuda

In reply to by Laila (not verified)

[quote=Laila] Estoy trabajando por primer vez con los dblinks en Oracle On Demand y tengo algunas dudas: 1.- Es necesario que las BD que quiera conectar tengan la misma versión?? 2.- Tienen que estar en el mismo servidor las bases que quiera conectar?? [/quote]

Las bases de datos pueden tener versiones diferentes, pero dentro de unos límites, en este comentario ya surgió esta cuestión. En principio no deberías tener problemas entre bases de datos Oracle de versiones 8i, 9i, 10g y 11g.

Sobre los servidores, te confirmo que las bases de datos pueden estar en diferentes servidores.

 

Hola Carlos, tengo un problema, estoy trabajando con un dblink el cual es ejecutado dentro de un procedure. Cuando ejecuto el procedure directamente del plsql no es mucho el tiempo de respuesta pero sin embargo cuando lo ejecuto desde un form demora demasiado o a veces no responde.
Que puede ser y que podría hacer para optimizarlo?

Hola podría ayudarme con una consulta que tengo sobre los dblink

Tengo un paquete Cl_pruebas1 el cual llama aun procedimiento pt_pruebas.
En el procedimiento pt_pruebas realizo varios select e insert a unas tablas que estan en una base ppt

Select *
From tabla1@ppt.dd.com
Where Customer_Id = Cn_Customerid ;

Insert Into tabla1@ppt.dd.com

En este procedimiento pt_pruebas cierro los dblink y luego en el paquete principal Cl_pruebas1 realizo un commit a todo, pero el problema es que no se estan actualizando las tablas (tabla1@ppt.dd.com) que estan en la base ppt, solo se actualizan para la otra base qppt, no entiendo cual podría ser el problema.

In reply to by myf

La verdad es que yo siempre lo he hecho al revés, siempre intento utilizar los dblinks para hacer selecciones de datos, y las inserciones hacerlas 'en local', es la manera más segura, no tienes problemas adicionales con los permisos y te ahorras estos problemas.

Si puedes haz el INSERT desde la BD 'ppt' utilizando un dblink para seleccionar los datos de la BD donde tienes el procedimiento pt_pruebas.

Puede que te vaya bien echarle un vistazo al tema Insert entre bases de datos remotas enlazadas por dblink

Y si al final descubres algo más, porqué no se puede hacer, u otra manera de hacerlo, no te olvides de explicárnoslo..

 

 

tengo el siguiente codigo

Imports System.Data.OracleClient

Public Class Form1

Private Sub btnbuscar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnbuscar.Click

Dim cadenaDeConexion As String
Dim conexion As OracleConnection
Dim dsdataset As New DataSet

cadenaDeConexion = " Data source=ORCL; persist security info=false; User ID= SCOTT; password= scott;"
conexion = New OracleConnection(cadenaDeConexion)

conexion.Open()

Dim query As String
query = "select scott.emp.ename , scott.emp.deptno, scott.dept.loc from" & _
" scott.emp inner join scott.dept on scott.emp.deptno = scott.dept.deptno " & _
" where ename like '%" & UCase(Me.txtnombre.Text.Trim) & "%'"

Dim MiAdaptador As New OracleDataAdapter(query, conexion)
Try
MiAdaptador.Fill(dsdataset)
Me.DataGridView1.DataSource = dsdataset.Tables(0)
Catch ex As Exception

End Try
End Sub

lo que busco es llenar un datagrid con la informacion, pero al darle click al boton me aparece el siguiente error ORA-00604: error ocurred at recursive SQL level 1 ORA 06502 PL/SQL numeric or value error: character string buffer to small ORA 06512: at line 10..
que puedo hacer?? no e encontrado la solucion a este problema!! le agradeceria que me ayudara.. muchas gracias

Hola,
Tengo un servidor en Windows con 10gR2 con un dblink definido a un servidor Solaris con 10gR2 también.

Resulta que migre el servidor Windows a un Solaris con 11gR2 pero ahora los queries que usan el dblink al Solaris 10gR2 tienen un mal rendimiento.

Por ejemplo desde el servidor de Windows duran 20 segundos pero desde el nuevo servidor Solaris duran 157 segundos.

Alguna idea de que pueda ser?

Saludos,

Alberto

In reply to by Alberto (not verified)

Así a primera vista parece un problema de comunicaciones más que de versiones de BBDD o de SO, y más si son versiones 10g y 11g.
Yo revisaría que todas las comunicaciones entre los servidores estén funcionando al 100% y no haya nada que las esté ralentizando

Estimado Carlos, estoy creando el siguiente trigger:

create or replace trigger trg_autonumero
before insert on t_personas_atendidas
for each row
begin
if :new.codPer is null then
select personas_id.NextVal into :new.codPer from dual;
end if;
end;

y me da error de que "el identificador new.CodPer no se ha declarado", a que se debe.

hola! tengo un problema con un BDlink y espero me pudieras ayudar. tengo dos bases remotas con oracle 8, creo mi bdlink para conectarme a la otra BD y al probar el bdlink me dice que el enlace no esta activo y al hacer un select o una vista materializada a la BD donde me quiero conectar con el bdlink me dice que TNS:COULD NOT RESOLVE SERVICE NAME.

tengo otro enlace a otra BD remota y ese si funciona sin problemas, todos son oracle 8; no se si falte algo de configuracion en la bd a donde no puedo entrar.
gracias por la ayuda

Hola Carlos, quería ver si me puedes ayudar...

Necesito crear un sinónimo con db link para llamar a procedimiento de un paquete que está en otra base de datos pero no me funciona.
Es en Oracle.
Le pongo create public synonym xxx for paquete.procedimiento@dblink
y si lo crea pero cuando hago el llamado del sinónimo para ejecutarlo da error de que no reconoce el sinónimo.
Lo intenté hacer solo con el paquete pero igual cuando llamo al sinónimo como? le especifico cual procedimiento del paquete necesito?.

Si lo hago con un procedimiento solito si me funciona... es con paquete que no.

Si me puedes dar un pista!!.. please!. A ver si me dí a entender!.

Saludos Carlos.

Mi problema es el siguiente, tal vez me puedas ayudar !!

Tengo un problema con un DBLink al tratar de ejecutar un procedimiento dentro de un paquete

de la siguiente manera.

Por ejemplo: nombre_paquete.nombre_procedimiento@nombre_dblink(<parámetros>)

La situación es que se realizó una migración y en el servidor anterior todo funciona correctamente

pero en el nuevo servidor esto da problemas. Me han dicho que hay posibilidad de que dé problema

la ejecución de un procedimiento dentro de un paquete haciendo uso de dblinks. He llegado a

pensar que el problema puede ser de configuración del archivo de parámetros; sin embargo;

reviso el archivo y están prácticamente iguales. Las bases de datos tienen nombres distintos.

Básicamente al ejecutarlo obtengo los siguientes errores:

 

Gracias !!

In reply to by tavo.montero

La nueva base de datos tiene exactamente la misma versión que la antigua?

Buscando por el error he encontrado más de una referencia a un bug de la versión 10g, que se soluciona con un parche. También podría ser la misma versión y que a la nueva le falte aplicar el pachset, echa un vistazo por si acaso fuera eso..

 

This error is an interoperability error due to the bug 4511371, which is fixed by applying the 10.1.0.5.0 patchset for 10gR1 and 10.2.0.2.0 patchset for 10gR2.

Ref. Metalink note 4511371.8

Fuente: Oracle by Madrid

In reply to by Carlos

Saludos Carlos !!

Muchas gracias por tu pronta respuesta !!

 

En el ambiente anterior las dos bases de datos eran Oracle 10g Release 2 de 32 bits

En el nuevo ambiente una base de datos es Oracle 10g Release 2 de 32 bits y la otra

es Oracle 11g de 64 bits.

Menciono que en el ambiente anterior todo funcionaba perfectamente, leyendo tus comentarios

he visto que el problema se solucionaba con la Oracle 10g R 2, por lo que me extraña mucho

que en Oracle 11g 64 bits esté danto este problema.

Afectará mucho el manejo de los bits? Esto porque una es de 32 y la otra es de 64?

 

Muchas gracias Carlos !!

 

 

 

In reply to by tavo.montero

 El tema 32/64 bits siempre puede dar alguna sorpresa, pero yo antes me aseguraría de que la nueva 10g R2 tiene aplicado el patch. Aunque las dos BBDD tengan la misma versión puede que en la anterior estuviera aplicado y en la nueva no.

Busca más información en el metalink para asegurarte antes de hacer nada.

A parte de lo que me pueda parecer tú query... la solución podria ser aumentar el parámetro open_links y open_links_per_instance. Ambos parámetros tiene el valor por defecto 4. El primero de ellos es el número máximo de dblinks abiertos por una sesión. El segundo, como su nombre indica, por toda la instancia. De todas maneras, lo que te comentaba, si el valor por defecto es 4, por algo será... has pensado en formas alternativas de ejecutar dicha query? Saludos, Oscar Paredes - oscar.paredes@dataprix.com

Hola, mi pregunta es si puedo crear una tabla en mi base de datos a partir de otra tabla de otra base de datos usando dblink y si esto afecta el rendimiento de la aplicación. Muchas Gracias

In reply to by yajaira Pardo (not verified)

Sí, sin problemas, con Oracle SQL puedes crear una tabla a partir de otra con una sentencia CTAS:

CREATE AS SELECT ... FROM otra_tabla@dblink

Si no son muchos datos y la red va bien no deberías tener problemas de rendimiento. Si hablamos de millones de registros para arriba, y la red que conecta las dos bases de datos no va sobrada, tendrías que plantearte opciones de exportación e importación.

 

Buenas tardes Carlos, En el momento tengo dos bases de datos una 10g y la otra 11g, y estoy intentando actualizar una tabla en 10g que tiene un trigger el cual inserta datos en una tabla de 11g, pero me sale el siguiente error ORA-02070: database does not support in this context. Si ejecuto el insert de la tabla 11g directamente en el usuario 10g, me funciona sin problemas. Me puedes orientar porque desde el trigger no funciona, sera falta de alguna configuracion? Muchas Gracias.

In reply to by Caro (not verified)

Hola, Tal vez una solucion podria ser que ejecutaras tu insert desde un procedimiento autonomo invocado desde el trigger. saludos

Hola, estoy intentando ejecutar un sp desde un oracle 11g standar one a un oracle xe 10g por medio de un dblink, cuando lo ejecuto me sale el siguiente error: ORA-04052: se ha producido un error al consultar el objeto remoto FLYPASS.PCKFPS_PURGAR_COLAS@XEPUERTO.WORLD ORA-00604: se ha producido un error a nivel 1 de SQL recursivo ORA-06544: PL/SQL: error interno, argumentos: [55916], [], [], [], [], [], [], [] ORA-06553: PLS-801: error interno [55916] ORA-02063: 2 lines precediendo a XEPUERTO.WORLD 04052. 00000 - "error occurred when looking up remote object %s%s%s%s%s" *Cause: An error has occurred when trying to look up a remote object. *Action: Fix the error. Make sure the remote database system has run KGLR.SQL to create necessary views used for querying/looking up objects stored in the database. se que el dblink esta bien por que cuando consulto una tabla remota funciona pero con el sp no Gracias

Estimado, Estoy Trabajando En Apex Que Esta En Un Servidor Con Oracle Xe Y Conectandome A Un Servidor Remoto Para Sacar Los Datos De Produccion Lo Que Es Bastante Lento Y Tengo Dos Dudas Espero Me Pueda Ayudar:

1.- Mi Conexion Es A Traves De Dblink Me Comentaron Que De Esta Forma Es Lenta De Que Forma Me Puedo Conectar En Forma Mas Eficiente Manteniendo Mi Servidor Con Apex Y Mi Servidor De Produccion.

2.- Cuando Ejecuto Un Sql En "Sql Comand" De Apex, El Resultado Es Relativamente Rapido, Pero Al Correr Ese Mismo Sql En Una Pagina Este Se Hace Extremadamente Lento. Porque??? Que Pone Mi Pagina Tan Lenta Cuando Debe Mostrar Los Datos. No Estoy Paginando Las Paginas.

Muchas Gracias

hola amigos, tengo el siguiente problema al tratar de hacer un insert vía un dblink

ORA-01652: unable to extend temp segment by 128 in tablespace TEMP
ORA-02063: preceding line from LNK_HIST_SI

lo que hago es un
Insert into tabla@dblink
select from tabla
where condiciones
y excluyendo lo que ya este con un not exists tabla@dblink;

espero haber sido claro

si ejecuto el solo select no me da ningun problema pero cuando pongo el insert me da el error del tablespace TEMP
en ese tablespace tengo 5 GB y estoy tratando de insertar solo 5 registros.

gracias por los comentarios

Muy buenas tardes, una pregunta
Resulta que de sql server 2008 r2 hice un linked server a oracle 9i pero cuando consulto y traigo datos de una tabla de oracle a una en sql server me tarda demasiado tiempo en ejecutar.
No se si es normal porque en la tabla de oracle hay miles de registros, pero los registros los estoy filtrando por fecha no se donde estar el error o si es normal

gracias de antemano

Buenas noches, quería consultarte sobre un error que me está apareciendo en un aplicativo que usa un dblink desde Oracle a MySQL (un esquema de Oracle consume información de una base de datos Mysql), el dblink lo he hecho mediante el Oracle Gateway ODBC que viene con el Oracle, y el error es el siguiente:

java.sql.SQLException: Violación de protocolo
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:450)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:186)
at oracle.jdbc.driver.T4C7Ocommoncall.doOLOGOFF(T4C7Ocommoncall.java:61)
at oracle.jdbc.driver.T4CConnection.logoff(T4CConnection.java:491)
at oracle.jdbc.driver.PhysicalConnection.close(PhysicalConnection.java:3754)
at pe.gob.servir.cat.connection.factory.ConnectionFactory.CloseConexion(ConnectionFactory.java:73)
at pe.gob.servir.cat.persistencia.jdbc.MovimientoActivoDAO.getDatosActivosRemotosComplemento(MovimientoActivoDAO.java:218)
at pe.gob.servir.cat.persistencia.jdbc.MovimientoActivoDAO.main(MovimientoActivoDAO.java:384)

Exception in thread "main" java.lang.NegativeArraySizeException
at oracle.jdbc.driver.T4CMAREngine.unmarshalDALC(T4CMAREngine.java:2341)
at oracle.jdbc.driver.T4C8TTIuds.unmarshal(T4C8TTIuds.java:146)
at oracle.jdbc.driver.T4CTTIdcb.receiveCommon(T4CTTIdcb.java:200)
at oracle.jdbc.driver.T4CTTIdcb.receive(T4CTTIdcb.java:144)
at oracle.jdbc.driver.T4C8Oall.readDCB(T4C8Oall.java:771)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:346)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:186)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:521)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:205)
at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:861)
at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1145)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1267)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3449)
at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3493)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1491)
at pe.gob.servir.cat.persistencia.jdbc.MovimientoActivoDAO.getDatosActivosRemotosComplemento(MovimientoActivoDAO.java:198)

Por favor si tuviera alguna idea de a que se puede deber el error, le estaré agradecido me pueda ayudar

Buenas tardes, 

 

   Tengo creado un DB_Link de Sql Server 2012 a Oracle 11g, puedo hacer consultas a las bd que asigne. Pero me da un error al momento de realizar un update desde Oracle, para que me realice el cambio en la Bd Sql Server. el error es el siguiente:  ORA-02070 database does not support update in this context.

 

Por favor si me pueden ayudar se los agradeceria.

 

Saludos,

Tengo un procedimiento X creado en oracle 12c, en oracle 11g se creo un dblink para ejecutar ese procedimiento X, pero en ocasiones genera los siguientes errores:

ORA-04052: se ha producido un error al consultar el objeto remoto SYSTEM.PK_COR@ADMIN.xxx.com.co
ORA-00604: se ha producido un error a nivel 1 de SQL recursivo
ORA-12154: TNS:no se ha podido resolver el identificador de conexión especificado
04052. 00000 -  "error occurred when looking up remote object %s%s%s%s%s"
*Cause:    An error has occurred when trying to look up a remote object.
*Action:   Fix the error.  Make sure the remote database system has run
           KGLR.SQL to create necessary views used for querying/looking up
           objects stored in the database.

 

Carlos, no soy el dba, y no se como ayudar a corregir este error.  

 

gracias

hola carlos disculpa el abuso soy de venezuela y vi en un foro que tu respondes cosas de oracle o si otra persona me puede ayudar le agradezco. bueno te cuento lo que me sucede:

   tengo mi BD en oracle 10g y en otro servidor que no es de nosotros también tiene oracle no recuerdo si es la 10g o la 11g 

bueno el problema es el siguiente tengo una vista de mi servidor al otro servidor a través de un enlace de base de datos y chevere hago la consulta y funciona pero resulta que si por ejemplo:

tengo mi pantalla donde pido una cédula la consulto en la vista que es del otro servidor y trae el nombre y apellido todo bien hasta aquí, termino de llenar los datos ya de mi tabla que esta servidor y bien al momento de guardar revienta dice error de comunicación me di cuenta que es la vista remota hacia el otro servidor, ya que me cree una pantalla mas sencilla sin hacer la consultar hacia esa vista remota y ahi si guarda pero si pongo algo que consulte a esa vista y guardo en mi tabla sale ese error

 

PD no recuerdo si siempre pasa o es a ratos ese error el detalle es que sucede es al consultar una vista remota

 

gracias a todos

Tengo un problema. conectando entre un IBM i V7R1 , mediante DBLink a una DB Oracle me da un error de formato de de fecha.

 

  ORA-28500: la conexión de ORACLE a un sistema no Oracle ha devuelto este mensaje: [Oracle][ODBC DB2 Wire Protocol driver][UDB DB2 for iSeries and AS/400] STRING REPRESENTATION OF DATETIME VALUE HAS INVALID SYNTAX.  16 *N {HY000,NativeErr = -180} ORA-02063: 2 lines precediendo a DBL_PHIDRDA ORA-06512: en "DA_ABA.ABA_SOLICITUD", línea 547 ORA-06512: en línea 38   Alguien le paso esto?   Saludos y gracias por la ayuda

Buenas tarde disculpe las molestias pero estoy necesitando ayuda de un experto como usted. Al instalar Oracle11g Me da a elegir en una opcion si queremos instalar en forma de Escritorio o Servidor .. En cual de esos dos modos instalo para poder crear una DBlink?

In reply to by JonathanBlackgg (not verified)

Hola Jonathan

En principio no te va a influir en la posibilidad de crear DBLinks si haces la instalación en modo Desktop o en modo Server, ya que en ambos casos vas a instalar el mismo motor, solo que en el modo Server el instalador crea opciones de configuración más avanzadas.

Saludos,

Buenos dias, talvez ustedes me pueden ayudar. 

 

Necesito conectarme de un dblink de mi base en mi maquina a otro dblink creado en otra maquina.

 

 En pocas palabras la maquina A tiene un dblink para conectarse consultar tablas de la maquina B. pero la maquina B tiene un dblink para conectarse a una maquina C. 

 

quiero consultar tablas de la maquina C usando el dblink de la maquina B pero de la maquina A

Carlos, buenas tardes. le comento que he instalado dos base de datos Oracle 11g Express XE, y quiero generar un db link entre las dos base de datos. La verdad es que he buscado por todos lados, como hacer la conexion de estas dos base de datos, pero no puedo conectarme. me da error de time out cuando creo el db link. Dichas bases de datos, estan en diferentes servidores fisicos, las dos base de datos se llaman XE dado a que es la unica forma que se instala el 11g express. hay alguna limitante para generar db link entre dos base de datos express? que cosas puedo controlar o hacer, para generar dichas conexion. Desde ya muchas gracias y disculpa las molestias. César.

In reply to by César Heredia (not verified)

Que yo sepa Oracle XE no tiene ninguna limitación en cuanto a la creación de database links. Si lo que obtienes es un error de timeout puede que sea un problema de comunicaciones entre las dos bases de datos. Si están en diferentes servidores o máquinas puede que algún firewall o alguna regla impida que se comuniquen entre sí. Revisa sobretodo que los puertos que tengas configurados en las bases de datos, que estén abiertos.

Por defecto la base de datos utiliza el 1521, y para conexiones http el 8080. Si quieres consultar la configuración de los puertos puedes ejecutar desde linea de comandos con el usuario de sistema con que has hecho la instalación en windows, o un user que pertenezca al grupo de Oracle en Linux/Unix:

> lsnrctl status

Antes de nada recuerda también hacer un tnsping para validar que hay comunicación entre las dos bases de datos

Dejar el puerto 8080 por defecto para las comunicaciones por http de BBDD Oracle puede crearte problemas si ya utilizas este puerto para otras aplicaciones, que es algo bastante habitual.

Te muestro cómo consultar por SQL qué puerto tienes configurado en la base de datos, y cómo cambiarlo por otro, el 8089 por ejemplo:

SQL> select dbms_xdb.gethttpport from dual;
--------
    8080
SQL> exec dbms_xdb.sethttpport(8089);

 

Carlos buenas tardes. Mira tengo este problema con un DBLINK que en su momento funciona, actualmente me manda este error, de favor tus comentarios por donde puedo buscar o ver que es lo que esta pasando, el DBLINK existe. Me conecto a la base del DBLINK y sin problemas. Al utilizar el DBLINK y nada. 09:34:20 Error: ORA-03113: end-of-file on communication channel SALUDOS

Buen dia,

Sabes que ejecute un procedimiento que usaba dblink varias veces por error en la programación.

Ahora tengo el error presente y no puedo acceder a la aplicación.

El error:

ORA-04052: se ha producido un error al consultar el objeto remoto CLIENTEVIR.ANDES@WEB

ORA-00604: se ha producido un error a nivel 2 de SQL recursivo

ORA-02046: ya ha empezado la transacción distribuida

ORA-02063: line precediendo a WEB

He intentado varias cosas de las que refieres aqui y nada.

He probado: reiniciar el servidor, matar todas las sesiones y lo del dblink.

Alguna idea?????

Gracias,

Amigosm estoy haciendo un DBlink de oracle a mysql y en la configuración inicial que es configurar la ODBC.ini y el listener me arroja error por el SID. me podría ayudar a como realizar este procedimiento.

Backups de bases de datos Oracle

Backups de bases de datos Oracle Dataprix Fri, 05/07/2010 - 19:25

Abro este tema a proposito de una consulta de Monica sobre Backups de BBDD Oracle.

Como la creación y gestión de copias de seguridad es un tema muy amplio y puede dar para muchas aportaciones y discusiones mejor dedicarle un tema específico de este foro de BBDD Oracle. 

El tema de los backups de BBDD es demasiado amplio, y la utilización de un método u otro depende mucho de tus necesidades. Seguramente estaría bien escribir un artículo sólo sobre backups de BBDD Oracle, pero ahora mismo no creo que tenga tiempo de hacerlo.

Comentarte sólo que a partir de la versión 10g de Oracle la consola de administración web (Oracle Enterprise Manager) facilita mucho las tareas de backup, y es relativamente fácil preparar un sistema de backup  sencillo ayudándote del asistente.

Trabajar con RMAN, por ejemplo, requiere mucho más conocimiento.

Eso sí, te recomiendo que antes hagas pruebas en un entorno de desarrollo, con los backups no cuesta mucho acabar consumiendo todo el espacio disponible, o saturando los recursos del server de BBDD.

Te indico también algunos enlaces que he encontrado 'googleando', y pienso que te pueden ser útiles para empezar:

http://www.databasedesign-resource.com/oracle-backup.html

http://systemadmin.es/2009/10/realizar-un-export-backup-de-oracle-mediante-exp

 

Otra opción es utilizar Oracle Secure Backup para gestionar los backups de BBDD Oracle. Como mínimo tendrás una documentación muy completa en la web de Oracle sobre cómo utilizar este producto y establecer tus políticas de backups para bases de datos Oracle.

 

In reply to by Carlos

Segun mi propia experiencia, trabajar con RMAN no me parece tan complejo una vez profundizamos un poco. La copia es rápida y autocomprimida ocupa poco espacio.

Las copias desde Enterprise Manager son más sencillas pero a mi personalmente todo lo que se puede hacer desde la consola lo acabo haciendo desde linea de comandos... Es bonita pero no es muy de mi agrado para cualquier cosa que no sea detectar picos de uso en la base de datos.

Por cierto, si dispones de suficiente espacio y ventana horaria no está mal acompañar las copias de rman con un export (copia lógica) de la base de datos como apunta Carlos en su segundo enlace.

Hola carlos, la cuestion es esta

 

Soy algo nuevo con esto de las bases de datos, cuando yo tome el rol de DBA estaban las estructuras, usuarios, etc. ya creados y he dado una revisada y mantenimiento a esto en primera instancia, ahora queiro establecer un esquema de respaldos, actualmente solamente se hacen respaldos logicos de manera full diaria con el export, pero no se hacen respaldos fisicos de los ficheros de datos, control file, etc. pienso comenzar a hacer los respaldos en frio de la DB ya que esta en modo NOARCHIVELOG, alguna recomendacion que tengas para hacer este tipo de respaldo o algún sitio donde pueda tener mayor referencia tanto a respaldos en caliente y respaldos en frio,

 

saludos

Hola .. tengo un problema ...

en la universidad me mandaron hacer un proyecto de BDD

Oracle esta instalado en una mquina virtual  y la interfaz esta hecha  en una maquina fisica necesito sacar un respaldo de la base pero no se como hacerlo desde la maquina fisica a la virtual..

podrias ayudarme por favor

Checklist de Seguridad en Oracle

Checklist de Seguridad en Oracle drakon Tue, 10/24/2006 - 21:42

Oracle normalmente no lo acostumbraremos a encontrar en Pymes sino más bien en empresas grandes. Esto hace que nos tengamos que poner las pilas en términos de seguridad, no aplicar una simple configuración sino, como buenos DBA's, realizar un buen y detallado estudio.

Qué mejor que ayudarnos de un checklist de seguridad para poder aplicar una buena configuración y que no se nos pase absolutamente nada.

Es por ello que adjunto uno en formato pdf y que básicamente se divide en cuatro apartados:

  • Reforzamiento
  • Actualizaciones de Seguridad
  • Contraseñas por defecto
  • Puertos por defecto utilizados por Oracle.

Descarga el Checklist de Seguridad en Oracle adjunto.

 

Espero que os guste..

Attachment Size
Oracle_Database_Checklist.pdf 162 bytes

Como obtener la lista de tablas con más movimiento (insert,update) en Oracle

Como obtener la lista de tablas con más movimiento (insert,update) en Oracle il_masacratore Fri, 08/14/2009 - 13:46

A fin de obtener una lista aproximada de las tablas con más movimientos de la base de datos podemos consultar el contenido de la tabla dba_tables y cruzarlo con el estado actual de cada tabla en la bbdd. Esto puede tener sentido cuando queremos confeccionar una lista de tablas a las que se debe actualizar estadísticas periódicamente o queremos controlar la cantidad de información que genera alguna aplicación en concreto. Los datos que obtenemos por cada tabla son siempre respecto al último analisis de la misma.

La siguiente forma de hacerlo es un poco "rupestre" pero útil a la vez:

  1. Nos conectamos a la base de datos como system y ejecutamos la siguiente consulta que nos devolvera una lista de selects con todas las tablas de la base de datos (es mejor filtrar para no incluir las tablas de sistema o incluir solo las de un usuario en concreto). En el ejemplo obtendremos solo las de un usuario en concreto:

    select 'select ''' || table_name || ''' as TABLA, ''' || sysdate ||
           ''' as FECHA_ACTUAL, ''' || last_analyzed ||
           ''' as ULTIMO_ANALISIS, count(*) as RECUENTO,' || num_rows ||
           ' as RECUENTO_ANALISIS ,  to_date(''' || sysdate ||
           ''', ''DD/MM/YYYY'') - to_date(''' || last_analyzed ||
           ''',''DD/MM/YYYY'') as DIAS_DESDE_ANALISIS , count(*) - ' || num_rows ||
           ' as DIFERENCIA_RECUENTO, (count(*) - ' ||
           num_rows || ')/(to_date(''' || sysdate ||
           ''', ''DD/MM/YYYY'') - to_date(''' || last_analyzed ||
           ''',''DD/MM/YYYY'')) as INCREMENTO_DIARIO   from ' || owner || '.' ||
           table_name || ' union '
      from dba_Tables
    where owner = 'USUARIO'


    Ejemplo del resultado con plsql:

     

  2. Copiamos toda la columna en el portapapeles y quitamos el último union. Obtendremos el siguiente resultado:

    Podemos ver la tabla con los datos del último analisis de la tabla respecto a los actuales y la variación con su media diaria en número de registros (teniendo en cuenta que un insert(1row) + delete(1row) = 0movimientos )
     

Si a esto le sumamos otros datos como tamaños de fila, si la tabla tiene índices y lo que se nos ocurra podemos hacer otros "trabajos manuales" como acumular esos resultados en una tabla para ver que se cuece en nuestra base de datos.  Eso sí, cada uno puede adaptar esta técnica a su gusto para cubrir sus necesidades

Como recuperar la contraseña del usuario sys y system (Oracle 9i)

Como recuperar la contraseña del usuario sys y system (Oracle 9i) il_masacratore Fri, 07/17/2009 - 13:15

Si pasais a ocupar el puesto de DBA o administrador de Oracle y la persona saliente no os deja anotadas las contraseñas de los usuarios sys y system de la base de datos se puede proceder de la siguiente manera para intentar recuperarlas. Si tenemos el usuario root, podemos cambiar la contraseña de sys y system de Oracle.

Primero debemos conectarnos con SQLPlus al servidor Oracle con el usuario en el que corre la base de datos o root (conectar as sysdba).

A continuación cambiaremos la contraseña del usuario sys de Oracle:

$ sqlplus "/ as sysdba"
SQL*Plus: Release 9.2.0.1.0 - Production on Mon Apr 5 15:32:09 2004
Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.
Connected to:
Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production

SQL> show user
USER is "SYS"

SQL> passw system
Changing password for system
New password:
Retype new password:
Password changed
SQL> quit

 

Luego cambiaremos la contraseña del usuario system de Oracle: 

$ sqlplus "/ as system"

SQL*Plus: Release 9.2.0.1.0 - Production on Mon Apr 5 15:36:45 2004
Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

SP2-0306: Invalid option.
Usage: CONN[ECT] [logon] [AS {SYSDBA|SYSOPER}]
where <logon>  ::= <username>[/<password>][@<connect_string>] | /
 Enter user-name: system
Enter password:
Connected to:

Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production

SQL> passw sys

Changing password for sys
New password:
Retype new password:
Password changed

SQL> quit

Ahora ya deberíamos poder conectarnos a nuestra base de datos Oracle como usuario sys y system, utilizando los nuevos passwords que hemos introducido desde SQLPlus.

 


Libros de Administración Oracle (DBA) y PL/SQL

¿Quieres profundizar más en PL/SQL de Oracle o en administración de bases de datos Oracle? Puedes hacerlo consultando alguno de estos libros de Oracle.


 

Cómo crear un nuevo esquema en Oracle paso a paso

Cómo crear un nuevo esquema en Oracle paso a paso cfb Sun, 10/22/2006 - 21:44

Vamos a ver en tres sencillos pasos cómo crear un esquema de Oracle. Para poder crear un nuevo esquema de Oracle siguiendo estos pasos es necesario iniciar la sesión en la base de datos con un usuario con permisos de administración. Lo más sencillo es utilizar directamente el usuario SYSTEM:

  • Creación de un tablespace para datos y otro para índices. Estos tablespaces son la ubicación donde se almacenarán los objetos del esquema de Oracle que vamos a crear.

Tablespace para datos, con tamaño inicial de 1024 Mb, y auto extensible

CREATE TABLESPACE "APPDAT" LOGGING
DATAFILE '/export/home/oracle/oradata/datafiles/APPDAT.dbf' SIZE 1024M
EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO

Tablespace para índices, con tamaño inicial de 512 Mb, y auto extensible

CREATE TABLESPACE "APPIDX" LOGGING
DATAFILE '/export/home/oracle/oradata/datafiles/APPIDX.dbf' SIZE 512M
EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO

La creación de estos tablespaces no es obligatoria, pero sí recomendable, así cada usuario de la BD tendrá su propio espacio de datos.

  • Creación del usuario que va a trabajar sobre estos tablespaces, y que será el propietario de los objetos que se se creen en ellos
CREATE USER "APP" PROFILE "DEFAULT" IDENTIFIED BY "APPPWD"
DEFAULT TABLESPACE "APPDAT" TEMPORARY TABLESPACE "TEMP" ACCOUNT UNLOCK;

Si no se especifica un tablespace, la BD le asignará el tablespace USERS, que es el tablespace que se utiliza por defecto para los nuevos usuarios.
Se puede apreciar también que no hay ninguna referencia al tablespace de índices APPIDX que hemos creado. Si queremos mantener datos e índices separados habrá que acordarse de especificar este tablespace en las sentencias de creación de índices de este usuario, si no se hace éstos se crearán en APPDAT:

CREATE INDEX mi_indice ON mi_tabla(mi_campo)
TABLESPACE APPIDX;
  • Sólo falta asignarle los permisos necesarios para trabajar. Si se le asignan los roles 'Connect' y 'Resource' ya tiene los permisos mínimos, podrá conectarse a la base de datos y realizar las operaciones más habituales de consulta, modificación y creación de objetos en su propio esquema.
GRANT "CONNECT" TO "APP";
GRANT "RESOURCE" TO "APP";

Completamos la asignación de permisos con privilegios específicos sobre objetos del esquema Oracle para asegurarnos de que el usuario pueda realizar todas las operaciones que creamos necesarias

GRANT ALTER ANY INDEX TO "APP";
GRANT ALTER ANY SEQUENCE TO "APP";
GRANT ALTER ANY TABLE TO "APP";
GRANT ALTER ANY TRIGGER TO "APP";
GRANT CREATE ANY INDEX TO "APP";
GRANT CREATE ANY SEQUENCE TO "APP";
GRANT CREATE ANY SYNONYM TO "APP";
GRANT CREATE ANY TABLE TO "APP";
GRANT CREATE ANY TRIGGER TO "APP";
GRANT CREATE ANY VIEW TO "APP";
GRANT CREATE PROCEDURE TO "APP";
GRANT CREATE PUBLIC SYNONYM TO "APP";
GRANT CREATE TRIGGER TO "APP";
GRANT CREATE VIEW TO "APP";
GRANT DELETE ANY TABLE TO "APP";
GRANT DROP ANY INDEX TO "APP";
GRANT DROP ANY SEQUENCE TO "APP";
GRANT DROP ANY TABLE TO "APP";
GRANT DROP ANY TRIGGER TO "APP";
GRANT DROP ANY VIEW TO "APP";
GRANT INSERT ANY TABLE TO "APP";
GRANT QUERY REWRITE TO "APP";
GRANT SELECT ANY TABLE TO "APP";
GRANT UNLIMITED TABLESPACE TO "APP";

Ahora el usuario ya puede conectarse a la base de datos y comenzar a trabajar sobre su nuevo esquema Oracle.


Entrar en SQLPlus como dba sin introducir password

Entrar en SQLPlus como dba sin introducir password Carlos Mon, 03/31/2008 - 23:09

Si tienes el usuario de sistema con el que se ha instalado la base de datos Oracle puedes entrar en SQL plus como usuario DBA y sin introducir ninguna contraseña de la siguiente manera:

  1. Entra en el sistema con este usuario.
  2. Desde la linea de comandos, entra en SQLplus poniendo:
> sqlplus "/as sysdba"

 

Si has necesitado entrar así porque no recordabas la contraseña de algún usuario, ya puedes modificarla/s para poder utilizarlo/s después:

SQL> alter user nombre_usuario identified by nuevo_password;

 

Te puede pasar que haya más de una Base de datos Oracle instalada en el servidor, por lo que tendrás que asegurarte de que las variables de entorno del usuario de Oracle están apuntando a la base de datos que te interesa.

Para comprobar que has entrado en la base de datos correcta antes de tocar nada puedes ejecutar esta sentencia SQL:

SQL> select name from v$database;

 


Libros de Administración Oracle (DBA) y PL/SQL

¿Quieres profundizar más en PL/SQL de Oracle o en administración de bases de datos Oracle? Puedes hacerlo consultando alguno de estos libros de Oracle.


Hola me gustaria saber como hago lo mismo pero en centos

In reply to by helar (not verified)

No sé si te entiendo bien, no debería haber diferencia por ser CentOS, sólo tienes que abrir la consola de comandos y ejecutar SQLPlus, que lo tendrás disponible si tienes instalada la BD en esa máquina. Dentro de SQLPlus los comandos son SQL de Oracle, independientes del sistema operativo.

Saludos,

In reply to by Carlos

ok gracias lo pruebo,no conozco el tema en linux y necesito ingresar a la base oracle10g, pero desgraciadamente quien estaba encargado tuvo un accidente y no tengo ningun usuario ni contraseña de la base.
gracias por contestarme si tienes alguna sugerencia de como acceder a ella a parte de la que ya mensionaste me serviria de mucha ayuda.

In reply to by Anonimo (not verified)

Es muy sencillo entra al sistem operativo con Root que el usuario dueño con todos los previlegios en Linux, luego lo que tienes que hacer es subleval con el usuario que instalo la aplicacion oracle en linux, por ejemplo: "su oracle" y como eres root no te pide clave , ya estando con el usuario oracle, ejecutas esto: sqlplus '/ as sysdba' y ya estas dentro del manejador de base de datos oracle y ahi cambias el password de system y sys, los dos usuarios mas poderoso de base de datos y listo, puedes conectarte via grafico con cualquier herramientas.

Hola que tal

Trato de conectarme como indicas pero me marca el siguiente error, ya busque y no puedo encontrar por que es:

C:\oracle2\product\10.2.0\db_2\BIN>sqlplus "/as sysdba"

SQL*Plus: Release 10.2.0.1.0 - Production on MiÚ Nov 24 10:45:39 2010

Copyright (c) 1982, 2005, Oracle. All rights reserved.

ERROR:
ORA-12560: TNS:protocol adapter error

Enter user-name:
ERROR:
ORA-12560: TNS:protocol adapter error

Enter user-name:
ERROR:
ORA-12560: TNS:protocol adapter error

SP2-0157: unable to CONNECT to ORACLE after 3 attempts, exiting SQL*Plus

C:\oracle2\product\10.2.0\db_2\BIN>

Espero me puedas ayudar

Mil gracias

In reply to by Anele (not verified)

Puede ser porque las variables de entorno no estén bien definidas. Estás utilizando el mismo usuario de Windows con el que se hizo la instalación de Oracle? Con ese no te debería fallar.

Si has de utilizar otro tendrás que definir las variables de entorno para él. Si, por ejemplo, no puedes ejecutar SQLPLUS desde fuera del mismo directorio 'BIN' es que el usuario no las tiene definidas.

También puedes comprobar directamente si existe la variable de entorno ORACLE_SID, que debería contener el valor de la instancia local de Oracle.

Buen dia a todos! Buscamos perfiles ETL-IPC para trabajar en una compañía estadounidense de renombre internacional (Base en el DF.). Si cubres con el perfil y eres bilingüe envianos mensaje privado o envia tu CV a maricruz.martinez@estrategiasdetalentohumano.com  O si conoces de alguien que pueda estar interesado. Asi como este perfil, también tenemos más vacantes en el área de TI. Gracias!!
 

Me gustaria saber si alguien me puede hechar una manito, tengo en mi pc

Toad for Oracle 9 y oracle 8i, cargo una base de datos automáticas todos los días por la mañana, pero necesito que una query con la cual hago el filtro de esta carga se ejecute de forma automática y no manual como lo hago todos los días. Se que por medio de un bach, una llamada a sql plus, este bach o bat lo invoco con un scheduler de windows y podria funcionar... el tema es como hago el llamado a SQL PLUS con un bat.

Saludos y muchas gracias

Alejandro

In reply to by Alejandro Escobar Q. (not verified)

Alejandro, te has planteado hacerlo con un job de Oracle? Si tienes permisos para crear jobs y procedimientos almacenados puedes programar con un job la ejecución de un procedure que contenga la query de la carga, y lo haces todo desde la misma base de datos.

ayuda instale 2motores de BD,

oracle express edition 11g y ahora
oracle enterprise 11g

y trato de conectarme a oracle por sqlplus

pero tngo el siguiente error

ORA-12560:TNS: error del adaptador del protocolo

que puedo hacer para que se levante oracle
cuando tenia solo express edition no habia problema

saludos Andrés J

Buenos dias Carlos,

soy Fans de DATAPRIX y me gusta todo el conocimiento que aquí exponen.
Carlos la pregunta es la siguiente:

Tengo instalado en estos momentos en el servidor de producción Oracle Database 10g
Release 10.2.0.4.0 - 64bit Production

vamos a actualizar a la versión Oracle Database 11g Release 11.2.0.1.0 - 64bit Production

cual es la mejor forma de actualizar mi Oracle ? algunos me han dicho que instale Oracle 11g en el servidor y que cambie las variables de ambiente y despues apague mi ORacle 10g que actualmente es produccion ?

Tu cual me recomendaría teniendo en cuenta que la compañia solo da una espera de 1 dia para esta labor?

Gracias y felicitaciones por sus aportes a esta comunidad.

In reply to by guillermohaad (not verified)

Hola Guillermo

Hay varios métodos para hacer un upgrade de Oracle, y la utilización de cada uno depende de muchos factores, entre los que se incluye la experiencia que tengas como DBA, o las herramientas de Oracle que domines mejor.

Lo de cambiar las variables de entorno, puede que se pueda hacer en algún caso, pero me parece algo arriesgado, y seguramente tengas que 'toquetear' alguna cosa más. El factor más importante es el tiempo que puedas tener la base de datos parada, si puedes. Si ese día que comentas la base de datos puede estar parada, para mí el método más seguro es hacer un export en frío de la base de datos de producción, y un import sobre la instalación nueva de la 11g.

Si quieres plantearte otras opciones, he encontrado este artículo de la OTN de Oracle que plantea diferentes escenarios, y aconseja qué hacer en cada uno, tiene hasta un diagrama para ayudarte a tomar la decisión.

El método de utilizar el DBUA (Database Upgrade Assistant) de Oracle, que el artículo explica al final con mucho detalle, creo que también podría servir para el entorno que planteas.

Saludos,

En referencia a si se puede forzar la petición de contraseña a todos los usuarios.....

Podeis hacer....

Editar el sqlnet.ora
y poner
SQLNET.authentication_sevices=none

Entonces no podréis conectar directamente desde sqlplus con connect /as sysdba

dará el error ORA-01031: insufficient privileges

Saludos,
Francisco García Colacios
www.colacios.es

Hola a todos,
Me gustaría saber si alguine tiene conocimiento de algun metodo de poder detectar bloqueos en una BD oracle 10g y un comando para liberarlas. es decir existen nuevos comandos 10g a la fecha que hagan este trabajo.

Gracias
Cristian Ampuero

Buenas Tardes, necesito ejecutar varios comandos desde la consola para dar permisios a un rol para gestionar objetos tipo JOBS, ejecuto el primer comando SQLPLUS "SYS/PASSWORD@INSTANCIA AS SYSDBA" pero no me logra abrir el sqlplus, alguien podria ayudarme

#te validas como root su - #cambias a usuario oracle su - oracle #validas que la variable de entorno este bien y corresponda a tu BD. echo $ORACLE_SID sqlplus /nolog conn / as sysdba alter user sys identified by "nuevo_password";

buen dia, trato de conectarme a sqlplus con un usuario distinto a oracle, ya le defini las variables de entorno a el y me sale un error en el momento de coneccion "ora 12547 tns: lost contact

In reply to by yenifer (not verified)

Entiendo que te refieres igualmente a una conexión "sqlplus / as sysdba".

Yo no me encontrado nunca el error "ORA-12547 TNS: Lost Contact" que comentas al conectar con SQLPlus, así que te referencio un par de posts de otros sitios con posibles causas y soluciones para solventar este error de conexión de Oracle:

En Oracle DBA Blog mencionan 5 posibles causas para el error de Oracle ORA12457, y 5 posibles soluciones, basándose en el documento de soporte de Oracle 422173.1

En el blog Oracle en Español explican cómo utilizar la utilidad 'sysresv' para consultar los segmentos de memoria compartida y los semáforos que utiliza una instancia de Oracle:

> $ORACLE_HOME/bin/sysresv

En su caso, eliminando con el comando ipcrm los semáforos y la memoria compartida que le devolvía el comando sysresv, pudieron volver a entrar con SQLPlus /as sysdba sin encontrarse el error ora 12547:

> ipcrm -m [shared_memory_ID]
> ipcrm -s [semaphore_ID]

 

Espero que alguna de estas referencias te ayude a solucionar el error

Hola tengo una duda, resulta que en oracle 11g 2 tengo la siguiente contraseña "pass"(con todo y dobles comillas) al querer conectarme con sqlplus

con el siguiente comando sqlplys usr/"pass"/BD@10.10.10.10/ORACLE, me conecto sin problemas por medio de un .BAT, el problema es que si en ese mismo .BAT agrego lo siguiente no se conecta, no se conecta a la base de datos y por ende no hace la carga del archivo .CTL

 

sqlplus usr/"pass"/BD@10.10.10.10/ORACLE control = C:\Users\xxxx\Documents\Compartida\carga\archivocarga.ctl

 

yo creo que es por la contraseña con esos caracteres, sin embargo alguien sabe como escapar esos carcteres?

In reply to by Anonimo (not verified)

Prueba a escapar las comillas, para que Oracle no las interprete, con una contrabarra. Sería algo así:

sqlplus usr/\"pass\"/BD@10.10.10.10/ORACLE control = C:\Users\xxxx\Documents\Compartida\carga\archivocarga.ctl

 

Necesito una manito please, quiero pasar una consulta ya terminada en Oracle Report 6i a Oracle 11i, pero este me desconfigura el layout y no lo puedo arreglar, ademas no me deja modificar los width y sale todo amontonado.  

 

Saludos Carlos!

 

Te escribo de México, tengo un ERP montado en Oracle 11g y al parecer mi base de datos tuvo un problema, tengo 3 ambientes (test, productivo y practicas) pero solamente mi ambiente productivo esta fuera, las personas que estan revisando el caso me dicen que pueden ver la BD pero no logram ingresar a ella, la pregunta es si se puede ver la BD aun hay posibilidades de ingresar a ella? Tenemos un respaldo, pero es de hace un mes, por consiguiente nos interesa rescatar l aBD actual para no perder informacion.

 

saludos!

In reply to by Anonimo (not verified)

Lo normal es que al menos con SQLPlus desde el servidor local, y con el usuario administrador puedas entrar en la base de datos y revisar los errores que pueda tener si no se levanta. No te puedo decir mucho más, porque eso de que 'se vea' (entiendo que desde otro servidor) no me parece lo más relevante, me parece más importante revisar bien los logs y los errores que te devuelva la BD al intentar levantarla.

 

hola carlos disculpa una consulta me sale un error que no se ha podido realizar la conexion con el servidor verifique la conexion error n.--2147217843 Descripcion Ora-01017 nombre usuario/contraseña no validos conexion denegada.

me puede ayudar ya le cambie la contraseña como dices en e primer comentario pero me sigue saliendo el error alguna solucion. 

Gracias

Buen dia. Como puedo ejecutar un script desde SQLPlus con un usuario X de la Base de datos en un esquema Y. Es decir quiero que el usuario de la BD llamado "Carlos" ejecute un script de un paquete pero este quede en el esquema de Pedro, sin necesidad de cambiar la creación del paquete ni digitar la clave de "Pedro"

GRANT WITH GRANT OPTION: La propiedad transitiva en la concesión de permisos de Oracle

GRANT WITH GRANT OPTION: La propiedad transitiva en la concesión de permisos de Oracle Carlos Sat, 06/23/2007 - 13:40

La instrucción grant se utiliza para conceder determinados permisos genéricos o bien permisos sobre objetos a usuarios de bases de datos Oracle.

La sintaxis de GRANT para conceder permisos genéricos es la siguiente:

GRANT [privilegios_de_sistema | roles] 
TO [usuarios | roles |PUBLIC] {WITH GRANT OPTION } 

La sintaxis de GRANT para conceder  premisos sobre objetos es la siguiente:

GRANT [ALL {PRIVILEGES} | SELECT | INSERT | UPDATE | DELETE] ON objeto 
TO [usuario | rol | PUBLIC] {WITH GRANT OPTION} 

 

La sintaxis de GRANT es muy sencilla, y los privilegios los puede conceder el usuario propietario de los objetos, o un usuario con privilegios de concesión de permisos sobre objetos que no son suyos (DBA's).

Lo que quería comentar es la utilización de la opción de grant WITH GRANT OPTION, que permite que el usuario al que le han concedido permisos pueda a su vez concederlos a otros usuarios.

 

Ejemplo de GRANT WITH GRANT OPTION

Mostraré la utilidad de esta opción con un ejemplo:

Imaginemos que tenemos un usuario 'U_VISTA', que crea una vista con una consulta que consulta información de un objeto de otro usuario 'U_DATOS'. Hasta aquí es sencillo, ya que con un GRANT del usuario 'U_DATOS' al usuario 'U_VISTA' sobre esos objetos el tema está solucionado. U_DATOS:

SQL> GRANT SELECT ON TABLA TO U_VISTA;

El problema vendría si tenemos un tercer usuario 'U_CONSULTA', que tiene que utilizar esta vista. Se podría pensar que con dar permisos de acceso a este usuario a la consulta por parte de 'U_VISTA', y permisos de acceso a los objetos que consulta la vista por parte de 'U_DATOS' ya estaría todo bien: U_VISTA:

SQL> GRANT SELECT ON VISTA TO U_CONSULTA;

U_DATOS:

SQL> GRANT SELECT ON TABLA TO U_CONSULTA;

Pues no, no es suficiente porque para acceder a estos datos a través de la vista ha de ser el propio propietario de la vista quien conceda los permisos a un tercero. Digamos que para la concesión de privilegios no se cumple la propiedad transitiva.

Para que 'U_CONSULTA' pueda trabajar sobre la VISTA sin que la base de datos le devuelva un error ORA-00942, el propietario de los objetos (o un usuario DBA) ha de conceder privilegios sobre esos objetos al otro usuario, pero con permisos para que este pueda a su vez concederlos a otros usuarios (grant with grant option):

U_DATOS:

SQL> GRANT SELECT ON TABLA TO U_VISTA WITH GRANT OPTION;

U_VISTA:

SQL> GRANT SELECT ON U_DATOS.TABLA TO U_CONSULTA;
SQL> GRANT SELECT ON VISTA TO U_CONSULTA;

U_CONSULTA:

SQL> SELECT * FROM VISTA;

 

Y eso es todo, U_CONSULTA ya puede consultar los datos de la vista gracias a la opción WITH GRANT OPTION del GRANT.

Coméntalo en el foro

 


Libros de Administración Oracle (DBA) y PL/SQL

¿Quieres profundizar más en PL/SQL de Oracle o en administración de bases de datos Oracle? Puedes hacerlo consultando alguno de estos libros de Oracle.


Heterogeneous Services: Conexión desde Oracle a SQLServer - DBA Oracle

Heterogeneous Services: Conexión desde Oracle a SQLServer - DBA Oracle Oscar_paredes Sat, 12/30/2006 - 10:42

Este artículo para DBA's de Oracle explica como configurar los servicios de conexión heterogeneous de Oracle para poder visualizar bases de datos SQL Server desde un esquema Oracle, como si fueran objetos propios de Oracle.

En versiones antiguas de Oracle, esta conectividad se podía realizar a través de “Gateways” que se licenciaban de manera independiente del servidor Oracle, pero la posibilidad de realizar lo mismo en sentido contrario a través de SQL Server, posibilitó la aparición de los “Heterogeneous Services” de manera gratuita en Oracle.

Para poder realizar la configuración es necesario contar con los objetos necesarios del catálogo. Por defecto están instalados, pero en determinadas instalaciones puede ser necesario realizarlo manualmente. Para ello, ejecutar como SYS el fichero caths.sql del directorio %ORACLE_HOME%/rdbms/admin. Después, el DBA de Oracle sólo ha de seguir los siguientes pasos:

  • Crear un conector ODBC de SQL Server (System DSN) en el administrador de ODBC de Microsoft (por ejemplo, “sqlcon”)
     
  • Ajuste del fichero de inicialización de Heterogeneous Services
    Este fichero reside en ORACLE_HOME/HS/ADMIN, y su nombre depende del SID que se asigne al servicio. El nombre usado tipicamente es: hsodbc, de manera que el fichero se llamaría: inithsodbc.ora. Este fichero debe contener como mínimo los siguientes parámetros:

# Nombre de la conexión ODBC
HS_FDS_CONNECT_INFO = sqlmis
HS_FDS_TRACE_LEVEL = 0
HS_OPEN_CURSORS = 300

  • Configuración del fichero TNSNAMES.ORA
    Se debe añadir la siguiente entrada:

hsodbc =
    (DESCRIPTION =
       (ADDRESS_LIST =
       (ADDRESS = (PROTOCOL = TCP)(HOST = <IP_SERVIDOR> ) (PORT = 1521))
    )
    (CONNECT_DATA = (SID = hsodbc))
    (HS=OK)
    )

  • Configuración del fichero del Listener
    LISTENER.ORA: Se debe añadir a la SID_List el siguiente descriptor:

(SID_DESC =
    (SID_NAME = hsodbc)
    (ORACLE_HOME = C:\oracle\ora92)    # el ORACLE_HOME correspondiente
    (PROGRAM = hsodbc )
)

  • Reinicio del listener
    En los servicios del servidor reiniciar el servicio del listener.
     
  • Conectarse con un SQL*Plus a la instancia ORACLE, y crear un database link contra el SQL Server a través de HS:

SQL> create database link hsodbc connect to "usuario" identified by "password" using 'hsodbc'

El usuario y el password deben ser los usuarios de conexión a la BBDD de SQL Server. 
Por ejemplo, si el usuario es el “sa” los objetos a los que se llegará serán los objetos de la BBDD de sistema “master”.

 

Una vez configurado se puede acceder desde un esquema ORACLE a las tablas (objetos en general) de una BBDD SQL Server.
A modo de ejemplo, la sintaxis necesaria para realizar una simple join entre 2 tablas una Oracle y la otra SQL Server sería:

SELECT e.name, d.dept
FROM emp e, dept@hsodbc d
where e.id_dept=d.id_dept;

 

 

Oscar Paredes

IT Manager
Oracle DBA

oscar.paredes@dataprix.com

 

 

Attachment Size
XDAT012006.pdf 162 bytes

Este método sirve para cualquier base de datos? Se puede utilizar también con MySQL?

In reply to by Antonio (not verified)

Se puede conectar con el mismo sistema un Mysql a una base de datos Oracle.

Como ves el procedimiento sólo utiliza una conexión ODBC, que podría ser hacia SQL Server o hacia MySQL.

Un saludo,

In reply to by oscapt (not verified)

Realizando la conexión a MaxDB fu exitosa, se realizó siguiendo uno manuales publicados que encontre partiendo de este foro, lo que no he podido es conectarme a varias bases de datos, es decir, se configuran los archivos, pero como hace uno para habilitar un ODBC diferente. Me quiero conectar a una base de datos MaxDB y a otra SQLserver de manera simultánea. Gracias

Alguien sabe como enlazar una base de datos en SQL SERVER con una de ORACLE.

In reply to by ricardo (not verified)

Entiendo que quieres leer o escribir datos desde un SQL Server hacia un oracle.

En primer lugar debes tener el cliente de oracle en la maquina que va ha realizar el enlace. Puede que te sirva el conector OLEDB de SQL Server aunque no puedo asegurarlo puesto que en mi caso tengo las 2 bbdd en la misma máquina.

El nombre de servidor oracle debe ser: nombre_servidor_oracle/SID_oracle (no sirve nombre_servidor_oracle@sid)

usuario y password del schema a usar.

Con esto la conexión desde SQL Server a Oracle funciona perfectamente.

 

Saludos,

 

Sirve este sistema también para SQL Server 2005??

In reply to by Anonimo (not verified)

El hecho de utilizar un ODBC para el enlace con la base de datos destino hace que el sistema sirva para prácticamente cualquier base de datos.

Si en el servidor de la base de datos Oracle puedes configurar un ODBC que se conecte correctamente a otra base de datos, tienes que poder utilizar Heterogeneous Services para definir un enlace de Oracle a esta base de datos.

Con MySQL funciona, lo he podido comprobar personalmente, con SQLServer 2005 aún lo tendrás más fácil para definir el ODBC.

Carlos Fernández

Analista de sistemas

In reply to by Carlos

HOLA

 

sobre............"ejecutar como SYS el fichero caths.sql del directorio %ORACLE_HOME%/rdbms/admin." debo decir que uso el pl/sql ejecute el archivo como usuario sys y funciona mas o menos hasta la mitad del archivo y luego me sale error de sintaxis que no reconoce el comando SQL. como lo soluciono. SE QUE HA PASADO MUCHO TIEMPO DESDE QUE SALIO ESTE TUTORIAL PERO SI ALGUIEN VE ESTO POR FAVOR AYUDAAAAAA!!!!

In reply to by Percy (not verified)

PL/SQL? Lo haces desde una herramienta gráfica? Puede que ese sea el problema. Deberías ejecutarlo con SQLPlus, y dentro de una sesión del servidor donde está instalada la base de datos.

Si estás en linea de comandos con el usuario con el que se ha instalado la base de datos puedes hacer:

>sqlplus "/as sysdba"

Una vez dentro de SQLPLUS ejecutas el script con @ más el camino completo:

SQL>@oracle_home/rdbms/admin/caths

Si lo haces así no te debería fallar.

 Hola muy buena la respuesta de conexion conSqlServer... 

tengo un problema con la conexion Oracle_Access tengo mi base Oracle en Linux y una Base Acces en Windows con una aplicacion.... entonces quisiera saber como hacer la conxion de mi base oracle en Linux hacia la base Access en Windows

 

Gracias

Attm

Roger Reyes 

Buen post, aunque me llevó tiempo resolver un pequeño error.

se trata de la linea del TNSNAMES.ORA siguiente

(CONNECT_DATA = (SID = hsodbc))

que debería ser

(CONNECT_DATA = (SERVICE_NAME = hsodbc))

In reply to by luigi (not verified)

Creo que no es un error. El post se escribió hace tiempo, cuando se trabajaba normalmente con la versión 9i, y hasta esta versión todo funciona correctamente.

Si no me equivoco debes tener una 10g u 11g, y entonces la cadena sí que ha de ser la que indicas.
Resumiendo:

Para versiones <= 9i:
(CONNECT_DATA = (SID = hsodbc))

Para versiones posteriores a 9i:
(CONNECT_DATA = (SERVICE_NAME = hsodbc))

Gracias por la observación, luigi

Saludos

queria preguntar por un problema que me surge, se trata que ya me conecto a MySQL 4.1,
pero el problema es que no me despliega las columnas varchar de MySQL y solo me muestra el primer registro y las dos primeras columnas que son numéricas, la tabla tiene 4 columnas
Id tipo int
sucursal tipo double
nombre tipo text
cedula tipo text
, hago select * from facturas@mysql pero solo muestra Id y sucursal del primer registro,
incluso si hago select "nombre" from facturas@mysql me dice que no se conoce la columna
esta con minusculas igual que el MySQL, talvez saben que me falta configurar?

he hecho agregando la clausula WHERE funciona pero siempre me muestra un registro y no reconoce las columnas text, si por ahi tienen alguna pista les agradezco mucho de antemano

In reply to by Anonim. (not verified)

Me imagino que esto ya se resolvio esto hace mucho tiempo, pero para los que lleguen a leer, a mi me paso lo mismo y era la version del Odbc, utilice el 3.51.27 y listo.

In reply to by Siyulena (not verified)

El problema era de hace tiempo, pero seguro aún sigue pasando, así que gracias por compartir tu solución, seguro que va a ser de ayuda :)

 

Hola. En mi caso, requiero pasar los datos desde una base de datos MySQL ubicados en un servidor a una base de datos Oracle ubicados en otro servidor diferente o que por el contrario la base de datos Oracle vaya y consulte los datos de MySQL y los inserte en oracle. Qué necesitaría en este caso? es posible? Gracias de antemano.

In reply to by Anonimo (not verified)

Con MySQL también debería funcionarte. La única diferencia es que tendrás que definir el conector ODBC en el servidor de Oracle apuntando hacia MySQL en lugar de hacia SQL Server.

Saludos,
Estoy realizando una consulta desde oracle a una tabla que esta en sql server, pero mi problema es que me dice en oracle que el tamaño de logitud del nombre de la tabla es muy largo, hay manera de solucionar este problema sin que tenga que tener que cambiar el nombre de la tabla que se encuentra en sql server?

Ejemplo:

SELECT e.name, d.dept
FROM emp e, a1235456789012345678901234567899@hsodbc d
where e.id_dept=d.id_dept;

ORA-00972: identifier is too long

In reply to by Anonimo (not verified)

Has probado a crear una vista en SQL Server con el nombre de tabla 'corto' y llamarla desde HS?

create view v_a12354567890 as select * from a1235456789012345678901234567899

Puede que también te dé el error, pero la prueba es muy rápida.

Si esto no te sirve, una opción desde Oracle es utilizar el package de PL/SQL DBMS_HS_PASSTHROUGH, que te permite ejecutar sentencias en otras bases de datos y recibir los resultados sin que Oracle interprete nada.

No me preguntes cómo funciona porque no lo he utilizado aún, pero te enlazo la documentación del paquete por si te sirve de ayuda.

Quisiera saber si con solo poner el ORACLE_HOME funciona o si debo tener alguna libreria en especial. mi BD es ORACLE 11g y la necesito establecer la conexion con un windows server 2008 R2...

gracias

In reply to by Inquietud (not verified)

En principio no hace falta ninguna librería especial para utilizar Oracle heterogeneous services, sólo que existan los objetos del catálogo que dice el post, y seguir todos los pasos de configuración para que puedas utilizar un ODBC para conectar con SQL Server.

Buenas Tardes hay alguna forma de realizar una conexión desde Oracle a sqlserver sin licenciamiento de Oracle Gateway, o los diferentes driver ODBC licenciados que existen? mi caso es entre una bd Oracle 11.2.0.4 en AIX y una bd sqlserver 2008 r2, los 2 sistemas a 64bits

Hola Buenas Tardes Tengo una conexión de oracle a firebird ,pero al realizar un select * from all_tables@DBLINK, no reconoce algunas tablas de firebird ,las cuales las necesito para hacer algunos cruces. Estoy utilizando oracle 10,centos 6. Utilizando oracle 11 en windows funciona correctamente. Gracias

Indices invisibles en Oracle 11g

Indices invisibles en Oracle 11g Oscar_paredes Mon, 09/13/2010 - 20:04

A partir de la versión 11g Oracle permite la creación de índices llamados invisibles que permiten llevar realizar cosas realmente interesantes.

Esta invisibilidad se refiere a que el optimizador no tiene en cuenta la existencia de estos índices para la generación de los planes de ejecución.

Esto puede resultar muy interesante en bases de datos en Producción por ejemplo para:

  • En el caso de probar nuevos índices sin afectar a las sentencias SQL de las aplicaciones que atacan a la base de datos, puesto que se pueden activar/desactivar de manera muy rápida.
  • En el caso de querer probar ciertas sentencias SQL de aplicaciones sin índice sin tener que borrar el índice y perder tiempo recreándolo..

A partir de la versión 11g Oracle permite la creación de índices llamados invisibles que permiten llevar realizar cosas realmente interesantes.

Esta invisibilidad se refiere a que el optimizador no tiene en cuenta la existencia de estos índices para la generación de los planes de ejecución.

Esto puede resultar muy interesante en bases de datos en Producción por ejemplo para:

  • En el caso de probar nuevos índices sin afectar a las sentencias SQL de las aplicaciones que atacan a la base de datos, puesto que se pueden activar/desactivar de manera muy rápida.
  • En el caso de querer probar ciertas sentencias SQL de aplicaciones sin índice sin tener que borrar el índice y perder tiempo recreandolo.

Mientras un índice permanece invisible se va actualizando con las sentencias DDL (insert, update, ...), de manera que, los hace perfectos para este tipo de pruebas.

Un índice invisible se puede crear invisible o se puede alterar para que sea visible o invisible. Se puede consultar en que estado está un índice mediante la columna "visibility" de la vista DBA_INDEXES.

Un nuevo parámetro de inicialización controla la visibilidad o no de los índices invisibles "optimizer_use_invisible_indexes". Es decir, que aunque un índice sea invisible, si esta parámetro tiene el valor TRUE, el optimizador los ve y los puede usar sin problemas. Por lo que, recomiendo dejarlo siempre con el valor por defecto FALSE.
 

Ejemplo:

1) Verificamos el valor del parámetro que controla la visibilidad de los índices invisibles:

SQL> show parameter optimizer_use_invisible_indexes

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
optimizer_use_invisible_indexes boolean FALSE

2) Creamos una tabla de ejemplo con un indice visible:

SQL> create table prueba as select * from dba_tables;

SQL> create index i_prueba on prueba (table_name);

3) Consultamos su visibilidad

SQL> select index_name , visibility from dba_indexes where index_name = 'I_PRUEBA';

INDEX_NAME VISIBILITY
------------------------------ ------------------------------ ---------
I_PRUEBA VISIBLE

4) Consultamos su plan de ejecución forzando el uso del índice: Al ser visible el índice lo usará sin problemas.

SQL> explain plan
2> select /*+ index(prueba i_prueba) */ * from t where table_name

Explained.

SQL> select * from table(DBMS_XPLAN.DISPLAY);
Plan hash value: 2609566873

----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 18 | 1 (0)| 00:00:02 |
|* 1 | INDEX UNIQUE SCAN |I_PRUEBA | 1 | 18 | 1 (0)| 00:00:02 |
----------------------------------------------------------------------------------------

5) Hacemos invisible el índice

SQL> alter index I_PRUEBA invisible;

6) Consultamos su plan de ejecución forzando el uso del índice con un HINT: El optimizador no tiene en cuenta el índice invisible.

----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 93 | 1008 | 31 (0)| 00:00:20 |
|* 1 | TABLE ACCESS FULL | T | 93 | 1008 | 31 (0)| 00:00:20 |
----------------------------------------------------------------------------------------

 

 

Oscar Paredes

IT Manager
Oracle DBA

oscar.paredes@dataprix.com

 

 

Limitar número de conexiones por usuario

Limitar número de conexiones por usuario cfb Fri, 11/23/2007 - 10:34

Alguien sabe si en bases de datos Oracle hay alguna manera de limitar el número de conexiones por usuario, o el número de cursores abiertos por conexión de un usuario?

El número de sesiones se puede limitar con los profiles. Basta con añadir el número máximo de sesiones en el profile (sea el de por defecto u otro) y asignar al usuario en concreto.

In reply to by Oscar_paredes

Y para ampliar el número de sesiones abiertas en la base de datos?
He probado con la sentencia 'alter system set processes=150 scope=both' con el usuario de sistema, pero la BD me responde que no se puede:
ORA-02095: el parámetro de inicialización especificado no se puede modificar

También he probado a modificar directamente el parámetro en el spfileexe.ora del directorio dbs, pero este parámetro no aparece en el fichero.

Alguien podría decirme lo que puede estar pasando?
La base de datos sobre la que estoy trabajando es una OracleXE (Oracle Database 10g Express Edition Release 10.2.0.1.0)

In reply to by il_masacratore

Contrariamente a lo que me habían explicado se hace de la siguiente manera:
Ejecutamos:
SQL>ALTER SYSTEM SET PROCESSES=150 SCOPE=SPFILE;
y reiniciamos la base de datos.

Parece ser que al ser un parámetro estático y al poner BOTH para cambiarlo como si fuera dinámico falla. Para los estáticos se utiliza SPFILE.

Hasta los programadores de .NET sabemos de oracle!!

Ora10g: Creación de tablas e indices con la cláusula logging / nologging

Ora10g: Creación de tablas e indices con la cláusula logging / nologging il_masacratore Tue, 09/21/2010 - 15:30

 

La cláusula loggin/nologging añadida cuando creamos una tabla, índice, tablespace... determina si se crea registro de la sentencia en los redo log y su correcta restauración desde backup. Tiene guasa porque si creamos una tabla con opción nologging efectivamente no se crea registro pero de alguna manera esta si se tiene en cuenta en el diccionario de datos.

Ejemplo cronológico con malas consecuencias:
06:00 Hacemos backup con rman
09:00 Creamos tabla XXX (nologging)
09:45 Se pierde el datafile de la tabla
09:53 Recuperamos la base de datos (desde la copia, o desde la copia y archive)

Al terminar la recuperación los bloques correspondientes a la tabla/índice son marcados como corruptos y cuando intentemos acceder obtendremos un error como el siguiente:
ORA-01578: bloque de datos ORACLE corrupto (archivo número 43, bloque número 222806)
ORA-01110: archivo de datos 43: '/db/PROD/idatafiles/INDX3_20.dbf'
ORA-26040: Se ha cargado el bloque de datos utilizando la opción NOLOGGING

Casos como el anterior dan que pensar y debemos recapitular para tener más claro cuando hacerlo y cuando no. Debemos tener en cuenta:

  • Recuperación/Standby
    -Si la base de datos trabaja en modo archivelog. Si no es el caso tiene menos sentido usar la opción logging y por temas de rendimiento o volumen nos conviene más "probar suerte" y hacerlo con nologging.
    -Si las copias las hacemos con rman. Si trabajamos en modo archivelog y usarmos rman para hacer backups lo más lógico sería hacerlo todo con la opción logging para reducir la perdida de datos al mínimo.
    -Si tenemos una base de datos standby sincronizada mediante aplicación de archive logs. Es un caso como el anterior pero con más razón. Lo más lógico será hacer logging para que los objetos también se creen en el servidor en standby, tenemos que pensar que aquí podemos partir de una copia rman específica de hace tiempo y seguramente no estamos restaurandola cada semana ni cada mes.
    -Velocidad de recuperación. En la creación de índices podemos precindir del logging pero debemos considerar que luego puede tocar recrearlos en la base de datos restaurada.
     
  • Rendimiento
    -El tiempo necesario para la creación de la tabla/índice. Obviamente si no dejamos log ganamos en velocidad pero aumentamos el riesgo.
    -Lo asumible que es la pérdida de esa tabla índice mientras no sea recuperable. Si es una tabla que puede sobrar o prescindible (tabla de traza de cualquier aplicación) pues no pasa nada.

Con todo lo anterior y alguna cosa más que se queda en el tintero puede que nos decidamos a forzar el logging y quitarle ese poder de decisión al que ejecuta la sentencia de creación del objeto (más vale prevenir que curar, que luego vienen los llantos...). Aunque quizás no esté en sus manos, puede usar un ERP que es el intermediario en la creación de objetos de la base de datos y se los crea sin poder cambiar esa opción.

Mucho cuidado!! No vaya a ser que montemos una base de datos en standby y en el momento de la verdad cuando la vayamos a usar no tenga la mitad de las tablas.

Ora10g: ORA-00060 Deadlock detected (II)

Ora10g: ORA-00060 Deadlock detected (II) il_masacratore Thu, 04/21/2011 - 17:03

Siguiendo con el post anterior creo necesario comentar que existen otros tipos de bloqueo que se producen por un diseño conflictivo que se une a las peculiaridades de oracle.

Dejo primero la traza de ejemplo:

*** ACTION NAME:() 2011-04-21 14:08:01.227
*** MODULE NAME:(MiPrograma.exe) 2011-04-21 14:08:01.227
*** SERVICE NAME:(SYS$USERS) 2011-04-21 14:08:01.227
*** CLIENT ID:() 2011-04-21 14:08:01.227
*** SESSION ID:(1636.58026) 2011-04-21 14:08:01.227
DEADLOCK DETECTED ( ORA-00060 )
[Transaction Deadlock]
The following deadlock is not an ORACLE error. It is a
deadlock due to user error in the design of an application
or from issuing incorrect ad-hoc SQL. The following
information may aid in determining the deadlock:
Deadlock graph:
                       ---------Blocker(s)--------  ---------Waiter(s)---------
Resource Name          process session holds waits  process session holds waits
TM-0001f1b8-00000000        99    1636    SX   SSX       92    1461    SX   SSX
TM-0001f1b8-00000000        92    1461    SX   SSX       99    1636    SX   SSX
session 1636: DID 0001-0063-0003159E    session 1461: DID 0001-005C-000375B1
session 1461: DID 0001-005C-000375B1    session 1636: DID 0001-0063-0003159E
Rows waited on:
Session 1461: no row
Session 1636: no row

 

Aquí lo que primero nos llama la atención es que ya tenemos registros bloqueados como se ve abajo. Además el tipo de bloqueo es distinto (antes X o modo exclusivo, ahora SX o exclusivo compartido?). En la documentación podemos ver más de los tipos.

Aquí el tema está en que deadlocks con bloqueo tipo SX se producen al manipular tablas con claves foraneas donde el campo no está indexado (en la fk, no la pk de la tabla primaria) y estamos intendo hacer update/delete sobre la tabla principal. Por decirlo de alguna manera oracle necesita mantener la integridad referencial y consulta la hija para que se siga cumpliendo.

Solución en este caso? Crear siempre la clave primaria en la tabla principal, un indice y una foregin key en la tabla secundaria. Nada más...

Ora10g: ORA-00060 Deadlock detected

Ora10g: ORA-00060 Deadlock detected il_masacratore Thu, 01/27/2011 - 12:02

De vez en cuando puede pasar que dos sesiones que se pisen se bloqueen al intentar hacer cambios en los mismos datos (a nivel de registro o a nivel de tabla). En sistemas no concurrentes y/o bien diseñados no tiene por que pasar ya que las aplicaciones suelen estar mínimamente pensadas para evitarlo; o en todo caso en pruebas pre-producción ya se detecta y se corrige. El caso es que incluso aunque se planee evitarlos se pueden producir. En la mayoría de casos se resuelven solitos al acabar de realizar los cambios la sesión bloqueante, incluso ni nos daremos cuenta. En otros casos más infrecuentes se producen bloqueos circulares irresolubles, “deadlocks”, donde se acaba haciendo rollback de una transacción y se genera una entrada en el fichero de alerta:

ORA-00060: Deadlock detected. More info in file /opt/oracle/admin/XXX/udump/XXX_ora_28205.trc

Si consultamos el fichero de traza encontraremos información más detallada: sesiones involucradas, objeto, registro, consulta que lo provoca, etc... Aquí incluyo algunas partes de un fichero de ejemplo. En la primera parte del fichero vemos que sesión sufrirá el rollback(marcada en negrita) y más abajo vemos el bloqueo circular (donde la 1706 espera a la 1693 y viceversa):

...
*** ACTION NAME:() 2011-01-27 08:07:36.110
*** MODULE NAME:(Servicio.exe) 2011-01-27 08:07:36.110
*** SERVICE NAME:(SYS$USERS) 2011-01-27 08:07:36.110
*** SESSION ID:(1693.30703) 2011-01-27 08:07:36.110
DEADLOCK DETECTED ( ORA-00060 )
[Transaction Deadlock]
The following deadlock is not an ORACLE error. It is a
deadlock due to user error in the design of an application
or from issuing incorrect ad-hoc SQL. The following
information may aid in determining the deadlock:
Deadlock graph:
                       ---------Blocker(s)--------  ---------Waiter(s)---------
Resource Name          process session holds waits  process session holds waits
TX-00090022-00173f07        82    1693     X             21    1706           X
TX-00030014-0013a2dd        21    1706     X             82    1693           X
Rows waited on:
Session 1706: obj - rowid = 0000CF1C - AAAM8cAA5AAACX+AAF
  (dictionary objn - 53020, file - 57, block - 9726, slot - 5)
Session 1693: obj - rowid = 0000CF1C - AAAM8cAA5AAACX+AAI
  (dictionary objn - 53020, file - 57, block - 9726, slot - 8)
…

Con esta información también podemos saber exactamente que objetos y registro/s es el origen de la disputa. Si es algo que se repite de forma cíclica podemos ayudar al responsable de la aplicación dandole más datos (además de las consultas) para que lo resuelva. Para saber que registro de que tabla:

  1. Convertimos a decimal el obj que se indica al final en hex (0000CF1C->53020)
  2. Obtenemos el nombre del objeto del diccionario de datos:
         SELECT owner, object_name, object_type FROM dba_objects WHERE object_id = 53020;
  3. Consultamos la tabla obtenida buscando el registro por el rowid:
        SELECT * FROM tabla WHERE rowid=’AAAM8cAA5AAACX+AAF’’

Un poco más abajo del fichero también se puede ver que consultas han provocado el deadlock y otra información como la cantidad de “waits” de la session en cuestión etc...

Todo esto me hace gracia comentarlo porque a veces desarrolladores mal acostumbrados nos piden que comprobemos si existen bloqueos entre usuarios porque tienen algo que no va tan rápido como siempre. En contraposición también tenemos a usuarios muy impacientes, que cierran a saco sus aplicaciones... Si a ti te pillan en horario, te vienen a preguntar, lo miras sin renegar, miras si existe y si la sessión bloqueante sigue trabajando... Si es el caso y hay que esperar, ¿que le dices? La primera vez le explicas de que va el tema, la segunda vez se lo recuerdas y la tercera que se vaya a tomar un café...

Oracle 10g: Buscando actividad "extra-ordinaria" en nuestra base de datos

Oracle 10g: Buscando actividad "extra-ordinaria" en nuestra base de datos il_masacratore Mon, 07/05/2010 - 12:11

 

Al administrar nuestra base de datos tenemos que lidiar a veces con aplicaciones de terceros(ERPs, etc...) o desarrolladas dentro de la empresa que a veces pueden tener mal planteados algunos procesos o por el motivo que sea traten la base de datos como si fuera exclusivamente suya. Voy a mostraros un ejemplo:

Entorno:
-servidor con dos puntos de montaje. El del sistema operativo donde también residen los archivos de datos de la base de datos y un disco secundario donde tenemos los archivos de copia rman más los archivelogs.
-base de datos Oracle10g funcionando en modo archivelog.
-política de retención de copias de 3 días y 60 archive logs al día de media.

Sintoma:
-Nos quedamos sin espacio donde metemos los backups de la base de datos debido al crecimiento de la generación de más archivelogs de la cuenta.

Detectar la causa:
Si tenemos bien dimensionada la política de retención de backups pero de repente en nuestra base de datos se estan generando más archivelogs de la cuenta puede ser debido a una acividad "extra-ordinaria" en la base de datos. Para detectarla primero podemos consultar el número de ficheros que se generan por hora consultando la tabla v$log_history:

select to_char(FIRST_TIME,'DY, DD-MON-YYYY') day,
       decode(sum(decode(substr(to_char(FIRST_TIME,'HH24'),1,2),'00',1,0)),0,'-',sum(decode(substr(to_char(FIRST_TIME,'HH24'),1,2),'00',1,0))) d_0,
       decode(sum(decode(substr(to_char(FIRST_TIME,'HH24'),1,2),'01',1,0)),0,'-',sum(decode(substr(to_char(FIRST_TIME,'HH24'),1,2),'01',1,0))) d_1,
       decode(sum(decode(substr(to_char(FIRST_TIME,'HH24'),1,2),'02',1,0)),0,'-',sum(decode(substr(to_char(FIRST_TIME,'HH24'),1,2),'02',1,0))) d_2,
       decode(sum(decode(substr(to_char(FIRST_TIME,'HH24'),1,2),'03',1,0)),0,'-',sum(decode(substr(to_char(FIRST_TIME,'HH24'),1,2),'03',1,0))) d_3,
       decode(sum(decode(substr(to_char(FIRST_TIME,'HH24'),1,2),'04',1,0)),0,'-',sum(decode(substr(to_char(FIRST_TIME,'HH24'),1,2),'04',1,0))) d_4,
       decode(sum(decode(substr(to_char(FIRST_TIME,'HH24'),1,2),'05',1,0)),0,'-',sum(decode(substr(to_char(FIRST_TIME,'HH24'),1,2),'05',1,0))) d_5,
       decode(sum(decode(substr(to_char(FIRST_TIME,'HH24'),1,2),'06',1,0)),0,'-',sum(decode(substr(to_char(FIRST_TIME,'HH24'),1,2),'06',1,0))) d_6,
       decode(sum(decode(substr(to_char(FIRST_TIME,'HH24'),1,2),'07',1,0)),0,'-',sum(decode(substr(to_char(FIRST_TIME,'HH24'),1,2),'07',1,0))) d_7,
       decode(sum(decode(substr(to_char(FIRST_TIME,'HH24'),1,2),'08',1,0)),0,'-',sum(decode(substr(to_char(FIRST_TIME,'HH24'),1,2),'08',1,0))) d_5,
       decode(sum(decode(substr(to_char(FIRST_TIME,'HH24'),1,2),'09',1,0)),0,'-',sum(decode(substr(to_char(FIRST_TIME,'HH24'),1,2),'09',1,0))) d_9,
       decode(sum(decode(substr(to_char(FIRST_TIME,'HH24'),1,2),'10',1,0)),0,'-',sum(decode(substr(to_char(FIRST_TIME,'HH24'),1,2),'10',1,0))) d_10,
       decode(sum(decode(substr(to_char(FIRST_TIME,'HH24'),1,2),'11',1,0)),0,'-',sum(decode(substr(to_char(FIRST_TIME,'HH24'),1,2),'11',1,0))) d_11,
       decode(sum(decode(substr(to_char(FIRST_TIME,'HH24'),1,2),'12',1,0)),0,'-',sum(decode(substr(to_char(FIRST_TIME,'HH24'),1,2),'12',1,0))) d_12,
       decode(sum(decode(substr(to_char(FIRST_TIME,'HH24'),1,2),'13',1,0)),0,'-',sum(decode(substr(to_char(FIRST_TIME,'HH24'),1,2),'13',1,0))) d_13,
       decode(sum(decode(substr(to_char(FIRST_TIME,'HH24'),1,2),'14',1,0)),0,'-',sum(decode(substr(to_char(FIRST_TIME,'HH24'),1,2),'14',1,0))) d_14,
       decode(sum(decode(substr(to_char(FIRST_TIME,'HH24'),1,2),'15',1,0)),0,'-',sum(decode(substr(to_char(FIRST_TIME,'HH24'),1,2),'15',1,0))) d_15,
       decode(sum(decode(substr(to_char(FIRST_TIME,'HH24'),1,2),'16',1,0)),0,'-',sum(decode(substr(to_char(FIRST_TIME,'HH24'),1,2),'16',1,0))) d_16,
       decode(sum(decode(substr(to_char(FIRST_TIME,'HH24'),1,2),'17',1,0)),0,'-',sum(decode(substr(to_char(FIRST_TIME,'HH24'),1,2),'17',1,0))) d_17,
       decode(sum(decode(substr(to_char(FIRST_TIME,'HH24'),1,2),'18',1,0)),0,'-',sum(decode(substr(to_char(FIRST_TIME,'HH24'),1,2),'18',1,0))) d_18,
       decode(sum(decode(substr(to_char(FIRST_TIME,'HH24'),1,2),'19',1,0)),0,'-',sum(decode(substr(to_char(FIRST_TIME,'HH24'),1,2),'19',1,0))) d_19,
       decode(sum(decode(substr(to_char(FIRST_TIME,'HH24'),1,2),'20',1,0)),0,'-',sum(decode(substr(to_char(FIRST_TIME,'HH24'),1,2),'20',1,0))) d_20,
       decode(sum(decode(substr(to_char(FIRST_TIME,'HH24'),1,2),'21',1,0)),0,'-',sum(decode(substr(to_char(FIRST_TIME,'HH24'),1,2),'21',1,0))) d_21,
       decode(sum(decode(substr(to_char(FIRST_TIME,'HH24'),1,2),'22',1,0)),0,'-',sum(decode(substr(to_char(FIRST_TIME,'HH24'),1,2),'22',1,0))) d_22,
       decode(sum(decode(substr(to_char(FIRST_TIME,'HH24'),1,2),'23',1,0)),0,'-',sum(decode(substr(to_char(FIRST_TIME,'HH24'),1,2),'23',1,0))) d_23,
       count(trunc(FIRST_TIME)) Total
 from v$log_history
 group by to_char(FIRST_TIME,'DY, DD-MON-YYYY')
 order by to_date(substr(to_char(FIRST_TIME,'DY, DD-MON-YYYY'),5,15) )

 

(RESULTADO DE EJEMPLO)

Con esto ya vemos que hay un pico el lunes 1 de julio desde horas "intempestivas" hasta las 10:00 de la mañana. Si queremos informarnos más antes de hablar con los responsables podemos consultar la v$sqlarea para detectar consultar repetitivas y pesadas para conocer el sql, número de ejecucuciones, coste , etc... Una consulta ejemplo seria la siguiente:

SELECT sql_text "Sql",
         executions "Ejecuciones",       
         ceil(cpu_time/greatest(executions,1)) "Avg Cpu",
         ceil(elapsed_time/greatest(executions,1)) "Avg Disk",
         ceil(elapsed_time/greatest(executions,1)) "Avg Time"
  FROM v$sqlarea
  ORDER BY ceil(elapsed_time/greatest(executions,1)) desc,
           ceil(cpu_time/greatest(executions,1)) desc,
           ceil(disk_reads/greatest(executions,1)) desc;

De esta manera conoces la tabla que se está "populando" de forma masiva y puedes preguntar al desarrollador cubriendote la espalda de antemano ya que no siempre le conocemos, le tenemos confianza o simplemente sabemos que nos acabará ocultando lo que ha hecho... o peor aún NO SABE LO QUE ESTÁ HACIENDO!!
 

Oracle 10g: Estadísticas artesanales de nuestra base de datos en el tiempo

Oracle 10g: Estadísticas artesanales de nuestra base de datos en el tiempo il_masacratore Wed, 02/10/2010 - 12:20

Normalmente para analizar lo que pasa unas horas antes bastaría con consultar los datos históricos del Enterprise Manager pero no tenemos datos como el detalle de sesiones activas (si la cantidad total) o el estado o programa de cada una de ellas. También consultar las instantáneas en la consola web pero el problema sigue siendo el mismo, la falta de detalle. Pero no todo es insalvable y podemos en tres pasos completar esta información con algo más de detalle.

 

Paso 1: Crear una tabla con los datos que necesitaremos con un campo fecha.

Paso 2: Crear un procedimiento para alimentar la tabla con datos.

Paso 3: Crear un job con el usuario indicado para acumular datos.

 

Esta técnica puede ser “cutre” pero muchas veces sirve para analizar con más detalle y a nuestro gusto ciertas estadísticas que son visibles mediante vistas v$ que muestran el estado actual de la base de datos y que directamente no muestran un estado anterior en el tiempo.

 

Ejemplo para ver que está pasando con la apertura de conexiones y quién las hace:

Os podéis encontrar que en vuestra base de datos que tengáis problemas causados por la mala gestión de conexiones o choque entre aplicaciones que derivan en miles de conexiones abiertas. A esto se le puede sumar que esto ocurre fuera de horario y cuando sucede estamos normalmente en casa, sentados en el sofá viendo la tele.

 

Creación de la tabla:

create table AUDITORIA_SESIONES AS

(

select s.USERNAME, s.MACHINE, s.STATUS, count(*) as SESIONES, sysdate as FECHA
 from v$session s
group by s.USERNAME, s.MACHINE, s.STATUS

);

 

Creación del procedimiento:

create or replace procedure AUDITAR_SESIONES AS

begin

insert into AUDITORIA_SESIONES

(

select s.USERNAME, s.MACHINE, s.STATUS, count(*) as SESIONES, sysdate as FECHA
 from v$session s
group by s.USERNAME, s.MACHINE, s.STATUS

)

commit;

end;

 

En este caso se debe tener en cuenta que solo puede hacerse con el usuario sys y programar el job con su usuario. Ahora ya solo falta crear el job y consultar los datos cuando los necesitemos.

Ahora, ya depende de cada uno el uso que se le quiera dar. Esta manera de proceder nos puede sacar de un apurillo pero no es cuestión de llenar de basurilla la base de datos.

 

Oracle 10g: OPEN_CURSORS y SHARED_OPEN_CURSORS

Oracle 10g: OPEN_CURSORS y SHARED_OPEN_CURSORS il_masacratore Fri, 01/29/2010 - 16:21

Pasos que sigue Oracle para procesar una consulta:

1) Validación Sintáctica
2) Validación Semántica
3) Optimización
4) Generación del QEP (Query Execution Plan)
5) Ejecución del QEP (Query Execution Plan)

En algunos entornos nos podemos encontrar con aplicaciones que realizan ciertas consultas (y digo consultas) de forma muy reetiva de forma continua. Cuando el catálogo es muy amplio, continuo e inevitable debemos tener en cuenta dos parámetros de inicialización de la base de datos: open_cursors y session_cached_cursors.

Open_cursors nos permite establecer el límite de cursores por sesión y su seteo es muy directo. Si se necesitan 1000 y no hay nada que optimizar pues 1000 pondremos. En cambio Session_cached_cursors es algo más complejo y requiere analizarse en base al número máximo de cursores (open_cursors) y la cantidad actual de cursores que se mantienen en "cache" actualmente.

Consulta:

select
'session_cached_cursors'  parameter,
lpad(value, 5)  value,
decode(value, 0, '  n/a', to_char(100 * used / value, '990') || '%')  usage
from
( select
    max(s.value)  used
  from
    sys.v_$statname  n,
    sys.v_$sesstat  s
  where
    n.name = 'session cursor cache count' and
    s.statistic# = n.statistic#
),
( select
    value
  from
    sys.v_$parameter
  where
    name = 'session_cached_cursors'
)
union all
select
'open_cursors',
lpad(value, 5),
to_char(100 * used / value,  '990') || '%'
from
( select
    max(sum(s.value))  used
  from
    sys.v_$statname  n,
    sys.v_$sesstat  s
  where
    n.name in ('opened cursors current', 'session cursor cache count') and
    s.statistic# = n.statistic#
  group by
    s.sid
),
( select
    value
  from
    sys.v_$parameter
  where
    name = 'open_cursors'
) ;

Ejemplo:
PARAMETER              VALUE           USAGE
---------------------- --------------- -----
session_cached_cursors   100            100%
open_cursors             300             57%

Si con el valor actual observamos que el uso es del 100% podemos incrementar de forma moderada el parámetro session_cached_cursors y observar el resultado. Siempre que este por debajo estamos reutilizando todos los que son posibles y estamos optimizando al evitar el "hard parse" de la consulta reduciendo el uso de cpu. Pero cuidado, tampoco vale igualar este parámetro al número máximo de cursores ya que no es oro todo lo que reluce y cuanto más grande sea este valor mayor memoria estamos consumiendo y en servidores cortitos de harware puede pasar factura por otro sitio.

Oracle 10g: Resumir tablespaces transportando tablas e indices

Oracle 10g: Resumir tablespaces transportando tablas e indices il_masacratore Wed, 02/24/2010 - 16:21

Por el motivo que sea nos podemos encontrar que en nuestra base de datos Oracle tenemos muchos tablespace y para hacer un poquito de limpieza decidamos resumir los que estén duplicados. Entoces nos dirigimos a OEM y vemos una maravillosa liista de 50 tablespace con nombres sin sentido, algunos vacíos y otros por triplicado por que han llegado al tamaño que consideran máximo (en lugar de tres datafiles) etc etc... Llega el momento de ponerse manos a la obra.

Recordar que para ver el contenido de un tablespace nos podemos dirigir a Oracle Enterprise Manager y en la sección Administración>tablespaces marcar el que queramos, seleccionar en el desplegable Mostrar Dependencias y luego pulsando Ir. Luego veremos una segunda pestaña Dependientes. Ahí se muestran todos los objetos dependientes del tablespace (contenidos, vamos).

 

Ejemplo a) Solo índices

Nos encontramos que tenemos tres tablespaces IDX1, IDX2 e IDX3 que contiene índices creados por el mismo usuario APL y que son de la misma aplicación; lo que queremos hacer es resumirlos en un único tablespace IDX1. Para hacerlo podemos:

a)Hacer un export/import
b)Modificar indice por índice con la siguiente sql:
ALTER INDEX [indice] REBUILD TABLESPACE [nuevo tablespace]

La opción b) es una buena manera de hacerlo ya que aunque se tarde más el usuario seguro que no se dá ni cuenta.

 

Ejemplo b) Tablas e índices

Tenemos dos tablespace DAT1 y DAT2, y queremos mover las tablas de DAT2 a DAT1. Opciones:

a)Hacer un export/import
b)Modificar tabla por tabla (más sus índices*).
ALTER TABLE [tabla] MOVE TABLESPACE [nuevo tbspace];
ALTER INDEX [indice] REBUILD;

*En el caso de las tablas, al moverlas de un tablespace a otro hay que reconstruir los índices ya que quedan en estado “unusable”. Cualquier inserción posterior al traslado de tablespace sin la reconstrucción del indice producirá un error ORA.

 

Pues sí, con este método se puede hacer limpieza y organizar los tablespaces, y también ayuda a mejorar el rendimiento, ya que la reconstrucción de los mismos elimina la fragmentación de datos que puediera existir.

Oracle global_names

Oracle global_names il_masacratore Thu, 07/02/2009 - 13:26

Hola!

Puede alguien explicarme brevemente la utilidad de los global_names? Por lo que he visto existe un parámetro para activar o desactivar su uso. También existe una variable donde se guarda el nombre global de la base de datos actual.

¿Que se puede ver afectado si los desactivas?

¿Que puede verse afectado si cambias el nombre actual?

 

Buenas,

El nombre global de la base de datos se encuentra en la vista GLOBAL_NAME y está compuesto por el nombre de la base de datos (DB_NAME) más el nombre del dominio (DB_DOMAIN). La utilidad que tiene componerlo con un nombre de dominio es que permite distinguir o referenciar dos bases de datos que se llamen igual, pero que se encuentren en diferentes dominios.

Se me ocurre que yo podría tener, por ejemplo, una base de datos en el servidor de Dataprix, y un réplica de desarrollo en un PC de mi casa, y las distinguiría así:


SQL&gt; select * from global_name;
GLOBAL_NAME
------------------------------------------------------------
MIBD.DATAPRIX.COM

SQL&gt; select * from global_name;
GLOBAL_NAME
------------------------------------------------------------
MIBD.MICASA.COM

 

Si yo definiera un DBLINK a cada una desde una tercera BD, el dominio me permitiría distinguirlas.

Comentar también que a nivel de parámetros, el global database name se almacena en el parámetro SERVICE_NAMES del fichero de parámetros de inicialización.

 

Si cambias el nombre actual, si no estás en el caso que en tu sistema se acceda a dos bases de datos con el mismo nombre y diferentes dominios lo que deberías revisar sobretodo son los DBLINKS que haya definidos contra la BD, y teniendo en cuenta si el parámetro global_names (que no es lo mismo que la vista o sinónimo GLOBAL_NAME que acabamos de ver) está a TRUE o FALSE.

Si está a TRUE, este parámetro obliga a que los database links que se definan contra la base de datos utilicen como nombre el GLOBAL_NAME de la misma, por lo que en este caso, si cambias el GLOBAL_NAME, las sentencias que utilicen los DBLINKS devolverían un error ORA-02085 hasta que redefinieras el DBLINK, o modificaras el valor del parámetro global_names a FALSE.

Si global_names está a FALSE, la BD ya no obliga a que el DBLINK utilice el mismo nombre global que la BD que enlaza, pero el nombre global sigue siendo el mismo.

Si la BD arranca con spfile, para desactivar este chequeo a nivel de sistema basta con ejecutar: 


SQL&gt; ALTER SYSTEM SET global_names=FALSE;

Para evitar problemas, a menos que sea necesario hacerlo de otra manera por las razones que ya hemos comentado, yo suelo poner el parámetro global_names a FALSE, y el valor de GLOBAL_NAME con el mismo dominio que el de mi sistema (cuando creas la BD se suele quedar con el impresionante DB_DOMAIN de Oracle REGRESS.RDBMS.DEV.US.ORACLE.COM, que es fácil que nos de algún problema por su longitud). Modificarlo es tan fácil como:


SQL&gt; alter database rename GLOBAL_NAME to MIBD.DATAPRIX.COM;
Database altered.

 

 

Oracle10g: Cambiar el juego de carácteres de la base de datos

Oracle10g: Change the character set of the database il_masacratore Wed, 03/10/2010 - 10:23

It may happen that after you install or configure a new Oracle database we realize that the character set chosen during installation is not correct. What we may happen in cases like this is to delete the database and reconfigure it or worse ...But you do not. We can change the character set stopping the database, looking up strictly by changing the settings and restart the database. Howto:
 

- First we connect to the database 

$ sqlplus sys/pwd@prod as sysdba
 

- We stop the database 

SQL>SHUTDOWN IMMEDIATE;

 

- We raise strictly * 

SQL>STARTUP MOUNT;
SQL>ALTER SYSTEM ENABLE RESTRICTED SESSION;
SQL>ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
SQL>ALTER DATABASE OPEN;

- Change the character map 

SQL>ALTER DATABASE CHARACTER SET <new characters map>;

- Restart the database and yata 

SQL>SHUTDOWN IMMEDIATE;
SQL>STARTUP;

To verify that changes have taken effect can query the view v $ nls_parameters and check the value of nls_characterset. We know that according to changes in coding that we can lose data (if any) depending on the change.

* It is also useful to know to get up the database in restricted mode is very useful to carry out maintenance of the database that can be done faster when no user activity (such as rebuilding indexes, reduction of segments , etc).
 

Oracle10g: Manual standby database (planteamiento inicial)

Oracle10g: Manual standby database (initial approach) il_masacratore Wed, 03/24/2010 - 12:15

An Oracle database in Standby is an exact copy of an operational database on a remote server, used as a backup, and copy for reference, disaster recovery, etc..

A database in the Standby mode is more than a normal backup because it can be put into production disaster in less time than if we had to restore a copy (either from a simple rman or export).Restore a copy from file takes time, and during this period the system is unavailable. With an additional database in standby mode there is nothing (or almost nothing to restore) in case of disaster. Within minutes, allowing the change is continuity of service. It offers the performance advantages of a cluster or safety of the mirror but the ratio of costs versus benefits and leave time seems right to me.

From a global perspective:

"We have a copy of the database remotely, we can count as a second set of copies. "Unlike a simple backup, the copy is kept alive and the data is updated more frequently. "In a disaster we can use in minutes, without waiting to restore a full backup, either logical (export) or physical (RMAN). -Serves as a more realistic test environment to test patches and estimated time. The volume of data is identical. "I understand that a standby database can use up to 10 days a year without license fee (though you look at where Microsoft leaves 30 days ...)

From a technical standpoint:

"Changes in the primary database are captured in the redo log files. Redo-files are not permanent, are overwritten by rotation (in this state is not yet copied to the second server). "It makes a copy of redo log. The permanent copy log file is called. "The archive logs (copies of redo log) is transferred to the standby server. In systems such as Linux can do this by rsync. -Apply the archive logs are transferred to the standby database will be updated.

Globally the steps to mount the kiosk can be:

1. Set the primary database to run in archivelog mode.

2. Prepare a script to make a hot copy (using rman).

3. Create a standby control file (control file) in the main database.

4. Copy everything (configuration file, and copy control rman) on the second server (where we mount the database in standby).

5. Reconfiguring routes (DB_FILE_NAME_CONVERT in init.ora or using small hand).

6. Starting the second database mount standby database mode.

7. Restore Data (recover database).

8. Synchronize periodically (cron) transporting (rsync?) And applying the archive logs.

 

In another post I will try to go into more detail with an example ...and utilities that you can give.

 

Oracle10g: Poner la base de datos en modo archivelog y hacer backups con rman

Oracle10g: Poner la base de datos en modo archivelog y hacer backups con rman il_masacratore Thu, 06/17/2010 - 12:05

El modo archivelog de una base de datos Oracle protege contra la pérdida de datos cuando se produce un fallo en el medio físico y es el primer paso para poder hacer copias de seguridad(en caliente!!) con rman. Para poner la base de datos en modo archivelog (sin usar la flash recovery area) debemos hacer básicamente dos cosas, añadir dos parámetros nuevos al fichero de configuración, reiniciar la base de datos y cambiar el modo trabajo a archivelog.

Como poner la base de datos Oracle 10g en modo archivelog

  1. Editamos el init.ora para añadir los siguientes parámetros
    *.log_archive_dest='/ejemplo/backup/'
    *.log_archive_format='SID_%r_%t_%s'
     
  2. Reiniciamos la base de datos para que coja los cambios y nos aseguramos.
    SQL> shutdown immediate
    Database closed.
    Database dismounted.
    ORACLE instance shut down.
    SQL> startup mount pfile='/ejemplo/pfile/init.ora
    ORACLE instance started.
     
    Total System Global Area  272629760 bytes
    Fixed Size                   788472 bytes
    Variable Size             103806984 bytes
    Database Buffers          167772160 bytes
    Redo Buffers                 262144 bytes
    Database mounted.
    SQL> alter database archivelog;
    Database altered.
    SQL> alter database open;
    Database altered.
    SQL> create spfile;
    SQL> shutdown immediate;
    Database closed.
    Database dismounted.
    ORACLE instance shut down.
    SQL> startup

Backups con RMAN
 
Una vez tenemos la base de datos funcionando en modo archivelog ya podemos plantearnos hacer los backups con rman. Para hacerlos basta con editar un script donde básicamnte hacemos la copia y mantenemos archives en base a cuantos copias queremos mantener y cada cuando ejecutaremos el script. Solo debemos tener cuidado y dimensionar correctamente el número de copias y archivelog que mantemos en base al espacio disponible en el disco. Para saber cuanto espacio necesitaremos podemos aplicar la siguiente formula, suponiendo que la copia sea diaria:

Espacio necesario = (num_backups_rman_mantenidos*tamanyo_backups_rman)+(media_num_redos_al_dia)*(dias_mantenidos).
 

Pasos para empezar a hacer backups:

  1. Editamos el script de sistema para el lanzamiento (/ejemplo/scripts/rman.sh) :
    #!/bin/bash
    export ORACLE_HOME=/opt/oracle/product/10.2/db_1/
    export ORACLE_SID=SID
    /opt/oracle/product/10.2/db_1/bin/rman @/ejemplo/scripts/rman.sql > /backup/scripts/rman.log
     
  2. Script sql que lanzaremos con el sh anterior (/ejemplo/scripts/rman.sql). No hace falta comentarlo porque es muy fácil leer lo que está haciendo en cada paso. Vereis también donde se indica la caducidad de los backups y los archives.

    connect target root/password@SID
    run {
    CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 3 DAYS;

    CONFIGURE CONTROLFILE AUTOBACKUP ON;
    CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/ejemplo/backup/%F';

    CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT '/ejemplo/backup/%d_%Y%M%D%U';
    CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO COMPRESSED BACKUPSET;
    CONFIGURE MAXSETSIZE TO 8000M;

            backup database
            include current controlfile
            plus archivelog;

    CROSSCHECK BACKUP completed before 'sysdate - 4';       
    DELETE NOPROMPT OBSOLETE;                               
    DELETE NOPROMPT ARCHIVELOG UNTIL TIME "SYSDATE - 4";
    delete noprompt expired backup;
    delete noprompt expired archivelog all;
    report schema;
    }
    exit;
     

  3. Programamos la tarea (crontab?) y listo!!
     

Para más información sobre los archive redo logs aquí.

Reducción de Segmentos en Oracle 10g: Shrink Table

Reducción de Segmentos en Oracle 10g: Shrink Table Oscar_paredes Mon, 02/19/2007 - 19:41

En Oracle 10g existe una nueva funcionalidad para DBA's de Oracle para a la recuperación del espacio ocupado por una tabla sin necesidad de recrearla: SHRINK TABLE

Es habitual en versiones anteriores a la versión 10g el problema generado por el borrado de registros de una tabla y la generación de “huecos” a nivel de los bloques que componen esa tabla. A modo de ejemplo: es habitual para un DBA de Oracle la duda tras el borrado masivo de muchos registros de una tabla (o de todos) y la comprobación tras la eliminación de los registros de que la tabla ocupa exactamente lo mismo (misma HWM – High Water Mark).

Esta situación también se da en sistemas OLTP donde con el tiempo, y con las inserciones/borrados de registros en determinadas tablas, se van generando espacio no reutilizables por las nuevas inserciones por falta de espacio en los bloques incompletos, y a la larga caídas de rendimiento en los sistemas.

El método tradicional para recuperar este espacio consistía en realizar periódicamente export/import de la tabla en cuestión o recreación de la misma. Eso conllevaba una serie de problemas en la práctica como invalidación de índices, vistas, procedimientos…

En Oracle 10g surge la funcionalidad shrink table, que no sólo permite la recuperación de este espacio y recuperación del acceso óptimo a la misma, sino que permite realizarlo en 2 fases diferenciadas disminuyendo el tiempo de afectación a los usuarios.

Para que el DBA lleve a cabo esta recuperación de espacio puede seguir los siguientes pasos:

  • Habilitación de movimientos de filas:
SQL&gt; ALTER TABLE tabla ENABLE ROW MOVEMENT; 
  • Movimiento de las filas:
SQL&gt; ALTER TABLE tabla SHRINK SPACE COMPACT; 
  • Reseteo HWM
SQL&gt; ALTER TABLE tabla SHRINK SPACE; 

Tan solo durante el último punto del procedimiento existe bloqueo de tabla, pero sin duda el punto 2 es el más costoso en tiempo y se puede hacer totalmente online.

  

Oscar Paredes

IT Manager
Oracle DBA

oscar.paredes@dataprix.com

 

hola que tal es recomendable si se ha realizado un delete con una gran cantidad de registros... le afecta al performance de la base de datos?

Seguridad en Oracle

Seguridad en Oracle drakon Tue, 01/30/2007 - 22:15

En éste post os adjunto varios documentos PDF relacionados con la seguridad y administración de Oracle. Por una parte, sabiendo que incluso el sistema de contraseñas en Oracle 11g es débil, os linko un documento PDF publicado por NGSSoftware y que trata de ayudar a proteger Oracle bajo los ataques de fuerza bruta contra las contraseñas y además donde presenta la herramienta de fuerza bruta: OraBrute.

Por otra parte os linko otro documento PDF dónde explica cómo proteger Oracle en tan sólo 20 minutos que, aunque no es un sistema para proteger completamente la base de datos, sirve como mínimo para tapar aquellos agujeros más evidentes.

Finalmente una pequeña herramienta para aquellos técnicos que viajan de empresa en empresa y puedan aprovecharla. Se llama WinSID y es un sencillo descubridor de instancias de Oracle pero que para su ejecución no es necesario tener el cliente de Oracle instalado. Permite determinar si un servidor remoto tiene una base de datos Oracle y, en caso de encontrarla, obtiene información de servicios, el SID, estadísticas del listener, conexiones establecidas... y además genera un TSNNAMES.ORA para la conexión encontrada. ¿Qué os parece?

por un lado hablas de la base de datos (Oracle 10g) y por otro de Oracle Applications (Oracle Applications 11i).

Acabo de probar el WinSID, y la encuentro fácil de utilizar y bastante útil, hasta me ha devuelto una instancia de Oracle que yo desconocía en el servidor de desarrollo donde lo he probado!

Tablespaces Encriptados en Oracle 11g - Oracle DBA

Encrypted Tablespaces in Oracle 11g Oscar_paredes Sat, 06/11/2011 - 14:09

Since the release 1 of Oracle 11g, Oracle provides the ability to encrypt tablespaces in full, to protect sensitive data inside and accessible from the OS. That is, the objective of this new functionality is not to protect sensitive data of users of the database, but to protect the information of the tablespace datafiles.

 

To explain the usefulness of this feature, it is best to explain situations in which our data without this functionality would be vulnerable. For example, in the case file of a physical backup of a database tablespace were to wrong hands, could see some data "clear" without problems. For example, a single edition of tablespace (or a simple "cat") containing the Employees table, we show clear varchar2 fields can extract sensitive data (you do not believe, try it!).

 

For this functionality, Oracle uses the TDE - Transparent Data Encryption, by creating an Oracle Wallet that is stored on disk.By default, the location $ ORACLE_BASE / admin / $ ORACLE_SID / wallet, but you should change your location by using the parameter in the sqlnet.ora ENCRYPTION_WALLET_LOCATION.

 

For the creation of the Wallet: 

ALTER SYSTEM SET ENCRYPTION KEY AUTHENTICATED BY "myPassword";

  

The encrypted tablespace can be created as follows:

CREATE TABLESPACE seguro_tbs 
DATAFILE '/oradata/seguro_ts01.dbf.dbf' SIZE 1M
ENCRYPTION USING 'AES256'
DEFAULT STORAGE(ENCRYPT);

 

Unless stated otherwise, the encryption algorithm used is AES256 (Advanced Encryption Standard), but these algorithms are also allowed:

AES256

AES192

AES128

3DES168

When you restart the database, we open the wallet for consulting data encrypted tablespaces:

 ALTER SYSTEM SET WALLET OPEN IDENTIFIED BY "mypassword"; 

 

We can also close it at any time:

  ALTER SYSTEM SET WALLET CLOSE; 

 

If you don't open a wallet, the result of any query on any table that is the tablespace ORA-28365 error "is not open wallet."

 

Consulting if tablespace is encrypted or not can be made from the same view dba_tablespaces:

 

SQL> SELECT tablespace_name, encrypted FROM dba_tablespaces;
 TABLESPACE_NAME                ENCRYPTED
------------------------------ ---------
SYSTEM                         NO
SYSAUX                         NO
UNDOTBS1                       NO
TEMP                           NO
SEGURO_TBS                     YES

 

I hope you find it useful,

Oscar Paredes

Utilización de sinónimos para compartir objetos

Utilización de sinónimos para compartir objetos Carlos Sat, 11/25/2006 - 00:23

Cómo utilizar los sinónimos de Oracle para que un usuario pueda ver/utilizar objetos de un esquema que pertenezca a otro usuario. Es algo muy sencillo y realmente útil. Lo único que hay que hacer es crear un sinónimo para cada objeto que queramos 'compartir', y después asignar los permisos que interese al esquema que quiere acceder al objeto.

 -- Creación del sinónimo 

CREATE PUBLIC SYNONYM "MI_TABLA" FOR "YO"."MI_TABLA"; 

Utilizamos un sinónimo público para compartirlo para diferentes esquemas. La asignación de permisos sí que es específica para cada esquema que tenga que acceder al objeto

 -- Asignación de permisos para el usuario EL 

GRANT SELECT ON "YO"."MI_TABLA" TO "EL";
GRANT UPDATE ON "YO"."MI_TABLA" TO "EL";
GRANT INSERT ON "YO"."MI_TABLA" TO "EL";
GRANT DELETE ON "YO"."MI_TABLA" TO "EL";
-- Si se quiere dar acceso sólo de consulta a esta misma tabla para otro usuario, bastaría con hacer GRANT SELECT ON "YO"."MI_TABLA" TO "ELLA";

Ahora "EL" y "ELLA" ya pueden trabajar sobre "MI_TABLA" cada uno con los permisos que el propietario de la tabla ha decidido