Recopilación de artículos sobre Oracle
Recopilación de artículos sobre Oracle Dataprix 1 Agosto, 2008 - 09:18En este libro online vamos recopilando los artículos y entradas del foro y de blogs más interesantes sobre bases de datos Oracle y herramientas relacionadas.
Gracias a todos los usuarios de Dataprix que al compartir su conocimiento hacen que algunas cosas nos resulten más fáciles a los demás.
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.
Los libros que ves a continuación son una selección de los que a mi me parecen más interesantes para aprender administración y desarrollo PL/SQL, teniendo en cuenta precio y temática, espero que te puedan ser de utilidad:
- eBooks de Oracle gratuítos para la versión Kindle, o muy baratos (menos de 4€):
- Libros recomendados de Oracle
Administración de la base de datos
Administración de la base de datos Dataprix 8 Septiembre, 2009 - 09:46AWR Formatter para DBA's de Oracle
AWR Formatter para DBA's de Oracle Oscar_paredes 2 May, 2011 - 20:09Todo aquel, especialmente DBA's de Oracle, que suele mirar informes de rendimiento AWR en Oracle para analizar problemas de rendimiento, suele tener su propio procedimiento de lectura y aproximación a todos los datos que nos muestra este informe, pero como DBA siempre he echado en falta alguna herramienta que te facilite la lectura de todos los datos.
La he encontrado! “AWR Formatter” desarrollado por el Oracle DBA Tyler Muth permite facilitar esta lectura. Fantástico, debéis probarlo.
AWR Formatter es una extensión de Chrome (fichero con extensión .crx) gratuita que una vez instalado en el navegador, cada vez que visualizas un report AWR en html, te ofrece la posibilidad de formatearlo para ayudarte a ver toda su información.
Una vez formateado el texto, el HTML se ve en el navegador en distintas pestañas. Destaco las siguientes funcionalidades que te ofrece el formato añadido:
- Posibilidad de realizar dinámicamente conversiones de KB/MB/GB/TB en los distintos indicadores
- Posibilidad de consultar el significado de un determinado evento de espera, parámetro, etc… (esto es realmente útil)
- Tablas formateadas ordenables, casi como un Excel…
- Posibilidad de ver el texto de los comandos SQL’s…
Total, nada que ver con el mega fichero html estándar… una maravilla. Os lo podéis bajar gratuitamente del siguiente link:
http://dl.dropbox.com/u/4131944/AWR-Format/AWR-Format.crx
Una de las pestañas llamada “Observations”, pretende dar indicaciones de la lectura del report, pero es una primera aproximación, y por supuesto, cada Oracle DBA debe seguirlo según su responsabilidad.
Espero que lo disfrutéis,
Oscar Paredes
IT Manager
Oracle DBA
Acceso remoto mediante DBLink de Oracle
Acceso remoto mediante DBLink de Oracle Carlos 12 Marzo, 2007 - 23:18Para 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)
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 19 Octubre, 2009 - 16:08Abro 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.
no tengo el nombre de usuario y contraseña de oracle sql 9i
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
- Inicie sesión o registrese para enviar comentarios
Entrar en Oracle sin password
Puedes ver como entrar en SQLPlus con un usuario Oracle con rol sysdba en:
http://www.dataprix.com/entrar-en-sqlplus-como-dba-sin-introducir-passw…
Carlos Fernández
Analista de sistemas
- Inicie sesión o registrese para enviar comentarios
consulta DBLINKS. paquetes y variable Global_NAME
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
- Inicie sesión o registrese para enviar comentarios
Entiendo que desde SQLPlus la
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
- Inicie sesión o registrese para enviar comentarios
Hola se que usted es esperto
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.....
- Inicie sesión o registrese para enviar comentarios
En el TNSNAMES se agregan las
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;
- Inicie sesión o registrese para enviar comentarios
Carlos espero pueda ayudarme
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.
- Inicie sesión o registrese para enviar comentarios
Seguro que es un bug? Si
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.
- Inicie sesión o registrese para enviar comentarios
Carlos gracias por la pronta
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.
- Inicie sesión o registrese para enviar comentarios
Lo de RAC es un detalle
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.
- Inicie sesión o registrese para enviar comentarios
Hola Carlos... te saluda
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
- Inicie sesión o registrese para enviar comentarios
Hola Iván Parece sólo que no
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,
- Inicie sesión o registrese para enviar comentarios
Carlos ya hice todo lo que me
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...
- Inicie sesión o registrese para enviar comentarios
Puede que la base de datos
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!!
- Inicie sesión o registrese para enviar comentarios
Hola, ya hice lo del dominio,
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.
- Inicie sesión o registrese para enviar comentarios
Si has hecho el alter
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!!
- Inicie sesión o registrese para enviar comentarios
carlos no sirve mi db link ya
carlos no sirve mi db link ya hicimos todos como nos indicaste
y nada pero marca el mismo error.
el db link si lo crea pero al hacer la consulta marca el mismo error no se que sea gracias por la ayuda.
Andres.............
- Inicie sesión o registrese para enviar comentarios
No lo hemos especificado,
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..
- Inicie sesión o registrese para enviar comentarios
Tengo dos bases de datos
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
- Inicie sesión o registrese para enviar comentarios
La creación de vistas
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
andROWNUM
. -
The materialized view must not contain references to
RAW
orLONG
RAW
data types. -
It cannot contain a
SELECT
list subquery. -
It cannot contain analytical functions (for example,
RANK
) in theSELECT
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
, orNOT
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..
- Inicie sesión o registrese para enviar comentarios
Efectivamente, la opción
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 :)
- Inicie sesión o registrese para enviar comentarios
Estimado Carlos: Yo podria
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.
- Inicie sesión o registrese para enviar comentarios
Te entiendo, yo he tenido
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..
- Inicie sesión o registrese para enviar comentarios
Hola, mi pregunta es
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
- Inicie sesión o registrese para enviar comentarios
Para hacer una select no es
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.
- Inicie sesión o registrese para enviar comentarios
Hola Carlos. En mi caso
Hola Carlos.
En mi caso tambien utilizo dblinks para en una sola vista integrar datos de clietnes de dos servidores distintos.
He notado que cuando consulto datos de esa vista, despues de obtener los datos,
La BD mantiene la transaccion de esa consulta como bloqueada, y tengo que darle commit;
Es normal esto o como puedo configurar la vista para que en cuanto termine de usarse se cierre su transaccion?
Gracias!
- Inicie sesión o registrese para enviar comentarios
Buenas. El bloqueo que tienes
Buenas.
El bloqueo que tienes al utilizar dblinks es normal, ya que en Oracle cuando se utiliza un database link se genera un bloqueo de transacción, aunque sólo se relicen sentencias de SELECT.
Yo ya veo bien lo que estás haciendo, enviar un commit para finalizar la transacción o, si no se va a seguir utilizando el dblink en esa sesión, cerrar explícitamente el dblink para liberar los recursos:
ALTER SESSION CLOSE DATABASE LINK mi_dblink;
Según lo que tus procesos tengan que hacer después puedes plantearte también cerrar directamente la sesión y asegurarte así de liberar todos los recursos.
Saludos,
- Inicie sesión o registrese para enviar comentarios
Carlos: Tenemos una
Carlos:
Tenemos una aplicación Cliente Servidor desarrollada en VB6, la cual desde su BD en Oracle 10g accede, a través de un dblink, a otras tablas (también en Oracle 10g), se nos están quedando estas sesiones "colgadas" en el servidor remoto, por lo que tenemos que ejecutar la instrucción "alter session close data base link" al salir del cliente o inmediatamente después de hacer el query, es posible configurar esta instrucción en el servidor para que al hacer el logoff se ejecute o en el servidor remoto.
Gracias
- Inicie sesión o registrese para enviar comentarios
Si las sesiones se quedan
Si las sesiones se quedan colgadas es porque hay algún problema, no? En teoría al cerrar la sesión que abre el database link, éste se tiene que cerrar también.
Si no se cierra puede ser porque en la sesión se haya quedado alguna transacción sin terminar. Asegúrate de hacer un commit de todo lo que haya pendiente antes de que se cierre la sesión.
Comprueba también que no llegues al número máximo de cursores, aunque supongo que en ese caso ya habrías mencionado el error ORA-02020: too many database links in use.
Sobre si se puede hacer algo desde el servidor, yo creo que no, ya que como te digo, el comportamiento normal es que al cerrarse la sesión ya se cierre también el dblink.
- Inicie sesión o registrese para enviar comentarios
Carlos: Las sesiones que se
Carlos:
Las sesiones que se quedan "colgadas" son el servidor remoto, al cual es un repositorio de catálogos, es decir sólo se hacen querys no se inserta ni actualiza ningún tipo de información. Al salir del cliente si cerramos nuestra sesión, pero la que se levantó a través de la liga en el servidor remoto es la que se nos queda "colgada" y eso, segun el DBA, afecta el performance del servdidor remoto. Por eso pensaba que tal vez una configuración ya sea en el servidor de mi aplicación o en el remoto podría ayudar.
Gracias
- Inicie sesión o registrese para enviar comentarios
Vale, si he entendido bien
Vale, si he entendido bien tienes la base de datos de la aplicación, que podríamos llamar local, que abre un dblink para comunicarse con la base de datos servidora, el repositorio de catálogos.
Me reafirmo en que el comportamiento normal debería ser que al cerrar la sesión de la BD local también se cerrara el dblink, y si se queda la sesión colgada en la base de datos servidora es que existe algún problema, o que se está produciendo alguna espera.
Si me dices que todas las sentencias son de selección, podría ser que el problema estuviera justo en lo contrario de lo que te decía antes. Puede ser que se estén colando commits junto con las selects? La utilización de commits innecesarios a través de dblinks puede provocar problemas de rendimiento en la base de datos remota. Échale un vistazo a este post del blog Desempeño en Oracle, a ver si puede ser este tu caso.
Si no lo fuera lo que te recomiendo es que analicéis a fondo las sesiones abiertas en la base de datos remota, y busquéis indicadores de rendimiento anormal, como tiempos de espera demasiado elevados, que os puedan guiar para detectar el problema.
- Inicie sesión o registrese para enviar comentarios
Hola Carlos, tengo la
Hola Carlos, tengo la siguiente consulta, debo hacer un Dblink entre dos diferentes versiones de bases de datos entre la 7 y la 10, ¿es posible realizar esto?
gracias
Jorge
- Inicie sesión o registrese para enviar comentarios
Directamente no podrás
Directamente no podrás hacerlo, ya que Oracle no soporta la conexión por DBLink entre Oracle 7 y cualquier versión de base de datos superior a la 9.2.
Tendrías que subir de versión la base de datos hasta una 8 o una 9i como mínimo.
Si no te puedes plantear el upgrade, puedes intentar hacer un enlace 'puente' desde un cliente de Oracle 8, ya que esta versión puede comunicarse remotamente tanto con la versión 7 como con la 9i, y creo que también con la 10g.
- Inicie sesión o registrese para enviar comentarios
Hola. Tengo un error
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.
- Inicie sesión o registrese para enviar comentarios
Hola Juan No creo que sea un
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.
- Inicie sesión o registrese para enviar comentarios
Hola bueno tengo montado
Hola
bueno tengo montado oracle 10g sobre centos 5.5 ... configure el freedts y unixODBC en las pruebas de conexión que hago
puedo conectarme a la bd haciendo un llamado directo a la bd sql server (sin dblink), esto lo hago con las herramientas
tsql y isql
las consultas funcionan perfectamente, sin embargo cuando creo el dblink y hago la prueba de conexión de este me aparece el siguente error:
tambien haciendo pruebas con telnet al puerto 1433 se obtiene respuesta.
*********************************************************************
Link : "abc.xxx.COM"
Error : ORA-28545: error diagnosed by Net8 when connecting to an agent
Unable to retrieve text of NETWORK/NCR message 65535
ORA-02063: preceding 2 lines from abc
*********************************************************************
si tienen alguna sugerencia para resolver este error se los agradezco.
saludos.
- Inicie sesión o registrese para enviar comentarios
oscarw wrote: Hola bueno
[quote=oscarw]
Hola
bueno tengo montado oracle 10g sobre centos 5.5 ... configure el freedts y unixODBC en las pruebas de conexión que hago
puedo conectarme a la bd haciendo un llamado directo a la bd sql server (sin dblink), esto lo hago con las herramientas
tsql y isql
las consultas funcionan perfectamente, sin embargo cuando creo el dblink y hago la prueba de conexión de este me aparece el siguente error:
tambien haciendo pruebas con telnet al puerto 1433 se obtiene respuesta.
*********************************************************************
Link : "abc.xxx.COM"
Error : ORA-28545: error diagnosed by Net8 when connecting to an agent
Unable to retrieve text of NETWORK/NCR message 65535
ORA-02063: preceding 2 lines from abc
*********************************************************************
si tienen alguna sugerencia para resolver este error se los agradezco.
saludos.
[/quote]
un poco mas de información revisando el log que se genera para el listener, cuando se hace la prueba del dblink aparecen los siguientes errores:
23-JUN-2010 13:04:39 *
(CONNECT_DATA=(SERVICE_NAME=abc)(CID=(PROGRAM=)(HOST=zzz)(USER=userabc))) * (ADDRESS=(PROTOCOL=tcp)(HOST=xxx.xx.xx.xx)(PORT=55782)) * establish * abc* 12518
TNS-12518: TNS:listener could not hand off client connection
TNS-12547: TNS:lost contact
TNS-12560: TNS:protocol adapter error
TNS-00517: Lost contact
Linux Error: 32: Broken pipe
- Inicie sesión o registrese para enviar comentarios
A primera vista lo que me
A primera vista lo que me sorprende es el número de puerto que tienes en el log, 55782, y más si dices que la prueba de telnet la haces con el 1433. Asegúrate de que la conectividad, y sobrodo los puertos que tiene que utilizar la conexión están abiertos.
Lo mejor para validar conexiones de Oracle, después de haber comprobado el ping, es utilizar un TNSPING:
> tnsping nombre_del_servicio
o también
> tnsping ‘(ADDRESS=(PROTOCOL=tcp)(HOST=nombre_servidor_o_ip)(PORT=1575))’
- Inicie sesión o registrese para enviar comentarios
Hola las opciones que
Hola
las opciones que comentas del ping y el tnsping las use y siempre funcionaron de forma satisfactoria. Pero igual el problema seguía presentandose.
bueno finalmente ... luego de muchos cambios y pruebas infructuosas, encontré una referencia que el error tns-12518 se solucionaba parchando la bd 10.2.0.1 a 10.2.0.3. Pues bueno me he decidido hacerlo y enhorabuena que ha funcionado.
Carlos agradezco tus aportes.
bueno espero que si alguien tiene este inconveniente .. pues buen aquí esta la solución que me ha sacado de este rollo.
saludos.
- Inicie sesión o registrese para enviar comentarios
Hola! Tengo dos bases de
Hola!
Tengo dos bases de datos en Oracle, una base esta de forma local con 10g y la otra está en otro servidor de Oracle 9 tengo ambas conexiones con ODBC, mismas q funcionan perfectamente.
Como puedo realizar un query anidado de ambas bases de datos? pero sin cambiar el tsnames-- y si es necesario cambiarlo como hacer el query anidado de ambas dases de datos.
He leido que puedo hacerlo con un bdlink, pero ¿es necesario crear el bdlink? o ¿puedo hacerlo de otra forma?
pueden parecer tontas mis preguntas, pero de verdad que necesito un poco de ayuda.
100 gracias.
- Inicie sesión o registrese para enviar comentarios
Pues si quieres crear una
Pues si quieres crear una query que referencie a las dos bases de datos por lo menos en una tienes que crear el dblink. Si el problema que tienes es que no puedes acceder al TNSNAMES para modificarlo, puedes definir el DBLINK con toda la cadena que incluirías en el TNSNAMES.
Si no utilizas un dblink también podrías abrir un cursor para cada BD con cualquier lenguaje de desarrollo que te permita conectar por ODBC con BBDD Oracle, pero tendrás que anidar los cursores, no podrás crear una sentencia SQL que combine las dos bases de datos.
- Inicie sesión o registrese para enviar comentarios
Estimado, enhorabuena y
Estimado,
enhorabuena y gracias por el temita.
También tengo una consulta: tengo una aplicación Oracle y me piden un acceso via dblink desde una BD Adabas ¿es posible? ¿cómo?
gracias mil, y salud a porrillo.
- Inicie sesión o registrese para enviar comentarios
Si se puede acceder a Adabas
Si se puede acceder a Adabas por ODBC, puedes crear el Database Link de Oracle utilizando Heterogeneous Services.
Échale un vistazo al artículo Heterogeneous Services: Conexión desde Oracle a SQLServer.
Se pone como ejemplo cómo se hace con SQLServer, pero puedes hacerlo de la misma manera con otras bases de datos.
- Inicie sesión o registrese para enviar comentarios
Hola Carlos, Estoy trabajando
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
- Inicie sesión o registrese para enviar comentarios
Laila wrote: Estoy trabajando
[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.
- Inicie sesión o registrese para enviar comentarios
Hola Carlos, tengo un
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?
- Inicie sesión o registrese para enviar comentarios
Hola podría ayudarme con una
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.
- Inicie sesión o registrese para enviar comentarios
La verdad es que yo siempre
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..
- Inicie sesión o registrese para enviar comentarios
Hola podes revisar estas
Hola
podes revisar estas opciones creo que te pueden servir para lo que necesitas, haciendo uso de los dblinks
cursor integer
devuelve binary_integer
--esto para una db en sql server
ejecutar:= "exec insert .... commit"
cursor := DBMS_HS_PASSTHROUGH.OPEN_CURSOR@dblink;
DBMS_HS_PASSTHROUGH.PARSE(cursor, ejecutar);
devuelve := DBMS_HS_PASSTHROUGH.EXECUTE_NON_QUERY@dblink(cursor);
--cerrar
DBMS_HS_PASSTHROUGH.CLOSE_CURSOR@dblink(cursor);
bueno espero te sirva, nos cuentas como te fue.
saludos.
- Inicie sesión o registrese para enviar comentarios
tengo el siguiente
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
- Inicie sesión o registrese para enviar comentarios
Hola, Tengo un servidor en
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
- Inicie sesión o registrese para enviar comentarios
Así a primera vista parece un
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
- Inicie sesión o registrese para enviar comentarios
Estimado Carlos, estoy
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.
- Inicie sesión o registrese para enviar comentarios
hola! tengo un problema con
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
- Inicie sesión o registrese para enviar comentarios
Hola Carlos, quería ver si me
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!.
- Inicie sesión o registrese para enviar comentarios
Saludos Carlos. Mi problema
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 !!
- Inicie sesión o registrese para enviar comentarios
La nueva base de datos tiene
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
- Inicie sesión o registrese para enviar comentarios
Saludos Carlos !! Muchas
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 !!
- Inicie sesión o registrese para enviar comentarios
El tema 32/64 bits siempre
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.
- Inicie sesión o registrese para enviar comentarios
Una pregunta estimados
Una pregunta estimados amigos
instale BD Oracle 10G sobre windows7 y a diferencia del xp o vista no veo
en el regedit las variables de Oracle que antes se creabam en HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE
Quiero configurar la variable ui_icon para ver los iconos en el forms.
Por favor gracias anticipadas!
- Inicie sesión o registrese para enviar comentarios
Hola, tengo una BD en Oracle
Hola, tengo una BD en Oracle 9 que deseo migrar a Oracle10, quisiera saber qué diferencias en cuanto a DBlinks, vistas, sinónimos, etc o algun otro topic que debería considerar a la hora de la migración.
Muchas gracias.
- Inicie sesión o registrese para enviar comentarios
hola estoy tratando de hacer
hola estoy tratando de hacer un dblink como lo dice en la guia y me encuentro que cuando hago un select a la base remota me sale el siguiente error:
ora-12560:TSN:error del adaptador de protocolo
cual sera el problema, desde ya muchas gracias
- Inicie sesión o registrese para enviar comentarios
Hola verificaste que los
Hola
verificaste que los servicios heterogeneos estan bien configurados ?
como estas haciendo la consulta con el dblink ?
1. primero asegurarse que la conexion con la bd funciona para los servicios heterogeneos, se puede
usar el comando: isql -V bdconfigurada user pass si te da conexion no hay problema lo servicios estan bien configurados.
De lo contrario el dblink nunca te va funcionar.
- Inicie sesión o registrese para enviar comentarios
carlos wrote: Abro este tema
[quote=carlos]
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.
[/quote]
Hola Carlos, mi consulta es la siguiente: estoy utilizando oracle10g XE y tengo
creadas 15 bdlinks, el problema es que quiero unir los datos de las diferentes
tablas creando una vista utilizando un union all ya que las tablas a las que
quiero acceder tienen la misma estructura pero solo me permite crear la vista
con solo 4 dblinks, cuando quiero agregar uno más me dice
‘ORA-02020 demasiados enlaces de base datos en uso.’
Espero me puedas ayudar,
Saludos, Javier.
- Inicie sesión o registrese para enviar comentarios
A parte de lo que me pueda
- Inicie sesión o registrese para enviar comentarios
Buenas, tengo una
Buenas, tengo una pregunta.
He creado algunos dblink, conectando un oracle 10g con un sql server 2005 (usando el oracle gateway).
Hasta ahi todo va bien, porque puedo hacer select, insert, update, delete.
Bueno el siguiente paso fue utilizar un sp del sql server, desde el oracle. Para ello cree un procedimiento dentro de un paquete, a fin de poder llamar al procedimiento del sql, desde el oracle, de tal forma que tengo algo asi.
Procedimiento SQL
-----------------------------
create PROCEDURE [dbo].[TempSQLSP]
@inParam varchar(11),
@outParam int OUTPUT
AS
BEGIN
select @outParam = fkDepeCod from alumno where alumCod=@inParam
END
Procedimiento Oracle
----------------------------------
FUNCTION TEMP_ORACLE_FUNCTION ( inParam IN varchar2 )
RETURN NUMBER;
---------------
FUNCTION TEMP_ORACLE_FUNCTION ( inParam IN varchar2 )
RETURN NUMBER
IS
outParam NUMBER;
BEGIN
"dbo"."TempSQLSP"@Sqlserver (inParam, outParam);
commit;
RETURN 0;
END TEMP_ORACLE_FUNCTION;
Al ejecutar me sale un error,
Compilation errors for PACKAGE BODY TD.P_TEMP
Error: PLS-00306: número o tipos de argumentos erróneos al llamar a 'TempSQLSP'
Line: 486
Text: "dbo"."TempSQLSP"@Sqlserver (inParam, outParam);
Error: PL/SQL: Statement ignored
Line: 486
Text: "dbo"."TempSQLSP"@Sqlserver (inParam, outParam);
Gracias.
- Inicie sesión o registrese para enviar comentarios
Hola comunidad, tengo un
Hola comunidad, tengo un problema al tratar de cerrar un database link desde APEX
actualmente desarrollo una aplicación q obtiene la mayor parte de la informacion de otra base de datos (ACSEL)
para lo cual utilizo database link para las consultas y llamados a procedimientos
cada vez q se solicita una consulta un nuevo hilo de conexion database link es creado, necesito llevar el control de los hilos de conexion se que para cerrar una database link utilizamos el comando ALTER SESSION CLOSE DATABASE LINK nombredeldblink;
mas no consigo ejecutar esta sentencia dentro de APEX, alguna sugerencia??
de antemano gracias.
- Inicie sesión o registrese para enviar comentarios
Pero cuál es el problema que
Pero cuál es el problema que tienes al ejecutar el comando? Si te devuelve un error dinos cuál es.
Igualmente, si no consigues cerrar el dblink directamente, aunque seguro que no es la opción más eficiente, puedes probar a cerrar la sesión, ya que el cierre de la sesión debería hacer que la conexión del dblink también se libere.
- Inicie sesión o registrese para enviar comentarios
Hola, mi pregunta es si puedo
- Inicie sesión o registrese para enviar comentarios
Sí, sin problemas, con Oracle
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.
- Inicie sesión o registrese para enviar comentarios
Buenas tardes Carlos, En el
- Inicie sesión o registrese para enviar comentarios
Hola, Tal vez una solucion
- Inicie sesión o registrese para enviar comentarios
alguien me puede ayudar con
alguien me puede ayudar con esto
Tengo un procedimiento en una base de datos A que necesita ejecutar un procedimiento en una base de datos B, ya tengo el dblink entre las dos bases dedatos y puedo invocar tablas y llamar procedimientos, el problema esque el procedimiento B recibe como parametro un type table que esta definido en esa base de datos, yo creo el type el la base de datos origen(A) y lo lleno con datos y se lo envio como parametro, pero me sale un error que puedo hacer
declare
varnum number;
equipo number:=11127;
operacion number:=68;
impresora varchar2(100);
mensaje varchar2(100);
tDetalleV PRUEBA_TAB_TYPE := PRUEBA_TAB_TYPE();
rtDetalleV PRUEBA_TYPE := PRUEBA_TYPE(0,'',0,0);
n_registros NUMBER := 0;
nusuarioventa number;
begin
tDetalleV.extend;
n_registros:=n_registros+1;
rtdetallev.ide_producto:=1;
rtDetalleV.descripcion:='hola';
rtDetalleV.vlr_unitario:=10;
rtdetallev.cantidad:=1;
tDetalleV(n_registros):=rtDetalleV;
ganasw.facturacion.facturar_productos_prueba@DIVEDLLO_A_GANADLLO(tDetalleV,mensaje);
dbms_output.put_line(mensaje);
end;
Informe de error:
ORA-06550: línea 38, columna 1:
PLS-00306: wrong number or types of arguments in call to 'FACTURAR_PRODUCTOS_PRUEBA'
ORA-06550: línea 38, columna 1:
PL/SQL: Statement ignored
06550. 00000 - "line %s, column %s:\n%s"
*cause: usually a pl/sql compilation error.
- Inicie sesión o registrese para enviar comentarios
Hola, estoy intentando
- Inicie sesión o registrese para enviar comentarios
Estimado, Estoy Trabajando En
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
- Inicie sesión o registrese para enviar comentarios
hola amigos, tengo el
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
- Inicie sesión o registrese para enviar comentarios
Muy buenas tardes, una
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
- Inicie sesión o registrese para enviar comentarios
Buenas noches, quería
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
- Inicie sesión o registrese para enviar comentarios
Buenas tardes, Tengo
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,
- Inicie sesión o registrese para enviar comentarios
Y a nivel de ejecución de
Y a nivel de ejecución de proc. Almacenados, éstos se pueden ejecutar desde oracle 9i a un 11gr2 vía dblink??
gracias
- Inicie sesión o registrese para enviar comentarios
Tengo un procedimiento X
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
- Inicie sesión o registrese para enviar comentarios
hola carlos disculpa el abuso
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
- Inicie sesión o registrese para enviar comentarios
¿Puedes copiar el texto
¿Puedes copiar el texto completo del error, y la consulta que haces con el dblink remoto?
- Inicie sesión o registrese para enviar comentarios
Tengo un problema. conectando
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
- Inicie sesión o registrese para enviar comentarios
Buenas tarde disculpe las
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?
- Inicie sesión o registrese para enviar comentarios
Hola Jonathan En principio no
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,
- Inicie sesión o registrese para enviar comentarios
Buenos dias, talvez ustedes
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
- Inicie sesión o registrese para enviar comentarios
Carlos, buenas tardes. le
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.
- Inicie sesión o registrese para enviar comentarios
Que yo sepa Oracle XE no
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);
- Inicie sesión o registrese para enviar comentarios
Carlos buenas tardes. Mira
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
- Inicie sesión o registrese para enviar comentarios
Buen dia, Sabes que ejecute
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,
- Inicie sesión o registrese para enviar comentarios
Amigosm estoy haciendo un
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.
- Inicie sesión o registrese para enviar comentarios
Backups de bases de datos Oracle
Backups de bases de datos Oracle Dataprix 7 May, 2010 - 19:25Abro 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
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.
- Inicie sesión o registrese para enviar comentarios
Segun mi propia experiencia,
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.
- Inicie sesión o registrese para enviar comentarios
Hola Carlos, Tus notas son
Hola Carlos,
Tus notas son interesantes. Te cuento que tengo un problema, actualmente uso rman, antes todo funcionaba bien porque mis backups salian a disco y todos felices el catalogo no requeria mucho mantenimento. hace dos meses compraron la solucion del tivoli y ahora los backups salen directo a cinta. Los problemas que tengo son los siguientes:
- Mi escenario es que algunos backups estan en modo expired y otros en modo available.
- Necesito que los backups que estan en modo expired, pasen a modo available.
- Se requiere que se borre solo los backups, de hace un mes, los anteriores no se deben eliminar, es decir quiero que sigan en el catalogo como available. solo se requiere elimnar los del 14 de mayo de este año hasta el 14 de junio de este año.
Se requiere esto, porque tivoli dice que si los borro de mi catalogo, tivoli los borra de cinta.
Lo de borrar por fechas es posible?
He probado los siguientes comandos.
*delete backup tag='numero de tag del backup', pero no lo borra por lo menos en el catalogo sigue apareciendo.
*no quiero hacer delete expired backup, porque va a borrar los del año pasado, y eso aun los necesitamos, dado que ahi esta en backup anual, porque cuando me piden restaurar la data, yo hago un duplicate con rman, y si ese backup se elimina del catalogo, ya no voy a poder hacer el duplicate o si?
Espero me puedas ayudar. Gracias
Saludos,
- Inicie sesión o registrese para enviar comentarios
Pues con RMAN tengo muy poca
Pues con RMAN tengo muy poca experiencia, no voy a poder ayudarte, a ver si alguien lo ha manejado más y nos explica cómo resolver las cuestiones que planteas.
Un saludo,
- Inicie sesión o registrese para enviar comentarios
Hola me podrian ayudar a como
Hola me podrian ayudar a como escojer un esquema e impórtelo en otra
base de datos, teniendo en cuenta de solo subir la data y teniendo en
cuenta que el esquema pre existe,
debe subirse la información correspondiente a los
backups del 06 junio 2009, 15 agosto 2009, 01 enero 2010 en un tablespace
les agradezco mucho el favor su pagina es muy buena
- Inicie sesión o registrese para enviar comentarios
Para hacer una
Para hacer una exportación/importación de sólo uno o dos esquemas quizás lo más sencillo sea utilizar la utilidad imp/exp de Oracle.
No se la versión de BD que tienes, pero a partir de la versión 10g también se puede usar Oracle Data Pump, que dicen que es más eficiente, pero imp/exp también debería funcionarte bien.
Te pongo un ejemplo de algo parecido a lo que haría yo, pero busca documentación sobre las opciones, haz alguna prueba y adáptalo a tu caso.
Desde linea de comandos, y utilizando el usuario propietario de la instalación de Oracle, o uno que pueda ejecutar las utilidades de Oracle, puedes utilizar el comando exp para crear un fichero de exportación con los objetos de los dos esquemas.
1. Exportación de los dos objetos de los dos esquemas en el fichero dosesquemas.dmp
> exp system/password@basededatos file=dosesquemas.dmp full=n OWNER=(USER1, USER2) GRANTS=y COMPRESS=y log=dosesquemas_exp.log
2. Copia del fichero de exportación al servidor donde se hará la importación
> scp dosesquemas.* oracleuser@servidor:/directorio
3. Abriendo una sesión de terminal en el servidor de la base de datos destino, importación de los esquemas
> imp system/password@basededatos2 file=/directorio/dosesquemas.dmp FROMUSER=USER1,USER2 TOUSER=USER1,USER2 log=dosesquemas_imp.log ignore=yes
Enlazo algunos sitios donde he encontrado información que te puede ser de utilidad:
Manual de Backup y Recuperación con Oracle, Universidad de Valladolid
Import Export FAQ, Orafaq
Oracle export Utility y Oracle Import Burleson consulting
- Inicie sesión o registrese para enviar comentarios
hola la version es la 10g
hola la version es la 10g pero como se hace el backup por fechas me podrias ayudar
- Inicie sesión o registrese para enviar comentarios
No se si te entiendo bien,
No se si te entiendo bien, pero el backup no se suele hacer por fechas. Hay muchas maneras de hacerlo, pero básicamente consiste en que cada cierto tiempo la base de datos guarda una copia completa de su estado actual, o va haciendo copias incrementales de los cambios.
Si tienes un backup de una copia completa podrás recuperar lo que había el dia que hiciste la copia, y si te interesan sólo registros creados o modificados entre dos fechas, tendrás que crear un campo adicional para almacenar esa fecha, y después discriminar por fecha en la recuperación, pero ya te digo que no se suele hacer así.
Con backups incrementales, después de activar en la base de datos el modo de Archivado (Archive Log), lo que sí puedes hacer es recuperar la base de datos tal como estaba en un momento o fecha determinada, que también podría ser lo que estás preguntando. Pero piensa que tampoco es sencillo, la operación tiene su miga, y tienes que crear una política de backups con todos los valores bien ajustados para no consumir demasiado espacio en el servidor, ni reducir demasiado el rendimiento de la BD.
Por eso te recomiendo que consultes bien la documentación para encontrar lo que necesitas. Para empezar a hacerte una idea general de cómo funcionan los backups de Oracle yo comenzaría por el Manual de Backup y Recuperación con Oracle.
- Inicie sesión o registrese para enviar comentarios
HOLA carlos seria posible
HOLA
carlos seria posible tua ayuda?
en mi caso replique el servidor de produccion para generar un servidor de pruebas, las bases de datos son identicas, hace poco hice un backup en frio que quedo bn de igual manera genere un expotr completo antes del backup : expdp
ahora solo quiero exportar los datos que se generaron despues de la exportacion a la fecha actual he tratado con el parametro inctype=cumulative pero me genera error : parametro desconocido , ya valide el expdp help = y no esta
seria posible de su ayuda para generar el export acumulativo y tambien el import
el servidor es win2003 con oracle 10g
gracias
expdp system/12345 full=y inctype=cumulative constraints=Y dumpfile=EXP_DIC_15.dmp logfile=log_exprt_DIC_15.log full=y directory=export_1
- Inicie sesión o registrese para enviar comentarios
Hola, He encontrado este
Hola,
He encontrado este comando que logra solo correr el crosscheck para ciertas fechas:
ALLOCATE CHANNEL FOR MAINTENANCE DEVICE TYPE sbt;
CROSSCHECK BACKUP
COMPLETED BETWEEN '14-May-10' AND '14-Jun-10';
- Pero ahora tengo el problema, que hay otros backups que estan en estado expirados, hay alguna manera que vuelvan a estar en modo available? Espero que si
Saludos,
Elizabeth
- Inicie sesión o registrese para enviar comentarios
En principio sí que puedes
En principio sí que puedes cambiar el estado del backup, con el comando
CHANGE DATAFILECOPY '/oracle/backup/fichero_backup.f' AVAILABLE;
Échale un vistazo al apartado 'Marking a Backup or Copy as Available' de esta documentación online
- Inicie sesión o registrese para enviar comentarios
Hola carlos, la cuestion es
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
- Inicie sesión o registrese para enviar comentarios
Hola .. tengo un problema
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
- Inicie sesión o registrese para enviar comentarios
Checklist de Seguridad en Oracle
Checklist de Seguridad en Oracle drakon 24 Octubre, 2006 - 21:42Oracle 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..
Adjunto | 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 14 Agosto, 2009 - 13:46A 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:
- 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: - 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 17 Julio, 2009 - 13:15Si 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.
Como saber que bases estan corriendo dentro de un Servidor Windows???
Como saber que bases estan corriendo dentro de un Servidor Windows??? solena 30 Junio, 2010 - 19:55Como están gente del Foro, les comento que es la primera vez que entro a un foro... me gusto mucho la pronta respuesta del Director...
Tengo el siguiente problema: Estoy en un server Windows, como puedo ver que bases estan corriendo ?
ademas de fijarme por el task manager, en los servicios que estan corriendo.hay alguna consulta SQL? o duda como se si se esta usando RMAN para backupear una base....??? Mil gracias...
El Enterprise Manager te dice
El Enterprise Manager te dice qué bases de datos están activas. Una consulta SQL no te servirá porque la consulta la haces desde dentro de una BD, tienes que buscar algo externo a los motores de BBDD, y lo más fiable son los servicios que hay levantados.
Creo que también existen herrramientas específicas (aparte de TOAD y similares) que analizan el servidor y te muestran las BBDD que tienes funcionando, pero ahora no recuerdo ninguna, si encuentro tiempo ya buscaré mejor.
Con respecto a RMAN creo que en windows también tiene su propio servicio RMAN, si no está levantado seguro que no estará haciendo las copias.
- Inicie sesión o registrese para enviar comentarios
Te agradezco tu repuesta,
Te agradezco tu repuesta, pero en estos servidores no tenemos ningun software instalado como el TOAD o OEM... no nos permiten instalarlo... alguna otra manera?? se te ocurre... mil gracias
- Inicie sesión o registrese para enviar comentarios
Podrías consultar el estado
Podrías consultar el estado del listener desde linea de comandos con el usuario con el que se ha hecho la instalación de Oracle:
> lsnrctl status
Fíjate en las instancias con status READY
También te puede ayudar consultar el contenido del fichero 'listener.ora', aquí encontrarás relacionado el nombre de la instancia con el directorio de instalación.
- Inicie sesión o registrese para enviar comentarios
Cómo crear un nuevo esquema en Oracle paso a paso
Cómo crear un nuevo esquema en Oracle paso a paso cfb 22 Octubre, 2006 - 21:44Vamos 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 31 Marzo, 2008 - 23:09Si 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:
- Entra en el sistema con este usuario.
- 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
Hola me gustaria saber como hago lo mismo pero en centos
- Inicie sesión o registrese para enviar comentarios
No sé si te entiendo bien, no
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,
- Inicie sesión o registrese para enviar comentarios
ok gracias lo pruebo,no
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.
- Inicie sesión o registrese para enviar comentarios
Es muy sencillo entra al
- Inicie sesión o registrese para enviar comentarios
deberia ser lo mismo, no…
deberia ser lo mismo, no importa el sistema operativo
- Inicie sesión o registrese para enviar comentarios
Hola que tal Trato de
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
- Inicie sesión o registrese para enviar comentarios
Puede ser porque las
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.
- Inicie sesión o registrese para enviar comentarios
Alguien sabe como evitar ese
Alguien sabe como evitar ese procedimiento de ingreso con el sqlplus.
Me explico, como podria hacer para que al momento que se ingrese:
>> conn /as sysdba;
me pida la contraseña del usuario sys , si o si para poder conectarme.
- Inicie sesión o registrese para enviar comentarios
Buena pregunta. A mi no me
Buena pregunta. A mi no me suena que se pueda forzar la petición de contraseña a todos los usuarios.
He buscado un poco y creo que directamente no se puede, aunque siempre tienes la opción de dejar sin ningún usuario el grupo Oracle DBA. Si ningún usuario del sistema pertenece a este grupo, nadie tendrá el privilegio de entrar "/as sysdba" sin introducir un password.
Enlazo el foro donde he encontrado el 'tip', con algunas indicaciones para hacerlo en Windows y Unix
- Inicie sesión o registrese para enviar comentarios
ORA-12560: TNS:protocol
ORA-12560: TNS:protocol adapter error: controlar variables de entorno, los parametros del tnsnames.ora y el listener.ora
En linux:
export ORACLE_SID=nombre_SID (nombre de sid de la base de datos)
lsntcrl (nombre del listener)
Conectar sin saber usuario ni contraseña
usuario :~$ sqlplus /nolog
sqlplus> conn / as sysdba
Espero que les sirva. Saludos
- Inicie sesión o registrese para enviar comentarios
hola! ante todo saludar a
hola!
ante todo saludar a todos ya que soy nuevo en este foro
y nuevo en el tema de bases de datos.
Mi pregunta es: Acabo de llegar al puesto en el que estoy trabajando y ando un poco perdido.
La persona que estaba an el puesto anterior se fue y no dejo la password de acceso mediante toad a una base de datos.
Hay alguna manera de poder "encontrar" esa password para poder entrar? necesito los datos de las tablas, procedimientos y funciones para trabajar.
gracias de antemano y saludos a todos.
- Inicie sesión o registrese para enviar comentarios
Buen dia a todos! Buscamos
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!!
- Inicie sesión o registrese para enviar comentarios
Hola. Necesito su ayuda con
Hola. Necesito su ayuda con el procedirmiento para lo que comenta Carlos mas arriba: "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". Precisamente necesito ejecutar "sqlplus /no log " con un usuario diferente al de instalación. Tampoco es el root. Que debería configurar en el usuario para que pueda ejecutar esto? Muchas gracias
Esocola
- Inicie sesión o registrese para enviar comentarios
Publicado el 2005, hoy me es
- Inicie sesión o registrese para enviar comentarios
Me gustaria saber si alguien
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
- Inicie sesión o registrese para enviar comentarios
Alejandro, te has planteado
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.
- Inicie sesión o registrese para enviar comentarios
ayuda instale 2motores de BD,
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
- Inicie sesión o registrese para enviar comentarios
Buenos dias Carlos, soy Fans
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.
- Inicie sesión o registrese para enviar comentarios
Hola Guillermo Hay varios
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,
- Inicie sesión o registrese para enviar comentarios
En referencia a si se puede
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
- Inicie sesión o registrese para enviar comentarios
Hola a todos, Me gustaría
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
- Inicie sesión o registrese para enviar comentarios
Buenas Tardes, necesito
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
- Inicie sesión o registrese para enviar comentarios
#te validas como root su
- Inicie sesión o registrese para enviar comentarios
buen dia, trato de conectarme
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
- Inicie sesión o registrese para enviar comentarios
Entiendo que te refieres
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
- Inicie sesión o registrese para enviar comentarios
Hola tengo una duda, resulta
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?
- Inicie sesión o registrese para enviar comentarios
Prueba a escapar las
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
- Inicie sesión o registrese para enviar comentarios
Necesito una manito please,
- Inicie sesión o registrese para enviar comentarios
Saludos Carlos! Te escribo
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!
- Inicie sesión o registrese para enviar comentarios
Lo normal es que al menos con
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.
- Inicie sesión o registrese para enviar comentarios
hola carlos disculpa una
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
- Inicie sesión o registrese para enviar comentarios
Buen dia. Como puedo ejecutar
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"
- Inicie sesión o registrese para enviar comentarios
gracias, lo probare y te…
gracias, lo probare y te comento.
- Inicie sesión o registrese para enviar comentarios
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 23 Junio, 2007 - 13:40La 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.
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 30 Diciembre, 2006 - 10:42Este 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
Adjunto | Size |
---|---|
XDAT012006.pdf | 162 bytes |
Conexión desde Oracle a MySQL
Este método sirve para cualquier base de datos? Se puede utilizar también con MySQL?
- Inicie sesión o registrese para enviar comentarios
Si que se puede...
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,
- Inicie sesión o registrese para enviar comentarios
Como conectar a distintis ODBC
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
- Inicie sesión o registrese para enviar comentarios
Alguien sabe como enlazar
Alguien sabe como enlazar una base de datos en SQL SERVER con una de ORACLE.
- Inicie sesión o registrese para enviar comentarios
Conectar SQL Server contra Oracle
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,
- Inicie sesión o registrese para enviar comentarios
Versiones
Sirve este sistema también para SQL Server 2005??
- Inicie sesión o registrese para enviar comentarios
SQL Server 2005
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
- Inicie sesión o registrese para enviar comentarios
HOLA sobre............"eje
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!!!!
- Inicie sesión o registrese para enviar comentarios
Ejecutar un script como sys
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.
- Inicie sesión o registrese para enviar comentarios
Conexion Oracle_Access
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
- Inicie sesión o registrese para enviar comentarios
Error en TNSNAMES.ORA
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))
- Inicie sesión o registrese para enviar comentarios
Creo que no es un error. El
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
- Inicie sesión o registrese para enviar comentarios
conexion a MySql
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
- Inicie sesión o registrese para enviar comentarios
Me imagino que esto ya se
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.
- Inicie sesión o registrese para enviar comentarios
El problema era de hace
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 :)
- Inicie sesión o registrese para enviar comentarios
fichero TNSNAMES.ORA
Hola.
Tengo el servidor sqlserver 2008 en windows 7 y el servidor oracle XE 10gen ubuntu linux 10.10
Mi pregunta es:Si quiero obtener datos de sqlserver desde oracle,A la hora de configurar el fichero tnsnames.ora.
en el apartado (HOST=SERVER_IP) debo copiar la direccion ip del servidor oracle o la del sql server ya que los tengo en distintas maquinas, siendo el uno o el otro tambien influye en el (PORT:)por que el oracle escucha en el 1521, y el
sql server en el 1433.
Gracias
Saludos.
- Inicie sesión o registrese para enviar comentarios
Hola. En mi caso, requiero
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.
- Inicie sesión o registrese para enviar comentarios
Con MySQL también debería
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.
- Inicie sesión o registrese para enviar comentarios
Saludos, Estoy realizando una
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
- Inicie sesión o registrese para enviar comentarios
Has probado a crear una vista
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.
- Inicie sesión o registrese para enviar comentarios
Quisiera saber si con solo
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
- Inicie sesión o registrese para enviar comentarios
En principio no hace falta
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.
- Inicie sesión o registrese para enviar comentarios
Buenas Tardes hay alguna
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
- Inicie sesión o registrese para enviar comentarios
Puedes conectar desde Oracle
Puedes conectar desde Oracle con SQL Server utilizando drivers ODBC, que son de libre descarga y utilización, no sé si por licenciados quieres decir de pago o es que te suponen algún otro tipo de problema..
- Inicie sesión o registrese para enviar comentarios
Hola Buenas Tardes Tengo una
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
- Inicie sesión o registrese para enviar comentarios
Indices invisibles en Oracle 11g
Indices invisibles en Oracle 11g Oscar_paredes 13 Septiembre, 2010 - 20:04A 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
Limitar número de conexiones por usuario
Limitar número de conexiones por usuario cfb 23 Noviembre, 2007 - 10:34Alguien 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
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.
- Inicie sesión o registrese para enviar comentarios
Ampliar número total de procesos
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)
- Inicie sesión o registrese para enviar comentarios
Contrariamente a lo que me
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!!
- Inicie sesión o registrese para enviar comentarios
Definitivamentre quedese en
Definitivamentre quedese en su .NET, si ves la respues del señor calvo..
- Inicie sesión o registrese para enviar comentarios
Comentarte que el fichero
Comentarte que el fichero SPFILE no debe modificarse manualmente, ya que quedaría inutilizable.
- Inicie sesión o registrese para enviar comentarios
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 21 Septiembre, 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 21 Abril, 2011 - 17:03Siguiendo 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 27 Enero, 2011 - 12:02De 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:
- Convertimos a decimal el obj que se indica al final en hex (0000CF1C->53020)
- Obtenemos el nombre del objeto del diccionario de datos:
SELECT owner, object_name, object_type FROM dba_objects WHERE object_id = 53020; - 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é...
Saludos Cordiales, Quisera
Saludos Cordiales,
Quisera saber si tiene información para los Deadlock en 9i, tengo los siguientes errores y quisiera saber si es por falta de un COMMIT, trato de mandar por aca el error pero no lo permite
Gracias de antemano...
- Inicie sesión o registrese para enviar comentarios
Oracle 10g: Buscando actividad "extra-ordinaria" en nuestra base de datos
Oracle 10g: Buscando actividad "extra-ordinaria" en nuestra base de datos il_masacratore 5 Julio, 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 10 Febrero, 2010 - 12:20Normalmente 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 29 Enero, 2010 - 16:21Pasos 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 24 Febrero, 2010 - 16:21Por 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.
Tambien mejorará el rendimiento
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.
- Inicie sesión o registrese para enviar comentarios
Oracle global_names
Oracle global_names il_masacratore 2 Julio, 2009 - 13:26Hola!
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
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> select * from global_name;
GLOBAL_NAME
------------------------------------------------------------
MIBD.DATAPRIX.COM
SQL> 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> 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> alter database rename GLOBAL_NAME to MIBD.DATAPRIX.COM;
Database altered.
- Inicie sesión o registrese para enviar comentarios
Oracle10g: Cambiar el juego de carácteres de la base de datos
Oracle10g: Cambiar el juego de carácteres de la base de datos il_masacratore 9 Marzo, 2010 - 12:24Puede suceder que después de instalar Oracle o configurar una nueva base de datos nos demos cuenta de que el juego de carácteres elegido durante la instalación no es el correcto. Lo que se nos puede ocurrir en casos como este es borrar la base de datos y reconfigurarla o cosas peores... Pero no hace falta. Podemos cambiar el juego de carácteres parando la base de datos, levantandola de forma restrictiva, cambiando la configuración y reiniciado la base de datos. Howto:
--Primero nos conectamos con la base de datos
$ sqlplus sys/pwd@prod as sysdba
--Paramos la base de datos
SQL>SHUTDOWN IMMEDIATE;
--Levantamos de forma restrictiva*
SQL>STARTUP MOUNT;
SQL>ALTER SYSTEM ENABLE RESTRICTED SESSION;
SQL>ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
SQL>ALTER DATABASE OPEN;
--Cambiamos el mapa de carácteres
SQL>ALTER DATABASE CHARACTER SET <nuevo mapa de carácteres>;
--Reiniciamos la base de datos y yata
SQL>SHUTDOWN IMMEDIATE;
SQL>STARTUP;
Para comprobar que los cambios han surtido efecto podemos consultar la vista v$nls_parameters y comprobar el valor de nls_characterset. Debemos saber que según el cambio de codificación que hagamos podemos perder datos (si es que los hay) dependiendo del cambio.
*También es útil saber que levantar la base de datos en modo restrictivo es muy útil para realizar tareas de mantenimiento de la base de datos que se pueden hacer más rápido cuando no hay actividad de usuario (como puede ser reconstrucción de índices, reducción de segmentos, etc).
Oracle10g: Manual standby database (planteamiento inicial)
Oracle10g: Manual standby database (planteamiento inicial) il_masacratore 16 Marzo, 2010 - 11:43Una base de datos Oracle en Standby es una copia exacta de una base de datos operativa en un servidor remoto, usada como backup, como copia para consulta, recuperación de desastres, etc.
Una base de datos en modo Standby es algo más que un backup normal ya que se puede poner en producción en caso de desastre en un tiempo menor que si tuvieramos que restaurar una copia (ya sea desde rman o un simple export).
Restaurar una copia desde fichero tarda tiempo, y durante este periodo el sistema no está disponible. Con una base de datos adicional en modo standby no hay nada (o casi nada que restaurar) en caso de desastre. En cuestión de minutos se hace el cambio permitiendo continuidad en el servicio. No nos ofrece las ventajas de rendimiento de un cluster o la seguridad del espejo pero la relación de costes de tiempo y licencia versus ventajas me parece correcta.
Desde un punto de vista global:
- Disponemos de una copia de la base de datos de forma remota, que podemos contabilizar como segundo juego de copias.
- A diferencia de un simple backup, la copia se mantiene viva y los datos son actualizados con mayor frecuencia.
- En caso de desastre la podemos usar en cuestión de minutos sin esperar a restaurar un backup entero, ya sea lógico(export) o físico(rman).
- Sirve como entorno de pruebas más real para la prueba de parches y estimación de tiempos. El volumen de datos es idéntico.
- Tengo entendido que una base de datos en standby se puede usar hasta 10 dias al año sin coste de licencia (aunque mira por donde Microsoft te deja 30 dias... )
Desde un punto de vista técnico:
- Los cambios en la base de datos principal se captura en los archivos de redo log.
- Los archivos de redo no son permanentes, son sobreescritos de forma rotativa (en este estado aún no se copia al segundo servidor).
- Se hace una copia del redo log. La copia permanente se llama archive log.
- Los archive logs(copias de redo log) se transfieren al servidor en standby. En sistemas linux por ejemplo podemos hacerlo mediante rsync.
- Se aplican los archive logs transferidos a la base de datos en standby quedando actualizada.
A nivel global los pasos a seguir para montar el chiringuito pueden ser los siguientes:
- Configurar la base de datos principal para que funcione en modo archivelog.
- Preparar un script para hacer una copia en caliente (usando rman).
- Crear un fichero de control standby (control file) en la base de datos principal.
- Copiarlo todo (fichero de configuración, de control y copia rman) en el segundo servidor (donde montamos la base de datos en standby).
- Reconfigurar rutas (usando DB_FILE_NAME_CONVERT en init.ora o a manita).
- Iniciar la segunda base de datos en modo mount standby database.
- Restaurar datos (recover database).
- Sincronizar de forma periódica(cron) transportando (rsync?) y aplicando los archive logs.
En otro post intentaré entrar en más detalle con un ejemplo... y las utilidades que le podemos dar.
No olvidemos la vuelta atrás
Sólo comentar que también es conveniente planificar como último paso la vuelta atrás a la base de datos de producción original en caso de que se tenga que utilizar la base de datos en Standby.
En un tiempo aceptable habrá que volver a recrear o actualizar la BD de producción inicial, pero incluyendo los cambios que se produzcan en el tiempo que esté activa la BD en Standby, y eso puede llegar a ser bastante complicado según las condiciones del entorno..
- Inicie sesión o registrese para enviar comentarios
Trafico a la Standby DB
Tengo una duda, despes del paso 7, como rediriges todo el trafico que iva a la instancia X que estaba en el servidor N, hacia la nueva instancia X (deduzco que el nombre de la instancia es el mismo) que esta en el servidor M?
Lo digo por que en algun momento diras a todas las aplicaciones que va al servidor N a buscar la instancia X que ahora deben ir al servidor M a buscar la instancia X, no?
X.N >>> X.M
No se si me explico.
Gracias.
- Inicie sesión o registrese para enviar comentarios
Buenas, Para redirigir el
Buenas,
Para redirigir el tráfico hay distintas maneras (manuales y automáticas) pero la manera más simple es apagar/desconectar el servidor original y ponerle la misma direcció n IP al servidor M. De esta manera tan "manual" solo haces un cambio en lugar de cambiar las 50 aplicaciones que usaban el servidor N.
Saludos,
- Inicie sesión o registrese para enviar comentarios
Hola, Respecto al punto
Hola,
Respecto al punto de:
- Tengo entendido que una base de datos en standby se puede usar hasta 10 dias al año sin coste de licencia (aunque mira por donde Microsoft te deja 30 dias... )
En un ambiente de recuperación ante desastres con un server en Standby, Oracle le requerirá licenciar la Base de Datos en standby en misma métrica y cantidad de licencia que la Base de Datos en producción. (asociada a ella).
Para más detalle acceder a: http://www.oracle.com/us/corporate/pricing/sig-070616.pdf
Saludos,
- Inicie sesión o registrese para enviar comentarios
Hola Mario Lo que yo
Hola Mario
Lo que yo recuerdo de hace tiempo es que si se monta un RAC en modo activo, es decir, con los servidores Oracle que conforman el cluster funcionando al 100% para dar servicio a las instancias, tienes que licenciar todos los servidores de base de datos que tengas funcionando, pero si se monta en modo Activo/pasivo, con un server activo funcionando en producción, y otro (el pasivo) en standby, con la licencia del activo es suficiente para poder mantener este interesante sistema de recuperación, que ante cualquier problema en el server activo permite tomar el control temporalmente al pasivo.
Eso sí, el pasivo sólo ha de estar activo el tiempo necesario para resolver el problema en el server activo, después el servidor licenciado ha de volver a tomar el control, y el otro volver al modo standby, por eso la licencia sólo permite la utilización del server en Standby como activo durante 10 días.
En el documento de Oracle que mencionas, en la página 18, se enlaza otro documento que aclara el licenciamiento de los entornos de recuperación:
Backup/Failover/Standby/Remote Mirroring – Please see the Licensing Data Recovery Environments document: http://www.oracle.com/us/corporate/pricing/data-recovery-licensing-0705… for more information.
Consultando el otro documento, veo que este método se incluye dentro de Data Recovery using Clustered Environments (Failover), y este párrafo creo que es bastante aclaratorio:
The failover data recovery method is an example of a clustered deployment; where multiple nodes/servers have access to one Single Storage/SAN. In such cases your license for the programs listed on the US Oracle Technology Price, includes the right to run the licensed program(s) on an unlicensed spare computer in a failover environment for up to a total of ten separate days in any given calendar year..
Y, sin embargo, el standby lo menciona dentro del apartado 'Data Recovery Environments using Copying, Synchronizing or Mirroring':
Standby and Remote Mirroring are commonly used terms to describe these methods of deploying Data Recovery environments. In these Data Recovery deployments, the data, and optionally the Oracle binaries, are copied to another storage device..
Yo entiendo entonces que no son necesarias licencias extra siempre que se utilice el método de failover para dos servidores que compartan la unidad de almacenamiento.
- Inicie sesión o registrese para enviar comentarios
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 17 Junio, 2010 - 12:05El 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
- Editamos el init.ora para añadir los siguientes parámetros
*.log_archive_dest='/ejemplo/backup/'
*.log_archive_format='SID_%r_%t_%s'
- 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:
- 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
- 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;
- 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 19 Febrero, 2007 - 19:41En 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> ALTER TABLE tabla ENABLE ROW MOVEMENT;
- Movimiento de las filas:
SQL> ALTER TABLE tabla SHRINK SPACE COMPACT;
- Reseteo HWM
SQL> 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
hola que tal es recomendable
- Inicie sesión o registrese para enviar comentarios
Seguridad en Oracle
Seguridad en Oracle drakon 30 Enero, 2007 - 22:15En é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?
mezclas cosas
por un lado hablas de la base de datos (Oracle 10g) y por otro de Oracle Applications (Oracle Applications 11i).
- Inicie sesión o registrese para enviar comentarios
WinSID
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!
- Inicie sesión o registrese para enviar comentarios
Tablespaces Encriptados en Oracle 11g - Oracle DBA
Tablespaces Encriptados en Oracle 11g - Oracle DBA Oscar_paredes 4 Abril, 2011 - 14:40A partir de la release 1 de Oracle 11g, Oracle ofrece a los DBA's la posibilidad de encriptar los tablespaces al completo, para proteger datos sensibles en su interior y accesibles desde Sistema Operativo. Es decir, el objetivo de esta nueva funcionalidad no es proteger datos sensibles de usuarios de la Base de Datos, sino de proteger la información de los datafiles de tablespaces.
Para explicar la utilidad de esta funcionalidad, lo mejor es explicar situaciones en las que sin esta funcionalidad nuestros datos serian vulnerables. Por ejemplo, en el caso de que el fichero de un backup físico de un tablespace de base de datos llegase a manos no deseadas, podría ver algunos datos “en claro” sin problemas. A modo de ejemplo, una simple edición del tablespace (o un simple “cat”) que contuviera la tabla empleados, nos mostraría los campos varchar2 en claro, pudiendo extraer datos sensibles (no os lo creéis, probadlo!).
Para esta funcionalidad, Oracle utiliza el TDE – Transparent Data Encryption, mediante la creación de una Oracle Wallet que se almacena en disco. Por defecto, en la localización $ORACLE_BASE/admin/$ORACLE_SID/wallet, pero es recomendable cambiar su localización mediante el uso del parámetro ENCRYPTION_WALLET_LOCATION en el sqlnet.ora.
Para la creación de esta Wallet:
ALTER SYSTEM SET ENCRYPTION KEY AUTHENTICATED BY "myPassword";
El tablespace encriptado se puede crear de la siguiente manera:
CREATE TABLESPACE seguro_tbs
DATAFILE '/oradata/seguro_ts01.dbf.dbf' SIZE 1M
ENCRYPTION USING 'AES256'
DEFAULT STORAGE(ENCRYPT);
Si no se indica lo contrario, el algoritmo de encriptación usado es el AES256 (Advanced Encryption Standard), pero los siguientes algoritmos también están permitidos:
AES256, AES192, AES128 y 3DES168
Al reiniciar la base de datos, deberemos abrir la wallet para poder consultar los datos de los tablespaces encriptados:
ALTER SYSTEM SET WALLET OPEN IDENTIFIED BY "myPassword";
También podemos cerrarla en cualquier momento:
ALTER SYSTEM SET WALLET CLOSE;
Si no abrimos una wallet, el resultado de cualquier query sobre alguna tabla de dicho tablespace es el error ORA-28365 “wallet is not open”.
La consulta de si un tablespace está encriptado o no, se puede realizar desde la misma vista dba_tablespaces:
SQL> SELECT tablespace_name, encrypted FROM dba_tablespaces;
TABLESPACE_NAME ENCRYPTED
------------------------------ ---------
SYSTEM NO
SYSAUX NO
UNDOTBS1 NO
TEMP NO
SEGURO_TBS YES
Espero que os sea útil.
Oscar Paredes
IT Manager
Oracle DBA
como puedo hacer esa
como puedo hacer esa encriptacion del tablespace en Oracle Express, ya que asi como tu lo has hecho yo tambien pero sobre la version Enterprise y requiero hacerlo sobre la version Express 11g
- Inicie sesión o registrese para enviar comentarios
Por favor si tienen una
- Inicie sesión o registrese para enviar comentarios
Utilización de sinónimos para compartir objetos
Utilización de sinónimos para compartir objetos Carlos 25 Noviembre, 2006 - 00:23Có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
problemas con OEM basicamente con el rol de dba como puedo regenerarlo o reconstruirlo
problemas con OEM basicamente con el rol de dba como puedo regenerarlo o reconstruirlo jimyman 19 Marzo, 2010 - 22:31hola a todos
el problema que tengo con el OEM es que no me guarda las bases de datos conectadas o dadas de alta en el tnsname.ora y al conectarme con mi usuario que tiene privilegios de DBA me manda select any dictionary que me faltan esos permisos para poderme logear con mi usuario, como puedo eliminar este problema
gracias por su atencion
Tienes opción de entrar con
Tienes opción de entrar con el usuario SYS o SYSTEM, o decirle a quien los controle que lo haga? Estos tienen definidos los roles de DBA por defecto y, si no se han modificado te tienen que funcionar perfectamente.
Después puedes utilizarlos para revisar los permisos de tu usuario y encontrar lo que le falte.
- Inicie sesión o registrese para enviar comentarios
Ayuda con Query para consultar los privilegios que tiene asignado un grupo de PACKAGE (Oracle)
Ayuda con Query para consultar los privilegios que tiene asignado un grupo de PACKAGE (Oracle) Erik Olave 17 Noviembre, 2011 - 14:41Buenos Días. Saludos a todos.
Me encuentro con un problema, necesito saber si existe alguna vista o tabla que me permita saber que privilegios tiene asignado un grupo de paquetes. Son 450 paquetes y necesito saber cual de ellos no tiene permisos de Ejecución.
Gracias de antemano.
Saludos.
Por ejemplo, para ver los
Por ejemplo, para ver los privilegios de un grupo de tablas, se puede usar la (dba_tab_privs) pero en el caso de los paquetes cual tabla o vista puedo usar? Gracias
- Inicie sesión o registrese para enviar comentarios
En realidad no vas mal
En realidad no vas mal encaminado, la vista DBA_TAB_PRIVS es la que contiene los privilegios asignados a los objetos de la base de datos, aunque la nomenclatura es un poco engañosa, ya que lo de TAB no se refiere sólo a las tablas, es para todos los objetos, y el campo TABLE_NAME mejor debería llamarse OBJECT_NAME.
Una manera rápida de localizar los PACKAGES es seleccionar los registros con permisos de ejecución:
select * from dba_tab_privs where privilege = 'EXECUTE';
Aprovecho para recordar algunas sentencias útiles para consultar los roles y privilegios generales del usuario que tiene abierta la sesión:
select * from user_role_privs; select * from user_sys_privs;
También te pueden ser muy útiles estas sentencias obtenidas de esta web para listar recursivamente los privilegios de los usuarios de la base de datos:
Listado de roles y privilegios de sistema de los usuarios
select lpad(' ', 2*level) || granted_role "User, his roles and privileges" from ( /* THE USERS */ select null grantee, username granted_role from dba_users where username like upper('%&enter_username%') /* THE ROLES TO ROLES RELATIONS */ union select grantee, granted_role from dba_role_privs /* THE ROLES TO PRIVILEGE RELATIONS */ union select grantee, privilege from dba_sys_privs ) start with grantee is null connect by grantee = prior granted_role;
Privilegios de sistema para roles y usuarios
select lpad(' ', 2*level) || c "Privilege, Roles and Users" from ( /* THE PRIVILEGES */ select null p, name c from system_privilege_map where name like upper('%&enter_privliege%') /* THE ROLES TO ROLES RELATIONS */ union select granted_role p, grantee c from dba_role_privs /* THE ROLES TO PRIVILEGE RELATIONS */ union select privilege p, grantee c from dba_sys_privs ) start with p is null connect by p = prior c;
Privilegios asignados a los objetos
select case when level = 1 then own || '.' || obj || ' (' || typ || ')' else lpad (' ', 2*(level-1)) || obj || nvl2 (typ, ' (' || typ || ')', null) end from ( /* THE OBJECTS */ select null p1, null p2, object_name obj, owner own, object_type typ from dba_objects where owner not in ('SYS', 'SYSTEM', 'WMSYS', 'SYSMAN','MDSYS', 'ORDSYS','XDB', 'WKSYS', 'EXFSYS', 'OLAPSYS', 'DBSNMP', 'DMSYS','CTXSYS', 'WK_TEST', 'ORDPLUGINS', 'OUTLN') and object_type not in ('SYNONYM', 'INDEX') /* THE OBJECT TO PRIVILEGE RELATIONS */ union select table_name p1, owner p2, grantee, grantee, privilege from dba_tab_privs /* THE ROLES TO ROLES/USERS RELATIONS */ union select granted_role p1, granted_role p2, grantee, grantee, null from dba_role_privs ) start with p1 is null and p2 is null connect by p1 = prior obj and p2 = prior own;
- Inicie sesión o registrese para enviar comentarios
Muchísimas muchísimas
Muchísimas muchísimas graciassss.
De verdad esto es justo lo que estaba buscando.
Mil gracias hermano, Dios lo siga bendiciendo en grande.
Saludos cordiales.
- Inicie sesión o registrese para enviar comentarios
Hola amigos. Tengo una
Hola amigos.
Tengo una consulta. Quisiera saber a que objetos(tables, procedure, functions. etc) tiene acceso un rol determinado. Estaré atento.
- Inicie sesión o registrese para enviar comentarios
¿A qué objetos, o a qué tipo
¿A qué objetos, o a qué tipo de objetos? Puedes consultar los privilegios de un rol para saber sobre qué tipo de objeto tiene permisos.
- Inicie sesión o registrese para enviar comentarios
Estimado, por conultar con
Estimado, por conultar con cierto usuario Oracle 12c en una tabla no puede ver la data completa en una tabla (se tiene *********1234), pero con otro usuario si lo puedo todo el dato. Segun lo explicado son privilegios. Me podrian ayudar indicando como se otorta esto previlegios en Oracle 12C
- Inicie sesión o registrese para enviar comentarios
Libros de Administración
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.
Los libros que ves a continuación son una selección de los que a mi me parecen más interesantes para aprender administración y desarrollo PL/SQL, teniendo en cuenta precio y temática, espero que te puedan ser de utilidad:
- eBooks de Oracle gratuítos para la versión Kindle, o muy baratos (menos de 4€):
- Libros recomendados de Oracle
- Inicie sesión o registrese para enviar comentarios
Hola Espero me puedan ayudar.
Hola Espero me puedan ayudar. Tengo 2 consultas. Tengo un esquema con mucha información tablas de mas de 5 millones de registros en ciertos casos y veo que se me han creado automaticamente supongo porque yo no las he creado tablas que empiezan con EPC_..,SMP_..,VBZ_..,VDK_..,VMQ_..' , la consulta seria porque se crearon estas tablas La segunda consulta, cree un esquema a partir de ese esquema muy grande en el nuevo esquema limpie todas las tablas,y le hice un drop a todas las tablas que empezaban con el nombre EPC_..,SMP_..,VBZ_..,VDK_..,VMQ_..' , pero tengo algunas tablas que no las puedo eliminar porque revisando tienen dependencia con otras tablas del esquema original por ejemplo la tabla NUEVOESQUEMA.SMP_VDN_TARGET_TYPE_DEFN tiene dependencia con VIEJOESQUEMA.SMP_VDN_TARGET_LIST como borro esa dependencia para poder hacer el DROP y porque se creo esta dependencia ?
- Inicie sesión o registrese para enviar comentarios
Cómo puedo saber, en Oracle las sentencias que se ejecutan desde una sesión desconectada o conectada.
Cómo puedo saber, en Oracle las sentencias que se ejecutan desde una sesión desconectada o conectada. Juan Calvo Munido 20 Enero, 2011 - 13:48Me podeis decir cómo puedo saber las sentencias SQL que se han ejecutado en una sesión de Oracle, la sesión puede estar desconectada o conectada, deseo conocerlo en ambas situaciones.
El objetivo es saber, mediante consultas SQL, desde qué ordenador cliente se han ejecutado qué sentencias SQL.
Hola Juan Si consultas el
Hola Juan
Si consultas el tema Recopilación de scripts y consultas útiles de Oracle encontrarás la query que te copio para extraer información sobre las sentencias SQL y el usuario que las ha ejecutado. Ten en cuenta que la consulta te saca las sentencias que se encuentran en la Shared SQL Area, dentro de la Shared Pool, es decir, las que se están ejecutando o se han ejecutado y Oracle almacena para optimizar ejecuciones posteriores. Las que menos se utilizan irán desapareciendo de este àrea.
•• Últimas consultas SQL ejecutadas en Oracle y usuario que las ejecutó: select distinct vs.sql_text, vs.sharable_mem, vs.persistent_mem, vs.runtime_mem, vs.sorts, vs.executions, vs.parse_calls, vs.module, vs.buffer_gets, vs.disk_reads, vs.version_count, vs.users_opening, vs.loads, to_char(to_date(vs.first_load_time, 'YYYY-MM-DD/HH24:MI:SS'),'MM/DD HH24:MI:SS') first_load_time, rawtohex(vs.address) address, vs.hash_value hash_value , rows_processed , vs.command_type, vs.parsing_user_id , OPTIMIZER_MODE , au.USERNAME parseuser from v$sqlarea vs , all_users au where (parsing_user_id != 0) AND (au.user_id(+)=vs.parsing_user_id) and (executions >= 1) order by buffer_gets/executions desc
A partir de aquí puedes sacar tanta la información que necesites tanto de v$sqlarea como de all_users. En la documentación online de Oracle tienes todos los campos de estadísticas disponibles para v$sqlarea. Igualmente los copio:
Column | Datatype | Description |
---|---|---|
SQL_TEXT |
VARCHAR2(1000) |
First thousand characters of the SQL text for the current cursor |
SQL_FULLTEXT |
CLOB |
All characters of the SQL text for the current cursor |
SQL_ID |
VARCHAR2(13) |
SQL identifier of the parent cursor in the library cache |
SHARABLE_MEM |
NUMBER |
Amount of shared memory used by a cursor. If multiple child cursors exist, then the sum of all shared memory used by all child cursors. |
PERSISTENT_MEM |
NUMBER |
Fixed amount of memory used for the lifetime of an open cursor. If multiple child cursors exist, the fixed sum of memory used for the lifetime of all the child cursors. |
RUNTIME_MEM |
NUMBER |
Fixed amount of memory required during execution of a cursor. If multiple child cursors exist, the fixed sum of all memory required during execution of all the child cursors. |
SORTS |
NUMBER |
Sum of the number of sorts that were done for all the child cursors |
VERSION_COUNT |
NUMBER |
Number of child cursors that are present in the cache under this parent |
LOADED_VERSIONS |
NUMBER |
Number of child cursors that are present in the cache and have their context heap (KGL heap 6) loaded |
OPEN_VERSIONS |
NUMBER |
The number of child cursors that are currently open under this current parent |
USERS_OPENING |
NUMBER |
Number of users that have any of the child cursors open |
FETCHES |
NUMBER |
Number of fetches associated with the SQL statement |
EXECUTIONS |
NUMBER |
Total number of executions, totalled over all the child cursors |
PX_SERVERS_EXECUTIONS |
NUMBER |
Total number of executions performed by Parallel eXecution Servers. The value is 0 when the statement has never been executed in parallel. |
END_OF_FETCH_COUNT |
NUMBER |
Number of times this cursor was fully executed since the cursor was brought into the library cache. The value of this statistic is not incremented when the cursor is partially executed, either because it failed during the execution or because only the first few rows produced by this cursor are fetched before the cursor is closed or re-executed. By definition, the value of theEND_OF_FETCH_COUNT column should be less or equal to the value of the EXECUTIONS column. |
USERS_EXECUTING |
NUMBER |
Total number of users executing the statement over all child cursors |
LOADS |
NUMBER |
Number of times the object was loaded or reloaded |
FIRST_LOAD_TIME |
VARCHAR2(19) |
Timestamp of the parent creation time |
INVALIDATIONS |
NUMBER |
Total number of invalidations over all the child cursors |
PARSE_CALLS |
NUMBER |
Sum of all parse calls to all the child cursors under this parent |
DISK_READS |
NUMBER |
Sum of the number of disk reads over all child cursors |
DIRECT_WRITES |
NUMBER |
Sum of the number of direct writes over all child cursors |
BUFFER_GETS |
NUMBER |
Sum of buffer gets over all child cursors |
APPLICATION_WAIT_TIME |
NUMBER |
Application wait time (in microseconds) |
CONCURRENCY_WAIT_TIME |
NUMBER |
Concurrency wait time (in microseconds) |
CLUSTER_WAIT_TIME |
NUMBER |
Cluster wait time (in microseconds) |
USER_IO_WAIT_TIME |
NUMBER |
User I/O Wait Time (in microseconds) |
PLSQL_EXEC_TIME |
NUMBER |
PL/SQL execution time (in microseconds) |
JAVA_EXEC_TIME |
NUMBER |
Java execution time (in microseconds) |
ROWS_PROCESSED |
NUMBER |
Total number of rows processed on behalf of this SQL statement |
COMMAND_TYPE |
NUMBER |
Oracle command type definition |
OPTIMIZER_MODE |
VARCHAR2(10) |
Mode under which the SQL statement was executed |
OPTIMIZER_COST |
NUMBER |
Cost of this query given by the optimizer |
OPTIMIZER_ENV |
RAW(703) |
Optimizer environment |
OPTIMIZER_ENV_HASH_VALUE |
NUMBER |
Hash value for the optimizer environment |
PARSING_USER_ID |
NUMBER |
User ID of the user that has parsed the very first cursor under this parent |
PARSING_SCHEMA_ID |
NUMBER |
Schema ID that was used to parse this child cursor |
PARSING_SCHEMA_NAME |
VARCHAR2(30) |
Schema name that was used to parse this child cursor |
KEPT_VERSIONS |
NUMBER |
Number of child cursors that have been marked to be kept using the DBMS_SHARED_POOL package |
ADDRESS |
RAW(4 | 8) |
Address of the handle to the parent for this cursor |
HASH_VALUE |
NUMBER |
Hash value of the parent statement in the library cache |
OLD_HASH_VALUE |
NUMBER |
Old SQL hash value |
PLAN_HASH_VALUE |
NUMBER |
Numerical representation of the SQL plan for this cursor. Comparing one PLAN_HASH_VALUE to another easily identifies whether or not two plans are the same (rather than comparing the two plans line by line) |
MODULE |
VARCHAR2(64) |
Contains the name of the module that was executing at the time that the SQL statement was first parsed as set by callingDBMS_APPLICATION_INFO .SET_MODULE |
MODULE_HASH |
NUMBER |
Hash value of the module that is named in the MODULE column |
ACTION |
VARCHAR2(64) |
Contains the name of the action that was executing at the time that the SQL statement was first parsed as set by callingDBMS_APPLICATION_INFO .SET_ACTION |
ACTION_HASH |
NUMBER |
Hash value of the action that is named in the ACTION column |
SERIALIZABLE_ABORTS |
NUMBER |
Number of times the transaction fails to serialize, producing ORA-08177 errors, totalled over all the child cursors |
OUTLINE_CATEGORY |
VARCHAR2(64) |
If an outline was applied during construction of the cursor, then this column displays the category of that outline. Otherwise the column is left blank. |
CPU_TIME |
NUMBER |
CPU time (in microseconds) used by this cursor for parsing, executing, and fetching |
ELAPSED_TIME |
NUMBER |
Elapsed time (in microseconds) used by this cursor for parsing, executing, and fetching |
OUTLINE_SID |
VARCHAR2(40) |
Outline session identifier |
LAST_ACTIVE_CHILD_ADDRESS |
RAW(4) |
Address (identifier) of the child cursor that was the last to be active in the group (that is, the child cursor on behalf of which statistics in V$SQL were updated) |
REMOTE |
VARCHAR2(1) |
Indicates whether the cursor is remote mapped (Y ) or not (N ) |
OBJECT_STATUS |
VARCHAR2(19) |
Status of the cursor:
|
LITERAL_HASH_VALUE |
NUMBER |
Hash value of the literals which are replaced with system-generated bind variables and are to be matched, whenCURSOR_SHARING is used. This is not the hash value for the SQL statement. If CURSOR_SHARING is not used, then the value is 0. |
LAST_LOAD_TIME |
DATE |
Time at which the query plan (heap 6) was loaded into the library cache |
IS_OBSOLETE |
VARCHAR2(1) |
Indicates whether the cursor has become obsolete (Y ) or not (N ). This can happen if the number of child cursors is too large. |
CHILD_LATCH |
NUMBER |
Child latch number that is protecting the cursor |
SQL_PROFILE |
VARCHAR2(64) |
SQL profile |
PROGRAM_ID |
NUMBER |
Program identifier |
PROGRAM_LINE# |
NUMBER |
Program line number |
EXACT_MATCHING_SIGNATURE |
NUMBER |
The signature used when the CURSOR_SHARING parameter is set to EXACT |
FORCE_MATCHING_SIGNATURE |
NUMBER |
The signature used when the CURSOR_SHARING parameter is set to FORCE |
LAST_ACTIVE_TIME |
DATE |
Time at which the query plan was last active |
BIND_DATA |
RAW(2000) |
Bind data |
- Inicie sesión o registrese para enviar comentarios
Muy útil y claro, gracias por
Muy útil y claro, gracias por la información.
- Inicie sesión o registrese para enviar comentarios
Muchas gracias, me sirvio
Muchas gracias, me sirvio mucho, esta super detallado y claro.
Saludos
- Inicie sesión o registrese para enviar comentarios
Gracias por el articulo Me
Gracias por el articulo
Me podrias decir como consultar DML de mas de 8 dias con los mismos datos (o similares) que los mostrados en la consulta?
Gracias
- Inicie sesión o registrese para enviar comentarios
Buenos días. Tengo una tabla
Buenos días. Tengo una tabla con 82 columnas en donde 80 de estas tienen por nombre col01, col02, col03,....col80. Realizo un fetch y guardo los valores en vcol01, vcol02,...vcol80. Lo que se requiere es poder identificar que columnas tienen valores y cuáles no. Para esto existen dos alternativas: a)preguntar por medio de if en cada columna si es nula o si tiene valor, la otra alternativa es b) en un while construir la variable vcol concatenado con una secuencia(vcol || secuencia) de tal forma que quede vcol01, vcol02, vcol03.... pero ahora requiero saber el contenido de ésta variable para saber si tiene valor o si es nula.
- Inicie sesión o registrese para enviar comentarios
Lenguaje Oracle SQL, PL/SQL y desarrollo
Lenguaje Oracle SQL, PL/SQL y desarrollo Dataprix 8 Septiembre, 2009 - 09:49Cómo hacer o mejorar sentencias Oracle SQL, utilizar PL/SQL y los procedimientos almacenados, o cualquier cosa relacionada con el desarrollo o explotación de bases de datos Oracle
Construcción de scripts Oracle SQL con ayuda del diccionario
Construcción de scripts Oracle SQL con ayuda del diccionario Carlos 7 Junio, 2007 - 23:12Es bastante habitual si se trabaja con bases de datos que a menudo se tenga que realizar alguna tarea de creación o alteración de estructuras, análisis, recompilación, etc. sobre objetos de la base de datos. Para ello se suele crear un script con numerosas sentencias DDL, en las que la mayoría de las veces lo único que cambia es el nombre del objeto a tratar.
Crear sentencia Oracle SQL que genera sentencias Oracle
En estos casos puede ahorrarnos mucho trabajo la utilización del diccionario de la base de datos para construir estas sentencias dinámicamente. Pondremos como ejemplo la creación de un nuevo campo para almacenar la fecha de creación de los registros en todas las tablas de un esquema de una base de datos ORACLE. Para ello utilizaríamos la siguiente sentencia de SQL Oracle:
SELECT 'ALTER TABLE ' || OWNER || '.' || TABLE_NAME || ' ADD FECHA_CREACION DATE DEFAULT SYSDATE;'
FROM ALL_TABLES WHERE OWNER ='HR';
El resultado de esta sentencia SQL Oracle sería algo como esto, las sentencias SQL que queremos utilizar en realidad:
ALTER TABLE HR.DEPARTMENTS ADD FECHA_CREACION DATE DEFAULT SYSDATE; ALTER TABLE HR.EMPLOYEES ADD FECHA_CREACION DATE DEFAULT SYSDATE; ALTER TABLE HR.JOB_HISTORY ADD FECHA_CREACION DATE DEFAULT SYSDATE; ALTER TABLE HR.JOBS ADD FECHA_CREACION DATE DEFAULT SYSDATE; ALTER TABLE HR.LOCATIONS ADD FECHA_CREACION DATE DEFAULT SYSDATE; ALTER TABLE HR.REGIONS ADD FECHA_CREACION DATE DEFAULT SYSDATE; ALTER TABLE HR.COUNTRIES ADD FECHA_CREACION DATE DEFAULT SYSDATE;
Crear script con Oracle SQL para ejecutar sentencias SQL
Ahora sólo restaría guardar estas sentencias en un script y ejecutarlo, o lanzarlas directamente desde la aplicación que utilicemos para interactuar con nuestra base de datos.
Para el que tenga que (o prefiera) trabajar desde un terminal o linea de comandos, la manera de hacer esto mismo con SQLPLUS sería la siguiente:
SQL> SET HEADING OFF
SQL> SET FEEDBACK OFF
SQL> SPOOL C:\campo_auditoria.sql
SQL> SELECT 'ALTER TABLE ' || OWNER || '.' || TABLE_NAME || ' ADD FECHA_CREACION DATE DEFAULT SYSDATE;'
FROM ALL_TABLES WHERE OWNER ='HR';
SQL> SPOOL OFF;
SQL> SET FEEDBACK ON
SQL> SET HEADING ON
Y finalmente ejecutar el script generado, aunque es recomendable una revisión previa de las sentencias generadas:
SQL> @C:\campo_auditoria.sql
Estructura de la Dimension Tiempo y Script de carga con Oracle SQL
Estructura de la Dimension Tiempo y Script de carga con Oracle SQL Carlos 29 Agosto, 2009 - 23:47Con este script de Oracle SQL se crea una tabla DIM_TIEMPO y se rellena con los valores comprendidos entre las fechas que se indiquen en las variables FechaDesde y FechaHasta. Puede ser muy útil para la creación de la tabla de tiempo de cualquier Data Warehouse.
Esta es la versión para una base de datos Oracle, con Oracle SQL, que se suma a las que han creado anteriormente il_masacratore y Dario Bernabeu para Microsoft SQL Server y Oracle MySQL en sus respectivos blogs:
Estructura de la Dimensión Tiempo y Script de carga para Ms SQL Server
Estructura de la Dimensión Tiempo y Procedure de carga para MySQL
----------------------------------------------------
-- SQL de Creación de la tabla DIM_TIEMPO --
----------------------------------------------------
drop table DIM_TIEMPO;
create table DIM_TIEMPO
(
FechaSK number not null,
Fecha date not null PRIMARY KEY,
Año number not null,
Trimestre number not null,
Mes number not null,
Semana number not null,
Dia number not null,
DiaSemana number not null,
NTrimestre varchar2(7) not null,
NMes varchar2(15) not null,
NMes3L varchar2(3) not null,
NSemana varchar2(10) not null,
NDia varchar2(6) not null,
NDiaSemana varchar2(10) not null
);
------------------------------------------------------------
-- Script Oracle SQL de carga de los datos entre fechas --
------------------------------------------------------------
DECLARE
FechaDesde date;
FechaHasta date;
BEGIN
--Borrar datos actuales, si fuese necesario
--TRUNCATE TABLE DIM_TIEMPO
--Rango de fechas a generar: del 01/01/2006 al 31/12/Año actual+2
FechaDesde := TO_DATE('20060101','YYYYMMDD');
FechaHasta := TO_DATE((TO_CHAR(sysdate,'YYYY')+2 || '1231'),'YYYYMMDD');
WHILE FechaDesde <= FechaHasta LOOP
INSERT INTO DIM_TIEMPO
(
FechaSK,
Fecha,
Año,
Trimestre,
Mes,
Semana,
Dia,
DiaSemana,
NTrimestre,
NMes,
NMes3L,
NSemana,
NDia,
NDiaSemana
)
VALUES
(
to_char(FechaDesde,'YYYYMMDD'),
FechaDesde,
to_char(FechaDesde,'YYYY'),
to_char(FechaDesde, 'Q'),
to_char(FechaDesde,'MM'),
to_char(FechaDesde,'WW'),
to_char(FechaDesde,'DD'),
to_char(FechaDesde,'D'),
'T'||to_char(FechaDesde, 'Q')||'/'||to_char(FechaDesde,'YY'),
to_char(FechaDesde,'MONTH'),
to_char(FechaDesde,'MON'),
'Sem '||to_char(FechaDesde,'WW')||'/'||to_char(FechaDesde,'YY'),
to_char(FechaDesde,'DD MON'),
to_char(FechaDesde,'DAY')
);
--Incremento del bucle
FechaDesde := FechaDesde + 1;
END LOOP;
END;
Como cada uno se adaptará el formato de las fechas al que más le convenga, aprovecho para adjuntar esta tabla de ayuda obtenida de Oradev. Contiene descripciones de la sintaxis que se puede utilizar en las máscaras de formato de fechas de las funciones TO_CHAR y TO_DATE de Oracle:
Format mask | Description |
---|---|
CC | Century |
SCC | Century BC prefixed with - |
YYYY | Year with 4 numbers |
SYYY | Year BC prefixed with - |
IYYY | ISO Year with 4 numbers |
YY | Year with 2 numbers |
RR | Year with 2 numbers with Y2k compatibility |
YEAR | Year in characters |
SYEAR | Year in characters, BC prefixed with - |
BC | BC/AD Indicator * |
Q | Quarter in numbers (1,2,3,4) |
MM | Month of year 01, 02...12 |
MONTH | Month in characters (i.e. January) |
MON | JAN, FEB |
WW | Weeknumber (i.e. 1) |
W | Weeknumber of the month (i.e. 5) |
IW | Weeknumber of the year in ISO standard. |
DDD | Day of year in numbers (i.e. 365) |
DD | Day of the month in numbers (i.e. 28) |
D | Day of week in numbers(i.e. 7) |
DAY | Day of the week in characters (i.e. Monday) |
FMDAY | Day of the week in characters (i.e. Monday) |
DY | Day of the week in short character description (i.e. SUN) |
J | Julian Day (number of days since January 1 4713 BC, where January 1 4713 BC is 1 in Oracle) |
HH | Hournumber of the day (1-12) |
HH12 | Hournumber of the day (1-12) |
HH24 | Hournumber of the day with 24Hours notation (1-24) |
AM | AM or PM |
PM | AM or PM |
MI | Number of minutes (i.e. 59) |
SS | Number of seconds (i.e. 59) |
SSSSS | Number of seconds this day. |
DS | Short date format. Depends on NLS-settings. Use only with timestamp. |
DL | Long date format. Depends on NLS-settings. Use only with timestamp. |
E | Abbreviated era name. Valid only for calendars: Japanese Imperial, ROC Official and Thai Buddha.. (Input-only) |
EE | The full era name |
FF | The fractional seconds. Use with timestamp. |
FF1..FF9 | The fractional seconds. Use with timestamp. The digit controls the number of decimal digits used for fractional seconds. |
FM | Fill Mode: suppresses blianks in output from conversion |
FX | Format Exact: requires exact pattern matching between data and format model. |
IYY or IY or I the last 3,2,1 digits of the ISO standard year. Output only | |
RM | The Roman numeral representation of the month (I .. XII) |
RR | The last 2 digits of the year. |
RRRR | The last 2 digits of the year when used for output. Accepts fout-digit years when used for input. |
SCC | Century. BC dates are prefixed with a minus. |
CC | Century |
SP | Spelled format. Can appear of the end of a number element. The result is always in english. For example month 10 in format MMSP returns "ten" |
SPTH | Spelled and ordinal format; 1 results in first. |
TH | Converts a number to it's ordinal format. For example 1 becoms 1st. |
TS | Short time format. Depends on NLS-settings. Use only with timestamp. |
TZD | Abbreviated time zone name. ie PST. |
TZH | Time zone hour displacement. |
TZM | Time zone minute displacement. |
TZR | Time zone region |
X | Local radix character. In america this is a period (.) |
Adjunto procedimiento
Adjunto procedimiento completo de PL/SQL de Oracle al que se le adicionan 3 campos: periodo que no es relevante, fecha de corte que es el ultimo dia del trimestre de la fecha, la fecha de corte anterior que es la fecha del anterior trimestre.
Espero les sirva.
CREATE OR REPLACE PROCEDURE CARGADIMTIEMPO IS
tmpVar NUMBER;
FechaDesde date;
FechaHasta date;
FechaDesdeStr VARCHAR2(8);
err_num NUMBER;
err_msg VARCHAR2(255);
BEGIN
tmpVar := 0;
FechaDesde := TO_DATE('19941231','YYYYMMDD');
FechaHasta := TO_DATE('20181231','YYYYMMDD');
WHILE FechaDesde <= FechaHasta LOOP
FechaDesdeStr := to_char( FechaDesde, 'YYYYMMDD') ;
INSERT INTO DIM_TIEMPO
(
FechaSK,
Fecha,
Año,
Trimestre,
Mes,
Semana,
Dia,
DiaSemana,
NTrimestre,
NMes,
NMes3L,
NSemana,
NDia,
NDiaSemana,
Periodo,
FechaCorte,
FechaCorteAnt
)
VALUES
(
to_char(TO_DATE( FechaDesdeStr,'YYYYMMDD') ,'YYYYMMDD'),
FechaDesde,
to_char(TO_DATE( FechaDesdeStr,'YYYYMMDD'),'YYYY'),
to_char(TO_DATE( FechaDesdeStr,'YYYYMMDD'), 'Q'),
to_char(TO_DATE( FechaDesdeStr,'YYYYMMDD'),'MM'),
to_char(TO_DATE( FechaDesdeStr,'YYYYMMDD'),'WW'),
to_char(TO_DATE( FechaDesdeStr,'YYYYMMDD'),'DD'),
to_char(TO_DATE( FechaDesdeStr,'YYYYMMDD'),'D'),
'T'||to_char(TO_DATE( FechaDesdeStr,'YYYYMMDD'), 'Q')||'/'||to_char(TO_DATE( FechaDesdeStr,'YYYYMMDD'),'YY'),
to_char(TO_DATE( FechaDesdeStr,'YYYYMMDD'),'MONTH'),
to_char(TO_DATE( FechaDesdeStr,'YYYYMMDD'),'MON'),
'Sem '||to_char(TO_DATE( FechaDesdeStr,'YYYYMMDD'),'WW')||'/'||to_char(TO_DATE( FechaDesdeStr,'YYYYMMDD'),'YY'),
to_char(TO_DATE( FechaDesdeStr,'YYYYMMDD'),'DD MON'),
to_char(TO_DATE( FechaDesdeStr,'YYYYMMDD'),'DAY'),
CASE
WHEN to_char(TO_DATE( FechaDesdeStr,'YYYYMMDD'), 'Q') = 1 THEN 3
WHEN to_char(TO_DATE( FechaDesdeStr,'YYYYMMDD'), 'Q') = 2 THEN 6
WHEN to_char(TO_DATE( FechaDesdeStr,'YYYYMMDD'), 'Q') = 3 THEN 9
WHEN to_char(TO_DATE( FechaDesdeStr,'YYYYMMDD'), 'Q') = 4 THEN 12
END,
CASE
WHEN to_char(TO_DATE( FechaDesdeStr,'YYYYMMDD'), 'Q') = 1 THEN TO_DATE('31/03/' || to_char(TO_DATE( FechaDesdeStr,'YYYYMMDD'),'YYYY'), 'DD/MM/YYYY')
WHEN to_char(TO_DATE( FechaDesdeStr,'YYYYMMDD'), 'Q') = 2 THEN TO_DATE('30/06/' || to_char(TO_DATE( FechaDesdeStr,'YYYYMMDD'),'YYYY'), 'DD/MM/YYYY')
WHEN to_char(TO_DATE( FechaDesdeStr,'YYYYMMDD'), 'Q') = 3 THEN TO_DATE('30/09/' || to_char(TO_DATE( FechaDesdeStr,'YYYYMMDD'),'YYYY'), 'DD/MM/YYYY')
WHEN to_char(TO_DATE( FechaDesdeStr,'YYYYMMDD'), 'Q') = 4 THEN TO_DATE('31/12/' || to_char(TO_DATE( FechaDesdeStr,'YYYYMMDD'),'YYYY'), 'DD/MM/YYYY')
END,
CASE
WHEN to_char(to_date(FechaDesdeStr,'YYYYMMDD'), 'Q') = 1 THEN TO_DATE('31/12/' || to_char(to_number(to_char(TO_DATE( FechaDesdeStr,'YYYYMMDD'),'YYYY'))-1), 'DD/MM/YYYY')
WHEN to_char(TO_DATE( FechaDesdeStr,'YYYYMMDD'), 'Q') = 2 THEN TO_DATE('31/03/' || to_char(TO_DATE( FechaDesdeStr,'YYYYMMDD'),'YYYY'), 'DD/MM/YYYY')
WHEN to_char(TO_DATE( FechaDesdeStr,'YYYYMMDD'), 'Q') = 3 THEN TO_DATE('30/06/' || to_char(TO_DATE( FechaDesdeStr,'YYYYMMDD'),'YYYY'), 'DD/MM/YYYY')
WHEN to_char(TO_DATE( FechaDesdeStr,'YYYYMMDD'), 'Q') = 4 THEN TO_DATE('30/09/' || to_char(TO_DATE( FechaDesdeStr,'YYYYMMDD'),'YYYY'), 'DD/MM/YYYY')
END
);
-- Incremento del bucle
commit ;
FechaDesde := FechaDesde + 1;
END LOOP;
EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL;
WHEN OTHERS THEN
-- Consider logging the error and then re-raise
err_num := SQLCODE;
err_msg := SQLERRM;
DBMS_OUTPUT.put_line('Error Problemas :'||TO_CHAR(err_num) || ' ' || err_msg );
DBMS_OUTPUT.put_line(err_msg);
END CARGADIMTIEMPO;
- Inicie sesión o registrese para enviar comentarios
Gracias por la aportación de
Gracias por la aportación de esta ampliación :)
- Inicie sesión o registrese para enviar comentarios
Gestionar dos empresas con el mismo usuario
Gestionar dos empresas con el mismo usuario ana.janez 13 May, 2014 - 11:14Hola a todos.
Soy nueva con oracle y tengo una duda. Necesito crear con forms una aplicacion que gestione dos empresas. Un usuario se conecta y podrá elegir entre dos empresas. Dependiendo de la empresa que elija se le mostraran los datos correspondientes. Las dos empresas tienen las mismas estructura tablas pero con datos diferentes.
Muchas gracias por vuestra ayuda
Independientemente de si se
Independientemente de si se trata de una aplicación de Oracle Forms o no, lo que comentas me parece una decisión de diseño que se ha de tomar al nivel del modelo de datos, de las tablas de la base de datos.
Yo creo que si las dos empresas manejan los mismos datos lo más indicado es incluir en cada tabla un identificador de la empresa, que enlace a una tabla maestra de empresas. Así cualquier aplicación podrá identificar los datos que corresponden a cada empresa para mostrarlos o no a quien corresponda, o en función del entorno o las selecciones que se hayan hecho.
Espero haberte ayudado.
- Inicie sesión o registrese para enviar comentarios
ana.janez wrote: Hola de
[quote=ana.janez]
Hola de nuevo,
Lo primero es agradecer tu ayuda. Si he entendido bien la cuestión sería duplicar todas las tablas de la base de datos y añadir un campo extra en cada tabla en el que se indique el nombre de la empresa a la que pertenece. Mi pregunta es, ese campo extra que identifica la empresa debe considerarse parte de una primary key o no es necesario?
gracias de nuevo.[/quote]
- Inicie sesión o registrese para enviar comentarios
No del todo, de duplicar
No del todo, de duplicar nada, cada tabla te ha de servir para las dos empresas, por eso cada registro ha de tener el campo identificador de la empresa y, efectivamente lo normal es que este id de empresa forme parte de la clave primaria.
La opción de duplicar tablas también es factible, pero entonces sería el nombre de la tabla lo que te indicaría si los datos que contiene son de una empresa u otra, y entonces no sería necesario que las tablas tuvieran un campo id de la empresa. De todas maneras, esta segunda opción desperdicia mucho espacio, es muy poco flexible, y a la larga seguro que te complica el mantenimiento, yo te recomendaría la primera, la misma tabla para almacenar los registros de ambas empresas.
- Inicie sesión o registrese para enviar comentarios
Insert entre bases de datos remotas enlazadas por dblink de Oracle
Insert entre bases de datos remotas enlazadas por dblink de Oracle cfb 19 Agosto, 2008 - 22:28Para hacer un insert con Oracle SQL desde una tabla de una base de datos TablaBD1 a otra base de datos TablaBD2 a través de un dblink debería haber dos maneras:
1- Crear el database link en la base de datos origen BD1 y hacer el insert hacia la tabla de la base de datos destino BD2 a través de este dblink
SQL en la base de datos Oracle BD1:
CREATE [PUBLIC] DATABASE LINK BD1toBD2_dblink
CONNECT TO usuario2
IDENTIFIED BY password2
USING 'BD2';
INSERT INTO TablaBD2@BD1toBD2_dblink
(SELECT * FROM TablaBD1);
* Para simplificar suponemos que las tablas tienen la misma estructura
2- Crear el database link en la base de datos destino BD2 y hacer el insert seleccionando los registros de la tabla de la base de datos origen BD1 a través de este dblink:
SQL en la base de datos Oracle BD2:
CREATE [PUBLIC] DATABASE LINK BD2toBD1_dblink
CONNECT TO usuario1
IDENTIFIED BY password1
USING 'BD1';
INSERT INTO TablaBD2
(SELECT * FROM TablaBD1@BD2toBD1_dblink);
Yo hasta ahora he utilizado siempre el SQL de la segunda opción para enlazar bases de datos Oracle, supongo que porque parece más simple utilizar un dblink para seleccionar datos de una tabla de una base de datos remota que para insertarlos remotamente. Pues parece que lo mejor es buscar las cosas simples porque he podido comprobar que la primera opción no funciona, por lo menos a mi.
He probado a hacerlo creando con SQL un dblink entre dos bases de datos Oracle 10g y la inserción no se realizaba. Lo curioso es que la sentencia SQL, en lugar de devolverme un error me devolvía un mensaje de '0 registros insertados', cuando haciendo la SELECT sí que obtenía registros.
Yo he llegado a la conclusión de que la opción de insertar datos directamente en una tabla de una base de datos Oracle remota a través de un database link no funciona, hay que hacer una SELECT desde la base de datos 'destino'. Para simplificar, la @ ha de estar en la tabla de la sentencia SQL de SELECT, no en la de INSERT.
Si alguien tiene una explicación mejor le agradecería que lo comentara, porque el tema me parece bastante curioso.
Saludos Cordiales, Tengo dos
Saludos Cordiales,
Tengo dos base de datos en Oracle 9i y necesito efectuar replicacion de datos entre ellos, ahora mismo uso DBLINK para mantener actualizada la información, pensamos cambiar a vistas materializadas, pero recientemente eschamos el STREAMS de Oracle, lo ha utilizado? podria sugerirme algunos link o información al respecto? el problema básico es que tengo una TABLA A en una DB 1 que constantemente se incrementa en el número de registros (Ocurren INSERT constantemente) y debemos actualizar la TABLA B en una BD 2. Cuando insertamos en la TABLA B cada vez que se inserte en la TABLA A se quedan conexiones abiertas que nunca se cierran y degrada el performance de la BD 1 y de la BD 2.
Puedes Ayudarnos?
Gracias de antemano
- Inicie sesión o registrese para enviar comentarios
Las vistas materializadas
Las vistas materializadas pueden ser un buena opción para gestionar esta replicación, pero si las inserciones son muy frecuentes donde vas a notar mejora, con cualquier método que utilices para refrescar, es si en lugar de actualizar cada vez que insertas en la tabla origen, lo haces de manera agrupada, seleccionando los registros que han cambiado cada cierto tiempo para hacer un sólo insert cada x tiempo en lugar de un insert/update por registro creado o modificado.
Sobre STREAMS de Oracle yo no los he utilizado nunca, así que si los pruebas y nos explicas qué tal funcionan te lo agradezco.
Sobre vistas materializadas, te enlazo un artículo que explica cómo utilizar las vistas materializadas, e incluye enlaces a la documentación oficial de Oracle, espero que te ayude.
Y si te quedan dudas, en el foro tenemos abierto un tema sobre vistas materializadas de Oracle.
Saludos,
- Inicie sesión o registrese para enviar comentarios
Hola, Muy buen aporte! Sólo
Hola, Muy buen aporte!
Sólo me queda una consulta... Haciendo el dblink éste permite que las modificaciones sean bidireccionales?
Muchas gracias!
Saludos.-
- Inicie sesión o registrese para enviar comentarios
Hola Manuel. El DBLink es
Hola Manuel.
El DBLink es para utilizarlo desde la instancia de base de datos en la que se define, y desde esta poder enlazar con otras, pero de manera unidireccional, tanto para modificaciones como para consultas.
Es decir, que desde las bases de datos que se enlazan con el database link no se puede utilizar ni se ve este mismo dblink para conectar con la primera. Para hacerlo habria que definir un nuevo dblink en la otra base de datos.
Saludos!
- Inicie sesión o registrese para enviar comentarios
Perfecto! Muchisimas gracias!
Perfecto! Muchisimas gracias!
- Inicie sesión o registrese para enviar comentarios
Saludos! Gracias por la
Saludos!
Gracias por la información.
Cuando probemos STRWAMS, lo comento por el foro.
- Inicie sesión o registrese para enviar comentarios
Genial, estaremos pendientes,
Genial, estaremos pendientes, gracias a ti por compartir!
- Inicie sesión o registrese para enviar comentarios
Amigo necesito realizar un
Amigo necesito realizar un insert desde una bd SQL Server a Oracle, como hago para ejecutar o hacer un llamado a un Stored Procedure que realice un insert en la BD Oracle desde una Bd SQL Server
- Inicie sesión o registrese para enviar comentarios
Oracle 10g: Posible optimización de volcado masivo de datos
Oracle 10g: Posible optimización de volcado masivo de datos il_masacratore 12 Febrero, 2010 - 18:06
En Oracle SQL, se pueden optimizar ejecuciones batch que hagan un volcado masivo de datos en una misma tabla usando sentencias de insert o update por registro dentro de un bloque. Se pueden optimizar con el uso de parámetros (si el cliente lo permite) o si usamos odbc con bind variables.
Recordemos los pasos que sigue Oracle para procesar una consulta:
- Validación Sintáctica
- Validación Semántica
- Optimización
- Generación del QEP (Query Execution Plan)
- Ejecución del QEP (Query Execution Plan)
Las sentencias SQL pueden recoger los parámetros por valor (where salario>1000) o una vez compilada la sentencia haciendo uso de Bind Variables (where salario>:b1). La ventaja de la segunda opción es que Oracle compila un única vez la sentencia y reutiliza el código compilado para cada uno de los valores para los parámetros. Pero hay que ir con ojo ya que en este segundo caso, Oracle no puede calcular el grado de selectividad de una consulta y, en su lugar, aplica un grado de selectividad por defecto (asociado a cada tipo de operación), lo cual puede dar lugar a decisiones "equivocadas".
Por lo tanto, trabajando por costes es desaconsejable el uso de Bind Variables, salvo que trabajemos con sentencias Oracle SQL que se van a ejecutar repetidas veces y que no ofrezcan muchas dudas en cuanto a los posibles planes de acceso que puede generar.
En casos probados como el siguiente el tiempo de ejecución se reduce hasta en un 90% en una inserción de 100.000 registros...
SQL para Creación de la tabla necesaria para la prueba:
create table PRUEBA ( NUM number(22), TEXTO varchar(100) );
SQL de Carga con parámetros por valor:
declare v_i number; begin loop INSERT INTO PRUEBA VALUES (3, '50'); v_i := v_i + 1; exit when v_i > 1000000; end loop; rollback; end;
SQL de Carga con parámetros usando bind variables
declare v_i number; begin loop execute immediate 'INSERT INTO PRUEBA VALUES (:x, :y)' using 3, '50'; v_i := v_i + 1; exit when v_i > 1000000; end loop; rollback; end;
Adjunto los resultados de la prueba realizada antes de aplicar cambios en producción (un viernes por la tarde )
FILAS | POR VALOR | CON BIND VARIABLES |
10000 | 5,3350 | 0,4370 |
100000 | 58,5160 | 6,1000 |
1000000 | (A)570,1060 | (B)54,1950 |
Oracle Flashback Query
Oracle Flashback Query Juan_Vidal 13 Septiembre, 2011 - 09:53
Revisamos brevemente en este post la funcionalidad flashback query que aporta el gestor de BBDD de Oracle desde su versión 9i.
Básicamente se trata de un tipo de sql de Oracle que accede a datos que existían en la base de datos en un momento anterior, pero que en el momento en el que se ejecuta la sql pueden no existir o haber sufrido modificaciones. Para ello, Oracle utiliza los datos que quedan disponibles durante un tiempo en el segmento de UNDO. Este segmento, como es sabido, almacena los datos anteriores a una serie de modificaciones. Se utiliza para asegurar la consistencia en la lectura de una consulta previa a la confirmación de las modificaciones (commit) y pueden ser utilizados en una posible recuperación (rollback).
La sentencia de Oracle SQL flashback query nos permite ver datos de la tabla que han sido borrados o modificados. Ejecutando una flashback query accedemos a datos de una foto de datos consistentes en un punto determinado, especificando para ello la hora del sistema o bien el número de cambio del sistema (SCN). La base de datos debe estar configurada para trabajar en Automatic Undo Management (AUM). Para ello revisar los siguientes parámetros de la base de datos Oracle:
undo_management = auto undo_tablespace = UNDOTBS001 (tablespace que alberga el segmento de undo) undo_retention = 3600 (tiempo en segundos que tenemos retenido el dato en el segmento de undo)
Hay que tener en cuenta respecto al parámetro undo_retention que si el tablespace de UNDO no es lo suficientemente grande como para mantener ese tiempo todas las transacciones, el gestor de base de datos las va a sobreescribir. Igualmente, considerar que para poder ejecutar el comando flashback query de Oracle SQL debemos tener permisos sobre el package BDMS_FLASHBACK. Para ello:
sys> grant execute on dbms_flashback to usuario1;
Veamos un ejemplo. Supongamos que queremos realizar una consulta SQL sobre una tabla que contiene facturas de clientes y queremos acceder a los datos de un cliente que previamente hemos borrado:
sys> select to char(sysdate, ‘dd-mm-yyyy hh24:mi’) fecha_sistema from dual; fecha_sistema ------------------------- 12-09-2011 12:05 sys> delete from t_facturas where cod_cliente = ‘00125’; 4 registros borrados sys> commit;
Media hora después ejecutamos:
sys> select to char (sysdate, ‘dd-mm-yyyy hh24:mi’) fecha_sistema from dual fecha_sistema ------------------------- 12-09-2011 12:35 sys> exec dbms_flashback.enable_at_time (to_date('12-09-2011 12:05, 'DD-MM-YYYY HH24:MI')); sys> select to char (sysdate, ‘dd-mm-yyyy hh24:mi’) fecha_sistema from dual fecha_sistema ------------------------- 12-09-2011 12:35 sys> exec dbms_flashback.enable_at_time (to_date(’12-09-2011 12:05, ‘DD-MM-YYYY HH24:MI’)); Procedimiento PL/SQL terminado correctamente. sys> select * from t_facturas where cod_cliente = ‘00125’; …… …… …… …… 4 registros seleccionados. sys> execute dbms_flasback.disable; sys> select count(*) from t_facturas where cod_cliente = ‘00125’; count(*) ------ 0
Se puede obtener lo mismo accediendo por el número de cambio SCN:
sys> select dbms_flashback.get_system_change_number from dual; GET_SYSTEM_CHANGE_NUMBER ------------------------ 1307125 sys> exec dbms_flashback.enable_at_system_change_number(1307125); Procedimiento PL/SQL terminado correctamente
Existe también la posibilidad de emplear la sentencia ‘select ... as of...’:
sys> select * from t_facturas where cod_cliente = ‘00125’ as of timestamp to_timestamp (’12-09-2011 12:05', ‘DD-MM-YYYY HH24:MI’); sys> select * from t_facturas where cod_cliente = ‘00125’ as of scn 1307125;
Hay que tener en cuenta que mientras la sesión está en el modo Flashback Query, solo podemos ejecutar sentencias SELECT. Las sentencias SQL de actualización (insert, delete y update) no están permitidas.
En el trabajo diario con esta opción es útil el uso de tablas temporales para trabajar con los datos recuperados:
sys> create table t_facturas_ant as (select * from t_facturas where cod_cliente = ‘00125’ as of timestamp to_timestamp (’12-09-2011 12:05, ‘DD-MM-YYYY HH24:MI’);
Otras opciones Flashback Query
A continuación listamos algunas funcionalidades que aporta Oracle relacionadas con operaciones Flashback Query:
- Flashback Version Query: Acceso al histórico de cambios de una tabla.
- Flashback Transaction Query: Acceso al histórico de cambios de una transacción determinada.
- Flashback Table: Acceso a datos anteriores, pero para una única tabla.
- Flashback Drop: Recuperar una tabla borrada (‘papelera reciclaje’).
- Flashback Database: Permite dejar la BBDD tal y como se encontraba en un tiempo pasado. Similar a restaurar un backup, pero con las limitaciones temporales de los procesos flashback, aunque mucho más rápido que recuperar la copia del backup. Es necesario tener el modo flashback activado, así como la flash recovery area.
Algunas de estas opciones requieren que el gestor sea 'Enterprise Edition'.
Se trata, como se ha dicho, de una sentencia de Oracle SQL bastante útil, con múltiples opciones de “rebobinado” y que nos puede sacar de más de un apuro.
Recopilación scripts y consultas útiles de Oracle
Recopilación scripts y consultas útiles de Oracle Carlos 14 Marzo, 2007 - 00:33¿Quién no tiene su chuleta de consultillas útiles que se suelen utilizar en el día a día, y en nuestras aventuras y desventuras con la base de datos?
Incluyo en este primer post un listado de consultas SQL de Oracle, la mayoría sobre las vistas del diccionario de Oracle, y extraídas de la web Cibermanuales.com , y animo a todo el que quiera añadir otras que considere de utilidad a responder el post publicando las suyas, a ver si entre todos creamos un repositorio que podamos consultar desde cualquier lugar para facilitarnos la vida, o sacarnos de algún que otro apuro.
•• Consulta Oracle SQL sobre la vista que muestra el estado de la base de datos select * from v$instance
•• Consulta Oracle SQL que muestra si la base de datos está abierta select status from v$instance
•• Consulta Oracle SQL sobre la vista que muestra los parámetros generales de Oracle select * from v$system_parameter
•• Consulta Oracle SQL para conocer la Versión de Oracle select value from v$system_parameter where name = 'compatible'
•• Consulta Oracle SQL para conocer la Ubicación y nombre del fichero spfile select value from v$system_parameter where name = 'spfile'
•• Consulta Oracle SQL para conocer la Ubicación y número de ficheros de control select value from v$system_parameter where name = 'control_files'
•• Consulta Oracle SQL para conocer el Nombre de la base de datos select value from v$system_parameter where name = 'db_name'
•• Consulta Oracle SQL sobre la vista que muestra las conexiones actuales a Oracle Para visualizarla es necesario entrar con privilegios de administrador select osuser, username, machine, program from v$session order by osuser
•• Consulta Oracle SQL que muestra el número de conexiones actuales a Oracle agrupado por aplicación que realiza la conexión select program Aplicacion, count(program) Numero_Sesiones from v$session group by program order by Numero_Sesiones desc
•• Consulta Oracle SQL que muestra los usuarios de Oracle conectados y el número de sesiones por usuario select username Usuario_Oracle, count(username) Numero_Sesiones from v$session group by username order by Numero_Sesiones desc
•• Consulta Oracle SQL que muestra propietarios de objetos y número de objetos por propietario select owner, count(owner) Numero from dba_objects group by owner
•• Consulta Oracle SQL sobre el Diccionario de datos (incluye todas las vistas y tablas de la Base de Datos) select * from dictionary
•• Consulta Oracle SQL que muestra los datos de una tabla especificada (en este caso todas las tablas que lleven la cadena "XXX") select * from ALL_ALL_TABLES where upper(table_name) like '%XXX%'
•• Consulta Oracle SQL que muestra las descripciones de los campos de una tabla especificada (en este caso todas las tablas que lleven la cadena "XXX") select * from ALL_COL_COMMENTS where upper(table_name) like '%XXX%'
•• Consulta Oracle SQL para conocer las tablas propiedad del usuario actual select * from user_tables
•• Consulta Oracle SQL para conocer todos los objetos propiedad del usuario conectado a Oracle select * from user_catalog
•• Consulta Oracle SQL para el DBA de Oracle que muestra los tablespaces, el espacio utilizado, el espacio libre y los ficheros de datos de los mismos Select t.tablespace_name "Tablespace", t.status "Estado", ROUND(MAX(d.bytes)/1024/1024,2) "MB Tamaño", ROUND((MAX(d.bytes)/1024/1024) - (SUM(decode(f.bytes, NULL,0, f.bytes))/1024/1024),2) "MB Usados", ROUND(SUM(decode(f.bytes, NULL,0, f.bytes))/1024/1024,2) "MB Libres", t.pct_increase "% incremento", SUBSTR(d.file_name,1,80) "Fichero de datos" FROM DBA_FREE_SPACE f, DBA_DATA_FILES d, DBA_TABLESPACES t WHERE t.tablespace_name = d.tablespace_name AND f.tablespace_name(+) = d.tablespace_name AND f.file_id(+) = d.file_id GROUP BY t.tablespace_name, d.file_name, t.pct_increase, t.status ORDER BY 1,3 DESC
•• Consulta Oracle SQL para conocer los productos Oracle instalados y la versión select * from product_component_version
•• Consulta Oracle SQL para conocer los roles y privilegios por roles select * from role_sys_privs
•• Consulta Oracle SQL para conocer las reglas de integridad y columna a la que afectan select constraint_name, column_name from sys.all_cons_columns
•• Consulta Oracle SQL para conocer las tablas de las que es propietario un usuario, en este caso "xxx" SELECT table_owner, table_name from sys.all_synonyms where table_owner like 'xxx'
•• Consulta Oracle SQL como la anterior, pero de otra forma más efectiva (tablas de las que es propietario un usuario) SELECT DISTINCT TABLE_NAME FROM ALL_ALL_TABLES WHERE OWNER LIKE 'HR'
•• Parámetros de Oracle, valor actual y su descripción SELECT v.name, v.value value, decode(ISSYS_MODIFIABLE, 'DEFERRED', 'TRUE', 'FALSE') ISSYS_MODIFIABLE, decode(v.isDefault, 'TRUE', 'YES', 'FALSE', 'NO') "DEFAULT", DECODE(ISSES_MODIFIABLE, 'IMMEDIATE', 'YES','FALSE', 'NO', 'DEFERRED', 'NO', 'YES') SES_MODIFIABLE, DECODE(ISSYS_MODIFIABLE, 'IMMEDIATE', 'YES', 'FALSE', 'NO', 'DEFERRED', 'YES','YES') SYS_MODIFIABLE , v.description FROM V$PARAMETER v WHERE name not like 'nls%' ORDER BY 1
•• Consulta Oracle SQL que muestra los usuarios de Oracle y datos suyos (fecha de creación, estado, id, nombre, tablespace temporal,...) Select * FROM dba_users
•• Consulta Oracle SQL para conocer tablespaces y propietarios de los mismos select owner, decode(partition_name, null, segment_name, segment_name || ':' || partition_name) name, segment_type, tablespace_name,bytes,initial_extent, next_extent, PCT_INCREASE, extents, max_extents from dba_segments Where 1=1 And extents > 1 order by 9 desc, 3
•• Últimas consultas SQL ejecutadas en Oracle y usuario que las ejecutó select distinct vs.sql_text, vs.sharable_mem, vs.persistent_mem, vs.runtime_mem, vs.sorts, vs.executions, vs.parse_calls, vs.module, vs.buffer_gets, vs.disk_reads, vs.version_count, vs.users_opening, vs.loads, to_char(to_date(vs.first_load_time, 'YYYY-MM-DD/HH24:MI:SS'),'MM/DD HH24:MI:SS') first_load_time, rawtohex(vs.address) address, vs.hash_value hash_value , rows_processed , vs.command_type, vs.parsing_user_id , OPTIMIZER_MODE , au.USERNAME parseuser from v$sqlarea vs , all_users au where (parsing_user_id != 0) AND (au.user_id(+)=vs.parsing_user_id) and (executions >= 1) order by buffer_gets/executions desc
•• Consulta Oracle SQL para conocer todos los tablespaces select * from V$TABLESPACE
•• Consulta Oracle SQL para conocer la memoria Share_Pool libre y usada select name,to_number(value) bytes from v$parameter where name ='shared_pool_size' union all select name,bytes from v$sgastat where pool = 'shared pool' and name = 'free memory'
•• Cursores abiertos por usuario select b.sid, a.username, b.value Cursores_Abiertos from v$session a, v$sesstat b, v$statname c where c.name in ('opened cursors current') and b.statistic# = c.statistic# and a.sid = b.sid and a.username is not null and b.value >0 order by 3
•• Consulta Oracle SQL para conocer los aciertos de la caché (no debería superar el 1 por ciento) select sum(pins) Ejecuciones, sum(reloads) Fallos_cache, trunc(sum(reloads)/sum(pins)*100,2) Porcentaje_aciertos from v$librarycache where namespace in ('TABLE/PROCEDURE','SQL AREA','BODY','TRIGGER');
•• Sentencias SQL completas ejecutadas con un texto determinado en el SQL SELECT c.sid, d.piece, c.serial#, c.username, d.sql_text FROM v$session c, v$sqltext d WHERE c.sql_hash_value = d.hash_value and upper(d.sql_text) like '%WHERE CAMPO LIKE%' ORDER BY c.sid, d.piece
•• Una sentencia SQL concreta (filtrado por sid) SELECT c.sid, d.piece, c.serial#, c.username, d.sql_text FROM v$session c, v$sqltext d WHERE c.sql_hash_value = d.hash_value and sid = 105 ORDER BY c.sid, d.piece
•• Consulta Oracle SQL para conocer el tamaño ocupado por la base de datos select sum(BYTES)/1024/1024 MB from DBA_EXTENTS
•• Consulta Oracle SQL para conocer el tamaño de los ficheros de datos de la base de datos select sum(bytes)/1024/1024 MB from dba_data_files
•• Consulta Oracle SQL para conocer el tamaño ocupado por una tabla concreta sin incluir los índices de la misma select sum(bytes)/1024/1024 MB from user_segments where segment_type='TABLE' and segment_name='NOMBRETABLA'
•• Consulta Oracle SQL para conocer el tamaño ocupado por una tabla concreta incluyendo los índices de la misma select sum(bytes)/1024/1024 Table_Allocation_MB from user_segments where segment_type in ('TABLE','INDEX') and (segment_name='NOMBRETABLA' or segment_name in (select index_name from user_indexes where table_name='NOMBRETABLA'))
•• Consulta Oracle SQL para conocer el tamaño ocupado por una columna de una tabla select sum(vsize('NOMBRECOLUMNA'))/1024/1024 MB from NOMBRETABLA
•• Consulta Oracle SQL para conocer el espacio ocupado por usuario SELECT owner, SUM(BYTES)/1024/1024 MB FROM DBA_EXTENTS group by owner
•• Consulta Oracle SQL para conocer el espacio ocupado por los diferentes segmentos (tablas, índices, undo, rollback, cluster, ...) SELECT SEGMENT_TYPE, SUM(BYTES)/1024/1024 MB FROM DBA_EXTENTS group by SEGMENT_TYPE
•• Consulta Oracle SQL para obtener todas las funciones de Oracle: NVL, ABS, LTRIM, ... SELECT distinct object_name FROM all_arguments WHERE package_name = 'STANDARD' order by object_name
•• Consulta Oracle SQL para conocer el espacio ocupado por todos los objetos de la base de datos, muestra los objetos que más ocupan primero SELECT SEGMENT_NAME, SUM(BYTES)/1024/1024 MB FROM DBA_EXTENTS group by SEGMENT_NAME order by 2 desc
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.
tablespaces en oracle
Saludos a todos.. Tengo una pregunta, en esta página se indica como ver
los datos de un tablespace desde Oracle Enterprise Manager,
pero ¿Se lo puede hacer via comandos desde SQL * Plus?..
- Inicie sesión o registrese para enviar comentarios
En este mismo tema tienes la
En este mismo tema tienes la respuesta. Entre las consultas SQL de la entrada inicial hay varios que consultan datos de tablespaces, que se encuentran en vista dba_tablespaces.
Otro ejemplo podría ser una query como esta:
select TABLESPACE_NAME, INITIAL_EXTENT, NEXT_EXTENT, MIN_EXTENTS, MAX_EXTENTS, PCT_INCREASE, STATUS, CONTENTS, LOGGING, FORCE_LOGGING
from dba_tablespaces
where TABLESPACE_NAME like 'mitablespace%';
- Inicie sesión o registrese para enviar comentarios
Para comparar dentro de un
Para comparar dentro de un DECODE con parte de un texto del contenido de un campo, es decir, para poder utilizar un like u otras funciones en lugar de la igualdad que toma por defecto el DECODE se puede hacer lo siguiente:
SELECT DECODE(CAMPO, (select CAMPO from dual where CAMPO like 'A%'), 'Campo comienza por A', (select name from dual where name like 'B%'), 'Campo comienza por B', 'Campo no comienza ni por A ni por B') FROM TABLA;
- Inicie sesión o registrese para enviar comentarios
Cuando un tablespace se queda
Cuando un tablespace se queda sin espacio se puede ampliar creando un nuevo fichero de datos, o ampliando uno de los existentes.
Para consultar el espacio ocupado por cada datafile se puede utilizar la consulta de la lista anterior:
•• Consulta Oracle SQL para el DBA de Oracle que muestra los tablespaces, el espacio utilizado, el espacio libre y los ficheros de datos de los mismos:
SELECT t.tablespace_name "Tablespace", t.status "Estado",
ROUND(MAX(d.bytes)/1024/1024,2) "MB Tamaño",
ROUND((MAX(d.bytes)/1024/1024) -
(SUM(decode(f.bytes, NULL,0, f.bytes))/1024/1024),2) "MB Usados",
ROUND(SUM(decode(f.bytes, NULL,0, f.bytes))/1024/1024,2) "MB Libres",
t.pct_increase "% incremento",
SUBSTR(d.file_name,1,80) "Fichero de datos"
FROM DBA_FREE_SPACE f, DBA_DATA_FILES d, DBA_TABLESPACES t
WHERE t.tablespace_name = d.tablespace_name AND
f.tablespace_name(+) = d.tablespace_name
AND f.file_id(+) = d.file_id GROUP BY t.tablespace_name,
d.file_name, t.pct_increase, t.status ORDER BY 1,3 DESC
Una vez que localizamos el datafile que podríamos ampliar ejecutaremos la siguiente sentencia para hacerlo:
ALTER DATABASE
DATAFILE '/db/oradata/datafiles/datafile_n.dbf' AUTOEXTEND
ON NEXT 1M MAXSIZE 4000M
Con esta sentencia, el datafile continuaría ampliándose hasta llegar a un máximo de 4Gb.
Si preferimos crear un nuevo datafile porque los que tenemos ya son demasido grandes, una sentencia que podríamos utilizar es la siguiente:
ALTER TABLESPACE "MiTablespace"
ADD
DATAFILE '/db/oradata/datafiles/datafile_m.dbf' SIZE
100M AUTOEXTEND
ON NEXT 1M MAXSIZE 1000M
Crearíamos un nuevo fichero de datos de 100 Mb, y en modo autoextensible hasta 1000 Mb. Por supuesto, el path especificado debe ser el específico de cada base de datos, y se debe utilizar para todo el proceso un usuario con privilegios de DBA.
- Inicie sesión o registrese para enviar comentarios
Para matar una sesión de
Para matar una sesión de Oracle hay que utilizar, con un usuario con permisos de DBA, el comando
ALTER SYSTEM KILL SESSION 'SID,SERIAL#';
Para obtener el SID y el SERIAL# que necesitamos se puede utilizar la consulta:
SELECT p.*, s.*
FROM v$session s, v$process p
WHERE p.addr(+)=s.paddr
ORDER BY SID
Esta consulta devolvería los datos de todas las sesiones abiertas, se pueden restringir los resultados a las sesiones que interesen añadiendo condiciones en el where.
Si el número de sesiones que hay que eliminar es elevado, se puede utilizar esta misma consulta para crear las sentencias necesarias dinámicamente:
SELECT 'alter system kill session '''||s.sid||','||p.serial#||''';'
FROM v$session s, v$process p
WHERE p.addr(+)=s.paddr
AND s.username='USER'; (por ejemplo)
Sobretodo cuidado con la condición que se incluye en el where, ya que si no se especificara nada, por ejemplo, se matarían todas las sesiones de la base de datos.
Para crear un script con estas sentencias consultar Construcción de scripts con ayuda del diccionario
- Inicie sesión o registrese para enviar comentarios
Gente, capas que hay gente
Gente, capas que hay gente que ya sabia de estas funciones pero bueno simplemente para dejarlo plasmado en alguna pagina y le pueda llegar a ser de gran utilidad a todo el mundo. Lo que voy a postear me llevo un tiempo encontrarlo y la idea con esto es lograr que sea mas facil encontrarlo y ademas que funcione porque hay mucha basura dando vueltas en la internet.
una funcion muy util que recien encontre hoy dia es: SYS_CONTEXT.
NOTA: USERENV es un nombre que describe la sesion actual y con ella y la funcion sys_context se puede conseguir:
•• identificador del cliente SELECT sys_context('USERENV', 'CLIENT_IDENTIFIER') FROM dual; •• nombre del esquema donde uno esta conectado SELECT sys_context('userenv', 'CURRENT_SCHEMA') FROM dual; •• ID del esquema donde uno se encuentra conectado SELECT sys_context('USERENV', 'CURRENT_SCHEMAID') FROM dual; •• nombre de la base de datos. SELECT sys_context('USERENV', 'DB_NAME') FROM dual; •• nombre del host SELECT sys_context('USERENV', 'HOST') FROM dual; •• nombre de la instancia SELECT sys_context('USERENV', 'INSTANCE_NAME') FROM dual; ••los formatos de moneda, fechas. SELECT sys_context('USERENV', 'NLS_CURRENCY') FROM dual; SELECT sys_context('USERENV', 'NLS_DATE_FORMAT') FROM dual; •• nombre del territorio. ejemplo : 'AMERICA'; SELECT sys_context('USERENV', 'NLS_TERRITORY') FROM dual; •• server host nome SELECT sys_context('USERENV', 'SERVER_HOST') FROM dual; •• ID de la session del usuario SELECT sys_context('USERENV', 'SESSION_USERID') FROM dual; •• SID (session number) util para matar sesiones luego con el numero. SELECT sys_context('USERENV', 'SID') FROM dual; •• LISTA DE PAQUETES UTL (utilidades de oracle, envio de mails mediante SMTP entre otros) SELECT * FROM ALL_OBJECTS WHERE OBJECT_NAME LIKE '%UTL_%' AND OBJECT_TYPE = 'PACKAGE' •• LISTA DE PAQUETES DBMS (otras utilidades del Data Base Manager System) SELECT * FROM ALL_OBJECTS WHERE OBJECT_NAME LIKE '%DBMS_%' AND OBJECT_TYPE = 'PACKAGE'
estas dos listas digamos son utiles como para ver las que hay y luego investigar un poco mas como se utilizan en internet.
•• Envio de e-mail a multiples usuarios mediante la utilidad UTL_SMTP.
Otra cosa que me costo mucho encontrar y en definitiva me lo termino contando un amigo del trabajo es como utilizar el paquete UTL_SMPT para mandar un mail a multiples recipientes. (a varias personas)
Mi idea es unicamente explicar este problema, como usarlo se los dejo para que lo investiguen que no es muy dificil.
si se tiene los mails en un VARCHAR de la siguiente manera
alguien@xxx.com;alguien1@xxx.com;alguien2@xxx.com;alguien3@xxx.com;alguien4@xxx.com
una vez hecho los pasos :
g_mail_conn := utl_smtp.open_connection (p_mailhost,p_mailport); -- <-- apertura de conexion. utl_smtp.helo(g_mail_conn,p_mailhost); utl_smtp.mail(g_mail_conn,p_sender);
hay que definir el recipiente con la funcion utl_smtp.rcpt(); tener en cuenta que este recipiente se va a instanciar en nuestro caso 5 veces (una vez por cada e-mail y no todos en uno solo OJO!)
osea : utl_smtp.rcpt( p_mail_conn , alguien@xxx.com ); utl_smtp.rcpt( p_mail_conn , alguien@xxx.com1 ); utl_smtp.rcpt( p_mail_conn , alguien@xxx.com 2); utl_smtp.rcpt( p_mail_conn , alguien@xxx.com 3); utl_smtp.rcpt( p_mail_conn , alguien@xxx.com4 );
para cortar los mails concatenados en un VARCHAR y cumplir el proposito anterior pueden usar este procesos que me toco hacer que hace lo anteriormente descrito.
PROCEDURE Pi_Prepare_Recip_Mail ( p_mail_conn IN OUT utl_smtp.connection, p_rec_mails IN VARCHAR2) IS MAILS VARCHAR2(1000) := p_rec_mails; SingleMail VARCHAR2(255); -- NO_MORE_MAILS BOOLEAN := FALSE; EOM NUMBER; -- end of mail. BOM NUMBER := 1; -- begin of mail. COC NUMBER ; -- number of characters. MAIL_NUMBER NUMBER := 1; BEGIN LOOP EOM := INSTR(MAILS,';',1,MAIL_NUMBER); IF EOM = 0 THEN EOM := LENGTH(MAILS) + 1; NO_MORE_MAILS := TRUE; END IF; COC := (EOM) - BOM; SingleMail := SUBSTR(MAILS,BOM,COC); utl_smtp.rcpt( p_mail_conn , SingleMail ); -- <-- recipiente de salida. EXIT WHEN NO_MORE_MAILS; MAIL_NUMBER := MAIL_NUMBER + 1 ; BOM := EOM + 1; END LOOP; END Pi_Prepare_Recip_Mail;
se instancia este procesos pasandole la conexion de mail y la lista de mails osea:
p_rec_mail VARCHAR2(300) := alguien@xxx.com;alguien1@xxx.com;alguien2@xxx.com;alguien3@xxx.com;alguien4@xxx.com;
instancia --> Pi_Prepare_Recip_Mail( g_mail_conn , p_rec_mail );
En si es dificil de entender y mas de explicar, trate de ser lo mas claro posible. Cualquier duda sobre este tema escriban.
•• cambiar el lenguaje de la fecha. select to_char(sysdate,'day', 'NLS_DATE_LANGUAGE=Spanish') from dual select to_char(sysdate,'month', 'NLS_DATE_LANGUAGE=Spanish') from dual •• correr las estadisticas para una determinada tabla (esto aumenta la velocidad de respuesta de las tablas en aquellos casos donde el volumen de registros es considerablemente grande) ANALIZE TABLE <nombre de la tabla> COMPUTE STATISTICS; -- realizarlo en un porcentaje (en un 25 %) ANALIZE TABLE <nombre de la tabla> COMPUTE STATISTICS SAMPLE 25 percent; -- realizarlo solo para una determinada cantidad de registros) ANALIZE TABLE <nombre de la tabla> COMPUTE STATISTICS SAMPLE 1000 rows; •• ponerle comentarios a las tablas y a sus columnas para que el significado de cada campo tenga mayor comprencion. COMMENT ON TABLE <table_name> IS 'comentario a escribir'; COMMENT ON COLUMN <table_name>.<column_name> IS 'comentario a escribir aca';
Con esto hay para divertirse un buen rato..... nunca termina de sorprenderme Oracle...
- Inicie sesión o registrese para enviar comentarios
Si hiciste las consultas hace
Si hiciste las consultas hace tiempo y no tenías activada la auditoría de Oracle sobre el usuario que las ejecutó no creo que las puedas recuperar.
Para poder saber las sentencias SQL que ha ejecutado un usuario tienes que decir previamente a la base de datos que haga un seguimiento de las mismas, se ha de auditar al usuario.
Es una medida de seguridad, y si se abusa de ella puede llegar a afectar negativamente al rendimiento de la base de datos, por lo que deberías aplicarla sólo si es necesario. Por supuesto, necesitarás un usuario con privilegios de DBA para poder hacerlo.
En el documento Guide to auditing in Oracle applications, elaborado por www.integrigy.com, se explica bastante bien cómo activar la auditoría en bases de datos Oracle y las diferentes opciones que hay.
También puedes consultar la información del tema que hemos abierto sobre auditoría, seguimiento y seguridad en Oracle.
A partir de la versión 10g, con la consola web de administración (Enterprise Manager Console) también tienes la opción de consultar sentencias SQL ejecutadas durante las últimas 24 horas. Seguramente no te solucionará tu actual problema, pero para analizar ejecuciones y problemas más recientes siempre va bien.
- Inicie sesión o registrese para enviar comentarios
How to send e-mail from Oracle
Hola,
solo queria compartir esta pagina que me parece muy interesante sobre como enviar mail desde Oracle
http://www.dba-oracle.com/t_email_mailing_messages_plsql.htm
:-D
- Inicie sesión o registrese para enviar comentarios
Gracias por la aportación,
Gracias por la aportación, pero más arriba betorey_24 ya nos explica cómo enviar mails con Oracle, y en castellano ;)
De todas maneras la página de BC que enlazas es una buena referencia, muchas veces he acabado en ella buscando cómo solucionar algún tema de Oracle.
- Inicie sesión o registrese para enviar comentarios
Cómo seleccionar un determinado número de registros en Oracle
Para hacer que nuestra consulta nos devuelva sólo los n primeros registros, y no saturar ni servidores ni aplicaciones cliente cuando trabajamos con tablas grandes, en Oracle tan sólo hay que añadir la condición where rownum < n a la sentencia SQL.
Por ejemplo:
SELECT * FROM tabla_ventas
WHERE rownum < 100;
Aunque nuestra tabla de ventas tenga 10.000.000 de registros, esta consulta sólo nos devolverá los primeros 99 que encuentre.
- Inicie sesión o registrese para enviar comentarios
Hola Carlos, he encontrado
Hola Carlos, he encontrado cosas muy interesnates aqui y tambien veo que mucha ayuda, espero me puedas ayudar con un problemita que tengo. Ya tengo listo el proceso que me manda el correo desde oracle a varias persona y con un texto fijo que mando como parametro, pero me falta saber como mandar el resultado de una consulta por el mismo correo ¿Me puedes ayudar?
Gracias.
- Inicie sesión o registrese para enviar comentarios
Estimado, una pregunta,
Estimado, una pregunta, existira alguna vista o consulta en Oracle que ayude a Saber dentro de las sesiones activas o inactivas cuales son o fueron los ultimos procesos que se ejecutaron (updates, select, delete, etc)? Gracias por tu pronta respuesta! Saludos!
- Inicie sesión o registrese para enviar comentarios
Las sesiones actuales las
Las sesiones actuales las puedes consultar con la vista v$session y las sentencias SQL que se ejecutan con v$sqltext.
Para enlazar estas dos vistas has de utilizar el campo sql_hash_value de la primera y hash_value de la segunda, y luego aplica las condiciones que te interesen.
En los scripts anteriores hay algún ejemplo de consulta de sentencias. Para sacar las sentencias que se están ejecutando podrías hacer algo así:
SELECT c.sid, c.status, d.piece, c.serial#, c.username, d.sql_text
FROM v$session c, v$sqltext d
WHERE c.sql_hash_value = d.hash_value
ORDER BY c.sid, d.piece
La ordenación por los campos sid y piece es importante porque las sentencias están 'troceadas' en diferentes registros.
- Inicie sesión o registrese para enviar comentarios
Hola Carlos, Una consulta.
Hola Carlos,
Una consulta. Estoy queriendo subir a memoria(buffer_pool keep) ciertas tablas, pero quiero saber que tablas podrian ser, me han dicho que pueden ser las que mas se utilizan, y que sean pequeñas. Por eso queria saber si existe un query para sacar las tablas mas consultadas. O si tu tienes alguna regla de buena practica para subir las tablas a memoria. Muchas gracias de antemano por la respuesta.
Saludos,
Elizabeth
- Inicie sesión o registrese para enviar comentarios
Hola Elizabeth, Lo que
Hola Elizabeth,
Lo que pides si que se puede hacer porque lo hice hace tiempo, pero no encuentro el script que usé :S
Por si te sirve de ayuda era algo relacionado con el LRU(Menos Recientemente Usada) y con el MRU (Mas Recientemente Usada) ambos del Buffer Caché, ya que es aconsejable para tablas pequeñas y consultadas muy frecuentemente y pocas veces modificadas.
Saludos
- Inicie sesión o registrese para enviar comentarios
Las recomendaciones que te
Las recomendaciones que te han dado me parecen correctas, Elizabeth. Sólo comentarte que controles bien la memoria utilizada y esas cosas, todo lo que se haga en memoria es delicado.
Gracias por la aportación, drakoniano, tiene pinta de ser un buen método. A ver si hay suerte y localizas el script..
En la entrada de blog Cómo obtener la lista de tablas con más movimiento (insert, update) en Oracle, il_masacratore publica un script que creo que también puede servir para tus propósitos, sólo te falta sacar también el tamaño de las tablas, y quedarte con las más pequeñas..
- Inicie sesión o registrese para enviar comentarios
Hola, muchas gracias
Hola,
muchas gracias drakoniano, y Carlos, ya les cuento como me fue, pero si logras encontrar el script seria genial!!!
Gracias
Elizabeth
- Inicie sesión o registrese para enviar comentarios
Hola eliviced, has encontrado
Hola eliviced, has encontrado algo al respecto sobre tu pregunta. Gracias. Saludos
- Inicie sesión o registrese para enviar comentarios
Hola amigos, alguien sabe que
Hola amigos, alguien sabe que software se puede usar para ver graficamente el contenido de un paquete es decir :
el paqueteI tiene dos procesos: "proceso1","proceso2"; el proceso1 contiene: 3 Cursores y presenta 3 funciones o algo asi, cuando de un click a cada objeto que compone el paquete desplegar el cuerpo del codigo.
help me pls.
saludos
- Inicie sesión o registrese para enviar comentarios
Hola, el PL/SQL Developer, te
Hola, el PL/SQL Developer, te puede servir, no es gratuito, pero te lo puedes bajar de taringa.com
Saludos.
- Inicie sesión o registrese para enviar comentarios
Usa Oracle SQL Developer, es
Usa Oracle SQL Developer, es gratuito y te lo puedes descargar desde la página de Oracle.
Yo lo uso y la verdad es que le veo algunos errores bastante considerables como por ejemplo
que no se pueda abrir dos sesiones a la vez o que aunque canceles una consulta, a veces,
no se cancela pero para lo que quieres te vale de sobra.
- Inicie sesión o registrese para enviar comentarios
Complementando un poco la
Complementando un poco la información espero les sirva esto.
MUESTRA LOS ROLES ASIGNADOS AL USUARIO ACTUAL
SELECT granted_role "Rol", admin_option "Admin" FROM user_role_privs;
MUESTRA LOS PRIVILEGIOS A NIVEL SISTEMA DEL USUARIO ACTUAL
SELECT privilege "Privilegio", admin_option "Admin" FROM user_sys_privs;
VERIFICAR LOS ROLES DE CUALQUIER USUARIO DE LA DB, CONECTADO COMO SYS O DBA
SELECT * FROM DBA_ROLE_PRIVS
Saludos
- Inicie sesión o registrese para enviar comentarios
Hola Carlos.. A lo mejor tu
Hola Carlos.. A lo mejor tu me puedes ayudar, se que hay una combinacion de memoria para que el porcentaje de aciertos de una base de datos oracle 9i no este muy baja, pero he manejado muchas hipotesis y no he podido rendir mi base de datos a un nivel optimo ( que no baje del 90% del porcentaje de aciertos) actualmente la tengo como en 60%, que puedo hacer para que el porcentaje de aciertos no sea tan bajo..
- Inicie sesión o registrese para enviar comentarios
Te recomiendo aumentar el
Te recomiendo aumentar el database buffer cache. El criterio que sigue para los aciertos es:
Cache Hit Ratio = 1 - (physical reads / (db block gets + consistent gets))
Para saber como esta configurada tu base de datos :
select physical_reads, db_block_gets, consistent_gets name
from v$buffer_pool_statistics;
Si no funciona:
La relación entre paradas para acceder al redo log y accesos en caché.
select name, value
from v$sysstat
where name='redo entries' OR
name = 'redo log space requests';S
Con una relación superior a 1:5.000 es necesario ampliar el tamaño del buffer de redo.
Los aciertos de Library Cache:
select sum(pins-reloads) / sum(pins) from v$librarycache;
Con un valor menor a 95% se recomienda aumentar el tamaño de la Shared Pool.
Los aciertos en el diccionario de datos
select sum(gets), sum(getmisses), (sum(getmisses)/sum(gets))*100
from v$rowcache;
Con un porcentaje de fallos (getmisses) frente al de aciertos (gets) mayor de 10-15% es necesario aumentar la Shared Pool y estudiar las consultas lanzadas para asegurarse de que usan parámetros.
Espero que te sirva
- Inicie sesión o registrese para enviar comentarios
me podrian ayudar con el
me podrian ayudar con el siguiene scrip en oracle.....
necesito obtener el nombre del primary key y los campos que lo conforman
select constraint_name,
(select column_name from all_cons_columns where constraint_name=p.constraint_name)columna
from all_constraints p
where owner = 'SYS' and
table_name = 'RULE_SET_IEUAC$' and
constraint_type = 'P'
me genera un error cuando la subconsulta genera dos campos
- Inicie sesión o registrese para enviar comentarios
Muy útiles estos
Muy útiles estos scripts.
Añado uno relativo a consulta de espacio disponible, ya habeís listado alguno, pero este me parece sencillo y de utilidad también:
SELECT SYSDATE AS FECHA_ACT, DEDICADO.TABLESPACE "TABLESPACE", ROUND (DEDICADO.ESPACIO, 2) "ESPACIO DEDICADO (GB)", ROUND (LIBRE.ESPACIO, 2) "ESPACIO LIBRE (GB)", ROUND (DEDICADO.ESPACIO - LIBRE.ESPACIO, 2) "ESPACIO USADO (GB)", LPAD (ROUND ((LIBRE.ESPACIO / DEDICADO.ESPACIO) * 100, 2) || '%', 6, ' ') "% ESPACIO LIBRE" FROM (SELECT DDF.TABLESPACE_NAME "TABLESPACE", SUM (DDF.BYTES) / 1024 / 1024 / 1024 "ESPACIO" FROM DBA_DATA_FILES DDF WHERE DDF.TABLESPACE_NAME IN ('tablespace1', ' tablespace2') GROUP BY DDF.TABLESPACE_NAME) DEDICADO, (SELECT DFS.TABLESPACE_NAME "TABLESPACE", SUM (DFS.BYTES) / 1024 / 1024 / 1024 "ESPACIO" FROM DBA_FREE_SPACE DFS WHERE DFS.TABLESPACE_NAME IN ('tablespace1', ' tablespace2') GROUP BY DFS.TABLESPACE_NAME) LIBRE WHERE DEDICADO.TABLESPACE = LIBRE.TABLESPACE ORDER BY LIBRE.ESPACIO / DEDICADO.ESPACIO ASC- Inicie sesión o registrese para enviar comentarios
Hola, hay alguna manera de
Hola,
hay alguna manera de modificar el numero maximo de sesiones de Oracle ??
saludos.
- Inicie sesión o registrese para enviar comentarios
Puedes hacerlo de dos formas:
Puedes hacerlo de dos formas: Modificando el parámetro MAX_SESSIONS vía SQL o en el spfile
- Inicie sesión o registrese para enviar comentarios
Hola !!! Tengo un
Hola !!!
Tengo un problema que no se como resolver, tengo un procedimiento que le estoy mandando como parametro el nombre de una funcion, dentro del procedimiento quiero que se ejecute la funcion pero no se como ejecutarla, lo que tengo en el codigo es algo asi:
resultado_funcion := p_nombre_funcion;
pero esto solo le asigna a la variable resultado_funcion el nombre de la funcion que tiene el parametro p_nombre_funcion.
Como puedo hacer para que se ejecute la funcion ???
Gracias y Saludos.
- Inicie sesión o registrese para enviar comentarios
Este caso requiere de uso SQL
Este caso requiere de uso SQL dinámico con la instrucción EXECUTE IMMEDIATE, ésta es muy potente, ya que permite el uso de parámetros con gran efeciencia. Recuerda revisar el prerequisito de roles para que se pueda ejecutar las funciones o procedimientos.
saludos
mabefa
- Inicie sesión o registrese para enviar comentarios
Muchas gracias , es muy util
Muchas gracias , es muy util todo lo que han puesto.
Una consulta, en mi servidor hay dos instancias y las consultas que han dado son a la instancia que
se conecta (por balanceo), hay alguna manera de hacer una consulta que retorne los resultados de ambas instancias?
O algun query para cambiar de instancia al instante sin hacer una nueva conexion? muchas gracias
- Inicie sesión o registrese para enviar comentarios
HOLA, Alguien me puede
HOLA,
Alguien me puede decir como puedo debuguear unas consultas, me estoy iniciando en los scripts, pero me gustaria poder ir viendo como se van tomando los datos de mi consulta,
Gracias.
- Inicie sesión o registrese para enviar comentarios
DIOS LO BENDIGA!!! =D nos
DIOS LO BENDIGA!!! =D nos salvo la vida en un curso de administracion de bases de datos!!
GRACIAS!!!!!!!!!!!
- Inicie sesión o registrese para enviar comentarios
Que tal Carlos! Tengo una
Que tal Carlos!
Tengo una super duda, sabes tengo un concurrent que al ejecutarse demora demasiado y se me queda colgado por muchas horas, tendrás una consulta con la cual en base al Request ID o algun dato pueda obtener en que consulta esta atorado el proceso o que es lo que esta haciendo?
De antemano te lo agradezco.
Atte. Mane
- Inicie sesión o registrese para enviar comentarios
Mírate las consultas que
Mírate las consultas que obtienen información de la vista v$session, como por ejemplo:
-- Consulta Oracle SQL sobre la vista que muestra las conexiones actuales a Oracle select osuser, username, machine, program from v$session order by osuser
-- Consulta Oracle SQL que muestra el número de conexiones actuales a Oracle agrupado por aplicación que realiza la conexión select program Aplicacion, count(program) Numero_Sesiones from v$session group by program
Con estas consultas puedes localizar los identificadores que necesite para investigar despues más a fondo sobre la consulta: cursores abiertos, recursos que consume, etc.
También te puede ir muy bien consultar la información de la vista v$sqlarea, que te muestra información sobre las últimas consultas ejecutadas. Filtrando por usuario, fecha o contenido de la sentencia SQL, si es corta (si no se trunca y has de utilizar otra vista), puedes filtrar información sobre la/s consulta/s que te interesen.
-- Últimas consultas SQL ejecutadas en Oracle y usuario que las ejecutó: select distinct vs.sql_text, vs.sharable_mem, vs.persistent_mem, vs.runtime_mem, vs.sorts, vs.executions, vs.parse_calls, vs.module, vs.buffer_gets, vs.disk_reads, vs.version_count, vs.users_opening, vs.loads, to_char(to_date(vs.first_load_time, 'YYYY-MM-DD/HH24:MI:SS'),'MM/DD HH24:MI:SS') first_load_time, rawtohex(vs.address) address, vs.hash_value hash_value , rows_processed , vs.command_type, vs.parsing_user_id , OPTIMIZER_MODE , au.USERNAME parseuser from v$sqlarea vs , all_users au where (parsing_user_id != 0) AND (au.user_id(+)=vs.parsing_user_id)
- Inicie sesión o registrese para enviar comentarios
Que barbaro!, muchas gracias
Que barbaro!, muchas gracias por la información voy a revisar esas consultas.
Saludos cordiales!
- Inicie sesión o registrese para enviar comentarios
Hola espero me puedan ayudar,
Hola espero me puedan ayudar, necesito un query que pueda sacar los roles que tiene asignado cada usuario, es posible? si asi fuera se los agradeceria-
saludos
- Inicie sesión o registrese para enviar comentarios
Si, claro: select username,
- Inicie sesión o registrese para enviar comentarios
Muchas gracias :D
Muchas gracias :D
- Inicie sesión o registrese para enviar comentarios
Hola, estoy en busca de una
Hola,
estoy en busca de una consulta o herramienta que me permita obtener un listado de todas las tablas que son utilizadas por un Package, Procedure o Function..
Desde ya, gracias por la ayuda..
Saludos
Fermín
- Inicie sesión o registrese para enviar comentarios
Hola Fermín, Echa un vistazo
Hola Fermín,
Echa un vistazo a este otro tema del foro de Oracle http://www.dataprix.com/forum/2010/02/obtener-lista-objetos-package-oracle-0
Creo que lo que se comenta te puede servir para buscar objetos de packages utilizando el diccionario de Oracle, o herramientas como Oracle SQL Developer.
Saludos,
- Inicie sesión o registrese para enviar comentarios
Buenas tardes, habra alguna
Buenas tardes, habra alguna manera de crear un script de toda la base de datos Oracle 10g ??
Esto es para trasladarla a otro servidor. Por supuesto se puede con un dmp, pero yo quiero hacerlo por medio de un script, si es posible...
Gracias.
- Inicie sesión o registrese para enviar comentarios
Estimado Carlos, Quisiera
Estimado Carlos,
Quisiera saber si tu o alguno de los users me pueden ayudar, necesito en una DB saber cuales son los esquemas y cuales son sus respectivas tablas y tablespace y además de eso calcular el espacio que están ocupando cada una. Otra consulta: ¿Todos los usuarios que se crean en oracle tienen asociado un esquema? Si consulto a dba_user puedo diferenciar cual es un usuario con esquema y sin esquema? Gracias por tu sitio que ha sido de mucha ayuda en mi inicio en Oracle. De antemano muchas gracias por tu tiempo. Saludos Francisco- Inicie sesión o registrese para enviar comentarios
Hola Francisco En las
Hola Francisco
En las consultas de arriba tienes las vistas que te dan la información sobre todas tablas de la base de datos, y también sobre los tablespace y el espacio que ocupan, combinando la información de esas vistas creo que ya puedes sacar la información que necesitas.
En realidad el usuario y el esquema son prácticamente lo mismo. Teóricamente el esquema es el usuario más sus objetos, y se crea cuando creas el primer objeto del usuario. Sobre la diferenciación que comentas, la verdad es que no le veo mucho sentido, supongo que podrías consultar si el usuario tiene algún objeto creado. Para qué la necesitas?
- Inicie sesión o registrese para enviar comentarios
Encontré la consulta que
Encontré la consulta que necesito para ver las tablas con sus tablespace y su espacio. La había revisado pero no la había encontrado, después de tu explicación y de leer del tema ya pude asimilar el tema del usuario/esquema por lo que la consulta que te hice arriba al respecto ya está saldada.
Muchas gracias por tu tiempo.
Un abrazo desde Chile!
Saludos
- Inicie sesión o registrese para enviar comentarios
Genial, me alegro de haberte
- Inicie sesión o registrese para enviar comentarios
Excelente recopilación, me ha
- Inicie sesión o registrese para enviar comentarios
Buenas, Requiero eliminar
Buenas,
Requiero eliminar o revocar el permiso PUBLIC de los paquetes de DBA_TAB_PRIVS (según las mejores prácticas) con la siguiente consulta ejemplifico un SELECT para verificar el dato:
SELECT *FROM DBA_TAB_PRIVS WHERE TABLE_NAME= 'DBMS_RANDOM' AND GRANTEE='PUBLIC';
Así lo revoco (consulta x): REVOKE EXECUTE ON DBMS_RANDOM FROM PUBLIC;
Preguntas:
1. Pero la base de datos Oracle se reinicia cuando lo intento revocar, a que se debe?
2. Cómo podría ejecutar un ALTER para que sea restringido dicho paquetes? o con solo ejecutar la consulta x por default se vuelve restringido el paquete?
Les agradezco las respuestas, por cierto toda la información de arriba me ha servido mucho.
Muchas gracias
Saludos,
- Inicie sesión o registrese para enviar comentarios
Estimado, agradecería puedas
- Inicie sesión o registrese para enviar comentarios
Rafael, no acabo de entender
- Inicie sesión o registrese para enviar comentarios
buenos dias una pregunta, hay
- Inicie sesión o registrese para enviar comentarios
Para localizar el path del
Para localizar el path del fichero Init.ora puedes probar con alguna de estas opciones:
SQL> show parameter ifile; SQL> select value from v$parameter where name = 'ifile';
- Inicie sesión o registrese para enviar comentarios
Hola agradeciendo la buena
- Inicie sesión o registrese para enviar comentarios
Hola yo tengo diversas
- Inicie sesión o registrese para enviar comentarios
Hola Carlos! quisiera ver si
- Inicie sesión o registrese para enviar comentarios
Saludos, este tema me ha
- Inicie sesión o registrese para enviar comentarios
Saludos, ya encontré como
- Inicie sesión o registrese para enviar comentarios
Hola Pomball, te paso una
- Inicie sesión o registrese para enviar comentarios
Buenas tardes, Estoy haciendo
- Inicie sesión o registrese para enviar comentarios
Buenas noches, mi pregunta es
- Inicie sesión o registrese para enviar comentarios
Si te he entendido bien, lo
Si te he entendido bien, lo que puedes hacer es comparar con la concatenación de los dos campos. Algo así:
select * from tabla1 where cd_Grupo in (select cd_Grupo_or || cd_Grupo_be from tabla2);Saludos,
- Inicie sesión o registrese para enviar comentarios
auxilio carlos esta consulta
- Inicie sesión o registrese para enviar comentarios
Bueno, las agrupaciones
- Inicie sesión o registrese para enviar comentarios
Disculpa CArlos que te saque
Disculpa CArlos que te saque del tema, pero hace unos días un DBA me recupero el contenido de una tabla, desde don el dijo, las areas de UNNDO, como puedo recu´perar data de esas areas?, de ante manos muchas gracias por tu gentil respuesta.
- Inicie sesión o registrese para enviar comentarios
Buenos tardes como puedo
- Inicie sesión o registrese para enviar comentarios
Por favor lo que necesito es
Por favor lo que necesito es leer los archivos de un directorio y guardar los nombres de los archivos en otro archivo para luego trabajar con los datos del archivo creado. Ademas luego de haber leído los archivos necesito cambiar su nombre a manera de tener un estado de archivos leídos y no leídos aun.
Gracias si alguien me puede echar una mano.
- Inicie sesión o registrese para enviar comentarios
Como podria consultar desde
Como podria consultar desde plsql el tamaño de un archivo que se encuentra en una ruta de mi maquina.
Saludos
- Inicie sesión o registrese para enviar comentarios
Carlos buenos días, quisiera
- Inicie sesión o registrese para enviar comentarios
Hola Patric No acabo de ver
Hola Patric
No acabo de ver bien el orden. ¿Primero alterar el campo y luego vaciarlo? Si el campo tiene datos creo que te dará error. Te copio un ejemplo del foro de la OTN de un método para cambiar el tipo de datos de un campo apoyándote en otro campo auxiliar:
SQL> create table "USER" (UserId varchar2(5))
Table created.
SQL> insert into "USER" values ('12345')
1 row created.
SQL> alter table "USER" add (UserId_tmp number(5))
Table altered.
SQL> update "USER" set userid_tmp=userid
1 row updated.
SQL> alter table "USER" set unused column userid
Table altered.
SQL> alter table "USER" rename column userid_tmp to userid
Table altered.
SQL> alter table "USER" drop unused columns
Table altered.
SQL> desc "USER"
TABLE USER
Name Null? Type
----------------------------------------- -------- ----------------------------
USERID NUMBER(5)
Otra opción que te podría funcionar más rápido, si tienes espacio y no hay muchas restricciones sobre la tabla, es utilizar como apoyo una tabla entera en lugar de un campo en la misma tabla. Tendrías que hacer una copia de la tabla original, y después truncar la original, modificar el tipo de datos del campo con un alter, y finalmente hacer un insert desde la copia con un TO_CHAR para el campo que quieres cambiar de tipo.
De todas maneras, yo haría igualmente el backup de la tabla que vas a modificar.
- Inicie sesión o registrese para enviar comentarios
Buenas tardes carlos o
Buenas tardes carlos o cualquier que me pueda colaborar le explico con un ejemplo tengo muchos procedimiento que se manejan en form 10g y otros desde php, resulta que hay algun procedimiento no se cual que me esta borrando unos datos en una tabla me gustaria saber si esto es posible y como
quiero hacer un trigger que me diga que usario la fecha y que procedmiento esta invocando sea el insert el update o delete de una tabla
yo ya he hecho trigger y guarda datos normal cuando inserta actualiza o borra y guardo lo que habia antes o despues el usuario que lo hizo y la fecha hasta aqui todo perfecto, pero hay una forma de saber que procedimiento o funcion fue el que invoca la tabla aaaa de modo que el trigger capture cual fue ese procedimiento o funcion (osea el nombre) y lo guardo en mi disparador de la base, de datos de modo que asi puedo saber en donde esta el error y corregirlo mas rapido y no estar mirando todos los ciento de procedimiento que pueda existir y ahi si corregirlo, osea como se dice ir al grano, con ese trigger que quiero hacer es guardar que PROCEDIMIENTO o FUNCION (su nombre) invoca la tabla aaa
muchas gracias a todos estos son mis correos por si me puede escribir le estaria agradecido
asanchez@unet.edu.ve
lalcubo@gmail.com
- Inicie sesión o registrese para enviar comentarios
Estimados, Antes que nada
- Inicie sesión o registrese para enviar comentarios
Estimados, Ante todo
- Inicie sesión o registrese para enviar comentarios
Hola tengo una duda acerca de
Hola tengo una duda acerca de crear un nuevo esquema en una base de datos.
existe un servidor d base de datos que tiene 3 esquemas (son de 3 docentes) y ha llegado un nuevo docente asi que necesito crear un nuevo esquema pero no se que pasos seguir. En internet encuentro diversas formas y confunde.
manejo este servidor desde la terminal.
- Inicie sesión o registrese para enviar comentarios
hola buenas disculpe como
hola buenas disculpe como puedo ver un subtotal en una bd.?
- Inicie sesión o registrese para enviar comentarios
Hola, muy interesante tu
Hola, muy interesante tu sitio, tengo una pregunta que quizas es tonta pero soy nuevo en esto y es la siguiente.
¿Existe una forma de ver que afectaciones tiene la accion de un boton en una aplicacion en la base de datos?
por ejemplo que al dar click en un check y salvar las modificaciones, saber que realizo a nivel base de datos si ejecuto algun procedimiento almacenado?
saludos y disculpa por la pregunta un poco fuera de lugar
- Inicie sesión o registrese para enviar comentarios
Hola Javier Si el botón
Hola Javier
Si el botón ejecuta un procedimiento almacenado puedes revisar el código del procedimiento para comprobar qué es lo que hace, o ejecutar tú directamente el procedimiento desde la base de datos, si estás seguro de que no vas a estropear nada.
Si el procedure es muy complejo, y cuesta seguirlo, puedes al menos buscar las sentencias SQL que incluye y ver sobre qué tablas se hacen inserts, updates o deletes, y consultar después los datos de esas tablas para comprobar qué es lo que ha cambiado.
Saludos,
- Inicie sesión o registrese para enviar comentarios
Como saber con una conslta si
Como saber con una conslta si algun proceso: paquete, procedimiento o funcion esta siendo utilizada por algun usuario
Saludos....
- Inicie sesión o registrese para enviar comentarios
Hola Franco Podrías probar
Hola Franco
Podrías probar este script que he encontrado en AskTom. Te muestra lo que cada usuario está ejecutando, y podrías adaptarlo buscando en sql_text partes del SQL de los packages o funciones que te interese controlar.
---------------- showsql.sql -------------------------- column status format a10 set feedback off set serveroutput on select username, sid, serial#, process, status from v$session where username is not null / column username format a20 column sql_text format a55 word_wrapped set serveroutput on size 1000000 declare x number; begin for x in ( select username||'('||sid||','||serial#|| ') ospid = ' || process || ' program = ' || program username, to_char(LOGON_TIME,' Day HH24:MI') logon_time, to_char(sysdate,' Day HH24:MI') current_time, sql_address, LAST_CALL_ET from v$session where status = 'ACTIVE' and rawtohex(sql_address) <> '00' and username is not null order by last_call_et ) loop for y in ( select max(decode(piece,0,sql_text,null)) || max(decode(piece,1,sql_text,null)) || max(decode(piece,2,sql_text,null)) || max(decode(piece,3,sql_text,null)) sql_text from v$sqltext_with_newlines where address = x.sql_address and piece < 4) loop if ( y.sql_text not like '%listener.get_cmd%' and y.sql_text not like '%RAWTOHEX(SQL_ADDRESS)%') then dbms_output.put_line( '--------------------' ); dbms_output.put_line( x.username ); dbms_output.put_line( x.logon_time || ' ' || x.current_time|| ' last et = ' || x.LAST_CALL_ET); dbms_output.put_line( substr( y.sql_text, 1, 250 ) ); end if; end loop; end loop; end; / column username format a15 word_wrapped column module format a15 word_wrapped column action format a15 word_wrapped column client_info format a30 word_wrapped select username||'('||sid||','||serial#||')' username, module, action, client_info from v$session where module||action||client_info is not null;
Saludos,
- Inicie sesión o registrese para enviar comentarios
select * from sys.dba_users
select * from sys.dba_users order by username como sacar los datos mas ordenados en tablas sale esto
USERNAME USER_ID PASSWORD ------------------------------ ---------- ------------------------------ ACCOUNT_STATUS LOCK_DATE EXPIRY_DA -------------------------------- --------- --------- DEFAULT_TABLESPACE TEMPORARY_TABLESPACE CREATED ------------------------------ ------------------------------ --------- PROFILE INITIAL_RSRC_CONSUMER_GROUP ------------------------------ ------------------------------ EXTERNAL_NAME -------------------------------------------------------------------------------- PASSWORD E -------- -
- Inicie sesión o registrese para enviar comentarios
Hola tengo una consulta como
Hola tengo una consulta como puedo averiguar dentro de un esquema todas las tablas que ya no se estan usando por ejemplo sacar un listado con todas las temporales creadas por el usuario que ya no se registran o no tienen movimientos por años saludos y gracias.
- Inicie sesión o registrese para enviar comentarios
Hola a todos expertos
Hola a todos expertos DBA,
Necesito llevar a cabo una analisis sobre archivos SQL REDO y deseo encontrar especificamente sobre este REDO datos relacionados a una Columna y Valor que se me han indicado buscar, actualmente mi proceso es muy rudimentario, y busco dentro de todo el REDO posibles coincidencias con el campo.
Select * FROM LOGMINER_MONITOR WHERE (LGMN_SQL_REDO LIKE '%589%' and LGMN_SQL_REDO LIKE '%SEGU466%' ) and LGMN_TIMESTAMP between to_date('03/07/2017 00:00:00','dd/mm/yyyy hh24:mi:ss') and to_date('08/07/2017 23:59:59','dd/mm/yyyy hh24:mi:ss') ORDER BY LGMN_TIMESTAMP DESCSe me solicita buscar específicamente en la columna Historics el Valor 598 y el otro valor de la columna INVDS = SEGU466.
Podrian ayudarme eh dado de topes, ya que no soy nuevo en temas de BD.
Agradecere el apoyo.
- Inicie sesión o registrese para enviar comentarios
Estoy realizando un query
Estoy realizando un query donde debo acceder a tablas que esta en otras 2 maquinas con un usuario y password distinto; y no quieren crear un dblink
- Inicie sesión o registrese para enviar comentarios
Quisiera saber en oracle como
Quisiera saber en oracle como extraer solo los atributos que no son nulos. Ejemplo tengo una tabla de trabajo para realizar un update a otra tabla (maestra), los campo son en común, pero solo se actualizarán de la tabla maestra aquellos campos que en la tabla de trabajo esten poblados, es decir debo descartar lo que sean null. Por favor me podrian ayudar??
- Inicie sesión o registrese para enviar comentarios
Estimado, Espero se encuentre
Estimado, Espero se encuentre bien, Quisiera saber la forma de realizar un update de una tabla maestra desde una tabla de trabajo en donde hay campos en común pero solo se actualizarán los campos que no estan null en la tabla de trabajo. ya que asi se registraron.
- Inicie sesión o registrese para enviar comentarios
Buenas tardes! Quisiera saber
Buenas tardes! Quisiera saber cómo consultar los logins de la Base de Datos que no han tenido actividad/conexión en la BD en determinado tiempo con el fin de depurar usuarios inactivos.
- Inicie sesión o registrese para enviar comentarios
Hola, quisiera su ayuda para
Hola, quisiera su ayuda para saber como hacer que los UPDATE a la tabla "X" se tomen para la base de datos "Y" sin importar desde que base de datos se ejecute o que base de datos tengan como default. La base de datos que utilizo es Oracle SqlDeveloper. Espero puedan ayudarme >_<)
- Inicie sesión o registrese para enviar comentarios
Buenas tardes, gracias por
Buenas tardes, gracias por los tips, me sirvieron de mucho, consulte a otro compañero sobre el tema y me comento que para ver los objetos del usuario actual era mucho mejor consultar a la vista dbaobject, mi pregunta es cual es la diferencia entre consultar a esta vista y a las tablas: user_objects, user_tables,....etc?
- Inicie sesión o registrese para enviar comentarios
Hola katy La diferencia de
Hola katy
La diferencia de cara a consultar información está simplemente en la información que te muestran. Las vistas del diccionario suelen mostrar información cruzada sobre varias tablas, pero si tú tienes suficiente con la información que te da una tabla como las de user_objects o user_tables, o prefieres hacer tu misma una query que haga joins entre esas tablas para sacar la información que necesitas no tienes porqué utilizar las vistas.
Y si la vista ya se ajusta a la info que precisas, pues trabajo que te ahorras :)
- Inicie sesión o registrese para enviar comentarios
Consulta Oracle SQL para
- Inicie sesión o registrese para enviar comentarios
hola Carlos, Muchas gracias,
hola Carlos,
Muchas gracias, estas consultas que compartes son un tesoro para mi.
Espero puedas ayudarme con esta cuestión:
¿Cómo saber que usuario creo un objeto (no el owner del objeto), sino el usuario que lanzó la consulta para su creación?
por ejemplo, yo Berem con mi user lanzo el sql: CREATE TABLE SCHEMA_DATA.TABLA_PRUEBA ....
owner = SCHEMA_DATA
object: Table TABLE_PRUEBA
user_que_creo_object: Berem
Existe alguna consulta con la que pueda ver esto?
gracias por tu valioso aporte.
- Inicie sesión o registrese para enviar comentarios
Hola Berem Creo que primero
Hola Berem
Creo que primero tienes que activar la auditoría si no está activada para sentencias de creación, y después podrás consultar datos sobre los CREATE que se hayan hecho. Echa un vistazo a este enlace: https://docs.oracle.com/cd/E11882_01/server.112/e10575/tdpsg_auditing.htm
- Inicie sesión o registrese para enviar comentarios
Buen dia. Necesito realizar
Buen dia.
Necesito realizar un ALTER MODIFY a una TABLA GLOBAL TEMPORAL pero Oracle me dice que el recurso está ocupado y no puede ejecutarse.
Pueden ayudarme a identificar las sesiones Activas o Inactivas que tienen la tabla ocupada. lo hice por V$sql_text y V$session me sale cualquier cantidad de sesiones, les doy killer y aun asi el recuroso está ocupado.
Gracias.
- Inicie sesión o registrese para enviar comentarios
Buenas noches; cómo puedo…
Buenas noches; cómo puedo obtener la cantidad de registros almacenados en un DATAFILE?
- Inicie sesión o registrese para enviar comentarios
I envision that one of the…
I envision that one of the greatest issues with schools is there are an excessive number of interruptions, a lot of undies raiding, best paper writing service expositions ever crews, and boola what not.
- Inicie sesión o registrese para enviar comentarios
https://t.me/pump_upp - best…
- Inicie sesión o registrese para enviar comentarios
SSRS: #Error en una celda de importe decimal de reporte utiliza Oracle SQL
SSRS: #Error en una celda de importe decimal de reporte utiliza Oracle SQL il_masacratore 27 Abril, 2011 - 16:41Hasta el momento desconozco exactamente como o donde se detalla cada tipo de error en la ejecución de un informe de reporting services de Microsoft SQL Server. He tratado con derivados de falta de permisos, procesados incompletos de cubos pero hasta ahora ningun #Error en una celda por que sí.
El error en cuestión me aparece en la ejecución de un pequeño informe que tira de un origen de datos ODBC contra una base de datos Oracle donde se muestran totales (sumas, no porcentajes) y me ha sorprendido mucho la falta de detalle sobre el error que se produce. Para más dificultad, encima es en una combinación de parámetros concreta (las n ejecuciones anteriores han funcionado) y no en toda la columna sino en una celda. Además arrastra todo subtotal o total en el que se incluya...
Después de mirar el log del servidor de Reporting Services, después de comprobar la consulta en un cliente externo con la misma, tras pensar mal del formato me da por comprobar en el diseñador de informes el origen de datos, me hago una prueba con parámetros al tuntun y bien, pero al poner los valores problemáticos consigo que se al menos aparezca el error:
Error al leer datos del conjunto de resultados de la consulta. OCI-22053: error de desbordamiento.Pues nada, encontrado esto ya estoy más feliz ya que el error es que ado.net+oracle+odbc no lleva muy bien los números de 38 digitos...
Para esto podemos hacer un workaround que consiste en usar en la consulta la función trunc(número, decimales) de Oracle SQL para que nos trunque el valor en su parte decimal donde nosotros decidamos.
Traducción de terminología Oracle - DB2 LUW
Traducción de terminología Oracle - DB2 LUW Oscar_paredes 25 Marzo, 2011 - 12:52Con la versión 9.7 de DB2 LUW, IBM hace un guiño a todos los DBA's de Oracle, mucho más numerosos en el mercado que los DBA's de DB2.
Para ello, en la versión 9.7 de DB2 LUW ha introducido modos de compatibilidad de Oracle que permiten realizar tareas en DB2 con la facilidad y conocimiento que tienen los DBA de Oracle. Sin embargo, es importante conocer la traslación de terminología entre Oracle y DB2 si tienes la intención de meterte en el mundo IBM DB2.
En este primer artículo sobre equivalencias entre IBM DB2 y Oracle, relaciono una serie de elementos para que esa introducción sea sencilla y se pueda leer la documentación de IBM DB2 fácilmente. Entre ellos, terminología general de estas bases de datos, versiones, utilidades y vistas.
COMPONENTES GENERALES | |
ORACLE | DB2 LUW |
Instance | Instance |
File/Datafile | Container |
Database | Database |
Tablespace | Tablespace |
Schema | Schema |
Table | Table |
Index | Index |
View | View |
Trigger | Trigger |
Packages | Modules |
Stored Procedures | Stored Procedures |
SQL Plus | DB2 CLP |
Data Block | Data Page |
Dictionary | Catalog |
Alert Log | Diag log |
Redo Log | Log File |
Segments | Space Consumming Objects |
SGA | Instance/DB Shared Memory |
VISTAS CATÁLOGO | |
ORACLE | DB2 LUW |
ALL_ |
SYSIBM.* SYSSTAT.* SYSCAT.* |
UTILIDADES | |
ORACLE | DB2 LUW |
RMAN IMPORT EXPORT SQL*loader DB_VERIFY ANALYZE |
BACKUP IMPORT EXPORT LOAD RESTORE REORG REORGCHK RUNSTATS |
VERSIONES | |
ORACLE | DB2 LUW |
EXPRESS EDITION | EXPRESS-C |
STANDARD EDITION ONE | EXPRESS EDITION |
STANDARD EDITION | WORKGROUP EDITION |
ENTERPRISE EDITION | ENTERPRISE SERVER EDITION |
Espero que os sea útil.
Oscar Paredes
IT Manager
Oracle DBA
En el artículo de IBM
En el artículo de IBM developerWorks Leverage your Oracle 11g skills to learn DB2 9.7 for Linux, UNIX and Windows hacen una comparativa muy buena de las similitudes y diferencias entre los dos motores, a nivel de arquitectura, objetos, gestión de memoria, etc.
Aunque todo el artículo es muy recomendable, sólo los dos esquemas de comparación a nivel de estructura de sistema que copio a continuación ya pueden resultar de gran ayuda:
Figure 1. Oracle system structure on Linux, UNIX, and Windows
Figure 2. DB2 on Linux, UNIX, and Windows system structure
- Inicie sesión o registrese para enviar comentarios
Información
Más información en la presentación “DB2 LUW for the Oracle DBA” que realizó
Udo Brede de Quest Software en el SpDUG forum 2010. Disponible en:
http://www.spdug.org/index.php/spdug-forum-2010.html
Saludos,
- Inicie sesión o registrese para enviar comentarios
UPDATE con JOIN en ORACLE SQL
UPDATE con JOIN en ORACLE SQL hminguet 8 Julio, 2008 - 10:16Supongamos que queremos actualizar en nuestra base de datos ORACLE el campo de costes de la tabla de hechos FAC_TABLE con el coste unitario de nuestra tabla de COSTES.
Con Oracle SQL podemos hacerlo de dos maneras:
- Consulta Lenta, pero si es para pocos datos o para lanzarlo esporádicamente nos puede valer
update FAC_TABLE ft set COSTE_UNITARIO = (select distinct COSTE_UNITARIO from COSTES ct where (ft.id_articulo = ct.id_articulo);
- La mejor manera es esta, y el rendimimento es óptimo si tiene constraints)
UPDATE (SELECT ft.COSTE_UNITARIO AS old_coste, ct.COSTE_UNITARIO AS new_coste FROM FAC_TABLE ft INNER JOIN COSTES ct ON ft.id_articulo = ct.id_articulo) ) SET old_coste = new_coste;
Para que esta segunda opción funcione necesitamos tener UNIQUE or PRIMARY KEY constraint en ct.id_articulo.
Si no tienes esta constraint, puedes utilizar el hint /*+BYPASS_UJVC*/ después de la palabra UPDATE (bypass update join view constraint).
El rendimiento aumenta si tenemos la constraint pero aún sin ella debe correr mucho más que la primera opción.
Espero que os ayude.
Héctor Minguet.
Pruebas del UPDATE con JOIN
He tenido la oportunidad de probar este tipo de update con tablas grandes, de varios millones de registros, y realmente funciona como comentas.
He lanzado un update con la primera opción y he decidido cancelarlo cuando he visto que comenzaba a afectar negativamente al rendimiento de la base de datos. El tiempo estimado que me daba la consola de Enterprise Manager para terminar era de 1 hora y media.
Después de cancelar he probado la segunda opción y me he encontrado con el error ORA-01779 porque no tenía una clave única definida sobre el campo de la tabla con la que hacía la join. Como la tabla era demasiado grande para crear un índice único sin estudiarlo primero, he probado la opción de incluir el hint /*+BYPASS_UJVC*/ (para hacer esto hay que asegurarse antes de que la correspondencia es realmente de 1:1, si no podemos obtener resultados inesperados), y el update se ha realizado correctamente en menos de 15 minutos, una diferencia considerable.
Ahora a ver si alguien se anima y nos cuenta la mejora que se obtiene con la segunda opción, pero creando una clave única en la tabla 'enlazada', y sin utilizar el hint.
- Inicie sesión o registrese para enviar comentarios
Hola Hector y
Hola Hector y Carlos,
Excelente hint, lo he utilizado por años sin ningun problema.
Pero hoy me paso el sig. error:
Tengo una tabla PRIMARIA
* PREPAQ_MIC
Y tambien tengo dos vistas.
* VW_DATACRED
* VW_CNCH_MPIO
Esta ultima vista esta definida asiI:
CREATE OR REPLACE FORCE VIEW FIRA.VW_CNCH_MPIO (CDGPROG, CDGEF, CDGMU) AS select CDGPROG, CDGEF, trim(column_value) CDGMU from ( SELECT CDGPROG, CDGEF, APO.VALORES CDGMU FROM FIRA.APL_APOYO APO WHERE CDGPROG = 'CNCH' AND CDGMU = 'VAR' ORDER BY CDGEF, CDGMU ) t, xmltable(('"' || replace(CDGMU, ',', '","') || '"'));
Con el sig. script UPDATE, intento modificar un campo de la tabla primaria (PRE.APOYO) con el valor de la vista anterior
UPDATE /*+BYPASS_UJVC*/ ( SELECT PRE.ESQUEMA, PRE.STATUS, PRE.NUMCONTROL, PRE.CLNS, PRE.CDGRG, PRE.CDGCLNS, PRE.CICLO, PRE.CDGCL, PRE.CANTENTRE, PRE.SUSTRAE, PRE.MOTIVORECHAZO, PRE.APOYO AS PRE_APOYO, VDC.CDGEF, VDC.CDGMU, VDC.MUNICIPIO, VDC.CDGLO, VDC.LOCALIDAD, VDC.POB_LOC, VDC.GRADMARG, VDC.ACTIVIDAD, VDC.CVESECTOR, VDC.NOM_SECTOR, VDC.CDGSUBSEC, VDC.NOM_SUBSECTOR, CNCH.CDGPROG AS APOYO_CNCH FROM PREPAQ_MIC PRE, VW_DATACRED VDC, VW_CNCH_MPIO CNCH WHERE PRE.CLNS = VDC.CLNS AND PRE.CDGCLNS = VDC.CDGCLNS AND PRE.CICLO = VDC.CICLO AND PRE.CDGCL = VDC.CDGCL AND VDC.CDGEF = CNCH.CDGEF AND VDC.CDGMU = CNCH.CDGMU AND TRIM(PRE.APOYO) IS NULL ) SET PRE_APOYO = APOYO_CNCH
Sin embargo al ejecutar el script señala el siguiente error:
ORA-01031: Privilegios insuficientes.
La vista fue creada por el mismo usuario que lo ejecuta (FIRA) y tienen permiso de crear tablas (grant create table to FIRA)
Ojala me puedas ayudar
Saludos!
- Inicie sesión o registrese para enviar comentarios
No sé si la manera en que
No sé si la manera en que están definidas las vistas puedan influir en algo, y también es importante que te asegures de que la correspondencia de valores en la join es de 1 a 1.
Para localizar el problema yo probaría a simplificar la consulta. Para saber si tiene alguna relación con las vistas podrías crear tablas físicas a partir de los valores de una consulta de las vistas, y validar sobre estas tablas que no tengas registros duplicados antes de probar el update con las tablas.
Otra cosa que te podría afectar es el IS NULL mezclado con las joins. Puedes definir las joins en formato FROM .. INNER JOIN .. ON, como en el ejemplo, y dejar TRIM(PRE.APOYO) IS NULL sólo en la parte del WHERE.
Espero que localices pronto dónde está el problema, y que nos lo expliques.
Un saludo,
- Inicie sesión o registrese para enviar comentarios
En mi caso me daba el
En mi caso me daba el error:
Error SQL: ORA-01031: privilegios insuficientes 01031. 00000 - "insufficient privileges".
La causa es que tenia dos esquemas diferentes y en uno de ellos no tenia permisos de escritura sobre una de las tablas. Al sacar los datos del esquema que no tenia permisos, para una tabla temporal en el esquema que si tenia permisos, hizo el update correctamente, ya con las dos tablas en mi mismo esquema.
- Inicie sesión o registrese para enviar comentarios
Hola se agradece este
Hola se agradece este bypass.
Justamente tenía que actualizar unas tablas que tenian correlativos repetidos y tenian que ser secuenciales, realicé una tabla temporal y despues aplicar un update. De igual forma tenia que hacer un procedimiento almacenado pero en fin... con este bypass, todo bien.
El tiempo de respuesta en la actualizacion el descuebe GRACIAS!!!
gracias.
atte.
Maricela de CHILE
- Inicie sesión o registrese para enviar comentarios
Gracias. Lo utilice para una
Gracias.
Lo utilice para una actualizacion de varios campos y se comporto de maravilla.
- Inicie sesión o registrese para enviar comentarios
Utilice un script con este
Utilice un script con este hint /*+BYPASS_UJVC*/ y funciona una muy bien... Bajo un script de 9 hs a 6 segungos....
Pero cuando lo quiero utilizar dentro de un Package aparece un error "PL/SQL: ORA-01031: Insufficient privileges"
¿ALGUIEN PUEDE AYUDARME CON ESTE TEMA?
DESDE YA MUCHAS GRACIAS.
- Inicie sesión o registrese para enviar comentarios
Bueno lo mas probable es que
Bueno lo mas probable es que sea esto, mira una cosa son los permisos que tienes tu o tu usario y otra los permisos que tiene el paquete por ejemplo digamos que tu tienes el usuario au0001 y cuando corres esto si puedes hacerlo debido a tus permisos, pero cuando pones esto dentro del paquete que esta en el esquema au0002 y dicho esquema no tiene esos priviliegios, pues es claro que te truena aun si tu como usuario au0001 si tengas el permiso y seas tu el que corre el paquete , el paquete truena por ser el o su esquema mejor dicho el que no tiene los permisos.
- Inicie sesión o registrese para enviar comentarios
Hola intente hacerlo de las
Hola intente hacerlo de las dos maneras, el update tradicional y con el hint, con el primero se tarda bastante, lo cancele, con el segundo me marca el error ORA-01031 - Insufficient privileges, lo estoy haciendo en el mismo esquema, la tabla de la que quiero actualizar tiene llave unique en el campo que uso para unir con la tabla que tiene la información ¿A que se debe que con uno no me marque el error y con el segundo si?
- Inicie sesión o registrese para enviar comentarios
¡¡¡ UPS !!! Perdón. Gracias
¡¡¡ UPS !!! Perdón. Gracias por la ayuda.
- Inicie sesión o registrese para enviar comentarios
Muchisimas gracias por tu
- Inicie sesión o registrese para enviar comentarios
Me ha servido su update con
- Inicie sesión o registrese para enviar comentarios
La explicación es muy buena y
La explicación es muy buena y me ha servido en varios proyectos cuando la base de datos es Oracle 10g, sin embargo en Oracle 11g el hint ha desaparecido y no se puede utilizar, he leído algo acerca del tema y en todos lados lo que dice es que debo cambiar la instrucción y no utilizar más el hint bypass_ujvc.
¿Como han hecho para mitigar la eliminación del hint? ¿Es correcto mejor hacerlo por merge?
Gracias!
- Inicie sesión o registrese para enviar comentarios
Pues sí, si a partir de la
Pues sí, si a partir de la versión 11g R2 el HINT BYPASS_UJVC ya no es válido porque Oracle lo ha dejado como deprecated hay que dejar de utilizarlo, y además hay que tenerlo en cuenta en upgrades o migraciones desde versiones anteriores, ya que si se utilizaba este HINT en versiones anteriores a la 11g, al lanzar las queries que contengan el hint BYPASS_UJVC el analizador devolverá un error y la query fallará.
Una buena alternativa, tal como ya apuntas, es utilizar un MERGE para este tipo de operaciones en que se haya recurrido al HINT al no disponer de una clave primaria para el campo por el que se hace la join de la SELECT del UPDATE, aunque si se puede conseguir la clave primaria o única para ese campo, seguramente el UPDATE será más rápido.
Al utilizar el MERGE, hay que asegurarse igualmente de que la JOIN entre tabla origen y destino sea INNER, que no existan duplicados en las tablas para esos registros, porque entonces podemos encontrarnos el error ORA-30926, o efectos inesperados en los resultados. Si se diera el caso, habría que anular los duplicados eliminándolos antes de hacer la join, o modificando la query añadiendo un group by para aplicar un SUM, MAX, MIN u otra operación sobre el campo con valores duplicados.
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.
- Inicie sesión o registrese para enviar comentarios
Hola! Necesito algo de ayuda
Hola!
Necesito algo de ayuda con un Update de toda una columna..
La idea es actualizar la columna reintegro de la tabla tarjeta, la cual está relacionada con otras tablas (empresa, certificado,persona,institucion) donde ley=S de la tabla institucion
Les comento las consultas que he realizado sin éxito:
================== update tarjeta set reintegro ='0' where (select reintegro, ley_anterior from tarjeta , institucion where ley='S') ================== ================== Update tarjeta SET reintegro= '0' INNER JOIN empresa on tar_emp_codigo = empcodigo INNER JOIN certificado on empcodigo = cem_empcodigo INNER JOIN persona on per_documento = cem_perdocumento INNER JOIN institucion on per_inscodigo = inscodigo WHERE (ley='S') ==================
Me podrían ayudar?
Gracias
- Inicie sesión o registrese para enviar comentarios
Hola buenas tardes, no se si
- Inicie sesión o registrese para enviar comentarios
Hola, me ha sido muy útil
- Inicie sesión o registrese para enviar comentarios
Vistas materializadas de Oracle para optimizar un Datawarehouse
Vistas materializadas de Oracle para optimizar un Datawarehouse Carlos 13 Agosto, 2008 - 09:21Como las cargas de un Data warehouse se realizan de manera periódica, y además es habitual la creación de tablas agregadas para mejorar la eficiencia y tiempo de respuesta de nuestros informes, un recurso de optimización física que puede aportar grandes mejoras es la utilización de vistas materializadas.
Qué es una vista materializada
La vista materializada no es más que una vista, definida con una sentencia SQL de Oracle, de la que además de almacenar su definición, se almacenan los datos que retorna, realizando una carga inicial y después cada cierto tiempo un refresco de los mismos.
Así, si tenemos un Datawarehouse que se actualiza diariamente, podríamos utilizar vistas materializadas para ir actualizando tablas intermedias que alimenten nuestros esquemas de DWH, o directamente para implementar tablas agregadas que se refrescarán a partir de nuestras tablas base.
La creación de este tipo de vistas con Oracle SQL no es tan compleja como puede parecer, lo más importante es tener claro cada cuánto tiempo queremos actualizar la información de las vistas, y qué método de refresco utilizar.
También tendremos que asegurarnos de que nuestra licencia de base de datos nos permite utilizarlas (ha de ser una versión Enterprise).
Sintaxis básica de Oracle SQL para la creación de una vista materializada
CREATE MATERIALIZED VIEW mi_vista_materializada [TABLESPACE mi_tablespace] [BUILD {IMMEDIATE | DEFERRED}] [REFRESH {ON COMMIT | ON DEMAND | [START WITH fecha_inicio] NEXT fecha_intervalo } | {COMPLETE | FAST | FORCE} ] [{ENABLE|DISABLE} QUERY REWRITE] AS SELECT t1.campo1, t2.campo2 FROM mi_tabla1 t1 , mi_tabla2 t2 WHERE t1.campo_fk = t2.campo_pk AND …
Comentarios sobre las diferentes opciones de la sentencia Oracle SQL de creación de la vista:
-
Carga de datos en la vista
BUILD IMMEDIATE:
Los datos de la vista se cargan en el mismo momento de la creación
BUILD DEFERRED:
Sólo se crea la definición, los datos se cargarán más adelante. Para realizar esta carga se puede utilizar la función REFRESH del package DBMS_MVIEW:
begin
dbms_mview.refresh('mi_vista_materializada');
end;
-
Método y temporalidad del refresco de los datos
Cada cuánto tiempo se refrescarán:
REFRESH ON COMMIT:
Cada vez que se haga un commit en los objetos origin definidos en la select
REFRESH ON DEMAND:
Como con la opción DEFERRED del BUILD, se utilizarán los procedures REFRESH, REFRESH_ALL_MVIEWS o REFRESH_DEPENDENT del package DBMS_MVIEW
REFRESH [START WITH fecha_inicio] NEXT fecha_intervalo:
START WITH indica la fecha del primer refresco (fecha_inicio suele ser un SYSDATE)
NEXT indica cada cuánto tiempo se actualizará (fecha_intervalo podría ser SYSDATE +1 para realizar el refresco una vez al día)
-
De qué manera se refrescarán
REFRESH COMPLETE:
El refresco se hará de todos los datos de la vista materializada, la recreará completamente cada vez que se lance el refresco
REFRESH FAST:
El refresco será incremental, es la opción más recomendable, lo de fast ya da una idea del porqué.
Este tipo de refresco tiene bastantes restricciones según el tipo de vista que se esté creando.
Se pueden consultar en General Restrictions on Fast Refresh de la documentación oficial de Oracle
Una de las cosas importantes a tener en cuenta es que para poder utilizar este método casi siempre es necesario haber creado antes un LOG de la Vista materializada, indicando los campos clave en los que se basará el mantenimiento de la vista.
Se utiliza la instrucción de Oracle SQL "CREATE MATERIALIZED VIEW LOG ON":
CREATE MATERIALIZED VIEW LOG ON mi_tabla_origen WITH PRIMARY KEY INCLUDING NEW VALUES;
REFRESH FORCE:
Con esta opción se indica que si es posible se utilice el metodo FAST, y si no el COMPLETE.
Para saber si una vista materializada puede utilizar el método FAST, el package DBMS_MVIEW proporciona el procedure EXPLAIN_MVIEW
-
Activación de la reescritura de consultas para optimizar el Data warehouse
ENABLE QUERY REWRITE:
Se permite a la base de datos la reescritura de consultas
DISABLE QUERY REWRITE:
Se desactiva la reescritura de consultas
La opción QUERY REWRITE es la que más vamos a utilizar si queremos las vistas materializadas para optimizar nuestro Data warehouse.
Esta opción permite crear tablas agregadas en forma de vistas materializadas, y que cuando se lance una SELECT la base de datos pueda reescribirla para consultar la tabla o vista que vaya a devolver los datos solicitados en menos tiempo, todo de manera totalmente transparente al usuario
Lo único que hay que hacer es crear las tablas agregadas como vistas materializadas con QUERY REWRITE habilitado.
Ejemplos de vistas materializadas de Oracle
Son muchas combinaciones, pero la sentencia final no es tan compleja.
Primer paso de la ETL de un Data warehouse
Si quisiéramos crear con SQL de Oracle una vista materializada de una tabla que se refresque un día a la semana, y de manera incremental haríamos lo siguiente:
CREATE MATERIALIZED VIEW LOG ON mi_tabla_origen WITH PRIMARY KEY INCLUDING NEW VALUES; CREATE MATERIALIZED VIEW mi_vista_materializada REFRESH FAST NEXT SYSDATE + 7 AS SELECT campo1, campo2, campo8 FROM mi_tabla_origen WHERE campo2 > 5000;
Esta vista podría servirnos para alimentar la carga de un Data Mart que se realizara semanalmente. Podríamos programarla para que se refrescara justo antes del inicio del proceso de carga, o como primer paso en la ETL, y ya tendríamos los datos necesarios actualizados, e independientes del origen de datos (no tendríamos que molestar más al operacional). Otra ventaja a tener en cuenta es que si hay algún problema con el acceso a los datos de origen, si no los hemos eliminado, en la vista materializada aún tendremos los datos del último refresco, con lo que aunque el refresco fallara no nos encontraríamos un error que truncara la carga de nuestro Data Warehouse, o una tabla vacía.
Por supuesto, en las condiciones del WHERE de la sentencia SQL de creación podríamos seleccionar sólo los registros necesarios, sólo los del último mes, etc.
Tablas agregadas para optimizar el Data Warehouse
Otro ejemplo importante sería la utilización de vistas materializadas para la creación de tablas agregadas.
-- Oracle SQL para crear agregadas con materilized views CREATE MATERIALIZED VIEW ventas_agregadas_mv BUILD IMMEDIATE REFRESH COMPLETE ENABLE QUERY REWRITE AS SELECT id_producto, sum(importe) total_ventas FROM ventas GROUP BY id_producto;
Con esta sencilla sentencia de Oracle SQL se crearía una tabla agregada de total de ventas por producto de una supuesta tabla de ventas que seria la tabla de hechos.
A nivel de sesión también habría que asegurarse de que la opción QUERY_REWRITE estuviera activada. Por si acaso, desde SQL Plus, se puede habilitar con la sentencia SQL:
SQL> ALTER SESSION SET QUERY_REWRITE_ENABLED=TRUE;
Si ahora dentro de esta sesión se ejecuta la sentencia SQL
SQL> SELECT sum(importe) FROM ventas;
la base de datos preparará el plan de ejecución teniendo en cuenta la vista materializada creada e internamente realizará la selección sobre la vista ventas_agregadas_mv.
Una manera sencilla de comprobarlo, aparte de examinar el plan de ejecución, o de comparar tiempos antes y después de la creación de la vista, o desactivando el QUERY_REWRITE, es comprobar que esta query SQL devuelve resultados en el mismo tiempo que la query
SELECT sum(importe) FROM ventas_agregadas_mv;
Para consultar más detalles, o la sintaxis SQL completa de la creación de vistas materializadas Oracle, el capítulo Create Materialized View del manual de referencia SQL de Oracle es un buen recurso.
Con Oracle Enterprise Manager (OEM), o con la consola web de la base de datos también se pueden crear las vistas materializadas de una manera más asistida, pero igualmente es importante tener claros los conceptos antes de hacerlo.
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.
Los libros que ves a continuación son una selección de los que a mi me parecen más interesantes para aprender administración y desarrollo PL/SQL, teniendo en cuenta precio y temática, espero que te puedan ser de utilidad:
- eBooks de Oracle gratuítos para la versión Kindle, o muy baratos (menos de 4€):
Instalaciones y sistemas
Instalaciones y sistemas Dataprix 8 Septiembre, 2009 - 09:52Bases de datos embedded: Apache Derby y Sleepy cat
Bases de datos embedded: Apache Derby y Sleepy cat alone 9 Febrero, 2007 - 16:19Cuando hablamos de bases de datos, normalmente nos imaginamos un gran servidor, com grandes cantidades de información en su interior. Ahora bien, también existen bases de datos minúsculas para entornos donde el espacio, tanto de almacenaje como de proceso, es muy importante.
Dentro del proyecto Apache existe un proyecto llamado Derby. Derby es una base de datos relacional, implementada totalmente en Java que tiene la particularidad del pequeño tamaño que supone. Sun, a partir de Apache Derby, ha desarrollado su propia base de datos llamada JavaDB.
Así mismo, Oracle ha adquirido la base de datos Sleepy cat, desarrollada incialmente en la universidad de Berkeley.
Em ambos casos, sorprende el rendimiento, tanto en velocidad como en capacidad, y la funcionalidad.
Crear BD Oracle en Windows y Linux
Crear BD Oracle en Windows y Linux cfb 13 Febrero, 2007 - 01:22En el site www.ajpdsoft.com se publica el manual online Instalacion Oracle 9i sobre Windows, donde se explica paso a paso y con captura de pantallas cómo instalar una BD Oracle 9i sobre windows, cómo solucionar algunos de los errores típicos que suelen aparecer durante la instalación, cómo levantar el listener, comprobar el estado de la base de datos, y alguna cosa más..
Instalación de Oracle 10g Express bajo Debian
Instalación de Oracle 10g Express bajo Debian sabueso 20 Agosto, 2006 - 04:55La gente de Debian Administration nos muestra como instalar en pocos pasos un Oracle 10g Express.
El proceso de instalacion se realiza via Apt , y tb nos explican como dejarlo a punto para su utilizacion.
El articulo podemos encontrarlo aqui
Instalación de una base de datos Oracle sobre Linux
Instalación de una base de datos Oracle sobre Linux Carlos 14 Julio, 2008 - 18:14Para instalar una base de datos Oracle sobre una distribución Linux lo mejor es seguir las indicaciones de Oracle. En Oracle by example - Oracle database 10g on a single instance Oracle explica de una manera bastante clara cómo hacerlo.
Una cosa importante a tener en cuenta es que cada distribución LINUX tiene sus peculiaridades, y que no todo sirve para todas. Lo más recomendable es utilizar las que están certificadas por Oracle, eso no garantiza que no surgan problemas, pero por lo menos Oracle los documenta. Oracle suele certificar para distribuciones SUSE en su versión empresarial (SLES) y RedHat.
Una buena opción, si queremos tener lo más parecido a las versiones empresariales, y poder ir actualizando nuestro SO, puede ser utilizar Open SUSE o CentOS. Otra puede ser utilizar su propia distribución Oracle Enterprise Linux
Saludos, Una consulta tengo
Saludos, Una consulta tengo un campo tipo long en una tabla,
como hago para mostrar el contenido de este campo en una instrucción
select
Gracias.
- Inicie sesión o registrese para enviar comentarios
Buenas, El tipo de datos
Buenas, El tipo de datos long puede quedar obsoleto en futuras versiones de oracle, en la documentación de la versión 9 ya avisaban de ello... http://docs.oracle.com/cd/A91202_01/901_doc/server.901/a90120/ch4_dep.htm En su lugar deberías usar si puedes datos de tipo lob o clob. Para poder seleccionar valores puedes hacer algo como usar uan tabla intermedia donde conviertes el long o a saco con la funcion to_lob... Lo que hacen aqui: nadaenespecial.com.ar/2009/06/10/usar-long-varchar-en-oracle/ Saludos,
- Inicie sesión o registrese para enviar comentarios
Instalación desatendida Oracle Express Edition - Oracle XE silent mode installation
Instalación desatendida Oracle Express Edition - Oracle XE silent mode installation Oscar_paredes 12 Octubre, 2007 - 11:42Debido a la gratuidad de esta versión de Oracle suele ser común su uso para instalaciones masivas en múltiples PC's, TPV's...
Este artículo orientado a DBA's de Oracle y desarrolladores resume brevemente como realizar una instalación desatendida de Oracle XE.
Esta instalación es tan sencilla como ejecutar el instalador de Oracle XE con los siguientes parámetros:
> oraclexe /s /f1"fichero_respuesta.iss" /f2"fichero_de_log"
El primer fichero indica los parámetros básicos de la instalación, y el segundo será el log resultante de la instalación.
Los parámetros configurables en el fichero de respuesta de la instalación son:
** szDir - Path de instalación del software y de ficheros de datos
** TNSPort - Puerto Listener BBDD
** MTSPort - Puerto MTS
** HTTPPort - Puerto HTTP consola
** SYSPassword - Password del usuario SYS
** bOpt1 - 1 or 0 : Ejecución o no al final de la consola a través del navegador
El resultado de la instalación se puede consultar en el fichero de log. Sin embargo, en caso de problemas este fichero no resulta muy útil, para ello se puede consultar el fichero generado en el directorio %systemroot% (en Windows C:\WINDOWS).
Además de una instalación desatendida también es posible realizar una desinstalación o reparación desatendida.
Oscar Paredes
IT Manager
Oracle DBA
Adjunto | Size |
---|---|
oraclexe_response.txt | 162 bytes |
Copia de la base de datos
Y si el valor de los parámetros fuera el mismo en la nueva instalación (path, puertos, etc), funcionaría la nueva base de datos copiando directamente los ficheros de una BD vacía (o con datos, según interese más) en la máquina destino?
Obviamente antes pararíamos la BD origen.
- Inicie sesión o registrese para enviar comentarios
oraclexe /s ??? el segundo
oraclexe /s ??? el segundo parametro indica ejecucion silenciosa. y el primero? la constraseña de instalación?
- Inicie sesión o registrese para enviar comentarios
A ver, aclarando algunas
A ver, aclarando algunas cosas:
oraclexe /s /f1"fichero_respuesta.iss" /f2"fichero_de_log"
oraclexe = el archivo ejecutable, en algunos casos se llama setup.exe
Luego, tener cuidado con el fichero.log, que de forma predeterminada puede que no siga la secuencia de la instalación.
Para asegurarnos de que la secuencia es correcta, mejor ejecutar: setup.exe /r
Bajo dicho comando hacemos la instalación y terminada la misma obtendremos un nuevo archivo: setup.iss dentro de la carpeta TEMP o Windows,
- Inicie sesión o registrese para enviar comentarios
LAMP o LAOP
LAMP o LAOP Oscar 7 Julio, 2008 - 23:06Navegando por la red he encontrado en PHP y otras yerbas un artículo que habla de un manual de PHP y Oracle. Conocía las siglas LAMP, pero no las siglas LAOP.
Resumiendo, un manual sencillo y creado por el equipo de Oracle para todos aquellos que tienen pensado una posible migración de MySql a Oracle en su gestor de contenidos, sobre todo, los de caracter empresarial.
Qué bueno, también puede ser
Qué bueno, también puede ser útil para quien piensa que conectar con Oracle desde PHP es complicado ;)
Ahora sólo falta que los proveedores de hosting incluyan un Oracle XE en sus paneles de control
- Inicie sesión o registrese para enviar comentarios
Oracle RAC One Node
Oracle RAC One Node Oscar_paredes 7 Abril, 2011 - 14:38En la release 2 de Oracle 11g, se introduce un nuevo producto Oracle Real Application Clusters One Node (Oracle RAC One Node).
La definición rápida del producto seria: es una instancia de Oracle RAC pero ejecutado en 1 único nodo. No es que sea una única máquina física, puede estar corriendo en diversos servidores físicos (de hecho, es lo habitual) sino que una instancia de Base de Datos está ejecutándose únicamente en 1 nodo al mismo tiempo (* aunque ya veremos que está afirmación no es del todo cierta).
Lo más fácil es ver un esquema para entenderlo a la perfección:
En este esquema, tenemos 3 servidores físicos que contienen un total de 5 instancias Oracle ejecutándose con Oracle RAC One Node. Cada nodo tiene un S.O., es decir, no son máquinas virtuales distintas.
Cuáles son sus ventajas más destacables:
- Permite al DBA de Oracle dar alta disponibilidad de una instancia de Base de Datos, tanto a nivel de fallo de Servidor, o a nivel de BBDD (notar que por ejemplo, VMware sólo lo proporcionaría a nivel del hardware del Servidor). Es decir, en el ejemplo anterior, una caída o problema de indisponibilidad del Server 2, haría que la base de datos DB-C se moviera a otro servidor físico, de manera automática.
- Permite al Oracle DBA repartir recursos físicos online (Instance Caging). Por ejemplo, en el ejemplo anterior, si el Server 1 tuviera 4 procesadores físicos, se podría indicar que la instancia DB-A tuviera asignado 3 y la instancia DB-B tuviera sólo 1 asignado. Además, se podría reasignar dinámicamente sin necesidad de reinicio de ningún tipo, en caso de necesidad de más procesador por parte de una de las instancias.
- En caso de mantenimiento de uno de los servidores físicos (p.e., por necesidad de aplicar parches, se podría mover sus instancias dinámicamente y sin pérdida de servicio. Esta característica se realiza a través de Oracle Omotion. Para evitar pérdida de servicio, durante breves instantes, Oracle RAC One Node levanta una nueva instancia en el servidor destino, de manera que, en ese periodo de tiempo existen 2 instancias atacando a la misma Base de Datos (como con Oracle RAC).
- Posibilidad de upgradear a Oracle RAC en cualquier momento sin corte de servicio.
Como véis, el almacenamiento debe ser compartido.
Al igual que Oracle RAC, Oracle RAC One Node utiliza el software de clusterización Oracle Clusterware para el control de los recursos clusterizados en los distintos nodos. Esto hace, lógicamente, que la compatibilidad con otros productos de clusterización (Veritas, Sun Cluster, etc..) no sea posible.
Oracle para vendernos el producto, insiste en las ventajas de tener n-máquinas físicas con Oracle RAC One Node en comparación con tenerlas dentro de una granja VMware. Estas ventajas se pueden resumir en:
- Mayor eficiencia en el uso de recursos, al no utilizar la capa del hypervisor.
- Facilidad en la instalación de parches (menos Sistemas Operativos y posibilidad de cambiar el servidor que da servicio).
- Modificación dinámica de la CPU sin necesidad de reinicar.
El licenciamiento es más barato que Oracle RAC, de manera que, este producto se puede ver como una aproximación de coste inferior, para posteriormente actualizarla a Oracle RAC:
Espero que os sea útil.
Oscar Paredes
IT Manager
Oracle DBA
Oracle XE, la base de datos gratuita de Oracle
Oracle XE, la base de datos gratuita de Oracle Carlos 29 Diciembre, 2006 - 00:34Oracle ofrece una versión gratuita de su base de datos, con el principal objetivo de introducir en el 'mundo Oracle' a desarrolladores, DBAs, estudiantes y formadores, y vendedores de hardware y software que quieran distribuir junto con sus productos una base de datos sin costes de licencia. El producto es Oracle 10g Express Edition (Oracle Database XE) y, obviamente, tiene sus limitaciones.
Sólo puede utilizar 1 procesador del servidor donde esté instalada, un máximo de 1 Gb de RAM, y tiene limitado el almacenamiento a 4 Gb de datos de usuario. Cuando se superen estas limitaciones, Oracle ofrece un sencillo proceso de actualización a otras versiones más completas, y en las que sí que hay que pagar licencias.
De todas maneras es una opción muy válida para quien quiera practicar con bases de datos Oracle, o para quien necesite una base de datos limitada en cuanto a tamaño, pero fiable y eficiente, y gratuita.
Con la base de datos, Oracle incluye también Oracle Application Express, un entorno sencillo e intuitivo que permite realizar gráficamentes las tareas básicas de administración de la base de datos.
Se puede descargar esta base de datos, o consultar información más concreta sobre la misma en Oracle Database XE.
Recomiendo consultar antes de la instalación el Datasheet de Oracle Database XE, y las características de Oracle Application Express.
Oracle sobre Linux
Oracle sobre Linux Carlos 17 Agosto, 2006 - 21:40Tradicionalmente las bases de datos Oracle de una cierta envergadura se han ido instalando sobre servidores con SO UNIX, y también sobre sistemas servidores windows.
Con el reconocimiento de Linux como un SO suficientemente fiable para su utilización en grandes servidores, las grandes corporaciones comienzan a plantearse la utilización de este sistema por la flexibilidad, y acceso al código fuente que ofrece, y por la ausencia de costes en licencias.
Así, una opción que cada vez ganará más adeptos es la instalación de BBDD Oracle sobre Linux.
En el caso de éxito descrito por Oracle en el pdf adjunto se muestra el interesante ejemplo del Grupo Gas Natural, donde se tomó la decisión de migrar la base de datos Oracle que albergaba el Data Warehouse corporativo desde potentes máquinas en plataforma UNIX a servidores más modestos en cluster sobre una plataforma Linux.
Concretamente, la base de datos se migró a Oracle 9i con Real Application Cluster sobre Linux RedHat.
Con esta solución se consiguió una reducción de los costes, a la vez que mejoraban tanto el rendimiento como la escalabilidad del sistema.
Oracle-on-Linux VMware Tool Kits
Oracle-on-Linux VMware Tool Kits drakon 15 May, 2007 - 23:18Estaba navegando por la web de Oracle, concretamente unos apartados para principiantes como yo: "Getting Started". Éstos apartados te guían en muchos temas, incluso puedes encontrar un buen checklist de configuración de seguridad, para principiantes.
Además de ésto he encontrado unos Tool Kits para que en poco tiempo puedas montarte en tu escritorio Windows una VMWare con GNU/Linux y con el Oracle Database 10g preconfigurado. Los Tool Kits están disponibles con Red Hat o Novell. Y además viene acompañado de una guía que explica incluso cómo instalar VMWare.
Todo ésto bajo licencia de evaluación está claro. Si hay alguien que lo ha probado o que lo va a testear, que exponga sus opiniones al respecto.
Ya está disponible Oracle 10g para Windows Vista
Ya está disponible Oracle 10g para Windows Vista Carlos 30 May, 2007 - 22:27Para los que quieren estar siempre a la última y para los amantes del riesgo, desde el 4 de mayo está disponible la última versión del servidor de base de datos de Oracle para Windows Vista. Se puede descargar en Oracle Database 10g Release 2 para Windows Vista
Si alguien se anima y la prueba puede ser interesante cualquier comentario al respecto..
ayuda oracle vista
hola nesecito que me ayuden tengo instlado el oracle 10.2.0.2 y nesecito pasarlo a oracle 10.2.0.3 debido a que se trabajara en windows vista..espero me ayudes
- Inicie sesión o registrese para enviar comentarios
Resolución de Bugs y Errores
Resolución de Bugs y Errores Dataprix 8 Septiembre, 2009 - 09:5510 bugs de Oracle en 10 minutos
10 bugs de Oracle en 10 minutos sabueso 7 Septiembre, 2007 - 19:11Cesar Cerrudo, de Black Hat muestra como con herramientas libres buscar bugs dentro de una base de datos.
La noticia , aqui
Bugs de Oracle o de Windows?
Las herramientas utilizadas para detectar estos bugs son Process Explorer, WinObj, Pipeacl, and Interactive Disassembler (IDA), y la plataforma utilizada un Windows.
Ahora están investigando si estos problemas de seguridad son de la base de datos o del propio Windows, que nos avise quien se entere de las conclusiones.
De todas maneras detectar problemas de seguridad en un software que corra bajo esta plataforma es importante, pero no me parece un gran hallazgo.
A ver si alguien se anima a encontrar otros 10 bugs sobre la versión 10g de Oracle sobre UNIX, o incluso la de LINUX y nos lo cuenta..
Carlos Fernández
Analista de sistemas
- Inicie sesión o registrese para enviar comentarios
El error ORA-30926 como resultado de una operación Merge
El error ORA-30926 como resultado de una operación Merge Carlos 17 Febrero, 2009 - 22:01El error ORA-30926 suele producirse cuando se realizan operaciones Merge, y lo normal es que nos deje algo descolocados, ya que la descripción del mismo no da demasiada información sobre lo que está pasando:
ORA-30926: unable to get a stable set of rows in the source tables.
Normalmente este error se produce cuando en la operación Merge a una fila destino que hay que actualizar le corresponden más de una fila en la tabla origen. Como el motor no sabe qué registro escoger devuelve un error. Es un problema de duplicidad en la tabla origen.
Ejemplo:
- Tenemos:
TABLA_ORIGEN con los valores
ID Descripcion
1 'El primer valor'
1 'El valor con id duplicado'
2 'Otro valor'Y TABLA_DESTINO con los valores
ID Descripcion
1 'Valor a actualizar'
2 'Este no dará problemas'
3 'Este se queda igual'
- Queremos hacer un merge utilizando la siguiente sentencia:
MERGE into TABLA_DESTINO dest USING TABLA_ORIGEN ori ON (dest.ID = ori.ID) WHEN MATCHED THEN UPDATE SET a.Descripcion = b.Descripcion;
Con estos datos obtendríamos el siguiente error sobre TABLA_ORIGEN:
ORA-30926: no se ha podido obtener un juego de filas estable en las tablas de origen
- Ante este error tenemos 3 opciones:
1-. Eliminar los registros duplicados de la tabla origen:
DELETE FROM TABLA_ORIGEN WHERE id=1 AND Descripcion='El valor con id duplicado'
2-. Revisar las claves por las que hacemos la join en el merge:
Si utilizamos también el campo Descripcion en el enlace ya sólo habrá cero o un registro origen para cada destino:
MERGE into TABLA_DESTINO dest USING TABLA_ORIGEN ori ON (dest.ID = ori.ID AND dest.Descripcion=ori.Descripcion) WHEN MATCHED THEN UPDATE SET a.Descripcion = b.Descripcion;
(En este ejemplo no tiene mucho sentido porque la tabla son sólo estos dos campos, y además la join no encontrará coincidencias)
3-. Utilizar en lugar del MERGE un UPDATE con JOIN y el HINT /*+BYPASS_UJVC */ para saltarnos la validación del motor, y cruzar los dedos:
UPDATE /*+ BYPASS_UJVC */
( SELECT ori.ID ori_ID,
ori.Descripcion ori_Descripcion,
dest.ID dest_ID,
dest.Descripcion dest_Descripcion
FROM TABLA_ORIGEN ori, TABLA_DESTINO dest
WHERE ori.ID = dest.ID)
SET dest_Descripcion = ori_Descripcion;
Obviamente las más recomendables son la primera o la segunda, según el caso. La tercera opción, desde que la versión 11g R2 de Oracle ya no acepta el hint BYPASS_UJVC por considerarlo Deprecated, es ya totalmente desaconsejable para entornos de producción porque aunque ahora funcione por ser versiones anteriores a la 11g, las queries que incorporen este hint fallarán cuando se actualice la base de datos a una versión a partir de la 11g R2.
Otra buena opción para evitar el error ORA-30926 en operaciones de MERGE es modificar la sentencia aplicando un distinct para evitar los duplicados, o utilizando un group by y una función de agregación Min, Max o Sum, por ejemplo, sobre los campos que contengan los valores duplicados.
ORA-01555 Snapshot too old
ORA-01555 Snapshot too old il_masacratore 11 Agosto, 2009 - 16:37ORA-01555 Snapshot too old
La base de datos de una compañia normalmente tiene que aguantar algunas transacciones largas y pesadas. Si la base de datos es Oracle, está recien instalada y poco manipulada esas transacciones y sus primeras ejecuciones tienen pocas probabilidades de éxito. Es entonces cuando acaba apareciendo el fatídico ORA-01555, alias "... snapshot to old".
La gestión de consultas largas en Oracle viene limitada por el tamaño del tablespace de deshacer (undotbs). A mayor tamaño sera posible gestionar las transacciones más largas y pesadas. En Oracle 10g recien instalado el tamaño de este tablespace se reducido y uno no se suele dar cuenta hasta que falla la cosa.
Si la versión es la 10 se puede modificar directamente desde Oracle Enterprise Manager (consola web) en el apartado de administración, "Gestión de Deshacer". Allí tenemos el tiempo de retención, el tamaño del tablespace y podemos usar también el asesor para ver el tiempo de retención posible en base al tamaño en mb del tablespace.
Algo así:
En resumidas cuentas, le asignamos un tamaño mayor al tablespace que tengamos de "deshacer" y a ver si vale...
Para más información dejo aquí el Link de Oracle: http://www.oracle.com/technetwork/oramag/index.html
Ora10g: TNS-12518 Listener could not hand off client connection
Ora10g: TNS-12518 Listener could not hand off client connection il_masacratore 13 Septiembre, 2010 - 17:07
Cuando se produce este error el listener de nuestra base de datos Oracle está rechazando conexiones y no nos podemos conectar de ninguna manera con la base de datos. Para ver que está pasando podemos consultar el log del listener en /opt/oracle/product/10.2/db_1/network/log/listener.log para ver que nos cuenta el sistema. En el caso que nos ocupa podemos encontrar una entrada como la siguiente:
"TNS-12518: TNS:listener could not hand off client connection"
En el caso que me he encontrado este error puede producirse porque el número de procesos actuales de la base de datos está muy cerca del límite establecido en la configuración (por defecto 150). Inmediatamente se puede solucionar reiniciando el listener pero es recomendable revisar el valor del parámetro processes para incrementarlo. El valor máximo que le asignemos a este parámetro es trivial pero si lo modificamos debemos recalcular el valor de transacctions y sessions para que tengan en cuenta las sessiones de sistema de esta manera:
processes=x
transacctions=x*1.1
sessions=(processes*1.1)+5
Si con esto vemos que no se soluciona o queremos investigar más podemos activar la traza del listener para saber más sobre lo que acontece...
Oracle 10g - Suse Enterprise Error Consola: java.lang.Exception: Failed to get Number of users
Oracle 10g - Suse Enterprise Error Consola: java.lang.Exception: Failed to get Number of users Oscar_paredes 2 Octubre, 2007 - 12:48Este error de la consola de Oracle 10gR2 con Suse Enterprise (confirmado versión 10) hace que durante la navegación por la consola vayan apareciendo errores en la parte superior con el mensaje:
java.lang.Exception: Failed to get Number of users
La solución que puede aplicar el DBA de Oracle pasa por realizar los siguientes pasos:
- Parar la consola de Oracle:
>emctl stop dbconsole
- Ir al directorio:
>cd $ORACLE_HOME/sysman/admin/scripts
- Realizar backup del fichero osLoad.pl
- Editar el fichero osLoad.pl y cambiar las siguientes lineas:
>>> my $loadavg = NIL;
<<< my $loadavg = "0.46, 0.66, 0.61";
>>>> my $nusers = NIL;
<<<< my $nusers = 1;
- Grabar el fichero y arrancar la consola
>emctl start dbconsole
Oscar Paredes
IT Manager
Oracle DBA
Hola que tal, oye la
Subido por Jorge G (no verificado) el 27 Noviembre, 2014 - 09:19
Hola que tal, oye la extensión no la permite crome. Dice que no está en su web store. No hay otra manera de poder utilizarla?
Gracias!